Это тупиковый подход.
Нужно не “как можно точнее”, а “с приемлемой точностью и за приемлемое время”.
Ну вот вроде все заработало.
Осталось :
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()) вобще не использовать правильно?
ага, только задержки изменения скорости от этого только вырастут
Это точно работает?
Да, чудес ведь не бывает