ESP32 touchPad功能
我本来是一直在驱动别的输入传感器来当键盘的输入,但是我突然想到我为什么不可以做一个“任意”按键呢?结合以前看文档说,ESP32自带10个电容触摸GPIO。
T0:GPIO 4
T1:GPIO 0
T2:GPIO 2
T3:GPIO 15
T4:GPIO 13
T5:GPIO 12
T6:GPIO 14
T7:GPIO 27
T8:GPIO 33
T9:GPIO 32
这些引脚可以感应到任何带电物质的变化,比如人的皮肤,同时也可以方便的集成到电容垫里面。最后这个引脚也可以把芯片从深度休眠状态唤醒。
如果是Arduino开发,还有专门的语法touchpad使用
void setup()
{
Serial.begin(115200);
delay(1000); // give me time to bring up serial monitor
Serial.println("ESP32 Touch Test");
}
void loop()
{
Serial.println(touchRead(T0)); // get value using T0
delay(1000);
}
最简单的demo,就是这样
int threshold = 40;
bool touch1detected = false;
bool touch2detected = false;
void gotTouch1()
{
touch1detected = true;
}
void gotTouch2()
{
touch2detected = true;
}
void setup()
{
Serial.begin(115200);
delay(1000); // give me time to bring up serial monitor
Serial.println("ESP32 Touch Interrupt Test");
touchAttachInterrupt(T2, gotTouch1, threshold);
touchAttachInterrupt(T3, gotTouch2, threshold);
}
void loop()
{
if (touch1detected)
{
touch1detected = false;
Serial.println("Touch 1 detected");
}
if (touch2detected)
{
touch2detected = false;
Serial.println("Touch 2 detected");
}
}
如果只有简单读取,响应的代码就太low了,上面是用按键的中断来实现的。
中断很适合执行那些需要不断检查的工作,比如检查一个引脚上连接的按键开关是否被按下。中断更适用于很快就会消失的信号检查,比如某一个引脚用于检测脉冲信号,这个脉冲信号的持续时间可能十分短暂。如果不使用中断,那么假如Arduino开发板正在执行其它任务时,突然这个脉冲信号来了,还不等Arduino开发板完成正在执行的工作,这个脉冲信号可能就已经消失了。而使用中断,就可以确保这个转瞬即逝的脉冲信号可以很好的被Arduino开发板检测到并执行相应任务。
大致语法
touchAttachInterrupt(T0, gotTouch, 40);
//其中40为阈值,当通道T0上的值<40时,会触发中段
这样使用也是准确的
void attachInterrupt(uint8_t pin, std::function<void(void)> intRoutine, int mode)
{
// use the local interrupt routine which takes the ArgStructure as argument
__attachInterruptFunctionalArg (pin, (voidFuncPtrArg)interruptFunctional, new InterruptArgStructure{intRoutine}, mode, true);
}
这是我们ESP32的触摸中断语法,然后这个触摸的mode嘛。因为原理只能是下降沿。
注意,ESP32芯片的引脚可以映射
但是注意这个触摸脚是专用的,别瞎映射
我其实想逼逼,有映射功能,但是用起来这不行那不行
https://docs.espressif.com/projects/arduino-esp32/en/latest/boards/ESP32-DevKitC-1.html?highlight=touch
具体的也可以看看这各链接。
赞 (0)