资讯详情

ESP32的电容touch和外部中断

ESP32的电容touch和外部中断

中断原理

中断的目的是暂停主程序的运行,首先执行中断服务程序,其功能是改进CPU工作效率。在中断源提出中断请求后,处理器在执行当前指令后进行中断响应。一旦中断服务程序完成,它仍然必须返回到主程序中断(断点)并继续执行原程序。

在这里插入图片描述

代码编写

#include <Arduino.h>  // 定义外部中断Mode // 0: 读取无中断Touch值 // 1:Touch中断,执行 TouchEvent() // 2: 外部IO的中断 #define EXT_ISR_MODE 0  void TouchEvent() { 
             Serial.printf("Touch Event.\r\n"); }  void PinIntEvent() { 
             Serial.printf("PinInt Event.\r\n"); }  void setup() { 
             // put your setup code here, to run once:     Serial.begin(115200);  #if 1 == EXT_ISR_MODE     // Pin: T0(GPIO4), 函数指针:TouchEvent, 阈值: 40     touchAttachInterrupt(T0, TouchEvent, 40);  #elif 2 == EXT_ISR_MODE     pinMode(0, INPUT_PULLUP);     attachInterrupt(0, PinIntEvent, FALLING);  #endif }  void loop() { 
             // put your main code here, to run repeatedly:  #if 0 == EXT_ISR_MODE
    Serial.printf("touch:%d\r\n", touchRead(T0));
#endif

    delay(200);
}

代码中的#if #endif是预编译的一种形式,具体可以参考C/C++预编译 定义外部中断的模式:

代码剖析

  • Serial.begin()函数说明
Serial.begin(115200);//初始化串口0 并设置波特率为115200

可以查看这行代码的定义:

void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPin, bool invert, unsigned long timeout_ms, uint8_t rxfifo_full_thrhd);

可以看到这行代码的begin函数其实是HardwareSerial类中的一个成员函数: 这里的HardwareSerial 库是c++编写的,应用于esp32 Arduino应用环境的串口驱动库,我们在安装好ESP32的Arduino开发环境后就已经集成了这个串口操作库,在实际应用时直接引用就可以了。 HardwareSerial 在声明一个对象的时候,首先调用带参的构造函数:

HardwareSerial(int uart_nr);

将串口的值传入进去,可以传入0 1 2 分别代表Serial、Serial1、Serial2。 声明对象后就可以按一般串口的方法使用了:

void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPin, bool invert, unsigned long timeout_ms, uint8_t rxfifo_full_thrhd);
baud:串口波特率,该值写0则会进入自动侦测波特率程序;
config:串口参数,默认SERIAL_8N1为8位数据位、无校验、1位停止位;
rxPin:接收管脚针脚号;
txPin:发送管脚针脚号;
invert:翻转逻辑电平,串口默认高电平为1、低电平为0;
timeout_ms:自动侦测波特率超时时间,如果超过该时间还未获得波特率就不会使能串口;
  • Serial.printf()函数说明 由于HardwareSerial.h中引入了Stream.h,Stream.h中引入了 Print.h,Print.h中有被public修饰的printf()函数 Serial.printf()和Serial.print()是从串行端口打印数据 Serial.println()是从串口打印数据并且回车换行
  • touchAttachInterrupt()函数说明:
touchAttachInterrupt(T0, TouchEvent, 40);

上面的这条语句T0代表的是GPIO4 当低于阈值40的时候,ESP32会触发touchAttachInterrupt()中断函数,紧接着调用TouchEvent()函数。 可以查看touchAttachInterrupt具体的函数定义:

void touchAttachInterrupt(uint8_t pin, void (*userFunc)(void), uint16_t threshold);
  • attachInterrupt()函数说明:
attachInterrupt(0, PinIntEvent, FALLING);

将0号引脚设置为下降沿触发attachInterrupt中断,当attachInterrupt中断触发时会调用PinIntEvent()函数。 attachInterrupt函数定义如下:

void attachInterrupt(uint8_t pin, std::function<void(void)> intRoutine, int mode)
  • touchRead()函数说明:
touchRead(T0);

返回指定引脚电容传感器的值 具体的函数定义如下:

uint16_t touchRead(uint8_t pin);

实验现象

  • EXT_ISR_MODE = 0时,编译 下载到esp32中,会看到touch值在串口助手中显示 当用手触碰esp32的引脚时,touch值会变低
  • EXT_ISR_MODE = 1时,编译 下载到esp32中,当我没有触碰esp32的引脚时,串口助手不会进行任何打印操作 当用手触碰esp32时,串口助手会打印Touch Event,说明触发了TouchEvent事件

标签: 电容的ifcpu0402电容

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台