Не могу побороть ELSE

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

solovey6o2 пишет:

ничего, else начинает работать. Бред какой-то три часа голову ломаю.

Так не бывает.

Вам правильно сказали вставить печать. И если она не выдаёт ничего, значит Вы неправильно её вставили. давайте код как вставляли и копипасту вывода. И вообще, делайте. что Вам говорят, а не прыгайте с пятого на десятое с постоянными криками "усё пропало".

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

solovey6o2 пишет:

Сделал глобальную и изменил имя, не помогло

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

solovey6o2
Offline
Зарегистрирован: 19.12.2018



#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 7
Adafruit_SSD1306 display(OLED_RESET); // создаём объект "дисплей"

#include "UbloxGPS.h" // Библиотека для работы с GPS

char gpsSpeed[3];       // Буфер для строки с скоростью
char hours[3];       // Буфер для строки с скоростью
char minutes[3];       // Буфер для строки с скоростью
char seconds[3];       // Буфер для строки с скоростью
int gpsSpeedKm = 0;     // Скорость в км/ч
bool gps = true;
int numSV = 0;          // Количество спутников
unsigned long hAcc = 0; // Точность позиционирования
bool start = false;     // Старт замера
long startMillis = 0;   // Начало отсчета
long currentMillis = 0; // Текущее время
float meteringTime = 0; // Время замера

// Cтруктура результатов
struct Metering
{
  float accel30;
  float accel60;
  float accel100;
};
Metering metering;

void setup() {
  Serial.begin(115200);
  serial.begin(57600);
  delay(500);

  gpsSetup();                 // Настройка модуля Ublox
  metering = {0.0, 0.0, 0.0}; // Тут будем хранить результаты

  // Первоначальные настройки дисплея
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // инициализация дисплея по интерфейсу I2C, адрес 0x3C
  display.clearDisplay(); // очистка дисплея
  display.setTextColor(WHITE); // установка цвета текста
}
void loop() {
  currentMillis = millis(); // текущее время в миллисекундах
  int msgType = processGPS();
  Serial.println("MT_NAV_PVT " + String(MT_NAV_PVT));
  Serial.println("msgType " + String(msgType));
  if (msgType == MT_NAV_PVT) {
  	Serial.println("MT_NAV_PVT_IF " + String(MT_NAV_PVT));
  	Serial.println("msgType_IF " + String(msgType));
    gpsSpeedKm = ubxMessage.navPvt.gSpeed * 0.0036; // Переводим в км/ч
    numSV = ubxMessage.navPvt.numSV;
    hAcc = ubxMessage.navPvt.hAcc;
    // Если движемся
    if (gpsSpeedKm > 0) {
      // Если это был старт
      if (!start) {
        start = true;
        startMillis = millis();
      }

      meteringTime = (float)(currentMillis - startMillis) / 1000; // Время замера

      // Результаты замера
      if (0.0 == metering.accel30 && gpsSpeedKm >= 30) {
        metering.accel30 = meteringTime; // Разгон до 30км/ч
      }
      else if (0.0 == metering.accel60 && gpsSpeedKm >= 60) {
        metering.accel60 = meteringTime; // Разгон до 60км/ч
      }
      else if (0.0 == metering.accel100 && gpsSpeedKm >= 100) {
        metering.accel100 = meteringTime; // Разгон до 100км/ч
      }
    }
    else if (start && 0 == gpsSpeedKm) { // Если остановились
      start = false;
    }
    updateDisplay();   
  }
  else {
  	Serial.println("ERROR");
  }
}

