Подключение UBLOX M8N к Arduino

AdDa
Offline
Зарегистрирован: 06.05.2019

Имеется вот такой модуль GPS  UBLOX M8N

Подскажите пожалуйста рабочий скетч для работы с ним. Пробовал найденный проект на гитхабе,  Arduino_Parser_Ublox_Neo_M8N  - почему то не работает, к модулю подключается  шлет одни нули, хотя по индикатору на модуле видно, что к спутнику подключился и получает данные (зеленый светодиод горит), переключаешь его к компу, чтоб работал через ucenter - данные шлет нормальные, как ток к ардуино - нули...

sadman41
Offline
Зарегистрирован: 19.10.2016

Скорость не та, поди. В u-center (консоль) блохастый NMEA шлет или свои, мю-строки?

AdDa
Offline
Зарегистрирован: 06.05.2019

Не скорость перепроверял, везде сделано 115200... 
U center шлет 

??:??:??  $GNRMC,,V,,,,,,,,,,N*4D
??:??:??  $GNVTG,,,,,,,,,N*2E
??:??:??  $GNGGA,,,,,,0,00,99.99,,,,,,*56
??:??:??  $GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E
??:??:??  $GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E
??:??:??  $GPGSV,1,1,01,28,,,23*73
??:??:??  $GLGSV,1,1,04,,,,25,,,,25,,,,25,,,,25*61
??:??:??  $GNGLL,,,,,,V,N*7A

Мне бы знать точно, если скетч 100% рабочий, то тогда разбираться что не так, я просто не уверен, что рабочий скетч 

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

надо 9600

AdDa
Offline
Зарегистрирован: 06.05.2019

но в скетче 115200....  и конфиг файл для модуля на 115200 настроен 

AdDa
Offline
Зарегистрирован: 06.05.2019

Тут все настроил как мне надо - работает, на скорости 115200.
Перехожу в Arduino 
 

#include "Ublox.h"
#define SERIAL_BAUD 115200
#define GPS_BAUD 115200
#define N_FLOATS 4

Ublox M8_Gps;
// Altitude - Latitude - Longitude - N Satellites
float gpsArray[N_FLOATS] = {0, 0, 0, 0};

void setup() {
   Serial.begin(SERIAL_BAUD);
   Serial1.begin(GPS_BAUD);
 
}

void loop() {
   if(!Serial1.available())
		return;

  while(Serial1.available()){
        char c = Serial1.read();
         if (M8_Gps.encode(c)) {
          gpsArray[0] = M8_Gps.altitude;
          gpsArray[1] = M8_Gps.latitude;
          gpsArray[2] = M8_Gps.longitude; 
          gpsArray[3] = M8_Gps.sats_in_use;
        }
  }
  for(byte i = 0; i < N_FLOATS; i++) {
    Serial.print(gpsArray[i], 6);Serial.print(" ");
  }
  Serial.println("");
}

он мне шлет нули 

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

ну не знаю, как скетч расшаривает один и тот же порт

AdDa
Offline
Зарегистрирован: 06.05.2019

Есть варианты с другим скетчем , где данные идут не нули? Или вы не пользовались  таким?

sadman41
Offline
Зарегистрирован: 19.10.2016

.

AdDa
Offline
Зарегистрирован: 06.05.2019

Пробовал, ставить 9600 в конфиге и в скетче - тоже самое... 
А подключать надо к ардуино на 3.3. вольта или 5 вольт или разницы нету?

sadman41
Offline
Зарегистрирован: 19.10.2016

Спустите Serial1 и UART блохастого на 9600 для начала. Заработает - будете подымать. Для контроля выводите в Serial тот самый char c сразу после считывания.

У меня модуль тоже на M8 - он на 5V нормально работает. 

На фото, кстати, не восьмерка.

Точно рабочий скетч - это тот, который с одного порта берет, в другой суёт.

