3 термопары и tft дисплей SPI ILI9225 к шине SPI

Это тупиковый подход.
Нужно не “как можно точнее”, а “с приемлемой точностью и за приемлемое время”.

Ну вот вроде все заработало.
Осталось :
1)добавить команду очистки определенных ячеек перед печатью данных а то при снижении к примеру скорости с 12 км/ч до 8 км/ч вместо 8 км/ч пишет 82км/ч.
2) И понять почему .С утра включив в гараже плату сразу отобразилась дата 2000 год число и месяц не помню странно ведь перед печатью даты я использую команду if (gps.date.isValid()) (проверка являются ли данные даты верные ) и далее в программе если не верны то печать “–”

#include <TinyGPSPlus.h>  //Библиотека GPS модуля

TinyGPSPlus gps;  //Создаём объект gps класса TinyGPSPlus.

int hour;     // обЪявление переменной час
int GMT = 5;  // обЪявление переменной часовой пояс

//  Подключения дисплея
#include <Wire.h>                    // библиот для общения по I2C
#include <LiquidCrystal_I2C.h>       // библиот работы с символьным жк-дисплеем  по I2C
LiquidCrystal_I2C lcd(0x27, 20, 4);  // Устанавливаем характеристики дисплея

void setup() {
  Serial.begin(9600);  //задаем скорость общения по USB


  lcd.init();       // инициализация ЖК дисплея
  lcd.backlight();  // Включаем подсветку дисплея
  // Печатаем оформление на  дисплее то что не меняется
  lcd.clear();  //
  lcd.print("Date");
  lcd.setCursor(0, 1);
  lcd.print("clock");
  lcd.setCursor(0, 2);
  lcd.print("spyt=");
  lcd.setCursor(9, 2);
  lcd.print("<=");
  lcd.setCursor(0, 3);
  lcd.print("H=");
  lcd.setCursor(9, 3);
  lcd.print("skor=");
  delay(1000);
}
void loop() {
  // This sketch displays information every time a new sentence is correctly encoded.

  while (Serial.available() > 0) {    // ПРОВЕРКА ЕСТЬ ЛИИ ДАННЫЕ в порте
    if (gps.encode(Serial.read())) {  // команда библиотеки TinyGPSPlus.h ОБРАБОТКА ДАННЫХ ИЗВЛЕЧЕНИЕ нужной информации


      // Дата печать
      if (gps.date.isValid()) {
        lcd.setCursor(6, 0);                      // Устанавливаем курсор на 5 строку и 1.
        if (gps.date.day() < 10) lcd.print("0");  //печать 0 перед днем если меньше 10
        lcd.print(gps.date.day());                // печать день
        lcd.print(F("/"));
        if (gps.date.month() < 10) lcd.print(F("0"));  //печать 0 перед месяцом если меньше 10
        lcd.print(gps.date.month());                   // печать месяц
        lcd.print(F("/"));
        lcd.print(gps.date.year());  // печать год
      } else {
        lcd.setCursor(6, 0);
        lcd.print(F("--"));
      }
      // время
      if (gps.time.isValid()) {
        lcd.setCursor(7, 1);              // Устанавливаем курсор на 5 строку и 1.
        hour = gps.time.hour() + GMT;     // расчет переменной час с учетом часового пояса
        if (hour > 23) hour = hour - 24;  // Вычитаем 24 когда часы переходят за 23 часа
        if (hour < 10) lcd.print("0");    //печать 0 перед часом если меньше 10
        lcd.print(hour);                  // печать часа
        lcd.print(F(":"));
        if (gps.time.minute() < 10) lcd.print(F("0"));  //печать 0 перед часом если меньше 10
        lcd.print(gps.time.minute());                   // печать  минут
        lcd.print(F(":"));
        if (gps.time.second() < 10) lcd.print(F("0"));  //печать 0 перед часом если меньше 10
        lcd.print(gps.time.second());                   // печать  минут

      } else {
        lcd.setCursor(7, 1);
        lcd.print(F("--"));
      }
      //кол-чество спутн
      if (gps.satellites.isValid()) {
        lcd.setCursor(5, 2);
        lcd.print(gps.satellites.value());
      } else {
        lcd.setCursor(5, 2);
        lcd.print(F("--"));
      }
      //Высота
      if (gps.altitude.isValid()) {
        lcd.setCursor(2, 3);
        lcd.print(gps.altitude.meters(), 1);
      } else {
        lcd.setCursor(2, 3);
        lcd.print(F("--"));
      }
      //Угол направления
      if (gps.course.isValid()) {
        lcd.setCursor(12, 2);
        lcd.print(gps.course.deg(), 1);
      } else {
        lcd.setCursor(12, 2);
        lcd.print(F("--"));
      }
      //Скорость
      if (gps.speed.isValid()) {
        lcd.setCursor(14, 3);
        lcd.print(gps.speed.kmph(), 0);
      } else {
        lcd.setCursor(14, 3);
        lcd.print(F("--"));
      }
    }
  }
}

