gps спидометр одометр
- Войдите на сайт для отправки комментариев
Сб, 02/02/2019 - 11:51
Помогите разобраться почему не считает пройденное расстояние?
[code] //#include <EEPROMex.h> #include <OneButton.h> #include <SoftwareSerial.h> #include <TinyGPS++.h> #include <U8glib.h> U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // SCK=A5, SDA=A4 // I2C / TWI 0.96 // The serial connection to the GPS device static const int RXPin = 4, TXPin = 3; static const uint32_t GPSBaud = 9600; SoftwareSerial ss(RXPin, TXPin); // The TinyGPS++ object TinyGPSPlus gps; #define BUTN1 7 // пин кнопки1 #define OLED_RENEW 500 // как часто обновлять экран OneButton butn_1(BUTN1, true); //Program variables long now_millis, lcd_millis, serial_millis; double dist_LAT, dist_LNG, last_LAT, last_LNG, max_LAT, max_LNG; String heading; float distToPoint, max_spd, max_dist, distance; int hour, minute, second; int num_sat, gps_speed, gps_time; boolean fix; byte num_ekr = 0 ; void setup() { Serial.begin(9600); ss.begin(GPSBaud); // assign default color value if ( u8g.getMode() == U8G_MODE_R3G3B2 ) { u8g.setColorIndex(255); // white } butn_1.attachClick(BTN1_click); // подключаем обработку клика кнопки butn_1.attachLongPressStart(BTN1_longPress); // подключаем обработку удержания кнопки // distance_o = EEPROM.readDouble(3); Serial.print("distance "); Serial.print(distance,3); } void loop() { Get_GPS(); //Get GPS data butn_1.tick(); // тик опроса кнопки 1 //Display info in the OLED u8g.firstPage(); do { print_speed(); } while ( u8g.nextPage() ); } void print_speed() { u8g.setPrintPos(0,0); switch (num_ekr) { case 0: u8g.setFont(u8g_font_fur42n); u8g.setPrintPos(0, 50); //скорость u8g.print(gps_speed , DEC); u8g.setFont(u8g_font_unifont); u8g.setPrintPos(70, 15); //время u8g.print( hour + 7); u8g.print(":"); u8g.print( minute); u8g.print(":"); u8g.print( second); u8g.setFont(u8g_font_unifont); u8g.setPrintPos(70, 55); //одометр u8g.print(distance,3); u8g.print(" "); break; case 1: u8g.setFont(u8g_font_unifont); u8g.setPrintPos(0, 15); u8g.print(" Max: "); u8g.print(max_spd); u8g.print(" "); u8g.setPrintPos(0, 46); u8g.print(" Sat: "); u8g.print((int)gps.satellites.value()); break; } } // This custom version of delay() ensures that the gps object // is being "fed". static void smartDelay(unsigned long ms) { 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) { print_speed(); lcd_millis = now_millis; } //****** } } while (millis() - start < ms); } void BTN1_click() { // клик кнопки. функция смены отображения экрана Serial.println("click!"); num_ekr = (num_ekr+1) % 2; u8g.firstPage(); delay(100); } void BTN1_longPress() { // удержание кнопки. Serial.println("lognpress!"); if (num_ekr == 1) { max_spd = 0; // сброс максимальной скорости } else if (num_ekr){ //distance = distance_o; // EEPROM.writeDouble(3,distance_o); u8g.firstPage(); delay(100); smartDelay(500); } } void Get_GPS() { 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; } } num_sat = gps.satellites.value(); gps_speed = gps.speed.kmph(); if (gps.time.isValid()) { hour = gps.time.hour(); minute = gps.time.minute(); second = gps.time.second(); gps_time = gps.time.value(); } smartDelay(500); if (millis() > 5000 && gps.charsProcessed() < 10) { // Serial.println(F("No GPS detected: Please check you wiring.")); } } [/code]
Потому что Вы тупо и не разбираясь скопировали чужую программу. Это первопричина. Далее поймите откуда в 93 строке берется переменная distance.
148
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; }
Выведите на порт TinyGPSPlus::distanceBetween(gps.location.lat(), gps.location.lng(), last_LAT, last_LNG). А там что нибудь изменяется?
148
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; }
Что такое "and" в условном операторе? Что за синтаксис TinyGPS::distance?
это что за язык? PHP или Perl? Этот код хотябы компилируется?
Ну, "and" - похоже на Паскаль, а "::" - это namespace в Си.
and и or похожи на бейсик, фортран, паскаль.
Этот код прикрасно компилируется.
Разобрался. Добавил всякой непонятной хрени и всё заработало.
Разобрался. Добавил всякой непонятной хрени и всё заработало.
Дак надо было ее сразу внутарь принять.
Сбросьте пожалуйста готовый код
Ношкой топнуть забыл.
Что такое "and" в условном операторе? Что за синтаксис TinyGPS::distance?
это что за язык? PHP или Perl? Этот код хотябы компилируется?
Вполне себе понимает ArduinoIDE , "or" , "and" и всяческие "not"
на даты смотрим ? :)