Ошибки при опросе NEO-6M в коде часов
- Войдите на сайт для отправки комментариев
Вс, 26/03/2017 - 17:04
Ребята, подскажите - отдельный код для NEO-6M работает, координаты и время идут чётко. Но если я встраиваю исполнительные его части в код часов то информацию с GPS не получаю, или она с ошибками идёт.... Если отключаю часть кода кот отвечает за вывод на дисплей, то данные иногда проскакивают.
Делаю часы с синхронизацией от GPS на Leonardo, дисплее OLED 0,96, модуле DS3121 и NEO-6M
Сразу говорю - новичок в этом.
Код кот работает с NEO-6M:
---------------------------------------------------------------------------
#include <TinyGPS.h> #include <SoftwareSerial.h> TinyGPS gps; SoftwareSerial gpsSerial(9, 8); bool newdata = false; unsigned long start; //long lat, lon; unsigned long time, date; int time_ch; int time_m; int time_c; void setup() { gpsSerial.begin(9600); // скорость обмена с GPS-приемником Serial.begin(9600); } void loop() { // задержка в секунду между обновлениями координат if (millis() - start > 1000) { newdata = readgps(); //Serial.println(newdata); if (newdata) { start = millis(); gps.get_datetime(&date, &time); Serial.print(time); time_c=time/1000000; time_ch=time_c+5; time_m=time/10000-time_c*100; Serial.print(" Chas: "); Serial.println(time_ch); Serial.print(" Min: "); Serial.println(time_m); } } } // проверка наличия данных bool readgps() { while (gpsSerial.available()) { int b = gpsSerial.read(); //в TinyGPS есть ошибка: не обрабатываются данные с \r и \n if ('\r' != b) { if (gps.encode(b)) return true; } } return false; } ----------------------------------------------------------------------------------------------- Код часов где нет инфы с GPS: ------------------------------------------------------ //#include <TinyGPS++.h> #include <DS3231.h> #include <OLED_I2C.h> #include <Wire.h> #include <TinyGPS.h> #include <SoftwareSerial.h> DS3231 Clock; OLED myOLED(SDA, SCL, 8); TinyGPS gps; SoftwareSerial gpsSerial(9, 8); bool newdata = false; unsigned long start; long lat, lon; unsigned long time, date; int time_ch; int time_m; int time_c; extern uint8_t MegaNumbers[]; bool Century = false; bool h12; bool PM; int minute; int hour; // --------------------------------------- Setup -------------------------------------- void setup() { gpsSerial.begin(9600); Serial.begin(9600); myOLED.begin(); myOLED.setFont(MegaNumbers); Wire.begin(); } // ============================= Чтение данных из GPS приемника ================================= bool readgps() { //Serial.println("= = = = = = = = ="); while (gpsSerial.available()) { int b = gpsSerial.read(); //в TinyGPS есть ошибка: не обрабатываются данные с \r и \n if ('\r' != b) { if (gps.encode(b)) return true; } } return false; } // --------------------------------------- Работа -------------------------------------- void loop() { if (millis() - start > 1000) { newdata = readgps(); Serial.println(newdata); if (newdata) { Serial.println("11111111111"); start = millis(); gps.get_datetime(&date, &time); Serial.print(time); time_c = time / 1000000; time_ch = time_c + 5; time_m = time / 10000 - time_c * 100; Serial.print(" Chas: "); Serial.print(time_ch); Serial.print(" Min: "); Serial.println(time_m); //Clock.setHour(05); //Set the hour //Clock.setMinute(05); //Set the minute } } minute = Clock.getMinute(); hour = Clock.getHour(h12, PM); // ============================================= Вывод на дисплей ================================== myOLED.setFont(MegaNumbers); if (hour < 10) { myOLED.print("0", 5, 16); myOLED.printNumI(hour, 29, 16); } else { myOLED.printNumI(hour, 5, 16); } myOLED.print("-", 53, 16); if (minute < 10) { myOLED.print("0", 77, 16); myOLED.printNumI(minute, 101, 16); } else { myOLED.printNumI(minute, 77, 16); } myOLED.update(); delay(500); myOLED.setFont(MegaNumbers); if (hour < 10) { myOLED.print("0", 5, 16); myOLED.printNumI(hour, 29, 16); } else { myOLED.printNumI(hour, 5, 16); } myOLED.print("/", 53, 16); if (minute < 10) { myOLED.print("0", 77, 16); myOLED.printNumI(minute, 101, 16); } else { myOLED.printNumI(minute, 77, 16); } myOLED.update(); delay(500); }
Если кого интересует - два добавочных крупных шрифта для часов (только цифры):
https://www.youtube.com/edit?o=U&video_id=XE5SeftS-nc
Ну неужели никто не поможет?
Знающему, скорее всего, это элементарно
Может временные накладки где-то? Питание всё отфильтровано.
Или библиотеку другую надо может?... Капец, двое суток коту под хвост...
нехватка динамической памяти похоже
Если соберу на Меге поможет?
Собрал на Меге - данные с NEO читает, но видимо определяет их как не верные. По какому принципу они сравниваются?:
Раз в несколько минут проскакивает время, а в основном ничего....
Короче, пошёл другим путём - нашёл другой код. В часах на Меге работает наура.
Завтра попробую на Леонардо.
ua6em, спасибо