目录
1.GPIO输入输出
老宇哥带你玩转ESP32:03 GPIO数字输入与数字输出今天我们来点灯https://mp.weixin.qq.com/s/4DdkHJgiaGZlDHrqdCVHdA
#include <Arduino.h>
#define LED 22
void setup() {
pinMode(LED,OUTPUT);
}
void loop() {
digitalWrite(LED,0);
delay(1000);
digitalWrite(LED,1);
delay(1000);
}
2.外部中断
#include <Arduino.h>
#define LED 22
#define KEY 13
int state=0;
void bt_callBack(void){
state = digitalRead(KEY); // 读取按键状态
digitalWrite(LED, state); // 把按键状态做为LED灯的输出
}
void setup() {
pinMode(LED,OUTPUT);
pinMode(KEY,INPUT);
attachInterrupt(KEY, bt_callBack, CHANGE);
}
void loop() {
}
如果没有按键,可直接触摸引脚,也可以达到转换电平的效果。
3.串口通信
老宇哥带你玩转 ESP32:04 串口玩起来是真方便今天我们来玩儿串口https://mp.weixin.qq.com/s/YBX0WfhnhpT0-SQuaRmeDg
#include <Arduino.h>
#define LED 22
#define KEY 13
int rec_data;
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
// rec_data = Serial.read();
rec_data=Serial.parseInt();
Serial.print("received: ");
Serial.println(rec_data,DEC);
}
}
读出代码Serial.read()只能读出字符,输出需要经过转换;而Serial.parseInt()可直接读出几位数的数字。
4.电压读取
老宇哥带你玩转 ESP32:04 ADC用起来这也太简单了吧今天我们来玩儿ADChttps://mp.weixin.qq.com/s/SmrYDSbCNxU0sZVsPDkf1g
Serial.println("ADC value on Pin(%d) is %d!",analog_value);这里带了红线,编译也出错了,不知道原因,然后就改为下面的代码了,知道原因的可以评论区告诉一下,感激不尽。
#include <Arduino.h>
#define ADC_GPIO 13
int analog_value = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
analog_value = analogRead(ADC_GPIO);
Serial.println(analog_value,DEC);
delay(1000);
}
5.PWM输出
老宇哥带你玩转 ESP32:06 输出你想要的PWM波形今天我们来玩儿PWMhttps://mp.weixin.qq.com/s/Bps6HYsSeyuxQAoKUZRh5A
#include <Arduino.h>
#define ADC_GPIO 13
#define LED 22
#define PWM1_Ch 0
#define PWM1_Res 10
#define PWM1_Freq 1000
int PWM1_DutyCycle=50;
int analog_value = 0;
void setup() {
Serial.begin(9600);
ledcAttachPin(LED, PWM1_Ch);
ledcSetup(PWM1_Ch, PWM1_Freq, PWM1_Res);
}
void loop() {
while(PWM1_DutyCycle < 1023)
{
ledcWrite(PWM1_Ch, PWM1_DutyCycle++);
delay(2);
}
while(PWM1_DutyCycle > 0)
{
ledcWrite(PWM1_Ch, PWM1_DutyCycle--);
delay(2);
}
}
PWM1_Res为分辨率,分辨率越高,PWM1_Freq可实现的值越小;如当分辨率为9,频率可达100khz,当分辨率为11,频率只能达到39khz,这个是我的个人理解,如有错误,欢迎指出。
6.I2C通信
老宇哥带你玩转 ESP32:07 I2C协议,看这一篇就够了今天我们来玩儿I2C。https://mp.weixin.qq.com/s/occvhjfXL-45ulTjbOS0iw
由于我的开发板没有21引脚,固通过F12查找声明,找到i2c的通讯引脚底层代码,修改了引脚号。
修改软件串口通信波特率为115200。
#include <Arduino.h>
#include "Wire.h"
void setup(){
Serial.begin(115200);
int I2CDevices = 0;
byte address;
Wire.begin();
for (address = 1; address < 127; address++)
{
Wire.beginTransmission(address);
if (Wire.endTransmission() == 0)
{
Serial.print("Found I2C Device: ");
Serial.print(" (0x");
if (address < 16)
{
Serial.print("0");
}
Serial.print(address, HEX);
Serial.println(")");
I2CDevices++;
}
}
if (I2CDevices == 0)
{
Serial.println("没有发现I2C设备!\n");
}
else
{
Serial.print("发现了");
Serial.print(I2CDevices);
Serial.println("个I2C设备!\n");
}
}
void loop() {
}
7.OLED显示
老宇哥带你玩转 ESP32:07 I2C协议,看这一篇就够了今天我们来玩儿I2C。https://mp.weixin.qq.com/s/occvhjfXL-45ulTjbOS0iw
需要安装两个库,首先回到platformio主桌面,然后如图搜索下载,然后选择添加,第二个库也是一样,是不是很方便呢!!
报错,缺少一个库Adafruit_I2CDevice.h,按照前面安装库的方法安装就行了,注意搜索“header:Adafruit_I2CDevice.h”才会搜到有文件。
不知道为什么出现了乱码,知道的麻烦告诉一下呗。
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
int recData=0;
void setup() {
Serial.begin(115200);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(1000);
display.display();
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
}
void loop() {
if (Serial.available() > 0)
{
recData = Serial.parseInt();
Serial.print("received: ");
Serial.println(recData,DEC);
display.setCursor(0,0);
display.print("CHIPHOME");
display.display();
display.setCursor(0,16);
display.print("12345678");
display.display();
display.setCursor(0,32);
display.print(recData,DEC);
display.display();
display.clearDisplay();
}
}