AdDa
Offline
Зарегистрирован: 06.05.2019

Так на 115200 в U center работает, зачем спускать на 9600 ?
сейчас по новой попробую....
"На фото, кстати, не восьмерка." вот это поворот! )))А что ?)
китайцы заверяли что M8N , но прошифка не заливается -  флэш памяти нету, так я подумал что М8 просто)))

sadman41
Offline
Зарегистрирован: 19.10.2016

На железке NEO-7M написано.

AdDa
Offline
Зарегистрирован: 06.05.2019

ааа , ну это да фото с алиэкспресса  у меня 8ка написана)

sadman41
Offline
Зарегистрирован: 19.10.2016

А вообще - сдается мне, что вывод массива не на месте. Ему бы внутри if (..encode()) находится. Иначе лупит он почем зря, путает карты принимающему порту. При равной скорости неясно, кто одеяло перетянет на себя - Serial или Serial1.

AdDa
Offline
Зарегистрирован: 06.05.2019

поставил 9600 - все тоже самое...
вот так написать if (M8_Gps.encode())  ??? 

sadman41
Offline
Зарегистрирован: 19.10.2016

Начните с простого скетча - читаем с Serial1, печатаем в Serial. Без библиотек. Скорость Serial1 должна быть меньше, чем у Serial. Иначе в трубу Б не будет успевать вытекать то, что через трубу А втекает.

AdDa
Offline
Зарегистрирован: 06.05.2019
#define SERIAL_BAUD 38400
#define GPS_BAUD 9600
void setup() {
   Serial.begin(SERIAL_BAUD);
   Serial1.begin(GPS_BAUD);
 
}

void loop() {
        char c = Serial1.read();
    Serial.print(c, 6);Serial.print(" ");
 
  Serial.println("");
}

Ну что то показывает.... 
 

1550104015152 
1550104015503 
252 
0 
1550104015210 
0 
215 
241 
1550104015334 
1550104015145 
32 
14 
1550104015503 
1550104015254 
212 
325 
1550104015503 
0 
15 
252 
1 
0 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

if (Serial1.available() ... ) - это ни о чём Вам не не говорит?

http://arduino.ru/Reference/Serial/Read

AdDa
Offline
Зарегистрирован: 06.05.2019

Вот что я понял... 
байты идут, но проходя через библиотеку M8_Gps.encode(incomingByte) байтов нету... 
 при таком раскладе 

void loop() {
   if(!Serial1.available())
		return;

  while(Serial1.available()){
        char c = Serial1.read();
        incomingByte = Serial1.read();
         if (M8_Gps.encode(incomingByte)) {
          gpsArray[0] = M8_Gps.altitude;
          gpsArray[1] = M8_Gps.latitude;
          gpsArray[2] = M8_Gps.longitude; 
          gpsArray[3] = M8_Gps.sats_in_use;
        }
  }
  for(byte i = 0; i < N_FLOATS; i++) {
    Serial.print(gpsArray[i], 6);Serial.print(" ");
  }
  
  Serial.println("Байты без библиоткеи");
  Serial.println(incomingByte, DEC);

}
 

Я получаю 

0.000000 0.000000 0.000000 0.000000 
Байты без библиоткеи
25
0.000000 0.000000 0.000000 0.000000 
Байты без библиоткеи
0
0.000000 0.000000 0.000000 0.000000 
Байты без библиоткеи
36
0.000000 0.000000 0.000000 0.000000 
Байты без библиоткеи
0
0.000000 0.000000 0.000000 0.000000 
Байты без библиоткеи
5
0.000000 0.000000 0.000000 0.000000 
Байты без библиоткеи
1

 

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

Кстати, вы точно на mega2560 пытаете? Или в крайней случает на 328PB у неё вроде два сериала

sadman41
Offline
Зарегистрирован: 19.10.2016
#define SERIAL_BAUD 38400
#define GPS_BAUD 9600
void setup() {
  Serial.begin(SERIAL_BAUD);
  Serial1.begin(GPS_BAUD);
}

