2014-09-02 151 views
0

我製作了一個光傳感器,所以當它在外面黑暗時會打開燈。 所以我連接了現在的光敏傳感器和一個按鈕來校準。 我想知道你是否有任何提示如何優化這個巨大的代碼... 我敢肯定,有什麼地方,因爲我是新的Arduino。優化Arduino此代碼

#include <LiquidCrystal.h> 

const int RED_Pin = 9; 
const int GREEN_Pin = 10; 
const int BLUE_Pin = 11; 
const int PHOTO_sense = 0; 
const int Button = 12; 
int RoomLight; 
int Sensor; 

LiquidCrystal lcd(7,6,5,4,3,2); 

void setup() 
{ 


    lcd.begin(16,2); 
    lcd.clear(); 
pinMode(RED_Pin,OUTPUT); 
pinMode(GREEN_Pin,OUTPUT); 
pinMode(BLUE_Pin,OUTPUT); 
pinMode(Button,INPUT); 
Serial.begin(9600); 
sync(); 
Serial.print(Button); 
} 


void loop(){ 
    Sensor = analogRead(PHOTO_sense); 
    Sensor = map(Sensor,0,1023,0,255); 
    Sensor = constrain(Sensor,0,255); 
    if(Sensor < RoomLight-5){ 
    digitalWrite(RED_Pin,LOW); 
    digitalWrite(GREEN_Pin,HIGH); 
    }else{ 
    digitalWrite(GREEN_Pin,LOW); 
    digitalWrite(RED_Pin,HIGH); 
    } 
    delay(500); 
    if(digitalRead(Button)==0){ //Buton Is Pressed so We Need to Sync 
    delay(2000); 
     if(digitalRead(Button) == 0){ 
      sync(); 
     } 
    delay(2500); 
    } 
} 

int sync(){ 
    lcd.clear(); 
    lcd.print("Calibriting"); 
    int compre [4]; 
    int Sum=0; 
    for (int Loop = 4;Loop>0;Loop--){ 
    lcd.print("."); 
    delay(500); 
    digitalWrite(BLUE_Pin,HIGH); 
    compre[Loop] = analogRead(PHOTO_sense); 
    delay(500); 
    digitalWrite(BLUE_Pin,LOW); 

    Sum=Sum+compre[Loop]; 
    } 
    RoomLight = Sum/4;  
    RoomLight = map(RoomLight,0,1023,0,255); 
    RoomLight = constrain(RoomLight,0,255);  
    lcd.clear(); 

    lcd.print("done Calibration"); 
    delay(2500); 
return 0; 
} 
+0

任何運氣這麼遠? – studioj 2014-09-11 16:58:16

回答

0

在快速瀏覽的第一個建議可以是:

添加功能做重複工作

我看你至少兩次以同樣的動作

Sensor = map(Sensor,0,1023,0,255); 
Sensor = constrain(Sensor,0,255); 
RoomLight = map(RoomLight,0,1023,0,255); 
RoomLight = constrain(RoomLight,0,255); 

你可以添加像這樣的功能

int recalc_light(input) 
{ 
    retVal = map(input, 0, 1023, 0, 255); 
    return constrain(retVal, 0, 255); 
} 

然後調用它是這樣的:

Sensor = recalc_light(analogRead(PHOTO_sense)); 
RoomLight = recalc_light(Sum/4); 

其次,我看到你的函數int同步()總是返回0

你總是可以如下重寫:

void sync() 
{ 
    lcd.clear(); 
    ... 
    ... 
    lcd.print("done Calibration"); 
    delay(2500); 
} 

第三評論可能會一直寫,例如總是在新行上開始一個{或a}。對於一個清晰的概述(但這是個人風格),你可以像我一樣確保它是唯一的字符。 還要記住身份,在每個'{'後添加一些額外的2或4個空格。

通過這種方式,您的代碼看起來會更好。

舉例:

void sync() 
{ 
    lcd.clear(); 
    lcd.print("Calibriting"); 
    int compre [4]; 
    int Sum=0; 
    for (int Loop = 4;Loop>0;Loop--) 
    { 
      lcd.print("."); 
      delay(500); 
      digitalWrite(BLUE_Pin,HIGH); 
      compre[Loop] = analogRead(PHOTO_sense); 
      delay(500); 
      digitalWrite(BLUE_Pin,LOW); 
      Sum=Sum+compre[Loop]; 
    } 
    RoomLight = recalc_light(Sum/4);  
    lcd.clear(); 
    lcd.print("done Calibration"); 
    delay(2500); 

}

+0

你也可以利用這些中斷對[interrupts](http://arduino.cc/en/Reference/Interrupts) 進行一些研究,你可以處理檢測按鈕的按下而不必等待500 ms – studioj 2014-09-02 15:00:51