原因:因为loop会无限循环,当按下按钮时会一直输出1,当松开按钮时会一直输出0,所以判断的时候if(digitalRead(BUT) == 1)判断条件不稳定(这里不稳定的意思是if(digitalRead(BUT) == 1)会重复执行,造成ledState = !ledState的值一直改变)
#define BUT D2 //定义按钮的针脚 #define LED D9 //定义LED灯的针脚 boolean ledState = LOW; // 初始化LED灯的值 void setup() { pinMode(BUT, INPUT); //设置针脚为输入 pinMode(LED, OUTPUT); //设置针脚为输出 Serial.begin(115200); //串口初始化 } void loop() { if(digitalRead(BUT) == 1){ //Serial.println(digitalRead(BUT)); //值为1 ledState = !ledState; Serial.println(ledState); //ledState值不稳定 digitalWrite(LED, ledState); }else{ //Serial.println(digitalRead(BUT));//值为0 } }
原理:使用中间值的方式稳定判断条件,在if(b1 != butState)的执行体中当按下按钮时control的值会加1,松开按钮又会加1,所以当control=2的执行if(control == 2)判断条件稳定(稳定的意思是if(control == 2)只会执行一次,这样就会解决ledState = !ledState值不稳定的情况。)
#define BUT D2 #define LED D9 boolean butState = LOW; boolean ledState = LOW; byte control = 0; void setup() { pinMode(BUT, INPUT); pinMode(LED, OUTPUT); Serial.begin(115200); //串口初始化 } void loop() { // 死循环--未按下按钮值0 按下按钮值1 boolean b1 = digitalRead(BUT); if(b1 != butState){ delay(20);//缓冲震动 // 只执行一次--未按下按钮值0 按下按钮值1 boolean b2 = digitalRead(BUT); if(b2 == b1) { // 只执行一次--未按下按钮值0 按下按钮值1 butState = b1; // 按一次按钮执行两次 control++; } } if(control == 2){ control = 0; // 默认值0 取反值1 ledState = !ledState; Serial.println(ledState); //ledState值稳定 digitalWrite(LED, ledState); } }
ps:开发板信息
原文:https://www.cnblogs.com/kinblog/p/11800096.html