学习如何通过触摸引脚控制LED和外部中断的使用
使用ESP32自带的Touch pin也就是触摸引脚,学习如何通过触摸引脚控制LED和外部中断的使用。开发板的Touch pin引脚有多个,开发板原理图中标注为Touch的引脚,具体引脚可见文档末尾。
工具 → 开发板 → ESP32 Arduino → ESP32 Dev Module工具 → 端口 → 选择对应的COM端口(Windows)在 Arduino IDE 中输入以下代码:
// 定义触摸引脚 (T0对应GPIO4)
#define TOUCH_PIN 4
// 定义LED引脚 (ESP32 DevKit板载LED通常是GPIO2)
#define LED_PIN 2
// 中断模式设置:0为轮询模式,1为中断模式
#define EXT_ISR_MODE 0
// 阈值,需要通过串口监视器观察并调整
int threshold = 20;
// 触摸值
int touchValue;
void setup() {
Serial.begin(115200);
delay(1000); // 等待串口稳定
pinMode(LED_PIN, OUTPUT);
}
void loop() {
touchValue = touchRead(TOUCH_PIN);
Serial.print("Touch Value: ");
Serial.println(touchValue);
// 简单的阈值判断逻辑
if (touchValue < threshold) {
digitalWrite(LED_PIN, HIGH); // 触摸时,值变小,LED亮
} else {
digitalWrite(LED_PIN, LOW); // 未触摸,LED灭
}
delay(100);
}
点击右上角放大镜图标,波特率设置为 115200。
EXT_ISR_MODE 值改为 1(需替换下方进阶代码)。使用触摸中断和LED,实现触摸一次LED亮,再触摸一次LED灭的效果。以下是使用中断实现的代码示例:
#define TOUCH_PIN 4
#define LED_PIN 2
#define THRESHOLD 20 // 需要根据实际测试修改此阈值
bool ledState = false;
// 中断服务函数 (ISR)
void gotTouch() {
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
}
void setup() {
Serial.begin(115200);
delay(1000);
pinMode(LED_PIN, OUTPUT);
// 绑定中断函数
touchAttachInterrupt(TOUCH_PIN, gotTouch, THRESHOLD);
}
void loop() {
// 主循环可以处理其他任务,或者置空
// 注意:在某些ESP32核心版本中,loop中可能需要保留简单的代码以保持看门狗复位
delay(100);
}
问题1:touch_value的值不变化
pinMode是否正确设置(注:touchRead会自动配置,不需手动set input)问题2:LED不亮
问题3:无法进入TouchEvent中断服务函数
touchAttachInterrupt函数阈值的设置touchAttachInterrupt函数第一个参数是否与引脚对应| 触摸传感器 | GPIO引脚 |
|---|---|
| T0 | GPIO4 |
| T1 | GPIO0 (慎用) |
| T2 | GPIO2 (慎用) |
| T3 | GPIO15 (慎用) |
| T4 | GPIO13 |
| T5 | GPIO12 |
| T6 | GPIO14 |
| T7 | GPIO27 |
| T8 | GPIO33 |
| T9 | GPIO32 |
注意: GPIO0、GPIO2、GPIO15等引脚有特殊功能(Bootstrapping引脚),尽量避免使用。
问题4:上传失败
touchRead函数获取数值touchAttachInterrupt函数:掌握如何将中断函数和中断源绑定