Ошибки при опросе NEO-6M в коде часов

alexbel620017
Offline
Зарегистрирован: 26.03.2017

Ребята, подскажите - отдельный код для 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);
}

 

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

---------------------------------------------------------------------------
#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);
}

 

alexbel620017
Offline
Зарегистрирован: 26.03.2017

Если кого интересует - два добавочных крупных шрифта для часов (только цифры):

https://www.youtube.com/edit?o=U&video_id=XE5SeftS-nc

alexbel620017
Offline
Зарегистрирован: 26.03.2017

Ну неужели никто не поможет?

Знающему, скорее всего, это элементарно

alexbel620017
Offline
Зарегистрирован: 26.03.2017

Может временные накладки где-то? Питание всё отфильтровано.

alexbel620017
Offline
Зарегистрирован: 26.03.2017

Или библиотеку другую надо может?...  Капец, двое суток коту под хвост...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

нехватка динамической памяти похоже

alexbel620017
Offline
Зарегистрирован: 26.03.2017
кетч использует 14502 байт (50%) памяти устройства. Всего доступно 28672 байт.
Глобальные переменные используют 1683 байт (65%) динамической памяти, оставляя 877 байт для локальных переменных. Максимум: 2560 байт.
 
Это о чём-то говорит?
alexbel620017
Offline
Зарегистрирован: 26.03.2017

Если соберу на Меге поможет?

alexbel620017
Offline
Зарегистрирован: 26.03.2017

Собрал на Меге - данные с NEO читает, но видимо определяет их как не верные. По какому принципу они сравниваются?:

while (gpsSerial.available())
  {
    int b = gpsSerial.read();
    //в TinyGPS есть ошибка: не обрабатываются данные с \r и \n
    Serial.println(b);
    if ('\r' != b)
    {
      if (gps.encode(b))
        return true;
    }

Раз в несколько минут проскакивает время, а в основном ничего....

alexbel620017
Offline
Зарегистрирован: 26.03.2017

Короче, пошёл другим путём - нашёл другой код. В часах на Меге работает наура.

Завтра попробую на Леонардо.

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);
}