void updateDisplay() {
  // Выводим скорость
  display.clearDisplay();
  display.setTextSize(1);
  display.drawLine(0, 8, display.width(), 8, WHITE);
  display.drawLine(0, 6, 0, 4, WHITE);
  display.drawLine(1, 6, 1, 4, WHITE);
  
  display.drawLine(3, 6, 3, 2, WHITE);
  display.drawLine(4, 6, 4, 2, WHITE);
  
  display.drawLine(6, 6, 6, 0, WHITE);
  display.drawLine(7, 6, 7, 0, WHITE);
  display.setCursor(12, 0);
  display.print (String(numSV));
  
  display.setCursor(40, 0);
  display.print (String(hAcc / 1000.0f));

  display.setCursor(80, 0);
  sprintf(hours, "%02d", ubxMessage.navPvt.hour + 3);
  sprintf(minutes, "%02d", ubxMessage.navPvt.minute);
  sprintf(seconds, "%02d", ubxMessage.navPvt.second);
  display.print (String(hours) + ":" + String(minutes) + ":" + String(seconds));

  display.setCursor(32, 15);
  display.setTextSize(2); // установка размера шрифта
  sprintf(gpsSpeed, "%03d", gpsSpeedKm);
  display.print (gpsSpeed);

  display.setTextSize(1);
  display.setCursor(100, 9);
  display.print ((String)metering.accel30);

  display.setCursor(100, 17);
  display.print ((String)metering.accel60);

  display.setCursor(100, 25);
  display.print ((String)metering.accel100);
  
  display.display();
}

 

solovey6o2
Offline
Зарегистрирован: 19.12.2018
#include <SoftwareSerial.h>
// Connect the GPS RX/TX to Wemos pins D7 and D8
SoftwareSerial serial(3, 4);
//#define serial Serial

const unsigned char UBX_HEADER[]        = { 0xB5, 0x62 };
const unsigned char NAV_PVT_HEADER[]    = { 0x01, 0x07 };
const unsigned char NAV_POSLLH_HEADER[] = { 0x01, 0x02 };
const unsigned char NAV_STATUS_HEADER[] = { 0x01, 0x03 };

enum _ubxMsgType {
  MT_NONE,
  MT_NAV_PVT,
  MT_NAV_POSLLH,
  MT_NAV_STATUS
};

const char UBLOX_INIT[] PROGMEM = {
  // Disable NMEA
  0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, // GxGGA off
  0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x2B, // GxGLL off
  0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x32, // GxGSA off
  0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x39, // GxGSV off
  0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x40, // GxRMC off
  0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x47, // GxVTG off

  // Disable UBX
  0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xDC, // NAV-PVT off
  0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xB9, // NAV-POSLLH off
  0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xC0, // NAV-STATUS off

  // Enable UBX
  0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0x01, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE1,   // NAV-PVT on
  //0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0x01, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x13, 0xBE, // NAV-POSLLH on
  //0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0x01, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x14, 0xC5, // NAV-STATUS on

  // Rate
  0xB5, 0x62, 0x06, 0x08, 0x06, 0x00, 0x64, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7A, 0x12, // 10Hz (100Ms)
  //0xB5,0x62,0x06,0x08,0x06,0x00,0xC8,0x00,0x01,0x00,0x01,0x00,0xDE,0x6A,              // 5Hz (500Ms)
  //0xB5,0x62,0x06,0x08,0x06,0x00,0xE8,0x03,0x01,0x00,0x01,0x00,0x01,0x39,              // 1Hz (1000Ms)
};

struct NAV_PVT {
  unsigned char cls;
  unsigned char id;
  unsigned short len;
  unsigned long iTOW;          // GPS time of week of the navigation epoch (ms)

  unsigned short year;         // Year (UTC)
  unsigned char month;         // Month, range 1..12 (UTC)
  unsigned char day;           // Day of month, range 1..31 (UTC)
  unsigned char hour;          // Hour of day, range 0..23 (UTC)
  unsigned char minute;        // Minute of hour, range 0..59 (UTC)
  unsigned char second;        // Seconds of minute, range 0..60 (UTC)
  char valid;                  // Validity Flags (see graphic below)
  unsigned long tAcc;          // Time accuracy estimate (UTC) (ns)
  long nano;                   // Fraction of second, range -1e9 .. 1e9 (UTC) (ns)
  unsigned char fixType;       // GNSSfix Type, range 0..5
  char flags;                  // Fix Status Flags
  unsigned char reserved1;     // reserved
  unsigned char numSV;         // Number of satellites used in Nav Solution

