2014-09-02 3 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

ответ

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

вы также можете провести исследование [прерываний] (http://arduino.cc/en/Reference/Interrupts) с этими прерываниями, вы можете справиться с обнаружением нажатия кнопки, не дожидаясь 500 мс – studioj

Смежные вопросы