这个帖子最后由topdog在2021-3-24 06:32编辑
Arduino用按钮控制LED。 一个按钮的正确姿势如下图所示。
Button.jpg(181.3kb,下载次数: 0 ) )。
2021-3-23 23:38上传
当mgdls按下按钮时,按钮连接电路中的两个点,UNO引线引脚3的电平变化控制板上引脚13的LED的点亮或熄灭。
const int buttonPin=3;
const int ledPin=13;
int buttonState=0;
void setup () }
pinmode(ledpin,OUTPUT );
pinmode(Buttonpin,INPUT );
}
void loop () }
button state=digitalread (button pin;
if(buttonstate==high ) {
数字写入(led pin,HIGH );
} else {
数字写入(led pin,LOW );
}
}
但是,按钮是机械装置,通常会发生虚假或欺诈的状态转移,不除去抖动,按下一次按钮可能会产生意想不到的结果。 必须在短时间内检查两次,确认按钮确实被按下了。 下面的示例使用millis ) )函数记录按钮被按下后经过的时间。 这称为无阻塞方式(delay ) ),后者称为阻塞方式。
const int buttonPin=3;
const int ledPin=13;
int ledState=HIGH;
int buttonState;
int lastButtonState=LOW;
unsigned long lastDebounceTime=0;
unsigned long debounceDelay=50;
void setup () }
pinmode(Buttonpin,INPUT );
pinmode(ledpin,OUTPUT );
数字写入(led pin,ledState );
}
void loop () }
intreading=digitalread (button pin );
if (就绪!=lastButtonState ) {
lastDebounceTime=millis (;
}
if () millis (-lastdebouncetime (debouncedelay ) )
if (就绪!=buttonState ) {
buttonState=reading;
if(buttonstate==high ) {
ledState=! ledState;
}
}
}
数字写入(led pin,ledState );
lastButtonState=reading;
}
也就是说,考虑到防抖的基本需求,在控制中只需一个按钮就可以实现有限状态机(finite state machine,简称: FSM ),建议使用onebutton库。 以下示例是双击触发事件。
#include 'OneButton.h '
//简化写法
//onebuttonbutton(3;
#define BUTTON_PIN 3
//初始化为高电平
OneButton button=OneButton (
BUTTON_PIN,
false、
假
);
void setup () }
pinmode(13,输出;
button.attach double click (double click );
}
void loop () }
button.tick (;
延迟(10;
}
void doubleclick (
静态输入m=low;
m=! m;
数字写入(13,m );
}
实施详细信息:
如果你想知道这个库是如何工作的,这里有:的说明
OneButton库的tick ) )函数中,可以找到输入端子检查的单击、双击或长按情况的实现。 这个实现被称为有限状态机(FSM ),实现以下的状态图:
onebuttonfsm2.jpg(125.13kb,下载次数: 0 ) )。
2021-3-24 00:25上传
每次调用tick ) )函数时,都会显示当前状态,分析当前状态和输入值,并根据需要调用外部函数或更改当前状态。 OneButton库的实现通常会立即返回,因为它不会调用delay ()或类似的函数。 总之,OneButton库可以非常简单地实现有限状态机(FSM ),有助于降低实现的复杂度。