我正在使用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");
}
}
答案 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();
}