void loop() {
  if (Serial1.available() > 0) {
    char c = Serial1.read();
    Serial.print(c);
  }
}

 

AdDa
Offline
Зарегистрирован: 06.05.2019

да, на мега

AdDa
Offline
Зарегистрирован: 06.05.2019

sadman41 пишет:

#define SERIAL_BAUD 38400
#define GPS_BAUD 9600
void setup() {
  Serial.begin(SERIAL_BAUD);
  Serial1.begin(GPS_BAUD);
}

void loop() {
  if (Serial1.available() > 0) {
    char c = Serial1.read();
    Serial.print(c);
  }
}

 

Данные идут

sadman41
Offline
Зарегистрирован: 19.10.2016

Тогда см. моё сообщение #14 и своё #19. Разгадка там.

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

Скомпилировалось и для атмеги 328pb, надо теперь попробовать с модулем...

sadman41
Offline
Зарегистрирован: 19.10.2016

328PB нормально наваливает в терминал с GPS-модулем на 115200 в пустом цикле. А вот когда до обработки дело доходит, уже не так всё шоколадно.

AdDa
Offline
Зарегистрирован: 06.05.2019

Заработало, спасибо!

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

AdDa пишет:

Заработало, спасибо!

Вы бы поправленный скетч выложили

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

совсем совсем давно 9600 была стандартная скорость для GPS, а вот интересно это из-за мультисистемности модулей увеличили до 115200? На 9600 не успевает читать?

sadman41
Offline
Зарегистрирован: 19.10.2016

NMEA-0183 вообще на 4800Bps ориентируется ;) И только с NMEA-0183HS начинается 38,400Bps

А в районе 115200 приходится юзать при большом Update Rate, которое требуется для навигации объекта, движущегося с большой скоростью. Данные надо чаще выводить, а стало быть - и быстрее. Если на месте стоять или на велосипеде ехать - 115200 не нужно совершенно. 

AdDa
Offline
Зарегистрирован: 06.05.2019

ua6em пишет:

AdDa пишет:

Заработало, спасибо!

Вы бы поправленный скетч выложили

Вот этот вариант рабочий,... 
 

#include "Ublox.h"
#define SERIAL_BAUD 38400
#define GPS_BAUD 9600
#define N_FLOATS 4 
Ublox M8_Gps;
// Altitude - Latitude - Longitude - N Satellites
float gpsArray[N_FLOATS] = {1, 1, 1, 1};

void setup() {
   Serial.begin(SERIAL_BAUD);
   Serial1.begin(GPS_BAUD);
 
}

void loop() {
   if(!Serial1.available())
		return;

  while(Serial1.available()){
        char c = Serial1.read(); 
         if (M8_Gps.encode(c)) {
          gpsArray[0] = M8_Gps.altitude;
          gpsArray[1] = M8_Gps.latitude;
          gpsArray[2] = M8_Gps.longitude; 
          gpsArray[3] = M8_Gps.sats_in_use;
            for(byte i = 0; i < N_FLOATS; i++) {
    Serial.print(gpsArray[i], 6);Serial.print(" ");
  }
        }
  }


}

Сейчас сделаю человеко понятный вид в столбик и перепроверю на скорости 115200 ... мне то на ней надо ) 

 и выложу окончательный

sadman41
Offline
Зарегистрирован: 19.10.2016

В данном случае while(Serial1.available()) уже не нужен, так как его дублирует if(!Serial1.available()) return;

AdDa
Offline
Зарегистрирован: 06.05.2019

Все , на 115200 все работает, данные идут, всем спасибо за помощь и участие)
 

#include "Ublox.h"
#define SERIAL_BAUD 115200
#define GPS_BAUD 115200
#define N_FLOATS 4