1 после 100 строки надо вывести 2 пробела на экран
2 думаю надо ориентироваться на валидность времени, а не даты

1 Прикольно оказывается так просто, а я уже думал как использовать команду lcd.clear(); с выбором очистки определенных ячеек.
2.То-есть проверять только if (gps.time.isValid()) и после печатать сразу дату и время, а команду (gps.date.isValid()) вобще не использовать правильно?

ага, только задержки изменения скорости от этого только вырастут

Это точно работает?

Да, чудес ведь не бывает

Что-то у меня зашло в тупик. Вот мой скетч который тормозит но секунды времени в нем тикают на дисплее как положено . Скорость отказывается отображать коректно. Но стоит мне оставить только скорость в кетче я задокументировать в коде все данные кроме скорости сразу отображение скорости приходит в норму.
В чем может быть причина может цикл содержит слишком много строк и его надо разделить на несколько ?


#include <TinyGPSPlus.h>  //Библиотека GPS модуля

TinyGPSPlus gps;  //Создаём объект gps класса TinyGPSPlus.

int hour;     // обЪявление переменной час
int GMT = 5;  // обЪявление переменной часовой пояс

//  Подключения дисплея
#include <Wire.h>                    // библиот для общения по I2C
#include <LiquidCrystal_I2C.h>       // библиот работы с символьным жк-дисплеем  по I2C
LiquidCrystal_I2C lcd(0x27, 20, 4);  // Устанавливаем характеристики дисплея

void setup() {
  Serial.begin(9600);  //задаем скорость общения по USB


  lcd.init();       // инициализация ЖК дисплея
  lcd.backlight();  // Включаем подсветку дисплея
  // Печатаем оформление на  дисплее то что не меняется
  lcd.clear();  //
  lcd.print("Date");
  lcd.setCursor(0, 1);
  lcd.print("clock");
  lcd.setCursor(0, 2);
  lcd.print("spyt=");
  lcd.setCursor(10, 2);
  lcd.print("ugol=");
  lcd.setCursor(0, 3);
  lcd.print("   H=");
  lcd.setCursor(10, 3);
  lcd.print("skor=");
  delay(1000);
}
void loop() {
  // This sketch displays information every time a new sentence is correctly encoded.

  while (Serial.available() > 0) {    // ПРОВЕРКА ЕСТЬ ЛИИ ДАННЫЕ в порте
    if (gps.encode(Serial.read())) {  // команда библиотеки TinyGPSPlus.h ОБРАБОТКА ДАННЫХ ИЗВЛЕЧЕНИЕ нужной информации

      if (gps.location.isValid()) {
        /*
        // Дата печать
        lcd.setCursor(6, 0);                      // Устанавливаем курсор на 5 строку и 1.
        if (gps.date.day() < 10) lcd.print("0");  //печать 0 перед днем если меньше 10
        lcd.print(gps.date.day());                // печать день
        lcd.print(F("/"));
        if (gps.date.month() < 10) lcd.print(F("0"));  //печать 0 перед месяцом если меньше 10
        lcd.print(gps.date.month());                   // печать месяц
        lcd.print(F("/"));
        lcd.print(gps.date.year());  // печать год
        // время печать
        lcd.setCursor(7, 1);              // Устанавливаем курсор на 5 строку и 1.
        hour = gps.time.hour() + GMT;     // расчет переменной час с учетом часового пояса
        if (hour > 23) hour = hour - 24;  // Вычитаем 24 когда часы переходят за 23 часа
        if (hour < 10) lcd.print("0");    //печать 0 перед часом если меньше 10
        lcd.print(hour);                  // печать часа
        lcd.print(F(":"));
        if (gps.time.minute() < 10) lcd.print(F("0"));  //печать 0 перед часом если меньше 10
        lcd.print(gps.time.minute());                   // печать  минут
        lcd.print(F(":"));
        if (gps.time.second() < 10) lcd.print(F("0"));  //печать 0 перед часом если меньше 10
        lcd.print(gps.time.second());                   // печать  минут

        lcd.setCursor(5, 2);
        lcd.print(gps.satellites.value());  //кол-чество спутн
        lcd.print(F("  "));



        lcd.setCursor(15, 2);
        lcd.print(gps.course.deg(), 0);  //Угол направления
        lcd.print(F("  "));

        lcd.setCursor(5, 3);
        lcd.print(gps.altitude.meters(), 0);  //Высота
        lcd.print(F("  "));
*/
        lcd.setCursor(15, 3);
        lcd.print(gps.speed.kmph(), 0);
        lcd.print(F("  "));

      } else {
        lcd.setCursor(6, 0);
        lcd.print(F("loading"));
      }
    }
  }
}