  long lon;                    // Longitude (deg)
  long lat;                    // Latitude (deg)
  long height;                 // Height above Ellipsoid (mm)
  long hMSL;                   // Height above mean sea level (mm)
  unsigned long hAcc;          // Horizontal Accuracy Estimate (mm)
  unsigned long vAcc;          // Vertical Accuracy Estimate (mm)

  long velN;                   // NED north velocity (mm/s)
  long velE;                   // NED east velocity (mm/s)
  long velD;                   // NED down velocity (mm/s)
  long gSpeed;                 // Ground Speed (2-D) (mm/s)
  long heading;                // Heading of motion 2-D (deg)
  unsigned long sAcc;          // Speed Accuracy Estimate
  unsigned long headingAcc;    // Heading Accuracy Estimate
  unsigned short pDOP;         // Position dilution of precision
  short reserved2;             // Reserved
  unsigned long reserved3;     // Reserved
};

//NAV_PVT pvt;

struct NAV_POSLLH {
  unsigned char cls;
  unsigned char id;
  unsigned short len;
  unsigned long iTOW; // GPS time of week of the navigation epoch (ms)
  long lon;
  long lat;
  long height;
  long hMSL;
  unsigned long hAcc;
  unsigned long vAcc;
};

struct NAV_STATUS {
  unsigned char cls;
  unsigned char id;
  unsigned short len;
  unsigned long iTOW;
  unsigned char gpsFix;
  char flags;
  char fixStat;
  char flags2;
  unsigned long ttff;
  unsigned long msss;
};

union UBXMessage {
  NAV_PVT navPvt;
  NAV_POSLLH navPosllh;
  NAV_STATUS navStatus;
};

UBXMessage ubxMessage;

// The last two bytes of the message is a checksum value, used to confirm that the received payload is valid.
// The procedure used to calculate this is given as pseudo-code in the uBlox manual.
void calcChecksum(unsigned char* CK, int msgSize) {
  memset(CK, 0, 2);
  for (int i = 0; i < msgSize; i++) {
    CK[0] += ((unsigned char*)(&ubxMessage))[i];
    CK[1] += CK[0];
  }
}

// Compares the first two bytes of the ubxMessage struct with a specific message header.
// Returns true if the two bytes match.
boolean compareMsgHeader(const unsigned char* msgHeader) {
  unsigned char* ptr = (unsigned char*)(&ubxMessage);
  return ptr[0] == msgHeader[0] && ptr[1] == msgHeader[1];
}


void gpsSetup() {
  // send configuration data in UBX protocol
  for (int i = 0; i < sizeof(UBLOX_INIT); i++) {
    serial.write( pgm_read_byte(UBLOX_INIT + i) );
    delay(5); // simulating a 38400baud pace (or less), otherwise commands are not accepted by the device.
  }
}


