我按照切换按钮试图使LED闪烁 . 如果我第一次按下第一个拨动开关,LED以5 Hz的频率闪烁,当我第二次按下切换按钮时,LED以6 Hz的频率闪烁,当我第三次按下时,LED熄灭 .
我尝试使用下面的程序,但它没有按我的意愿工作 .
// constants won't change. They're used here to set pin numbers:
const int buttonPin = 7; // the number of the pushbutton pin
const int ledPin = 6; // the number of the LED pin
// variables will change:
int buttonState = 0;
// variable for reading the pushbutton status
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
Serial.begin(9600);
}
void loop() {
int x=0;
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
Serial.print(x);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH && x==0) {
// turn LED on:
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
Serial.print(x);
} else {
// turn LED off:
x = x+1;
}
if (buttonState == HIGH && x==1) {
// turn LED on:
digitalWrite(ledPin, HIGH);
delay(2000);
digitalWrite(ledPin, LOW);
delay(2000);
Serial.print(x);
} else {
// turn LED off:
digitalWrite(ledPin, LOW);
x = x+1;
}
if (buttonState == HIGH && x==2) {
// turn LED on:
digitalWrite(ledPin, HIGH);
delay(3000);
digitalWrite(ledPin, LOW);
delay(3000);
Serial.print(x);
} else {
// turn LED off:
digitalWrite(ledPin, LOW);
x = x+1;
}
if (buttonState == HIGH && x==3) {
// turn LED off:
digitalWrite(ledPin, LOW);
x = 0;
}
}
当我使用这个代码时,它适用于第一种情况,即LED在1000毫秒延迟时闪烁,但如果我切换开关它再次适用于第一个条件 . 如何使其执行第二个条件,即以2000毫秒的延迟闪烁?
4 回答
首先这是你的电路 . 我试过这个电路和代码并为我工作 . 我用中断检查按钮状态 . 毫安计算很简单 .
频率= 1 /周期
期间= Ton Toff
6Hz = 1000毫斯/吨=> T = 166毫安
166 = Ton Toff(%50占空比Ton = Toff)=> Ton = Toff = 83 millis
enter image description here
现在,您的逻辑在单个循环中检查x的值为3次 . 当x大于零时,下面的代码会切换光 . 按下按钮时,x的值会改变 .
但是这里存在一个很大的问题:如果在处理器中发生了其他事情或者正在休眠时按下按钮(例如您想要使用的长延迟),则可能会忽略该按钮 . 因此,您可以更好地研究中断并使用它们实现此行为 .
您应该创建应用程序的全局状态 . 如果你以50hz / 60hz / off的速度闪烁,你可以记住这个状态 . 然后你可以使用开关来做正确的事情 .
然后检查按钮是否按下并更改应用程序状态 .
请参阅下面的示例:
我希望你理解我试图用示例代码说的和演示 .
您的代码无法运行:
您需要检查按钮状态是否发生变化,检测何时有边缘 . 并确保只检测一次边缘 .
您必须重复循环闪烁直到按下按钮,然后您才能更改频率 .
您必须在睡觉时检查按钮,否则当您按下按钮时程序无法识别 .
要使其工作,您必须更改完整的程序 .
更好的方法是使用硬件PWM模块并在按钮边缘之后更改值 .