Ошибки при опросе 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);
}
--------------------------------------------------------------------------- #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 читает, но видимо определяет их как не верные. По какому принципу они сравниваются?:
while (gpsSerial.available()) { int b = gpsSerial.read(); //в TinyGPS есть ошибка: не обрабатываются данные с \r и \n Serial.println(b); if ('\r' != b) { if (gps.encode(b)) return true; }Раз в несколько минут проскакивает время, а в основном ничего....
Короче, пошёл другим путём - нашёл другой код. В часах на Меге работает наура.
Завтра попробую на Леонардо.
ua6em, спасибо
//#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(50, 51); void gpsdump(TinyGPS &gps); bool newdata = false; unsigned long start; 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 m; int h; // --------------------------------------- Setup -------------------------------------- void setup() { gpsSerial.begin(9600); Serial.begin(9600); myOLED.begin(); myOLED.setFont(MegaNumbers); Wire.begin(); } // --------------------------------------- Работа -------------------------------------- void loop() { bool newdata = false; unsigned long start = millis(); // Every 5 seconds we print an update while (millis() - start < 5000) { if (gpsSerial.available()) { char c = gpsSerial.read(); //Serial.print(c); // uncomment to see raw GPS data if (gps.encode(c)) { newdata = true; break; // uncomment to print new data immediately! } } } if (newdata) { gpsdump(gps); } // ============================================= Вывод на дисплей ================================== //Clock.setHour(05); //Clock.setMinute(05); m = Clock.getMinute(); h = Clock.getHour(h12, PM); if (h < 10) { myOLED.print("0", 5, 16); myOLED.printNumI(h, 29, 16); } else { myOLED.printNumI(h, 5, 16); } myOLED.print("-", 53, 16); if (m < 10) { myOLED.print("0", 77, 16); myOLED.printNumI(m, 101, 16); } else { myOLED.printNumI(m, 77, 16); } myOLED.update(); delay(500); myOLED.setFont(MegaNumbers); if (h < 10) { myOLED.print("0", 5, 16); myOLED.printNumI(h, 29, 16); } else { myOLED.printNumI(h, 5, 16); } myOLED.print("/", 53, 16); if (m < 10) { myOLED.print("0", 77, 16); myOLED.printNumI(m, 101, 16); } else { myOLED.printNumI(m, 77, 16); } myOLED.update(); delay(200); } // ---------------------------------- Данные с GPS и синхронизация --------------------------------------- void gpsdump(TinyGPS &gps) { unsigned long age, date, time, chars; int year; byte month, day, hour, minute, second, hundredths; unsigned short sentences, failed; gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age); Serial.print(h); Serial.println(" "); Serial.println(m); Serial.println(" "); h = hour + 5; if (h > 23) { h = h - 24; } Clock.setHour(h); Clock.setMinute(minute); }