// Reads in bytes from the GPS module and checks to see if a valid message has been constructed.
// Returns the type of the message found if successful, or MT_NONE if no message was found.
// After a successful return the contents of the ubxMessage union will be valid, for the
// message type that was found. Note that further calls to this function can invalidate the
// message content, so you must use the obtained values before calling this function again.
int processGPS() {
  static int fpos = 0;
  static unsigned char checksum[2];

  static byte currentMsgType = MT_NONE;
  static int payloadSize = sizeof(UBXMessage);

  while ( serial.available() ) {

    byte c = serial.read();
    //Serial.write(c);

    if ( fpos < 2 ) {
      // For the first two bytes we are simply looking for a match with the UBX header bytes (0xB5,0x62)
      if ( c == UBX_HEADER[fpos] )
        fpos++;
      else
        fpos = 0; // Reset to beginning state.
    }
    else {
      // If we come here then fpos >= 2, which means we have found a match with the UBX_HEADER
      // and we are now reading in the bytes that make up the payload.

      // Place the incoming byte into the ubxMessage struct. The position is fpos-2 because
      // the struct does not include the initial two-byte header (UBX_HEADER).
      if ( (fpos - 2) < payloadSize )
        ((unsigned char*)(&ubxMessage))[fpos - 2] = c;

      fpos++;

      if ( fpos == 4 ) {
        // We have just received the second byte of the message type header,
        // so now we can check to see what kind of message it is.
        if ( compareMsgHeader(NAV_PVT_HEADER) ) {
          currentMsgType = MT_NAV_PVT;
          payloadSize = sizeof(NAV_PVT);
        }
        else if ( compareMsgHeader(NAV_POSLLH_HEADER) ) {
          currentMsgType = MT_NAV_POSLLH;
          payloadSize = sizeof(NAV_POSLLH);
        }
        else if ( compareMsgHeader(NAV_STATUS_HEADER) ) {
          currentMsgType = MT_NAV_STATUS;
          payloadSize = sizeof(NAV_STATUS);
        }
        else {
          // unknown message type, bail
          fpos = 0;
          continue;
        }
      }

      if ( fpos == (payloadSize + 2) ) {
        // All payload bytes have now been received, so we can calculate the
        // expected checksum value to compare with the next two incoming bytes.
        calcChecksum(checksum, payloadSize);
      }
      else if ( fpos == (payloadSize + 3) ) {
        // First byte after the payload, ie. first byte of the checksum.
        // Does it match the first byte of the checksum we calculated?
        if ( c != checksum[0] ) {
          // Checksum doesn't match, reset to beginning state and try again.
          fpos = 0;
        }
      }
      else if ( fpos == (payloadSize + 4) ) {
        // Second byte after the payload, ie. second byte of the checksum.
        // Does it match the second byte of the checksum we calculated?
        fpos = 0; // We will reset the state regardless of whether the checksum matches.
        if ( c == checksum[1] ) {
          // Checksum matches, we have a valid message.
          return currentMsgType;
        }
      }
      else if ( fpos > (payloadSize + 4) ) {
        // We have now read more bytes than both the expected payload and checksum
        // together, so something went wrong. Reset to beginning state and try again.
        fpos = 0;
      }
    }
  }
  return MT_NONE;
}

 

solovey6o2
Offline
Зарегистрирован: 19.12.2018
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Это вот что сейчас было? Вы читать умеете? Вам сказали втавить печать и дать получившийся код вместе с копипастой результатов печати. Где в Вашем коде вставленная печать? Где результаты?

Вы издеваетесь? Если так, то идите нафиг. Хотите помощи, делайте ТОЧНО, ЧТО ГОВОРЯТ и не засирайте тему левыми постами, итак уж навалено столько, что прочитать невозможно.

solovey6o2
Offline
Зарегистрирован: 19.12.2018

Вот результат:

MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
 
Это все было проделано ранее, пост 9.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

solovey6o2 пишет:

Вот результат:

MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
 
Это все было проделано ранее, пост 9.

1. А где код от этого результата?

2. В посте 9, Вы написали, что это без else, в посте 11 - что с else ничего не печатает.

3. В посте #51 я Вам написал, что так не бывает, чтобы ничего не печатало, и попросил привести код с else и вывод.

Вы до сих пор не почняли, что от Вас требуется?

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

solovey6o2
Offline
Зарегистрирован: 19.12.2018

ЕвгенийП пишет:

solovey6o2 пишет:

Вот результат:

MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
MT_NAV_PVT 1
msgType 1
 
Это все было проделано ранее, пост 9.

1. А где код от этого результата?

2. В посте 9, Вы написали, что это без else, в посте 11 - что с else ничего не печатает.

3. В посте #51 я Вам написал, что так не бывает, чтобы ничего не печатало, и попросил привести код с else и вывод.

Вы до сих пор не почняли, что от Вас требуется?

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

Код вверху поправил. Давай не будем переходить на личности, молчу лишь по той причине что нужна помощь.

Вот результат:ERROR

ERROR
ERROR
ERROR
ERROR
ERROR
ERROR
ERROR
ERROR
ERROR
ERROR
ERROR
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

solovey6o2 пишет:

Код вверху поправил.

Примерно это я и предполагал, когда писал, что так не бывает.

