2017-05-15 66 views
-2

我們正試圖製作一個程序,通過擊鍵改變連接到我們Arduino的LED的亮度。 C串行端口通信部分已經完成,但我們在Arduino部分遇到了一些問題。試圖通過在c中輸入字符來改變Arduino中LED的亮度

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」和減少當我們進入「B」,但發生的事情是隨機的亮度變化輸入和15時增加一個輸入B時的。你可以看到B的行爲與我們的意圖完全相反,A是隨機的。我們做錯了什麼?

+1

儘量使亮度的字符,而不是一個int – OldProgrammer

+2

首先,後是*調整亮度的代碼移動邊界測試*。否則,您最終會將0-255之外的值發送到analogWrite。我對Arduinos有更多的具體建議不夠熟悉,但這是任何系統上的一個通用問題。 – Torp

+0

同意。在你的情況下,如果亮度爲250,則brigthness> 255的條件將爲false,然後將亮度增加15,並將此值寫入AnalogOutput。 –

回答

1

與您的代碼的一個主要問題是,由於您使用deger作爲一個全局變量,並loop反覆調用,增加/減少的亮度每次循環運行時間將被應用,而不是一次只有一個,按鍵被接收。

你可以通過幾種方法之一來解決這個問題。您可以在loop的末尾清除deger。您還可以根據第一個if條件將最後3個if語句放在括號內,以便只讀取字符時才能運行。

然而,最合理的是隻是爲了讓deger在「loop`開始聲明的局部變量,因爲沒有必要讓它調用之間仍然存在:

void loop() { 
    char deger = 0; 
0

首先,我將使用開關而不是3個if。

二,修改內,如果到:

switch(deger) 
{ 
case 'A': 
     if(brightness+15>=255) 
      { 
      brightness = 0; 
      } 
     brightness=brightness+15; 
     analogWrite (LedPin, brightness); 
break; 
}