Seriële monitor werkt plotseling niet

Ik heb dit probleem een ​​paar keer gehad, het lijkt erop dat de Arduino IDE en de seriële monitor ongelooflijk onstabiel zijn, tenzij het een gebruikersfout is, maar afgaande op het feit dat ik nog niets had aangeraakt voordat het kapot ging, zou ik zeggen dat ik het niet ben.

Het werkte de avond ervoor, maar vanmorgen wilde het gewoon niets van de seriële monitor afdrukken vanuit mijn code, maar als ik een van de voorbeeldcodes voor communicatie zoals het ASCII-voorbeeld start, wordt het prima afgedrukt ... Ik gebruik de arduino uno, maar ik heb ook een paar rechten, dus ik probeerde het script op de vervaldatum en het drukte goed af op de seriële monitor.

Hier is mijn code, kan iemand mijn code controleren en kijken of ze kunnen afdrukken naar de seriële monitor of niet?

/*
   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 antwoord

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

Telkens wanneer u de Arduino reset, wordt de RTC-klok teruggezet naar de datum/tijd waarop u de schets hebt gecompileerd. Dat wil je toch niet?


De seriële monitor is helemaal niet onstabiel, omdat je het ermee eens bent wanneer je een andere schets probeert. Daarom heeft je sketch een bug, die je moet vinden.

Een mogelijk probleem is hardware. De standaard Draadbibliotheek blijft hangen als de communicatie verloren gaat tijdens het lezen. Kun je je klokhardware beschrijven? Is het een chip die je zelf hebt gesoldeerd? Een bord? Zo ja, welke? Heeft u pull-up weerstanden op SDA/SCL?

Er is een alternatieve I2C-bibliotheek die je zou kunnen proberen.


Uw manier van afdrukken is zeker ongebruikelijk. U belt bijvoorbeeld:

Line ();

Wanneer je net zo gemakkelijk (en veel meer leesbaar) kunt bellen:

Serial.println ();

Evenzo voor spatie enzovoort.


Ondanks de zeer moeilijk leesbare code, zie ik nog steeds geen lussen die ervoor kunnen zorgen dat het afdrukken mislukt. Ik stel voor dat u de aanroep van rtc.now() opneemt en test. Als het werkt, bevestigt dit dat u een probleem met de klok hebt en niet met afdrukken.

Ik merk dat je meerdere oproepen hebt om:

DateTime now = rtc.now();

... verspreid over uw code. Je hoeft toch maar één keer de tijd te lezen, per loop?

Zet de variabele now buiten de lus en noem hem maar één keer, zoals deze:

DateTime now; 

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

Verwijder vervolgens de andere oproepen naar rtc.now() .


Ik vond toen ik testte (zonder een verbonden RTC) dat het inderdaad hing. Maar dat was de rtc.now() oproep mislukt. Als je dat opmerkt, wordt het prima afgedrukt.

bv.

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
--------------------------------------------------
--------------------------------------------------

Dat laat zien dat het zeker een probleem met de klok is, en geen probleem met serieel afdrukken.

1
toegevoegd
Hoi Nick, ik heb net iets opgemerkt, toen ik de klokmodule uit het bord trok om de naam van het bord te krijgen begon het opnieuw met het seriële scherm te printen ... toen ik het weer erin zette begon het hetzelfde te printen als wat je hierboven geplaatst, maar het is 'It Is Zero O'Clock AM' aan het printen ...
toegevoegd de auteur xandriksson, de bron
Ik denk dat ik het probleem misschien heb gevonden, een van de pennen is losgekomen van het bord, het soldeer is eraf gekomen, ik zal het opnieuw solderen en kijken of dat het repareert
toegevoegd de auteur xandriksson, de bron
Oh en wat betreft die ongebruikelijke afdrukmethoden, ik probeer gewoon mijn code zo simpel mogelijk te houden, ik werk met een aantal onervaren programmeurs, niet dat ik bijzonder ervaren ben, bovendien vind ik het eigenlijk best leuk!
toegevoegd de auteur xandriksson, de bron
Alles goed nu, moet het solderen zijn geweest ...
toegevoegd de auteur xandriksson, de bron