gps спидометр одометр

sergchel07
Offline
Зарегистрирован: 02.02.2019

Помогите разобраться почему не считает пройденное расстояние?

[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]

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Потому что Вы тупо и не разбираясь скопировали чужую программу. Это первопричина. Далее поймите откуда в 93 строке берется переменная distance.

sergchel07
Offline
Зарегистрирован: 02.02.2019
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; }

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Выведите на порт TinyGPSPlus::distanceBetween(gps.location.lat(), gps.location.lng(), last_LAT, last_LNG). А там что нибудь изменяется?

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

sergchel07 пишет:

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? Этот код хотябы компилируется?

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну, "and" - похоже на Паскаль, а "::" - это namespace в Си.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

and и or похожи на бейсик, фортран, паскаль.

sergchel07
Offline
Зарегистрирован: 02.02.2019

Этот код прикрасно компилируется.

 

sergchel07
Offline
Зарегистрирован: 02.02.2019

Разобрался. Добавил всякой непонятной хрени и всё заработало.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sergchel07 пишет:

Разобрался. Добавил всякой непонятной хрени и всё заработало.

Дак надо было ее сразу внутарь принять. 

komar73@gmail.com
Offline
Зарегистрирован: 25.05.2021

Сбросьте пожалуйста готовый код

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ношкой топнуть забыл. 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

b707 пишет:

Что такое "and" в условном операторе? Что за синтаксис TinyGPS::distance?

это что за язык? PHP или Perl? Этот код хотябы компилируется?

 

Вполне себе понимает ArduinoIDE , "or" , "and" и всяческие "not"

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

Kakmyc пишет:
Вполне себе понимает ArduinoIDE , "or" , "and" и всяческие "not"

на даты смотрим ? :)