【问题标题】:optimising Arduino This Code优化 Arduino 这段代码
【发布时间】:2014-09-02 06:04:00
【问题描述】:

我制作了一个光传感器,所以当外面很黑时,它会打开灯。 所以我现在连接了光敏传感器和一个按钮来校准。 我想知道您是否有任何提示如何优化这个巨大的代码...... 我确定那里有,因为我是 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; 
}

【问题讨论】:

    标签: arduino


    【解决方案1】:

    快速浏览一下,第一个建议可能是:

    添加一个功能来做重复性的工作

    同一个动作我至少见过你两次

    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 sync() 总是返回一个 0

    你总是可以改写如下:

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

    第三个注释可能是写一致,例如总是在新行开始一个 { 或一个 }。为了获得清晰的概述(但这是个人风格),您可以像我上面所做的那样确保它是一行中唯一的字符。 还要记住标识,在每个“{”后添加一些额外的 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); 
    

    }

    【讨论】:

    • 您还可以对interrupts 进行一些研究,使用这些中断您可以处理按钮按下的检测,而无需等待 500 毫秒
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    相关资源
    最近更新 更多