Серійний монітор раптом не працює

У мене проблема ця кілька разів, здається, що IDE Arduino, а серійний монітор неймовірно нестабільний, якщо це не помилка користувача, але, судячи з того, що я навіть не торкнувся нічого, перш ніж він зламався, я б сказав, це не я.

Він працював вночі раніше, але сьогодні вранці він просто не друкуватиме що-небудь з монітора серії з мого коду, однак, якщо я почну один з кодів прикладів комунікації, наприклад, приклад ASCII, він друкує добре ... Я використовую arduino uno, але у мене також є пари зборів, тому я спробував скрипт належним чином і надруковано належним чином до серійного монітора.

Ось мій код, чи зможе хтось перевірити мій код і дізнатись, чи зможе він надрукувати його на моніторі серійного чи ні?

/*
   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 за межами циклу та зателефонуйте її лише один раз, як це:

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
додано
Привіт Нік, я щойно помітив, коли я витягнув годинниковий модуль з плати, щоб отримати назву плати, він почав друкувати знову серійний монітор ... тоді, коли я його знову поклав, він почав друкувати так само, як ви введений вище, однак це друк "It Zero O'Clock AM" ...
додано Автор xandriksson, джерело
Подумайте, що я, можливо, знайшов проблему, один з шпильок звільнився від дошки, припой прийшов відразу, я постараюсь паяти його і подивитися, що це виправляє це
додано Автор xandriksson, джерело
О, і для тих незвичайних методів друку я просто намагаюся зберегти свій код настільки простим, наскільки це можливо, я працюю з деякими недосвідченими програмістами, не те, що я особливо досвідчений, хоча, крім того, мені дуже сподобалося!
додано Автор xandriksson, джерело
Все в порядку тепер, мабуть, паяльник ...
додано Автор xandriksson, джерело
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147