我们正在尝试制作一个程序,通过击键来改变连接到Arduino的LED的亮度。 c-serial端口通信部分已完成,但我们在Arduino部分遇到了一些问题。
int LedPin = 3;
int brightness = 90;
char deger;
void setup () {
Serial.begin(9600);
pinMode(LedPin, OUTPUT);
}
void loop () {
if(Serial.available()>0)
deger = Serial.read();
if(deger== 'C') {
brightness = 0;
analogWrite (LedPin, brightness);
} //to set the brightness to 0 after an error
if(deger== 'A') {
if(brightness>=255)
brightness = 0;
brightness=brightness+15; // to increase led brightness by 15 with every entry
analogWrite (LedPin, brightness);
}
if(deger== 'B') {
if(brightness<=0)
brightness = 254;
brightness=brightness-15; //to decrease led brightness by 15 with every entry
analogWrite (LedPin, brightness);
}
}
当我们进入A&#39;我们希望亮度增加。当我们输入B&#39;时会减少,但是当输入A时亮度会随机变化,当输入B时亮度会增加15。你可以看到B的行为与我们的意图完全相反,A是随机的。我们做错了什么?
答案 0 :(得分:1)
您的代码的一个主要问题是,因为您使用deger
作为全局变量,并且重复调用loop
,所以每次循环运行时都会应用亮度的增加/减少,而不是仅在收到按键时才一次。
您可以通过以下几种方式之一来解决这个问题。您可以在deger
结束时清除loop
。您还可以根据第一个if
条件将最后3个if
语句括在括号中,这样只有在读取字符时它们才会运行。
然而,最合乎逻辑的是让deger
在'loop`的开头声明一个局部变量,因为没有必要让它在调用之间保持不变:
void loop () {
char deger = 0;
答案 1 :(得分:0)
首先,我会使用开关而不是3 if。
其次,将内部if修改为:
switch(deger)
{
case 'A':
if(brightness+15>=255)
{
brightness = 0;
}
brightness=brightness+15;
analogWrite (LedPin, brightness);
break;
}