延迟循环内的Arduino倒计时

时间:2013-12-06 03:38:48

标签: arduino

我的第一个Arduino项目是一个很棒的学习经历。我现在想要添加一个倒计时,直到获取并显示传感器读数,这将无限重复。我的传感器和LCD显示器工作正常,但我的循环不太正确..我应该使用某种类型的while()吗?如何在读数之间的大延迟期间保持定时器滴答?

/*Code for self-watering plant with LCD readout*/
// value for LCD params
char ESC = 0xFE;
// analog input pin that the soil moisture sensor is attached to
const int analogInPin = A1;  
// value read from the soil moisture sensor
int sensorValue = 0;
// if the readings from the soil sensor drop below this number, then turn on the pump
int dryValue;  
// countdown timer until next soil reading
int timerValue = 9; 

void setup() {
  pinMode(12, OUTPUT); 
  // initialize serial communications at 9600 bps:
  Serial.begin(9600); 
  // Set the "dry" value of soil on turning on the device
  dryValue = analogRead(analogInPin); 
  // pause before intialize LCD
  delay(2000);
  // Initialize LCD module
  Serial.write(ESC);
  Serial.write(0x41);
  Serial.write(ESC);
  Serial.write(0x51);
  // Set Contrast
  Serial.write(ESC);
  Serial.write(0x52);
  Serial.write(40);
  // Set Backlight
  Serial.write(ESC);
  Serial.write(0x53);
  Serial.write(5);

  //print the dry value to serial
  Serial.print("Dry = " ); 
  Serial.print(dryValue);
  Serial.print("   ");
}

void loop(){
  watering();
  // wait some time (really should be delay(86400000))
  delay(10000);                
}

void printTimer(){  
  // Set cursor line 1, column 16
  Serial.write(ESC);
  Serial.write(0x45);
  Serial.write(0x0F);
  // print the timer value
  Serial.print(timerValue);
  timerValue = timerValue - 1;
  if(timerValue == 0){
  timerValue = 9;
  }
}

void printVal(){
  // set cursor line 2, column 1
  Serial.write(ESC);
  Serial.write(0x45); 
  Serial.write(0x40);  
  // print the sensor to the serial monitor:
  Serial.print("Sensor = " );                       
  Serial.print(sensorValue);
  Serial.print("   ");
  printTimer();
  } 

void watering(){
  // read the analog in value:
  sensorValue = analogRead(analogInPin);                   
  //turn on the water pump for some time if the soil is too dry
  if(sensorValue < dryValue){
    digitalWrite(12, HIGH);
    delay(2000);
    digitalWrite(12, LOW);
  }
  else {
  printVal();
  }
}

2 个答案:

答案 0 :(得分:0)

实际上非常简单:不要拖延。相反,初始化计时器以在程序溢出或达到某个值时运行例程。检查Arduino中使用的微控制器的数据表,了解特定位到frob(注意Arduino库自己使用定时器0溢出向量),以及avr-libc documentation如何表示ISR(s)计时器。然后,当计时器为您运行整个节目时,loop()会变成一个大sleep

答案 1 :(得分:0)

我会像这样http://playground.arduino.cc//Code/SimpleTimer

使用Arduino的计时器库

只需下载库,将其放入sketchbook的“libraries”文件夹中,然后重新启动Arduino IDE即可加载新库。

然后你的代码看起来像这样。基本上它是什么它每个循环更新屏幕,然后每86400000毫秒一次它检查“浇水”功能。只是你知道这个代码每24小时只检查一次土壤(86400000ms)。我认为更好的解决方案是在需要时随时检查土壤和水。但我不是园丁所以也许有理由每天只检查一次。

 #include <SimpleTimer.h>

// the timer object
SimpleTimer timer;

void setup() {
  Serial.begin(9600);
  timer.setInterval(86400000, watering); // how often you would call your watering function is set with the first variable
}

void loop() {
  timer.run();
  printTimer();
}

void printTimer(){  
  // Set cursor line 1, column 16
  Serial.write(ESC);
  Serial.write(0x45);
  Serial.write(0x0F);
  // print the timer value
  Serial.print(timerValue);
  timerValue = timerValue - 1;
  if(timerValue == 0){
    timerValue = 9;
  }
}

void printVal(){
  // set cursor line 2, column 1
  Serial.write(ESC);
  Serial.write(0x45); 
  Serial.write(0x40);  
  // print the sensor to the serial monitor:
  Serial.print("Sensor = " );                       
  Serial.print(sensorValue);
  Serial.print("   ");
  printTimer();
} 

void watering(){
  // read the analog in value:
  sensorValue = analogRead(analogInPin);                   
  // send it to the display
  printVal();
  //turn on the water pump for some time if the soil is too dry
  if(sensorValue < dryValue){
    digitalWrite(12, HIGH);
    delay(2000);
    digitalWrite(12, LOW);
  }
}