c++ - 双击“Laser On” 双击“Laser Off” - Arduino
问题描述
谢谢大家的时间。我有我的代码,当我按住按钮时,激光打开“高”,当我从按钮上松开手指时,激光关闭“低”
但是我想当我双击激光打开时,当我再次双击激光关闭时。
谢谢你,对不起我的英语不好。
const int btn = 6;// The push button
int previousButtonStateLAZER = HIGH; // for btn6
void setup(){
pinMode(btn, INPUT);
pinMode (laserPin, OUTPUT);
}
void loop(){
int buttonStateLAZER = digitalRead(btn);
// if the button state has changed,
if (buttonStateLAZER != previousButtonStateLAZER){
if( buttonStateLAZER == HIGH ) {
digitalWrite (laserPin, HIGH);
}else{
digitalWrite (laserPin, LOW);
}
}
previousButtonStateLAZER = buttonStateLAZER;
}```
解决方案
您需要存储检测到点击的最后两次,然后测试它们是否足够靠近。试试这个代码(根据您发布的内容进行编辑):
const int btn = 6;// The push button
int previousButtonStateLAZER = LOW; // for btn6
static long releaseTimes[2];
static int releaseIndex = 1;
static int laserStates[2];
static int laserIndex = 0;
void setup(){
pinMode(btn, INPUT);
pinMode (laserPin, OUTPUT);
releaseTimes[0] = 0;
releaseTimes[1] = 0;
laserStates[0] = LOW;
laserStates[1] = HIGH;
}
void loop(){
int buttonStateLAZER = digitalRead(btn);
// if the button state has changed,
if (buttonStateLAZER != previousButtonStateLAZER){
previousButtonStateLAZER = buttonStateLAZER;
if (buttonStateLAZER == HIGH) {
return;
}
releaseIndex = 1 - releaseIndex;
releaseTimes[releaseIndex] = millis();
if (abs(releaseTimes[0] - releaseTimes[1]) < 800) {
releaseTimes[0] = 0;
releaseTimes[1] = 0;
laserIndex = 1 - laserIndex;
digitalWrite(laserPin, laserStates[laserIndex]);
}
}
}
推荐阅读
- wpf - 动画后WPF画布setRight无法正常工作
- django - 在 DJANGO 中使用旧模型名称删除权限
- perl - 替换二维数组中的值 - Perl
- sqlite - 如何将框阴影更改为 DB Flutter 中的最后两个元素
- python-3.x - 为什么我的代码在 PyCharm 中完成之前会出错
- android - CardView 权重与 ImageView
- excel - SharePoint 列表中两个日期和时间之间的差异
- linux - 为什么 ld.so 是共享对象?
- reactjs - 如何使用 React 和 Yup 验证(没有 Formik)
- python - 带有 grep 的 Git Python 日志