Вам что написали в #4 ??? "После третьей строки!" Смотрим в стартовый пост. Третья строка - это 

int msgType = processGPS();

Так какого ж чёрта, Вы печать после if вставили? Чего Вы там надеялись увидеть? До трёх считать не умеете?

Только, пжалуйста, не говорите мне, что с момента публикации стартового поста и до момента, когда Вы прочитали пост №4 у Вас уже номера строк поменялись. Надеюсь, сами понимаете, что это или ... или ...

Вставляйте печать правильно и выкладывайте свежие код и вывод!

solovey6o2 пишет:

Давай не будем переходить на личности

Ещё как будем! Не нравится, сразу скажите, и я немедленно отвалю.

Ну, вот Вы сами подумайте, как называть человека, который наваял тему на 50 постов и целый день выносит всем мозг тем, что не может до трёх посчитать? У Вас есть идеи как такого назвать?

solovey6o2
Offline
Зарегистрирован: 19.12.2018
поправил.
заметил условие срабатывает раз в 10-15 минут.
MT_NAV_PVT 1
msgType 0
ERROR
MT_NAV_PVT 1
msgType 0
ERROR
MT_NAV_PVT 1
msgType 0
ERROR
MT_NAV_PVT 1
msgType 0
ERROR
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

solovey6o2 пишет:

поправил.
заметил условие срабатывает раз в 10-15 минут.
MT_NAV_PVT 1
msgType 0
ERROR
MT_NAV_PVT 1
msgType 0
ERROR
MT_NAV_PVT 1
msgType 0
ERROR
MT_NAV_PVT 1
msgType 0
ERROR
 

