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

О скомпилировалось. Правда начиная с 48 строки не понимаю назначение этих строк :thinking: абра кадабра какая-то :grinning:

int qtde;


//  Подключения дисплея
#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 lat = fields[2].toFloat();          // извлекаем широту
      float lon = fields[4].toFloat();          // извлекаем долготу
      float alt = fields[9].toFloat();          // извлекаем высоту
                                                //печать данных
      lcd.setCursor(5, 3);
      lcd.print(alt);  //Высота
      lcd.print(F("  "));
    }
  } else {
    lcd.setCursor(6, 0);
    lcd.print(F("loading"));
  }
}
String* split(String& v, char delimiter, int& length) {
  length = 1;
  bool found = false;
  // Figure out how many itens the array should have
  for (int i = 0; i < v.length(); i++) {
    if (v[i] == delimiter) {
      length++;
      found = true;
    }
  }

тада я тебе не памошник.

Просто я понимаю что с GPS модуля идет сообщения .
Из него нужно выбрать нужную строку , разбить ее на поля, далее выбрать нужное поле и отправить его на дисплей .

Подскажите что не так с моим пониманием в написании скетча?

Всё так, в целом.
Дьявол в деталях.

Вот data.startsWith("$GPGGA") и выделяет нужную строку, а split(data, ',', qtde) разбивает эту строку на поля. Выводите нужные поля на экран !!! Профит !!!

Ни как не доходит что не нравится компилятору Compilation error: ‘split’ was not declared in this scope. японимаю что нужно обьявить ‘split’ но как это сделать ?

int qtde;


//  Подключения дисплея
#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();  // Включаем подсветку дисплея
}
void loop() {
 if (Serial.available()) {
   String data = Serial.readStringUntil('\n');  // читаем строку до символа конец строки
   if (data.startsWith("$GPGGA")) {             // проверяем, является ли сообщение $GPGGA
     String* fields = split(data, ',', qtde);   // разбиваем сообщение на поля
     float lat = fields[2].toFloat();           // извлекаем широту
     float lon = fields[4].toFloat();           // извлекаем долготу
     float alt = fields[9].toFloat();           // извлекаем высоту

     //печать данных

     lcd.print(lat);  //широта
     lcd.setCursor(0, 1);
     lcd.print(lon);  //долгота
     lcd.setCursor(0, 2);

     lcd.print(alt);  //Высота
   }
 }
}

Перечтите утренние посты.

я понимаю если допечатаю эти строки скеч скомпилируется . Вопрос неужели столько строк требуется и без них никак?

String* split(String& v, char delimiter, int& length) {
  length = 1;
  bool found = false;
  // Figure out how many itens the array should have
  for (int i = 0; i < v.length(); i++) {
    if (v[i] == delimiter) {
      length++;
      found = true;
    }
  }
  // If the delimiter is found than create the array
  // and split the String
  if (found) {
    // Create array
    String* valores = new String[length];
    // Split the string into array
    int i = 0;
    for (int itemIndex = 0; itemIndex < length; itemIndex++) {
      for (; i < v.length(); i++) {
        if (v[i] == delimiter) {
          i++;
          break;
        }
        valores[itemIndex] += v[i];
      }
    }
    // Done, return the values
    return valores;
  }
  // No delimiter found
  return nullptr;
}

Это подпрограмма для разделения строки на слова …
Вы на вес ценность программ оцениваете ? Вам эти строки на горбе тащить ???

Я просто стремлюсь к минимуму строк чтобы программа работала и по мере освоения материала усложнять код.

Тогда просто пустой setup и пустой loop.

Я до этого не сталкивался со вспомогательными програмами узнал о них от вас. почитал немного понял что это.

Прошил скетчем ардуино но почему-то на дисплее пусто ничего не печатает на модуле GPS светодиод моргает. Не подскажете что с кодом не так?

int qtde;
//  Подключения дисплея
#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();  // Включаем подсветку дисплея
}
void loop() {
  if (Serial.available()) {
    String data = Serial.readStringUntil('\n');  // читаем строку до символа конец строки
    if (data.startsWith("$GPGGA")) {             // проверяем, является ли сообщение $GPGGA
      String* fields = split(data, ',', qtde);   // разбиваем сообщение на поля
      float lat = fields[2].toFloat();           // извлекаем широту
      float lon = fields[4].toFloat();           // извлекаем долготу
      float alt = fields[9].toFloat();           // извлекаем высоту

      //печать данных

      lcd.print(lat);  //широта
      lcd.setCursor(0, 1);
      lcd.print(lon);  //долгота
      lcd.setCursor(0, 2);
      lcd.print(alt);  //Высота
    }
  }
}
String* split(String& v, char delimiter, int& length) {
  length = 1;
  bool found = false;
  // Figure out how many itens the array should have
  for (int i = 0; i < v.length(); i++) {
    if (v[i] == delimiter) {
      length++;
      found = true;
    }
  }
  // If the delimiter is found than create the array
  // and split the String
  if (found) {
    // Create array
    String* valores = new String[length];
    // Split the string into array
    int i = 0;
    for (int itemIndex = 0; itemIndex < length; itemIndex++) {
      for (; i < v.length(); i++) {
        if (v[i] == delimiter) {
          i++;
          break;
        }
        valores[itemIndex] += v[i];
      }
    }
    // Done, return the values
    return valores;
  }
  // No delimiter found
  return nullptr;
}

Отладка нужна. Код нужен - откуда это выдрано … выделение памяти есть, а очистки не вижу …