Ublox M8_Gps;
// Altitude - Latitude - Longitude - N Satellites
float gpsArray[N_FLOATS] = {0, 0, 0, 0};

void setup() {
   Serial.begin(SERIAL_BAUD);
   Serial1.begin(GPS_BAUD);
 
}

void loop() {
   if(!Serial1.available())
    return;

  while(Serial1.available()){
        char c = Serial1.read();
         if (M8_Gps.encode(c)) {
          gpsArray[0] = M8_Gps.altitude;
          gpsArray[1] = M8_Gps.latitude;
          gpsArray[2] = M8_Gps.longitude; 
          gpsArray[3] = M8_Gps.sats_in_use;
          for(byte i = 0; i < N_FLOATS; i++) {
            Serial.print(gpsArray[i], 6);Serial.print(" ");
            }  
            Serial.println("");
        } 
  }  
}

 

brigadir218
Offline
Зарегистрирован: 27.02.2022

Привет. Не могли бы подсказать. Вот купил модуль GPS NEO-8M , как у вас. Уже как месяц мучений, все никак не могу его связать с ардуинкой нано. Думал пришел дохлым с али, но однажды скетч ( спидометр) заработал правда где то на пару минут ( показания скорость, спутники и место положения). После более со скетчами не работал. ну подумал я что все, умер так умер. , но не все так просто. дело в том что модуль спутники ловит и передает данные в программу U-blox через ардуино , но  только при подключении gps-pinTX=> arduinoTX1, gps-pinRX=> arduinoRX0. пины RX не принципиально, можно хоть куда подключать. а вот TX - пины только TX-TX, по другому показаний нет. Может что ни-будь подскажите. модуль работает шустро, но ка-кто не правильно. и из за этого немогу собрать ни один проект.  И  еще, хотел попробовать ваш скетч, но при компиляции выскакивает ошибка ( не найдена библиотека ) где ее можно скачать?