В своём последнем посте (#60) я Вам чёрным по белому написал

ЕвгенийП пишет:

Вставляйте печать правильно и выкладывайте свежие код и вывод!

Как я Вам уже писал, мне пофиг тролль Вы или идиот, и по какой причине Вы не делаете того, что Вам говорят. Но я не могу тратить часы на стояние на коленях и умаливание Вас показать, наконец то, что мне нужно, чтобы Вам помочь. Очень жаль, до свидания.

solovey6o2
Offline
Зарегистрирован: 19.12.2018

Что не так? я вставил после 3 строки печать. Скиньте правильный код, скину результат.

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

solovey6o2 пишет:

Что не так? я вставил после 3 строки печать. Скиньте правильный код, скину результат.

Сам Евгений Петрович Вам желал помочь...

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

ua6em пишет:

solovey6o2 пишет:

Что не так? я вставил после 3 строки печать. Скиньте правильный код, скину результат.

Сам Евгений Петрович В0ам желал помочь...

Извини, но конкретно достало. Я понимаю глубоко...

и регулярно. Но может раздобудешь личную почту Евгения Петровича и туда филипинки посылать будешь. 

solovey6o2
Offline
Зарегистрирован: 19.12.2018

жаль что не помог. Я не понимаю что и куда нужно было вставить.

bwn
Offline
Зарегистрирован: 25.08.2014

solovey6o2 пишет:

жаль что не помог. Я не понимаю что и куда нужно было вставить.

А он, просто просил, выложить крайний код и результаты его печати. ВМЕСТЕ.

solovey6o2
Offline
Зарегистрирован: 19.12.2018

Так код по 10 раз зачем вставлять. В коде выше сделал изменения: вставил печать, результат печать ниже. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

solovey6o2 пишет:

 В коде выше сделал изменения:

После Вашей прошлой вставки печати, доверие к Вашему умению "делать изменения" равно нулю. Потому я попросил Вас показать мне свежий код, чтобы я его видел, а не догадывался правильно Вы на этот раз до трёх посчитали или нет. Вам трудно было? Перед этим я ведь тоже постов пять Вас умолял код показать. Достало умолять. Не хотите - не надо. Проблема, в конце концов, у Вас, а не у меня.

А на будущее, не задавайтесь ненужными вопросами типа

solovey6o2 пишет:

Так код по 10 раз зачем вставлять

просто делайте, что говорят. Всем будет лучше.

solovey6o2
Offline
Зарегистрирован: 19.12.2018
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 7
Adafruit_SSD1306 display(OLED_RESET); // создаём объект "дисплей"

#include "UbloxGPS.h" // Библиотека для работы с GPS

char gpsSpeed[3];       // Буфер для строки с скоростью
char hours[3];       // Буфер для строки с скоростью
char minutes[3];       // Буфер для строки с скоростью
char seconds[3];       // Буфер для строки с скоростью
int gpsSpeedKm = 0;     // Скорость в км/ч
bool gps = true;
int numSV = 0;          // Количество спутников
unsigned long hAcc = 0; // Точность позиционирования
bool start = false;     // Старт замера
long startMillis = 0;   // Начало отсчета
long currentMillis = 0; // Текущее время
float meteringTime = 0; // Время замера

// Cтруктура результатов
struct Metering
{
  float accel30;
  float accel60;
  float accel100;
};
Metering metering;

void setup() {
  Serial.begin(115200);
  serial.begin(57600);
  delay(500);

  gpsSetup();                 // Настройка модуля Ublox
  metering = {0.0, 0.0, 0.0}; // Тут будем хранить результаты

  // Первоначальные настройки дисплея
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // инициализация дисплея по интерфейсу I2C, адрес 0x3C
  display.clearDisplay(); // очистка дисплея
  display.setTextColor(WHITE); // установка цвета текста
}
void loop() {
  currentMillis = millis(); // текущее время в миллисекундах
  int msgType = processGPS();
  Serial.println("MT_NAV_PVT " + String(MT_NAV_PVT));
  Serial.println("msgType " + String(msgType));
  if (msgType == MT_NAV_PVT) {
  	Serial.println("MT_NAV_PVT_IF " + String(MT_NAV_PVT));
  	Serial.println("msgType_IF " + String(msgType));
    gpsSpeedKm = ubxMessage.navPvt.gSpeed * 0.0036; // Переводим в км/ч
    numSV = ubxMessage.navPvt.numSV;
    hAcc = ubxMessage.navPvt.hAcc;
    // Если движемся
    if (gpsSpeedKm > 0) {
      // Если это был старт
      if (!start) {
        start = true;
        startMillis = millis();
      }

      meteringTime = (float)(currentMillis - startMillis) / 1000; // Время замера

      // Результаты замера
      if (0.0 == metering.accel30 && gpsSpeedKm >= 30) {
        metering.accel30 = meteringTime; // Разгон до 30км/ч
      }
      else if (0.0 == metering.accel60 && gpsSpeedKm >= 60) {
        metering.accel60 = meteringTime; // Разгон до 60км/ч
      }
      else if (0.0 == metering.accel100 && gpsSpeedKm >= 100) {
        metering.accel100 = meteringTime; // Разгон до 100км/ч
      }
    }
    else if (start && 0 == gpsSpeedKm) { // Если остановились
      start = false;
    }
    updateDisplay();   
  }
  else {
  	Serial.println("ERROR");
  }
}

void updateDisplay() {
  // Выводим скорость
  display.clearDisplay();
  display.setTextSize(1);
  display.drawLine(0, 8, display.width(), 8, WHITE);
  display.drawLine(0, 6, 0, 4, WHITE);
  display.drawLine(1, 6, 1, 4, WHITE);
  
  display.drawLine(3, 6, 3, 2, WHITE);
  display.drawLine(4, 6, 4, 2, WHITE);
  
  display.drawLine(6, 6, 6, 0, WHITE);
  display.drawLine(7, 6, 7, 0, WHITE);
  display.setCursor(12, 0);
  display.print (String(numSV));
  
  display.setCursor(40, 0);
  display.print (String(hAcc / 1000.0f));

  display.setCursor(80, 0);
  sprintf(hours, "%02d", ubxMessage.navPvt.hour + 3);
  sprintf(minutes, "%02d", ubxMessage.navPvt.minute);
  sprintf(seconds, "%02d", ubxMessage.navPvt.second);
  display.print (String(hours) + ":" + String(minutes) + ":" + String(seconds));

  display.setCursor(32, 15);
  display.setTextSize(2); // установка размера шрифта
  sprintf(gpsSpeed, "%03d", gpsSpeedKm);
  display.print (gpsSpeed);

  display.setTextSize(1);
  display.setCursor(100, 9);
  display.print ((String)metering.accel30);

  display.setCursor(100, 17);
  display.print ((String)metering.accel60);

  display.setCursor(100, 25);
  display.print ((String)metering.accel100);
  
  display.display();
}

 

solovey6o2
Offline
Зарегистрирован: 19.12.2018
Результат
 
MT_NAV_PVT 1
msgType 0
ERROR
MT_NAV_PVT 1
msgType 0
ERROR
MT_NAV_PVT 1
msgType 0
ERROR
MT_NAV_PVT 1
msgType 0
ERROR
VladimirTsibrov
Offline
Зарегистрирован: 05.03.2019

Я бы предположил, что Serial мешает своими прерываниями коду для работы с gps. Вам предлагали добавить delay в начале loop, вы попробовали?

solovey6o2
Offline
Зарегистрирован: 19.12.2018

пробовал, не помогло.

b707
Онлайн
Зарегистрирован: 26.05.2017

если почитать листинги из #53 #54 - там два Сериала, причем один называется Serial. а другой serial. а дальше в коде идет замечательная строчка

#define serial Serial  ^))))

правда она закомментирована.

Но с учетом уровня ТС я не поручусь. что там еще что-то похожее где-то не закопано, в стиле анекдота про

#define true false

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мне уже, как Вы наверное поняли, пофиг :)

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