Да и еще когда я перенес печать скорости угла и высоты в цикле первыми дисплй начал печатать в место где угол дату :exploding_head:


#include <TinyGPSPlus.h>  //Библиотека GPS модуля

TinyGPSPlus gps;  //Создаём объект gps класса TinyGPSPlus.

int hour;     // обЪявление переменной час
int GMT = 5;  // обЪявление переменной часовой пояс

//  Подключения дисплея
#include <Wire.h>                    // библиот для общения по I2C
#include <LiquidCrystal_I2C.h>       // библиот работы с символьным жк-дисплеем  по I2C
LiquidCrystal_I2C lcd(0x27, 20, 4);  // Устанавливаем характеристики дисплея

void setup() {
  Serial.begin(9600);  //задаем скорость общения по USB


  lcd.init();       // инициализация ЖК дисплея
  lcd.backlight();  // Включаем подсветку дисплея
  // Печатаем оформление на  дисплее то что не меняется
  lcd.clear();  //
  lcd.print("Date");
  lcd.setCursor(0, 1);
  lcd.print("clock");
  lcd.setCursor(0, 2);
  lcd.print("spyt=");
  lcd.setCursor(10, 2);
  lcd.print("ugol=");
  lcd.setCursor(0, 3);
  lcd.print("   H=");
  lcd.setCursor(10, 3);
  lcd.print("skor=");
  delay(1000);
}
void loop() {
  // This sketch displays information every time a new sentence is correctly encoded.

  while (Serial.available() > 0) {    // ПРОВЕРКА ЕСТЬ ЛИИ ДАННЫЕ в порте
    if (gps.encode(Serial.read())) {  // команда библиотеки TinyGPSPlus.h ОБРАБОТКА ДАННЫХ ИЗВЛЕЧЕНИЕ нужной информации

      if (gps.location.isValid()) {
        
         lcd.setCursor(15, 3);
        lcd.print(gps.speed.kmph(),0);
        lcd.print(F("  "));

        lcd.setCursor(15, 2);
        lcd.print(gps.course.deg(),0);  //Угол направления
         lcd.print(F("  "));
      
      lcd.setCursor(5, 3);
        lcd.print(gps.altitude.meters(),0);  //Высота
         lcd.print(F("  "));
         
      // Дата печать
        lcd.setCursor(6, 0);                      // Устанавливаем курсор на 5 строку и 1.
        if (gps.date.day() < 10) lcd.print("0");  //печать 0 перед днем если меньше 10
        lcd.print(gps.date.day());                // печать день
        lcd.print(F("/"));
        if (gps.date.month() < 10) lcd.print(F("0"));  //печать 0 перед месяцом если меньше 10
        lcd.print(gps.date.month());                   // печать месяц
        lcd.print(F("/"));
        lcd.print(gps.date.year());  // печать год
        // время печать
        lcd.setCursor(7, 1);              // Устанавливаем курсор на 5 строку и 1.
        hour = gps.time.hour() + GMT;     // расчет переменной час с учетом часового пояса
        if (hour > 23) hour = hour - 24;  // Вычитаем 24 когда часы переходят за 23 часа
        if (hour < 10) lcd.print("0");    //печать 0 перед часом если меньше 10
        lcd.print(hour);                  // печать часа
        lcd.print(F(":"));
        if (gps.time.minute() < 10) lcd.print(F("0"));  //печать 0 перед часом если меньше 10
        lcd.print(gps.time.minute());                   // печать  минут
        lcd.print(F(":"));
        if (gps.time.second() < 10) lcd.print(F("0"));  //печать 0 перед часом если меньше 10
        lcd.print(gps.time.second());                   // печать  минут

        lcd.setCursor(5, 2);
        lcd.print(gps.satellites.value());  //кол-чество спутн
         lcd.print(F("  "));

        

       
      } else {
        lcd.setCursor(6, 0);
        lcd.print(F("loading"));
      }
    }
  }
}

Я не пользуюсь TinyGPSPlus и не могу сказать что там и как работает/не работает.
Я принимаю только пакеты navpvt от родного протокола UBX и сам их распарсиваю …
Всё работает без зависаний - я отображаю два раза в секунду …

