なぜ時間が更新されないのですか?

私はarduinoクロック/アラームを作りました。私は時間を表示するために、液晶画面を使用します。

void loop(){
    static unsigned long timing=micros();
    if (mode == 0) {//mode 0 is when the time should show
        timing=countTime(timing);
        writeTime(minutes, hours);//display time
  }
}
  unsigned long countTime(unsigned long timing){
            if (micros() - timing >= 59946970) {
              return timing += 59946970;//more precise because Arduino timing is not perfect
              minutes++;


    }
        else{

         return timing;
        }

      }


    void writeTime(int minute, int hour) {
      lcd.setCursor(6, 1);
      if (minute >= 60) {
        minute = 0;
        hour++;
      }
      if (hour >= 24) {
        hour = 0;
      }
      if (minute < 10) {

        if (hour < 10) {
          lcd.print(String("0") + hour + ":" + "0" + minute);
        }
        else {
          lcd.print(hour + String(":") + "0" + minute);
        }
      }
      else {
        if (hour < 10) {
          lcd.print(String("0") + hour + ":" + minute);
        }
        else {
          lcd.print(hour + String(":") + minute); //possibly split if problems arise
        }

      }

  }

私はループの中でこれをやっていましたが、それを別にすることに決めました。なぜこのコードは動作しませんか?

0

1 答え

この文:

static unsigned long timing=micros();

...これには初期値しか与えられません。 loop 中には実行されません。この種の変数は、おそらくアラーム時間が設定されているときに、実行可能なセクションに初期値を割り当てる必要があります。

これには、定義をファイルスコープに引き出す必要があります。

static unsigned long timing;

void loop(){
    if (mode == 0) {//mode 0 is いつ the time should show
        timing=countTime(timing);

ここでは、 static キーワードは別の意味を持っていますが、通常は他のグローバル変数名との衝突の可能性を減らすために使用します。

実行可能コードのどこかに初期値を指定してください:

void setup()
{
  ...
  timing = millis(); //Just once?  いつ the alarm is set?
}

... countTime のように更新してください。


更新 It's not clear from your snippet as to いつ the timing variable should be initialized, so I originally avoided addressing that. If it is really initialized just once, at program startup, you can set it in setup. Otherwise, it should be set いつ the initial timing value is finally known.

1
追加された
すべてのループを割り当てると、なぜ静的になりますか?また、フォームの問題として、静的変数にデフォルト値を割り当てる常に割り当てる必要があります。
追加された 著者 Majenko,
LOLはif文の内側にあり、 setup で初期化されます。
追加された 著者 slash-dev,