О скомпилировалось. Правда начиная с 48 строки не понимаю назначение этих строк абра кадабра какая-то
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;
}
Я до этого не сталкивался со вспомогательными програмами узнал о них от вас. почитал немного понял что это.
Прошил скетчем ардуино но почему-то на дисплее пусто ничего не печатает на модуле 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(" "));
}
}
}
Попробывал как вы посоветовали неправильные данные печатататьне стал. Но скорость и угол и высота попрежнему висят и обновляются очень редко. Работает только скетч в котором я порт проверяю чаще прикреплен выше.
А не может быть токого что у ардуино я гдето вычитал буфер всего 64 символа. Она же чтобы проверить данные сравнивает с прошлыми данными которые загружает себе в буфер а у меня их разом собирается не мало. Может в этом причина тормозов
#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"));
}
}
}
}