3

私は、arduino を使用した最初の物理コンピューティング プロジェクトに取り組んでいます。実際には、seeduino stalker 2.1 です。時間の経過に伴う水の収集率を記録するデバイスを構築しています。

プロジェクトをセットアップして実行することは、今日までそれほど難しくありませんでした。メイン ループ内で、ログを処理する a メソッドを呼び出します。また、データを要約して 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");
    }
}
4

3 に答える 3

1

Q: なぜ delay() の代わりに Alarm.delay() を使用しなければならないのですか? A: タスクのスケジューリングは、Alarm.delay 関数で処理されます。タスクは Alarm.delay 呼び出し内から監視およびトリガーされるため、スケッチで遅延が必要な場合はいつでも Alarm.delay を呼び出す必要があります。スケッチが外部イベント (センサーの変更など) を待機している場合は、センサーのチェック中に Alarm.delay を繰り返し呼び出すようにしてください。

アラーム ライブラリの FAQ から。したがって、Alarm.Delay は標準の遅延と同じように見えますが、スケジュールされたイベントによって中断される可能性があります。ロギング呼び出しはスケジュールされていません。ループの開始時に発生するだけです。..ロギングがまったく行われていませんか? 各ループの開始時に呼び出され、遅延中にリピーターが発火して 1300 遅延する必要があるようです。

于 2013-01-04T16:51:33.233 に答える
0

タイマーライブラリを使用して他の方法で行うこともできたと思います。データを毎秒ログに記録する必要があると言う場合は、タイマーで行う方が簡単です。コード例

#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();
}
于 2014-01-08T12:39:23.270 に答える
0

logdata() 関数では、delay(50)代わりに呼び出していますAlarm.delay(50)

caude が指摘したように、遅延が必要な場合は Alarm.delay を使用する必要があります。そうしないと、遅延によってアラームが台無しになります。

于 2013-06-08T23:23:44.897 に答える