Хотел посмотреть что внутри библиотеки. На запрос processGPS ubloxGPS.h arduino не нашлось ни одной. Что это значит? 

solovey6o2
Offline
Зарегистрирован: 19.12.2018

nik182 пишет:

Хотел посмотреть что внутри библиотеки. На запрос processGPS ubloxGPS.h arduino не нашлось ни одной. Что это значит? 

скетч нашел здесь https://ardulogic.ru/posts/gps-spidometr-na-neo-7-i-wemos-d1-esp8266

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

@solovey6o2, вы на какой плате собираете? на esp8266?

solovey6o2
Offline
Зарегистрирован: 19.12.2018

Алексей. пишет:

@solovey6o2, вы на какой плате собираете? на esp8266?

Arduino Nano (ATmega328)

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

Для sofwareserial скорость 57600 предельная, и дисплей на i2c, при инициализации задействован twi, может он прерываниями гадит?

solovey6o2
Offline
Зарегистрирован: 19.12.2018

Алексей. пишет:

Для sofwareserial скорость 57600 предельная, и дисплей на i2c, при инициализации задействован twi, может он прерываниями гадит?

Если бы я знал, с ардуиной пару месяцев занимаюсь. Напомню еще раз что требуется. Если нет связи со спутниками вызвать функцию(search_gps) как отловить этот момент?

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

А причём тут ардуина, есть или нет связи со спутниками определяется протоколом. Разве не так?
На обычном ПК как определяете?

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

Штож вы все космолёты начинаете через месяц после покупки ардуины лепить...

solovey6o2
Offline
Зарегистрирован: 19.12.2018

Алексей. пишет:
А причём тут ардуина, есть или нет связи со спутниками определяется протоколом. Разве не так? На обычном ПК как определяете?
а кто как не ардуина? когда есть связь я вижу 8-12 спутников, а как отловить момент когда спутников 0 и запустить скажем (скрин нет соединения gps), а когда появится связь продолжить программу.

solovey6o2
Offline
Зарегистрирован: 19.12.2018

sadman41 пишет:

Штож вы все космолёты начинаете через месяц после покупки ардуины лепить...

Уже хочу забить на эту заставку при отсутствии связи, но хотелось бы доделать до конца и разобраться что и как.

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

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

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

Поскольку для работы с gps модулем нужен только последовательный порт, отлаживаете логику работы сначала на ПК, на си пишите приложение с функциями setup и loop, учитываете типы данных, что на авре т.е. int16_t а не инт.