Проводок по которому данные идут от gps оставьте как есть, а проводок по которому вещает ардуино восстановите в сторону usb-uart и выводите в serial отладочные данные (data, fields[2], fields[4]… …)
“В тёмную” разобраться не выйдет !

Что бы у меня запустить отладку - мне нужно несколько пакетов с данными из u-center в виде байтов…

Решил попробывать поднять скорость и отключить ненужные пакеты модуля GY-GPS6MV2 через u-centr/.В программе все нашел, отключил пакеты, изменил скорость , после сохранил конфигурацию но при отключении от питания настройки возвращаются обратно ?

Есть и такие что не запоминают. Им при старте передают последовательность байт на 9600. В этих байтах летат команды отключиьь пакетв и поднять скорость. Потом далее уже общаются га новой скорости…

Без библиотеки GPS модуля написать скетч мне не хватает знаний. Написал так как никто в интернете не пишет и заработало задержки конечно есть но в районе 1 сек как и выдает модуль. Подскажите в чем пренципиальная разница раньше я один раз проверялесть ли данные в порте в этом скетче я проверяю каждый раз при запросе разной информации?


#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() {

  //ПЕЧАТЬ СКОРОСТЬ
  if (Serial.available() > 0) {       // ПРОВЕРКА ЕСТЬ ЛИИ ДАННЫЕ в порте было while
    if (gps.encode(Serial.read())) {  // команда библиотеки TinyGPSPlus.h ОБРАБОТКА ДАННЫХ ИЗВЛЕЧЕНИЕ нужной информации
      if (gps.speed.isValid()) {
        lcd.setCursor(15, 3);        // Устанавливаем курсор на 15 символ строку и 4.  
        lcd.print(gps.speed.kmph(), 0);
        lcd.print(F("  "));
      }
    }
  }
  //ПЕЧАТЬ Угол направления
  if (Serial.available() > 0) {       // ПРОВЕРКА ЕСТЬ ЛИИ ДАННЫЕ в порте было while
    if (gps.encode(Serial.read())) {  // команда библиотеки TinyGPSPlus.h ОБРАБОТКА ДАННЫХ ИЗВЛЕЧЕНИЕ нужной информации
      if (gps.course.isValid()) {
        lcd.setCursor(15, 2);              // Устанавливаем курсор на 15 символ строку и 3.   
        lcd.print(gps.course.deg(), 0);
        lcd.print(F("  "));
      }
    }
  }
  //ПЕЧАТЬ Высота
  if (Serial.available() > 0) {       // ПРОВЕРКА ЕСТЬ ЛИИ ДАННЫЕ в порте было while
    if (gps.encode(Serial.read())) {  // команда библиотеки TinyGPSPlus.h ОБРАБОТКА ДАННЫХ ИЗВЛЕЧЕНИЕ нужной информации
      if (gps.altitude.isValid()) {
        lcd.setCursor(5, 3);            // Устанавливаем курсор на 5 символ строку и 4.
        lcd.print(gps.altitude.meters(), 0);
        lcd.print(F("  "));
      }
    }
  }
  //кол-чество спутн
  if (Serial.available() > 0) {       // ПРОВЕРКА ЕСТЬ ЛИИ ДАННЫЕ в порте было while
    if (gps.encode(Serial.read())) {  // команда библиотеки TinyGPSPlus.h ОБРАБОТКА ДАННЫХ ИЗВЛЕЧЕНИЕ нужной информации
      if (gps.satellites.isValid()) {
        lcd.setCursor(5, 2);          // Устанавливаем курсор на 5 символ строку и 3.
        lcd.print(gps.satellites.value());
        lcd.print(F("  "));
      }
    }
  }
  // Дата печать
  if (Serial.available() > 0) {       // ПРОВЕРКА ЕСТЬ ЛИИ ДАННЫЕ в порте было while
    if (gps.encode(Serial.read())) {  // команда библиотеки TinyGPSPlus.h ОБРАБОТКА ДАННЫХ ИЗВЛЕЧЕНИЕ нужной информации
      if (gps.date.isValid()) {
        lcd.setCursor(6, 0);                      // Устанавливаем курсор на 6 символ строку и 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());  // печать год
      }
    }
  }
  // время печать
  if (Serial.available() > 0) {       // ПРОВЕРКА ЕСТЬ ЛИИ ДАННЫЕ в порте было while
    if (gps.encode(Serial.read())) {  // команда библиотеки TinyGPSPlus.h ОБРАБОТКА ДАННЫХ ИЗВЛЕЧЕНИЕ нужной информации
      if (gps.time.isValid()) {
        lcd.setCursor(7, 1);              // Устанавливаем курсор на 7 символ строку и 2.
        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());                   // печать  минут
      }
    }
  }
}

Что в данном случае “принципиальная разница”?
Порт проверяется чаще, вот и всё.

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


#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.

  if (Serial.available() > 0) {       // ПРОВЕРКА ЕСТЬ ЛИИ ДАННЫЕ в порте было while
    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("  "));
      }
    }
  }

Проверяйте только число спутников gps.satellites.value() и если делайте вывод на экран, когда оно больше трёх

Попробывал как вы посоветовали неправильные данные печатататьне стал. Но скорость и угол и высота попрежнему висят и обновляются очень редко. Работает только скетч в котором я порт проверяю чаще прикреплен выше.

А не может быть токого что у ардуино я гдето вычитал буфер всего 64 символа. Она же чтобы проверить данные сравнивает с прошлыми данными которые загружает себе в буфер а у меня их разом собирается не мало. Может в этом причина тормозов :thinking:


#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.

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

      if (gps.satellites.value() > 3) {
        // Дата печать
        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("no gps"));
      }
    }
  }
}