シリアルモニタが突然動作しない

私はこの問題を数回抱いていましたが、Arduino IDEとシリアルモニターはユーザーエラーでない限り、非常に不安定ですが、壊れる前に何かに触れなかったという事実から判断すると、私はそうではないと言います。

それは前夜に働いていましたが、今朝はコードからシリアルモニタに何も印刷されませんでしたが、ASCIIの例のような通信サンプルコードの1つを起動すると、それはうまく印刷されます...私はarduino unoですが、私には2倍の手数料があります。そのためにスクリプトを試してみましたが、シリアルモニタにはうまく印刷されました。

ここで私のコードは、誰かが自分のコードをチェックして、彼らがシリアルモニタに印刷できるかどうかを見ることができますか?

/*
   Pins:

   RTC:
   5V to VCC
   GND to GDN
   A4 to SDA
   A5 to SLC
*/




#include 
#include "RTClib.h"

#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
#define Serial SerialUSB
#endif

RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

//Words     //0      //1     //2    //3     //4     //5     //6    //7      //8      //9     //10   //11      //12      //13        //14        //15       //16       //17         //18        //19        //20      //21       //22    //23     //24                    //25//26 //27
char* w[] = {"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen", "Twenty", "Thirty", "Forty", "Fifty", "Keeg Jo And Mat 2016", "", " ", "Good",
             //28       //29         //30       //31     //32    //33  //34       //35    //36       //37  //38
             "Morning", "Afternoon", "Evening", "It Is", "Past", "To", "Quarter", "Half", "O'Clock", "AM", "PM"
            };

//End Words

int timeType = 0;
int _hour = 0;

int dayInput = 0;
int hourInput = 0;
int minuteInput = 0;

int iDay = 0;
int iHour = 0;
int iMinute = 0;


void setup() {

#ifndef ESP8266
  while (!Serial);//for Leonardo/Micro/Zero
#endif

  Serial.begin(57600);
  pinMode(11, INPUT);//Minutes
  pinMode(12, INPUT);//Hours
  pinMode(13, INPUT);//Day

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    //rtc.adjust(DateTime(2016, 3, 11, 10, 51, 0));
  }

  //rtc.adjust(DateTime(2016, 3, 11, 1, 0, 50));
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}

void loop() {
  DateTime now = rtc.now();

  minuteInput = digitalRead(11);
  hourInput = digitalRead(12);
  dayInput = digitalRead(13);

  if (minuteInput == HIGH) {
    Serial.println("Minute");
  } else if (hourInput == HIGH) {
    Serial.println("Hour");
  } else if (dayInput == HIGH) {
    Serial.println("Day");
  }

  Line();

  if (now.minute() == 0) {
    timeType = 0;
  } else if (now.minute() > 0 && now.minute() <= 20) {
    timeType = 1;
  } else if (now.minute() > 20 && now.minute() < 50 && now.minute() != 30 && now.minute() != 45) {
    timeType = 0;
  } else if (now.minute() >= 50 && now.minute() < 60) {
    timeType = 2;
  } else if (now.minute() == 30) {
    timeType = 3;
  } else if (now.minute() == 45) {
    timeType = 4;
  }

  ps("Time Type: ");
  pi(timeType);

  Line();
  Line();

  //Greeting
  p(27);
  Space();
  if (now.hour() >= 0 && now.hour() < 12) {
    p(28);
  } else if (now.hour() >= 12 && now.hour() < 18) {
    p(29);
  } else if (now.hour() >= 18 && now.hour() < 24) {
    p(30);
  }

  Line();
  Line();

  //Time (It Is) Time Type 0
  if (timeType == 0) {
    Itis();
    hours(0);
    Space();
    _minutes();
    OClock();
  }

  //Time (Past) Time Type 1
  if (timeType == 1) {
    Itis();
    _minutes();
    Past();
    hours(0);
    OClock();
  }

  //Time (To) Time Type 2
  if (timeType == 2) {
    Itis();
    _minutes();
    To();
    hours(0);
    OClock();
  }

  //Time (Half Past) Time Type 3
  if (timeType == 3) {
    Itis();
    p(35);
    Past();
    hours(0);
  }

  //Time (Quarter To) Time Type 4
  if (timeType == 4) {
    Itis();
    p(34);
    To();
    hours(1);
  }

  //AM/PM
  AMPM();

  Line();
  Line();

  //Day
  //Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  ps(daysOfTheWeek[now.dayOfTheWeek()]);

  Line();
  Line();

  pl(24);

  Serial.println("--------------------------------------------------");
  Serial.println("--------------------------------------------------");

  delay(1000);

}






//------------------------------------------------

void Line() {
  pl(25);
}

void Itis() {
  p(31);
  Space();
}

void Past() {
  Space();
  p(32);
  Space();
}

void To() {
  Space();
  p(33);
  Space();
}

