ESP32教程系列
1 - 认识ESP32
2 - Arduino IDE安装&配置
3 - 基本操作
4 - WiFi配网
5 - WebServer①
6 - Web Server②控制输出
7 - Web Server③ HTML&CSS基础
8 - Web Server④ 在Arduinio中添加HTML&CSS
9 - 异步网页服务器 Asynchronous Web Server(DHT11)
10 - OTA ESP32无线升级,告别数据线
ESP32实战系列
WiFi遥控小车
ESP32 Homekit系列
Homekit & Homespan介绍
点亮一颗LED
调节LED亮度
前言
Arduino之所以受众广,其有完整的一套SDK,市面上的STM32的Nucleo系列开发板,ESP32等第三方开发板均会将自带的库函数封装成Arduino函数,这样不论你换了什么单片机,代码书写无任何影响。
由于网络上针对Ardunio基本操作的教程已有很多,本系列就不再重复造轮子,因此本节仅做一些基本操作介绍。
准备内容
ESP32开发板
USB线
LED
电阻若干
电位器
PIR人体传感器
杜邦线若干
一、Arduino函数架构
当我们新建一个sketch时,会出现如下代码块。
void Setup()
{
//此处为外设的配置,如GPIO输入输出的设置
}
void loop()
{
//主循环
//书写主体逻辑
二、GPIO口数字输入输出
-
相关函数
-
digitalWrite():
用于控制数字输出,接受两个参数,分别是要操作的 GPIO 引脚和状态(HIGH 或 LOW)
※注意大写 -
digitalRead():
用于读取数字输入,接受一个参数,即要读取的 GPIO 引脚 -
Demo
实现功能:按下按键时LED灯亮,松手即灭。
电路接线
代码
int buttonState = 0;
void setup() {
pinMode(4, INPUT);
pinMode(5, OUTPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
二、ESP32 脉冲宽度调制(PWM)
- PWM 介绍
ESP32 的 LED PWM 控制器有 16 个独立通道,可以配置生成不同特性的 PWM 信号。通过设置 PWM 通道、信号频率、占空比分辨率以及指定输出引脚等步骤,可以实现对 LED 亮度的控制。 - 相关函数
ledcSetup():用于配置 PWM 通道的属性如通道号、频率和分辨率。
ledcAttachPin():将 PWM 通道连接到指定的 GPIO 引脚,参数为引脚及通道号。
ledcWrite():用于控制 PWM 信号的占空比,参数为通道号和占空比。
- Demo
实现功能:呼吸灯效果
电路接线图
代码:
int ledPin = 18; //LED灯的引脚
int freq = 5000; //频率
int pwmChannel = 0; //PWM的通道,0~15
int resolution = 8; //计数位数,2^8 = 256
void setup() {
ledcSetup(pwmChannel, freq, resolution);//设置LED的驱动PWM,通道为16,频率为5kHz,占空比为8%
ledcAttachPin(ledPin, ledChannel);//将上述PWM适用到LED的pin脚上
}
void loop() {
for (int dutyCycle = 0; dutyCycle <= 255; dutyCycle++) {//逐渐增大占空比,亮度逐渐增加
ledcWrite(ledChannel, dutyCycle);//更改占空比
delay(15);
}
for (int dutyCycle = 255; dutyCycle > 0; dutyCycle--) {//逐渐减小占空比,亮度逐渐增加
ledcWrite(ledChannel, dutyCycle);//更改占空比
delay(15);
}
}
三、ESP32 模拟输入
- 模拟输入介绍
ESP32 可以读取 0V 到 3.3V 之间的模拟电压值,并将其转换为 0 到 4095 之间的数字值。但 ESP32 的 ADC 引脚存在非线性行为,需要注意。 - 相关函数
analogRead():读取模拟输入值,参数为 GPIO 引脚。
- Demo
实现功能:读取电位器上的电压并在串口中显示
电路接线图
代码
int potPin = 34; //设置电位器连接的pin脚
int potValue = 0;
void setup() {
Serial.begin(115200); //初始化串口,通信速率为115200bps
delay(1000);
}
void loop() {
potValue = analogRead(potPin); // 读取电位器的电压
Serial.print(potValue); //在串口中打印电压值
Serial.println("V"); //在串口中打印单位
delay(500);
}
四、ESP32 中断和定时器
- 中断介绍
使用attachInterrupt()函数设置中断,参数为GPIO 引脚、要执行的函数名和中断模式作为。
中断模式包括 LOW(低电平)、HIGH(高电平)、CHANGE(电平变化)、FALLING(下降沿) 和 RISING(上升沿)。 - 定时器介绍
使用millis()函数获取从程序开始运行到当前所经过的毫秒数,可以通过一些计算来实现定时器功能,避免使用delay()函数阻塞代码。 - Demo
**实现功能:**利用 Arduino 的中断机制来检测人体传感器(PIR)的触发事件。当检测到人体运动时,点亮 LED,并开始计时。如果在 10 秒内没有再次检测到人体运动,则熄灭 LED。
电路接线图:
代码
#define timeSeconds 10 // 定义一个常量timeSeconds,单位为秒
int led = 19; //LED引脚
int motionSensor = 18; //PIR人体传感器接到18引脚
unsigned long now = millis(); //获取程序运行时间,单位为ms
unsigned long lastTrigger = 0; //定义一个触发,用于记录上一次触发事件发生的时间
boolean startTimer = false; //定义一个布尔型变量,用于控制事件触发相关的逻辑是否开始
//中断函数的配置
void IRAM ATTR detectsMovement() {
Serial.println("检测到有人!!!"); // 串口输出
digitalWrite(led, HIGH); //点亮LED灯
startTimer = true; // 将startTimer变量设置为true,表示计时相关的操作应该开始了
lastTrigger = millis(); // 更新lastTrigger变量为当前的时间,用于记录本次触发事件发生的时间
}
void setup() {
Serial.begin(115200); // 初始化串口通信,设置波特率为115200
pinMode(motionSensor, INPUT_PULLUP); // 将连接人体传感器的引脚设置为输入上拉模式
attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING);// 为motionSensor引脚注册一个中断,当引脚电平从低电平变为高电平时(RISING),会调用detectsMovement函数
pinMode(led, OUTPUT);// 将连接LED的引脚设置为输出模式
digitalWrite(led, LOW); // 初始化时将LED设置为低电平,也就是熄灭LED
}
void loop() {
now = millis(); // 在每次循环中,更新now变量为当前的程序运行时间
if (startTimer && (now - lastTrigger > (timeSeconds * 1000))) { // 如果startTimer为true(表示触发事件已经发生且计时应该开始),并且当前时间now减去上一次触发时间lastTrigger大于timeSeconds(值为10)乘以1000毫秒(也就是10秒)
Serial.println("无人");// 通过串口输出字符串"Motion stopped..."
digitalWrite(led, LOW);// 将LED引脚设置为低电平,熄灭LED
startTimer = false;// 将startTimer变量设置为false,表示计时相关操作结束
}
}
总结
以上为Arduino IDE下对单片机的常规操作的函数介绍。至于条件语句等与C语言一致,因此,需要一点C语言基础。
以上内容,如有错误,欢迎指正。
如果如果喜欢,欢迎关注微信公众号:+大钱硬件