01 #include "Ublox.h"
02 #define SERIAL_BAUD 115200
03 #define GPS_BAUD 115200
04 #define N_FLOATS 4
05  
06 Ublox M8_Gps;
07 // Altitude - Latitude - Longitude - N Satellites
08 float gpsArray[N_FLOATS] = {0, 0, 0, 0};
09  
10 void setup() {
11    Serial.begin(SERIAL_BAUD);
12    Serial1.begin(GPS_BAUD);
13  
14 }
15  
16 void loop() {
17    if(!Serial1.available())
18     return;
19  
20   while(Serial1.available()){
21         char c = Serial1.read();
22          if (M8_Gps.encode(c)) {
23           gpsArray[0] = M8_Gps.altitude;
24           gpsArray[1] = M8_Gps.latitude;
25           gpsArray[2] = M8_Gps.longitude;
26           gpsArray[3] = M8_Gps.sats_in_use;
27           for(byte i = 0; i < N_FLOATS; i++) {
28             Serial.print(gpsArray[i], 6);Serial.print(" ");
29             
30             Serial.println("");
31         }
32   
33 }

 

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

а вы точно переключили скорость порта модуля с 9600 на 115200? По умолчанию она 9600

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Чип USB-UART на UNO мешает нормальной работе serial устройств так как он сам висит на шине UART !

11    Serial.begin(SERIAL_BAUD);
12    Serial1.begin(GPS_BAUD);

Откуда на UNO Serial1 ?

На UNO надо с UBLOX общаться через SoftSerial на других пинах.

"а вот TX - пины только TX-TX"

В таком режиме вы используете от UNO только чип USB-UART ! Чип atmega может и сгореть в таком режиме (надо залить прошивку, которая переведет RX, TX (особенно TX) на вход)

brigadir218
Offline
Зарегистрирован: 27.02.2022

Komandir пишет:

Чип USB-UART на UNO мешает нормальной работе serial устройств так как он сам висит на шине UART !

11    Serial.begin(SERIAL_BAUD);
12    Serial1.begin(GPS_BAUD);

Откуда на UNO Serial1 ?

На UNO надо с UBLOX общаться через SoftSerial на других пинах.

"а вот TX - пины только TX-TX"

В таком режиме вы используете от UNO только чип USB-UART ! Чип atmega может и сгореть в таком режиме (надо залить прошивку, которая переведет RX, TX (особенно TX) на вход)

да нет, этот скетч я хотел установить себе на arduino NANO и протестировать на нем свой gps модуль, так как человек с этого форума сказал что этот скетч рабочий. а он даже не стал у меня компелироваться. выдавал ошибку ( нет библиотеки "Ublox.h). я думал может этот скетч поможет решить мою проблему, так как проблемы схожие с этим gps модулем.

brigadir218
Offline
Зарегистрирован: 27.02.2022

ua6em пишет:

а вы точно переключили скорость порта модуля с 9600 на 115200? По умолчанию она 9600

вы имеете ввиду скорость порта в самом gps модуле? нет я  там ничего не менял. там скорость 9600, при такой скорости захожу в U-blox , при подключении pin TX-TX. при другом соединении pin и скорости - пусто.

загружаю пустой скетч и подключаюсь  и получаю вот это.

b707
Offline
Зарегистрирован: 26.05.2017

brigadir218 - вы занимаетесь бредятиной.

Вам же сказали, что на Нано только один Сериал порт - он может быть подключен либо к ПК, либо к вашему GPS и никак туда и сюда одновременно. Поэтому указанный скетч НЕ ЗАРАБОТАЕТ на нано - и пытаться не стоит.

То что у вас показываются данные с GPS при загрузке пустого скетча - это только потому. что ардуина тут вообще не работает и вы читаете выход с GPS напрямую на ПК

brigadir218
Offline
Зарегистрирован: 27.02.2022

А когда захожу в U-blox там все выглядит вот так и сказать что модуль не исправный я не могу.

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

короче говоря вся эта красота только при подключении контактов на прямую TX-TX и при этом не могу вывести данные ни на один проект. Может кто поможет в этом вопросе? 

brigadir218
Offline
Зарегистрирован: 27.02.2022

b707 пишет:

brigadir218 - вы занимаетесь бредятиной.

Вам же сказали, что на Нано только один Сериал порт - он может быть подключен либо к ПК, либо к вашему GPS и никак туда и сюда одновременно. Поэтому указанный скетч НЕ ЗАРАБОТАЕТ на нано - и пытаться не стоит.

То что у вас показываются данные с GPS при загрузке пустого скетча - это только потому. что ардуина тут вообще не работает и вы читаете выход с GPS напрямую на ПК

А мне и не надо туда сюда. Мне нужно чтоб информация поступающая со спутников отображалась на олед дисплее в виде скорости и одометра. а устанавливая скетч и подсоединяя по пинам указанных в скетче у меня это не работает. вот я и ищу помощи в этом форуме.

nik182
Offline
Зарегистрирован: 04.05.2015

Прочитай про softserial.

brigadir218
Offline
Зарегистрирован: 27.02.2022

Я конечно же почитал про serial, но это для меня почти дремучий лес, все это сложно. Я почему то думал если есть ардуино, есть GPS модуль и есть скетч, то при объединении этого све должно работать. Разве не так? Здесь в ардуино Nano нужно как то программно изменять TX и RX контакты?
Я в этом деле новичок совсем, пытаюсь усваивать по мере своих возможностей. Столкнулся с ардуино и это дело стало меня затягивать так что не судите строго.

b707
Offline
Зарегистрирован: 26.05.2017

brigadir218 пишет:
Я конечно же почитал про serial, но это для меня почти дремучий лес, все это сложно. Я почему то думал если есть ардуино, есть GPS модуль и есть скетч, то при объединении этого све должно работать. Разве не так? .

Ардуино бывают разные, твой скетч для ардуино Мега. На нано он работать не будет.

А вообще, если тебе "сложно почитать" про Сериал - то не ясно, на что ты вообще рассчитываешь.  Крайне мало вероятно, что ты найдешь готовый скетч для своей задачи, а написать самому - это надо уметь разбираться в Сериал и программировании.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Где скетч с выводом на OLED ?

sadman41
Offline
Зарегистрирован: 19.10.2016

brigadir218 пишет:
Я почему то думал если есть ардуино, есть GPS модуль и есть скетч, то при объединении этого све должно работать.

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

brigadir218
Offline
Зарегистрирован: 27.02.2022

Да этот скетч не мой, я его взял в этом форуме выше. Хотел протестировать его у себя, но уже понял что не пойдёт.

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

brigadir218 пишет:
Да этот скетч не мой, я его взял в этом форуме выше. Хотел протестировать его у себя, но уже понял что не пойдёт.

это да, посмотри этот скетч для nano

brigadir218
Offline
Зарегистрирован: 27.02.2022

/*********************************************************************
HELLO WORLD! ANYBODY HOME?
GPS спидометр

SITE: http://voltnik.ru/
YOUTUBE: https://www.youtube.com/channel/UC4s13gPVOMQVX3P1ZpdUwjA
Креатед бай voltNik 2018
*********************************************************************/
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#include "OneButton.h"
#include <EEPROMex.h>
//==============================================================
#define RXPin 4  // UART подключение GPS
#define TXPin 3  // UART подключение GPS
#define BUTN1 7  // пин кнопки1
#define OLED_RENEW 500  // как часто обновлять экран
#define SERIAL_RENEW 1000  // как часто обновлять данные на serial
#define GPSBaud 9600 // скорость обмена с GPS часто именно 9600, но встречается и 4800
#define OLED_I2C_ADDRESS 0x3C // I2C адрес OLED экрана
//==============================================================
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
SSD1306AsciiWire oled;
OneButton butn_1(BUTN1, true);
//==============================================================
long now_millis, lcd_millis, serial_millis; // миллисекунды для отсчета обновления
byte num_ekr = 0 ;                        // номер отображения экрана
double dist_LAT, dist_LNG, last_LAT, last_LNG, max_LAT, max_LNG;                // переменные расстояния в EEPROM
float distToPoint, max_spd, max_dist, distance;
boolean fix;
TinyGPSDate dd; 
TinyGPSTime tt;

//static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;  // нахер лондон
//==============================================================
void setup()
{
  Serial.begin(115200);
  ss.begin(GPSBaud);

  oled.begin(&Adafruit128x64, OLED_I2C_ADDRESS);
  //oled.setFont(Adafruit5x7);
  oled.setFont(font5x7);
  //oled.setFont(Arial_bold_14);
  oled.clear();
  oled.set2X();
  oled.println("SPEED   1.1");
  oled.println("TRACKER");
  delay(1000);  // сукадилей
  oled.clear();

  butn_1.attachClick(BTN1_click);                  // подключаем обработку клика кнопки
  butn_1.attachLongPressStart(BTN1_longPress);     // подключаем обработку удержания кнопки

  dist_LAT = EEPROM.readDouble(0); // читаем из памяти широту нулевой точки
  dist_LNG = EEPROM.readDouble(4); // читаем из памяти долготу нулевой точки
  Serial.print("EEPROM POINT, lat: "); Serial.print(dist_LAT,6); Serial.print(" lng: "); Serial.println(dist_LNG,6); 
  
  Serial.println(F("Sats HDOP  Latitude   Longitude   Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum Odometer"));
  Serial.println(F("           (deg)      (deg)       Age                      Age  (m)    --- from GPS ----  ---- to Point   ----  RX    RX        Fail"));
  Serial.println(F("----------------------------------------------------------------------------------------------------------------------------------------"));
}
//==============================================================
void loop()
{
  now_millis = millis();
  butn_1.tick(); // тик опроса кнопки 1
  
  if (now_millis - lcd_millis > OLED_RENEW) { // обновление экрана
    oled_print();
    lcd_millis = now_millis;
  }

  if (now_millis - serial_millis > SERIAL_RENEW) { // печать данных в serial
    dd = gps.date; 
    tt = gps.time;
    if (gps.location.isValid()) { // проверка на FIX и отсутствие нулей в координатах
      if ((gps.location.lat()!=1)or(gps.location.lng()!=1)) {
        distToPoint = (float)TinyGPSPlus::distanceBetween(gps.location.lat(),gps.location.lng(),dist_LAT,dist_LNG) / 1000;
        if ((distToPoint>max_dist)and(distToPoint-max_dist<100)) {max_dist=distToPoint; max_LAT = gps.location.lat(); max_LNG = gps.location.lng(); fix=1;}
        if (gps.speed.kmph()>max_spd) max_spd=gps.speed.kmph();  
        if ((last_LAT != 0)and(fix)and(gps.speed.kmph()>1)) {distance = distance + (float)TinyGPSPlus::distanceBetween(gps.location.lat(), gps.location.lng(), last_LAT, last_LNG) / 1000; }
        last_LAT = gps.location.lat();
        last_LNG = gps.location.lng();    
        fix=0;
      }  
    } 
    printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
    printFloat(gps.hdop.hdop(), gps.hdop.isValid(), 6, 1);
    printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
    printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
    printInt(gps.location.age(), gps.location.isValid(), 5);
    printDateTime(dd, tt);
    printFloat(gps.altitude.meters(), gps.altitude.isValid(), 7, 2);
    printFloat(gps.course.deg(), gps.course.isValid(), 7, 2);
    printFloat(gps.speed.kmph(), gps.speed.isValid(), 6, 2);
    printStr(gps.course.isValid() ? TinyGPSPlus::cardinal(gps.course.deg()) : "*** ", 6);
    printInt(distToPoint, gps.location.isValid(), 9);
    double courseToPoint = TinyGPSPlus::courseTo(gps.location.lat(),gps.location.lng(),dist_LAT,dist_LNG);
    printFloat(courseToPoint, gps.location.isValid(), 7, 2);
    const char *cardinalToPoint = TinyGPSPlus::cardinal(courseToPoint);
    printStr(gps.location.isValid() ? cardinalToPoint : "*** ", 6);
    printInt(gps.charsProcessed(), true, 6);
    printInt(gps.sentencesWithFix(), true, 10);
    printInt(gps.failedChecksum(), true, 9);
    Serial.print("Odo: "); Serial.print(distance,3); Serial.print(" MaxD: "); Serial.print(max_dist,3); Serial.print(" MAX_LAT: "); Serial.print(max_LAT,6); Serial.print(" MAX_LNG: "); Serial.println(max_LNG,6); 
    serial_millis = now_millis;
  }  

  smartDelay(1000); // сукадилей для чтения данных c gps
  
  if (millis() > 5000 && gps.charsProcessed() < 10)
    Serial.println(F("No GPS data received: check wiring"));
}
//==============================================================
void BTN1_click() { // клик кнопки. функция смены отображения экрана
  Serial.println("click!");
  num_ekr = (num_ekr+1) % 5;
  oled.clear();
}
//==============================================================
void BTN1_longPress() { // удержание кнопки. функция записи текущего местоположения и сброса значений
  Serial.println("lognpress!");
  if (num_ekr == 1) { 
    max_spd = 0; // сброс максимальной скорости
  } else if (num_ekr == 2) {
    max_dist = 0; // сброс максимальной дистанции
  } else if (num_ekr == 3) {
    distance = 0; // сброс одометра
  } else { // записываем нулевую точку
    max_dist = 0;
    dist_LAT = gps.location.lat();
    dist_LNG = gps.location.lng();
    EEPROM.writeDouble(0,dist_LAT); // записываем в память широту текущей точки
    EEPROM.writeDouble(4,dist_LNG); // записываем в память долготу текущей точки
    oled.clear();
    oled.setCursor(0,0);
    oled.set1X();
    oled.print("Writing...");
    smartDelay(300);
  } 
}
//==============================================================
void oled_print() {  // смена отображения экранов
  oled.setCursor(0,0);
  switch (num_ekr) {
  case 0:
    oled.set1X();
    char st[12];
    sprintf(st, "%02d:%02d:%02d  ", tt.hour(), tt.minute(), tt.second());
    char sd[12];
    sprintf(sd, "%02d/%02d/%02d", dd.day(), dd.month(), dd.year());
    oled.print(st); oled.print(sd); oled.println("   ");
    oled.setCursor(0,1);
    oled.print("Spd: "); oled.print(gps.speed.kmph()); oled.print(" Max: "); oled.print(max_spd); oled.print("  ");
    oled.setCursor(0,2);
    oled.print("Dst: "); oled.print(distToPoint); oled.print(" Max: "); oled.print(max_dist); oled.print("  ");
    oled.setCursor(0,3);
    oled.print("Odo: "); oled.print(distance,3); oled.print(" Sat: "); oled.print((int)gps.satellites.value()); oled.print("  ");
    oled.setCursor(0,5);
    oled.print("Chars: "); oled.print(gps.charsProcessed());
    break;
  case 1:
    oled.set2X();
    oled.print("Spd:"); oled.print(gps.speed.kmph()); oled.println("  ");
    oled.print("Max:"); oled.print(max_spd); oled.print("  ");
    break;
  case 2:
    oled.set2X();
    oled.print("Pnt:"); oled.print(distToPoint,3); oled.println("  ");
    oled.print("Max:"); oled.print(max_dist,3); oled.println("  ");
    break;
  case 3:
    oled.set2X();
    oled.println("Odometer:");
    oled.print(distance,3); oled.println("  ");
    break;
  case 4:
    oled.set2X();
    oled.print(gps.location.lat(),6); oled.println("  ");
    oled.print(gps.location.lng(),6); oled.println("  ");
    break;
  }
}
//==============================================================
static void smartDelay(unsigned long ms) {  // сукадилей для чтения данных с gps
  unsigned long start = millis();
  do {
    while (ss.available()) {
      gps.encode(ss.read());
      //******
      now_millis = millis();    // пока читаем данные еще и кнопку опрашиваем чтобы не зависала и экран обновляем если надо
      butn_1.tick(); // опрос кнопки 1
      if (now_millis - lcd_millis > OLED_RENEW) {
       oled_print();
       lcd_millis = now_millis;
      }
      //******
    }  
  } while (millis() - start < ms);
}
//==============================================================
static void printFloat(float val, bool valid, int len, int prec)
{
  if (!valid) {
    while (len-- > 1)
    Serial.print('*');
    Serial.print(' ');
  } else {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      Serial.print(' ');
  }
  smartDelay(0);
}
//==============================================================
static void printInt(unsigned long val, bool valid, int len)
{
  char sz[32] = "*****************";
  if (valid) sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0) 
    sz[len-1] = ' ';
  Serial.print(sz);
  smartDelay(0);
}
//==============================================================
static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
  if (!d.isValid()) {
    Serial.print(F("********** "));
  } else {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d ", d.month(), d.day(), d.year());
    Serial.print(sz);
  }
  if (!t.isValid()) {
    Serial.print(F("******** "));
  } else {
    char sz[32];
    sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());
    Serial.print(sz);
  }
  printInt(d.age(), d.isValid(), 5);
  smartDelay(0);
}
//==============================================================
static void printStr(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  smartDelay(0);
}
//==============================================================
nik182
Offline
Зарегистрирован: 04.05.2015

О ! Ты даже первую тему песочницы не удосужился прочитать.