void Space() {
  p(26);
}

void OClock() {
  DateTime now = rtc.now();
  if (now.minute() == 0 || now.minute() == 60) {
    Space();
    p(36);
  }
}

void AMPM() {
  Space();

  DateTime now = rtc.now();

  bool am = false;

  if (now.hour() > 12) {
    am = false;
  } else {
    am = true;
  }

  if (am) {
    p(37);
  } else {
    p(38);
  }
}

void p(int i) {
  Serial.print(w[i]);
}

void pl(int i) {
  Serial.println(w[i]);
}

void ps(char* i) {
  Serial.print(i);
}

void pi(int i) {
  Serial.print(i);
}

void _minutes() {
  DateTime now = rtc.now();
  int minutes = 0;

  if (timeType == 2) {
    minutes = 60 - now.minute();
  } else {
    minutes = now.minute();
  }

  int i = minutes;

  if (i <= 20 && i != 0) {
    p(i);
  } else if (i > 20 && i < 30) {
    p(20);
    Space();
    p(i - 20);
  } else if (i > 30 && i < 40) {
    p(21);
    Space();
    p(i - 30);
  } else if (i > 40 && i < 50 && i != 45) {
    p(22);
    Space();
    p(i - 40);
  } else if (i > 50 && i < 60) {
    p(23);
    Space();
    p(i - 50);
  } else if (i == 30) {
    p(35);
  } else if (i == 40) {
    p(22);
  } else if (i == 50) {
    p(23);
  }

}

void hours(int m) {
  DateTime now = rtc.now();

  if (now.hour() > 12) {
    _hour = now.hour() - 12;
  } else {
    _hour = now.hour();
  }

  _hour = _hour + m;

  p(_hour);
}
0

1 答え

  //rtc.adjust(DateTime(2016, 3, 11, 1, 0, 50));
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

Arduinoをリセットするたびに、RTC時計はスケッチを編集した日付/時刻に戻されます。確かにあなたはそれを望んでいないのですか?


別のスケッチを試すときに同意するので、シリアルモニタは全く不安定ではありません。したがって、あなたのスケッチにはバグがあり、それを見つける必要があります。

ハードウェアの問題が考えられます。読み込み中に通信が失われた場合、デフォルトのWireライブラリはハングします。あなたの時計のハードウェアについて記述できますか?あなたが自分ではんだ付けしたチップですか?ボード?もしそうなら、どちらですか? SDA/SCLにプルアップ抵抗がありますか?

あなたが試みることができる代替I2Cライブラリがあります。


あなたの印刷方法は確かに珍しいことです。たとえば、次のように呼び出します。

Line ();

あなたは簡単に(そしてより多くの可読性)呼び出すことができます:

Serial.println ();

同様に Space のようになります。


それでも、読みにくいコードにもかかわらず、印刷が失敗する可能性のあるループは見えません。 rtc.now()の呼び出しをコメントアウトしてテストすることをお勧めします。それがうまくいけば、印刷の問題ではなく、クロックの問題があることを確認できます。

私はあなたに複数の呼び出しがあることに注意してください:

DateTime now = rtc.now();

...コード全体に散らばっています。確かに、ループごとに一度だけ時間を読む必要がありますか?

now 変数をループの外に置き、次のように1回だけ呼び出します。

DateTime now; 

void loop() {
  now = rtc.now();

次に、 rtc.now()の他の呼び出しを削除します。


私はそれが実際にハングアップしたことを(RTC接続なしで)テストしたときに見つかりました。しかし、それは失敗した rtc.now()呼び出しでした。あなたがそれをコメントアウトすると、それはうまく印刷されます。

例えば。

Minute

Time Type: 0

Good Morning

It Is Six Twenty Eight AM



Keeg Jo And Mat 2016
--------------------------------------------------
--------------------------------------------------
Minute

Time Type: 0

Good Morning

It Is Six Twenty Eight AM



Keeg Jo And Mat 2016
--------------------------------------------------
--------------------------------------------------

それは間違いなくクロックの問題であり、シリアル印刷の問題ではないことを示しています。

1
追加された
こんにちはニック、私はちょうど何かに気付きました、ボードの名前を取得するためにボードからクロックモジュールを取り出したときに、シリアルモニターを再び印刷し始めました。しかし、それは印刷されています 'それはゼロの午前はAM'です...
追加された 著者 xandriksson,
私は問題を発見したかもしれないと思うかもしれませんが、ピンの1つがボードから緩んで来て、はんだがすぐに来ました、私はそれをはんだ付けしてみて、
追加された 著者 xandriksson,
ああ、これらの珍しい印刷方法については、できるだけシンプルにコードを保管しようとしています。経験の浅いコーダーと一緒に作業しています。特に経験はありません。
追加された 著者 xandriksson,
すべての罰金今、はんだ付けされている必要があります...
追加された 著者 xandriksson,