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.
148if((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). А там что нибудь изменяется?
148if((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"
на даты смотрим ? :)