尝试通过在c中输入字符来更改Arduino中LED的亮度

时间:2017-05-15 13:50:15

标签: arduino arduino-uno

我们正在尝试制作一个程序,通过击键来改变连接到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是随机的。我们做错了什么?

2 个答案:

答案 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;
}