Я тоже ушел от этих библиотек GPS пытаюсь написать скетч без нее пока не идет выдает ошибку.
Подскажите что нужно поправить в скетче чтобы заработало?

int hour;     // обЪявление переменной час
int GMT = 5;  // обЪявление переменной часовой пояс
int data;
int qtde;
int alt;
int split;
//  Подключения дисплея
#include <Wire.h>                    // библиот для общения по I2C
#include <LiquidCrystal_I2C.h>       // библиот работы с символьным жк-дисплеем  по I2C
LiquidCrystal_I2C lcd(0x27, 20, 4);  // Устанавливаем характеристики дисплея

void setup() {
  Serial.begin(9600);  //задаем скорость общения по USB


  lcd.init();       // инициализация ЖК дисплея
  lcd.backlight();  // Включаем подсветку дисплея
  // Печатаем оформление на  дисплее то что не меняется
  lcd.clear();  //
  lcd.print("Date");
  lcd.setCursor(0, 1);
  lcd.print("clock");
  lcd.setCursor(0, 2);
  lcd.print("spyt=");
  lcd.setCursor(10, 2);
  lcd.print("ugol=");
  lcd.setCursor(0, 3);
  lcd.print("   H=");
  lcd.setCursor(10, 3);
  lcd.print("skor=");
  delay(1000);
}
void loop() {
  if (Serial.available()) {
    String data = Serial.readStringUntil('\n');
    if (data.startsWith("$GPGGA")) {            // проверяем, является ли сообщение GGA
      String* fields = split(data, ',', qtde);  // разбиваем сообщение на поля
     
      float alt = fields[9].toFloat();          // извлекаем высоту
       //печать данных
      lcd.setCursor(5, 3);
    lcd.print(alt), 0);  //Высота
    lcd.print(F("  "));

    } else {
      lcd.setCursor(6, 0);
      lcd.print(F("loading"));
    }
  }
}

Что делает split() и откуда вы списали эту строчку?
В строке 42 что происходит?

Коипилятор пишет явно - что ему не нравится.

Вы бы для начала разобрались с включение/отключением пакетов данных, с измпрением скорости обмена-через u-center Может и с tinygps зарабоиает нормально.

В картинках …

Списал от сюда Подключение GPS NEO-6M к ESP32 с примерами кода.

В строке 42 печатаем значение высоты извлеченное из сообщения от GPS. ошибку увидел надо писать lcd.print(alt);

Могли бы вы скинуть какой нибудь скетч где данные берутся из сообщения и распарсиваются? Пожалуйста :slightly_smiling_face:

Я в 100500 раз сообщаю, что у меня нет кода для сообщений NMEA !

Что компилятору не нравитьсявсе уже перепробывал? ошибка Compilation error: ‘split’ cannot be used as a function

int hour;     // обЪявление переменной час
int GMT = 5;  // обЪявление переменной часовой пояс
int data;
int qtde;
int alt;
int split;
//  Подключения дисплея
#include <Wire.h>                    // библиот для общения по I2C
#include <LiquidCrystal_I2C.h>       // библиот работы с символьным жк-дисплеем  по I2C
LiquidCrystal_I2C lcd(0x27, 20, 4);  // Устанавливаем характеристики дисплея

void setup() {
  Serial.begin(9600);  //задаем скорость общения по USB


  lcd.init();       // инициализация ЖК дисплея
  lcd.backlight();  // Включаем подсветку дисплея
  // Печатаем оформление на  дисплее то что не меняется
  lcd.clear();  //
  lcd.print("Date");
  lcd.setCursor(0, 1);
  lcd.print("clock");
  lcd.setCursor(0, 2);
  lcd.print("spyt=");
  lcd.setCursor(10, 2);
  lcd.print("ugol=");
  lcd.setCursor(0, 3);
  lcd.print("   H=");
  lcd.setCursor(10, 3);
  lcd.print("skor=");
  delay(1000);
}
void loop() {
  if (Serial.available()) {
    String data = Serial.readStringUntil('\n');
    if (data.startsWith("$GPGGA")) {            // проверяем, является ли сообщение GGA
      String* fields = split(data, ',', qtde);  // разбиваем сообщение на поля

      float alt = fields[9].toFloat();  // извлекаем высоту
                                        //печать данных
      lcd.setCursor(5, 3);
      lcd.print(alt);  //Высота
      lcd.print(F("  "));
    }
  } else {
    lcd.setCursor(6, 0);
    lcd.print(F("loading"));
  }
}

Но не до конца.

в 6 строке у тебя чо написано? И в 37-й

В esp32 может и есть такая функция - там памяти побольше …