为了避免由于抖动产生的错误信号,所以我们代码中有个去抖的过程。去抖的方法很简单,就是等到数据发生变化时,隔一段时间再检测一次。
一旦检测到读取的数据发生变化,通过millis()函数记下时间:
if (reading !=lastTouchState) {
lastDebounceTime = millis();
}
millis()是一个函数,该函数是Arduino语言自有的函数,它返回值是一个时间,Arduino开始运行到执行到当前的时间,也称之为机器时间,就像一个隐形时钟,从控制器开始运行的那一刻起开始计时,以毫秒为单位。
再等待50ms,再进行一次判断,是否和当前触摸开关状态相同。如果和当前状态不相同,改变触摸开关状态。同时,如果触摸开关状态为高(也就是被按下),那么就改变继电器的状态。
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != touchState) {
touchState =reading;
if (touchState ==HIGH) {
relayState= !relayState;
}
}
}
抖动的时间有多少呢?
如果有示波器,可以用示波器,但是没有也没有问题,用arduino写一个捕捉脉冲的
- const int touchPin = 5; //触摸开关连接到数字5 //HIGH 有效
- const int buttonPin = 4; //按键 //HIGH 有效
- long duration; //定义duration变量为无符号长整数型变量
- void setup()
- {
- Serial.begin(9600); //串口波特率为9600
- pinMode(touchPin, INPUT); //设置引脚为输入模式
- pinMode(buttonPin, INPUT);//设置引脚为输入模式
- }
- void loop2()
- {
- duration = pulseIn(touchPin, LOW,60000000); //读取引脚上的高电平脉冲,最大脉冲时间间隔为60秒,并且把结果赋值给duration变量
- Serial.println(duration); //通过串口输出duration变量
- }
- void loop()
- {
- duration = pulseIn(buttonPin, LOW,60000000); //读取引脚上的高电平脉冲,最大脉冲时间间隔为60秒,并且把结果赋值给duration变量
- Serial.println(duration); //通过串口输出duration变量
- }
复制代码
loop 依次修改做实验,发现机械按键存着抖动的情况,触摸按键经过芯片处理TTP223,The response time max about
60mS
at fast mode,
220mS
at low power mode。换句话说,触摸并不需要去除抖动设置
得到两个结论:
1)一般按键消时长是50~60ms以上
2)触摸按键TTP223是不需要消抖设置,直接读取信号的变化就可以