solovey6o2
Offline
Зарегистрирован: 19.12.2018

sadman41 пишет:

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

Для чего тогда нужен форум, для нравоучений? Я выложил весь код, прошу знающих помочь. Или я чего-то сверхъестественного прошу? На первый взгляд все было просто numSV - количество спутников, написал условие когда numSV = 0 то...... но не тут то было. 

b707
Онлайн
Зарегистрирован: 26.05.2017

solovey6o2 пишет:

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

ну уж точно не для того, чтоб искать ошибки в чужом говнокоде, когда автор вопроса в нем ничерта не понимает.

Если вы хотите запустить этот код - Разбирайтесь с тем, как он работает, осваивайте отладку.. А вы приходите с кодом, как клиент со сломанным телефоном в сервис : "Посмотрите, у меня тут не работает". Только сервис-то за это деньги берет - а форуму ваши проблемы нафига?

solovey6o2
Offline
Зарегистрирован: 19.12.2018

b707 пишет:

solovey6o2 пишет:

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

ну уж точно не для того, чтоб искать ошибки в чужом говнокоде, когда автор вопроса в нем ничерта не понимает.

Если вы хотите запустить этот код - Разбирайтесь с тем, как он работает, осваивайте отладку.. А вы приходите с кодом, как клиент со сломанным телефоном в сервис : "Посмотрите, у меня тут не работает". Только сервис-то за это деньги берет - а форуму ваши проблемы нафига?

а форум то нафига?

b707
Онлайн
Зарегистрирован: 26.05.2017

solovey6o2 пишет:

а форум то нафига?

для общения по интересам тем, кому это интересно. А для бесплатной помощи нищим есть благотворительность...

solovey6o2
Offline
Зарегистрирован: 19.12.2018

b707 пишет:

solovey6o2 пишет:

а форум то нафига?

для общения по интересам тем, кому это интересно. А для бесплатной помощи нищим есть благотворительность...

Ок, всем спасибо. Тему можно закрывать.

b707
Онлайн
Зарегистрирован: 26.05.2017

solovey6o2 пишет:

Ок, всем спасибо. Тему можно закрывать.

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

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

С логикой пичалька..
А отладкой заниматься по необъяснимым причинам нет возможности.
По коментам в коде причина неприятная. :(

Logik
Offline
Зарегистрирован: 05.08.2014

solovey6o2 пишет:

а форум то нафига?

а шоб сервера не простаивали.

1. Закоментировать в коде из #70 строки 51-78. Если не поменялся вывод то п.2

2. строки 46  заменить на Serial.println((int)MT_NAV_PVT); 

 

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

Знающие чем могли - помогли. Далее нужно запускать все на железе и отладкой заниматься. Вы этого не умеете и не желаете. Дежурный по палате у нас уволился. Так что ситуация патовая.

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

Я просто в ауте. Ну нахрена я потратил время на ползание по вашим ссылкам? Нет нигде ссылки на библиотеку. Блин ТС! Выкини в окно сто рублевку. Мне хоть легче станет. Единственное что я понял - по твоим хотелкам на этой плате сделать ничего не возможно. А авторы статьи не знают элементарных вещей про GPS. Прочитай стандарт GPS и просто подумай с какой частотой в чипе гражданского протокола GPS обновляется информация? Мы всем форумом не можем впихнуть невпихуемое. 

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

Нее.. Тема интересная, у меня на чердаке в хламе завалялся gps шилд, как всплывает топик про gps-ы, хочу поиграть в него.

b707
Онлайн
Зарегистрирован: 26.05.2017

Алексей. пишет:
Нее.. Тема интересная, у меня на чердаке в хламе завалялся gps шилд, как всплывает топик про gps-ы, хочу поиграть в него.

ну...вроде ничего сложного,  NMEA берешь и парсишь. только напрямую к GPS надо подключаться. а не через непонятно кем писанные странные библиотеки.

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

а я бы залез и посмотрел как делают профессионалы в исходниках Мишин плэнер благо они доступны