Arduino循环和警报

时间:2013-01-01 20:07:44

标签: arduino

我正在使用arduino进行我的第一个物理计算项目,实际上是一个seeduino跟踪者2.1。我正在建立一个记录水收集率的设备。

让项目建立和运行并不是那么难,直到今天。在主循环内部,我调用了一个处理日志记录的方法。我现在还有一个报警延迟来处理我需要的计时器重复,以便汇总数据并通过SMS将其发送到收件人号码。

问题是当alarm.repeat()处于活动状态时,它会抢占数据的日志记录。问题是:当alarm.delay存在时,为什么循环内的日志记录方法不起作用?

void setup() {
  Serial.begin(9600);
  Wire.begin();
  setTime(1,17,0,1,1,13); // set time
  Alarm.timerRepeat(60, Repeats); //set repeater

}

void loop(){
  logging(); //call logging
  Alarm.delay(1300); //for repeater
}

void Repeats(){
  Serial.println("the repeater fired"); // just to see it working
} 

void logging(){

   val = digitalRead(Sensor_Pin);  // read Sensor_Pin
  if (val == HIGH) {         
    // If Sensor N.C. (no with magnet) -> HIGH : Switch is open / LOW : Switch is closed 
    // If Sensor N.0. (nc with magnet) -> HIGH : Switch is closed / LOW : Switch is open 
    digitalWrite(Led_Pin, LOW);  //Set Led low
    //Serial.print("status -->");
    //Serial.println("low");
    //delay(500);
  } else {
    digitalWrite(Led_Pin, HIGH);  //Set Led high
      logdata();
  } 
}

void logdata(){

    // open the file. note that only one file can be open at a time,
    // so you have to close this one before opening another.
    File myFile = SD.open("datalog.txt", FILE_WRITE);

    // if the file opened okay, write to it:
    if (myFile) {

      //DateTime now = RTC.now();
      //String myString = readTimestamp(now);
      time_t t = now();
      String aDate = String(year(t))+"/"+String(month(t))+"/"+String(day(t))+" "+String(hour(t))+":"+String(minute(t))+":"+String(second(t));
      myFile.println(aDate);
    // close the file:
      myFile.close();
      Serial.println(aDate);
      delay(500); } else {
      // if the file didn't open, print an error:
      // Serial.println("error opening DATALOG.TXT");
    }
}

3 个答案:

答案 0 :(得分:1)

  

问:为什么我必须使用Alarm.delay()而不是delay()?答:任务调度   在Alarm.delay函数中处理。任务受到监控   从Alarm.delay调用中触发,因此应该是Alarm.delay   在草图中需要延迟时调用。如果你的草图   等待外部事件(例如,传感器更改),确保   在检查传感器的同时反复调用Alarm.delay。

来自Alarm库的FAQ。所以它看起来像Alarm.Delay就像标准的延迟,但可以被预定的事件打断。您的日志记录调用未安排,它只是在循环开始时发生。 ..你的日志记录根本没有发生?看起来应该在每个循环开始时调用,然后在延迟期间中继器触发1300延迟。

答案 1 :(得分:0)

在您的logdata()函数中,您正在调用delay(50)而不是Alarm.delay(50)

正如警告所指出的那样,当需要延迟时你必须使用Alarm.delay,否则延迟会使报警陷入困境。

答案 2 :(得分:0)

我认为您可以使用计时器库以其他方式完成。如果你说每秒都要记录数据,那么timer更容易完成。示例代码

#include <SimpleTimer.h>

// the timer object
SimpleTimer timer;

// a function to be executed periodically
void repeatMe() {
    Serial.print("Uptime (s): ");
    Serial.println(millis() / 1000);
}

void setup() {
    Serial.begin(9600);
    timer.setInterval(1000, repeatMe);
}

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