Реализация Яндекс карты ,Ардуино и дисплей

Zish88

✩✩✩✩✩✩✩
10 Май 2023
7
0
Всем привет!
Подскажите по такому вопросу.
Хочу попробовать реализовать такую приблуду:
Дисплей(круглый)+Ардуино+ модуль wi-fi или блютуз(для подключения к телефону).
Задача стоит такая,что бы эта самоделка подключалась к телефону и через апи Яндекс карт получала информацию об ограничении скоростного режима и выводила картину на дисплей как это отображается в самих картах в кружочке. Реально ли это осуществить из таких компонентов или Ардуино такого не сможет обработать?
 

VyAReMaN

✩✩✩✩✩✩✩
10 Май 2023
1
1
Лучше использовать esp8266 или одноплатник по типу Raspberry Pi Zero
 
  • Лойс +1
Реакции: Zish88

Zish88

✩✩✩✩✩✩✩
10 Май 2023
7
0
@VyAReMaN,Благодарю за подсказку. А Raspberry Pi Pico не подойдёт?
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,035
406
Москва
wan-derer.ru
@Zish88, рекомендую начать с продумывания технологии связи МК-телефон - физический канал и способ подключения. Также надо распределить роли между МК и телефоном. Что будет делать телефон: просто служить модемом в интернет или же именно он будет общаться с Яндексом, а МК будет получать готовые данные и отображать их на дисплее?
Исходя из этого надо выбирать МК.
Во-первых, какой физический интерфейс для связи с телефоном д.б. на борту?
Во-вторых, роль.
Если МК - просто обслуживает дисплей, то подойдёт любой МК, здесь ни память, ни производительность не важны. Но нужно будет приложение для телефона, которое работает постоянно, получает данные с Яндекса и передаёт значение на МК.
Если на телефоне ты только поднимаешь точку доступа, а остальное делать МК, то тут надо смотреть потянет ли он https, какой размер пакетов передаётся и принимается по API и исходя из этого прикидывать сколько памяти на борту понадобится.
Потом проделать то же самое с дисплеем. Какой будет дисплей? Какой физический интерфейс для управления? Сколько ног МК понадобится? Как ты будешь отрисовывать элементы и сколько памяти для этого надо?
Потом совместить всё вместе и получишь ответ какая плата нужна.
Ну и да, лучшая плата - та, которую знаешь. Умеешь прогать на Распе - делай на Распе. Плюс-минус 1000 руб для штучного проекта роли не играет.
 
  • Лойс +1
Реакции: Zish88

Zish88

✩✩✩✩✩✩✩
10 Май 2023
7
0
@Wan-Derer, Добрый день!
Вообще мысль такая,что телефон будет работать как модем ,а МК будет через АПИ запрашивать данные (координаты местоположения и данные о скоростном режиме). Далее выводить цифры (желательно такую же картинку как в картах).
Второй вариант был такой,что на телефоне в приложении ставишь конечную точку и уже по wifi телефон передает данные на МК и выводит на дисплей.
МК хотел такой:Screenshot_20230511-153417.jpg

Дисплей рассматривал такой:Screenshot_20230511-153613.jpgScreenshot_20230511-153308.jpg
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,035
406
Москва
wan-derer.ru
@Zish88, да, момент про координаты я упустил. А как получить координаты по API? Если это что-то вроде A-GPS, то думаю что такой метод грубоват для данной задачи. Нужен либо модуль GPS, либо опять же как-то с телефона получать координаты.
 
  • Лойс +1
Реакции: Zish88

Zish88

✩✩✩✩✩✩✩
10 Май 2023
7
0
Всем доброго дня!
Намучался я с gps NEO 6M, приходят не рабочие, но один пришёл хороший =).
Решил в итоге собрать эту приблуду на esp8266 + OLED(128*64) + neo 6m.
Изучив информацию о получении данных об ограничении скоростного режима, понял что с помощью Яндекса и Гугла их не получить, так как требуется отображать сами карты. Почитав форумы нашел еще пару сервисов которые вроде как могут предоставить нужные данные.

На данный момент сейчас пытаюсь разобраться с получением этих данных от OpenStreetMap, но так же безрезультатно(скорее всего я не правильно отправляю запрос).
Получилось только получать координаты + выводить текущую скорость. Но и с текущей скоростью проблемы.

1) Если получать так, то скорость на 15-20 км/ч ниже ,чем в действительности
Получение текущей скорости:
void loop() {
  while (gpsSerial.available() > 0) {
    if (gps.encode(gpsSerial.read())) {
      if (gps.speed.isValid()) {
        display.clearDisplay();
        display.setCursor(0, 0);
        display.print("Speed: ");
        display.print(gps.speed.kmph());
        display.print(" km/h");
        display.display();
      }
    }
  }
2)А если получать таким способом, вытаскивая данные из строки, то скорость отображается 8-10 км/ч стоишь ты или едешь. Но можно еще таким способом получить скорость в морских милях....такое себе)


второй способ получения скорости:
oid loop() {
  if (gpsSerial.available()) {
    String gpsData = gpsSerial.readStringUntil('\n');
    //int speed = gpsSerial.read();

    if (gpsData.startsWith("$GPGGA")) {
      // Обработка данных GPS и получение координат
      String latitude = ""; // Полученная широта
      String longitude = ""; // Полученная долгота
      String speed = "";

      // Разбиваем строку на поля
      int fieldCount = 0;
      int startIndex = 0;
      int commaIndex = 0;
      int endIndex = gpsData.indexOf(",");
      while (endIndex > 0) {
        if (fieldCount == 2) {
          latitude = gpsData.substring(startIndex, endIndex);
        } else if (fieldCount == 4) {
          longitude = gpsData.substring(startIndex, endIndex);
        } else if (gpsData.startsWith("$GPRMC")) {
          // Разделение строки данных на поля с помощью запятых         
          for (int i = 0; i < gpsData.length(); i++) {
            if (gpsData[i] == ',') {
              commaIndex++;
              if (commaIndex == 3) {
                latitude = gpsData.substring(i + 1, i + 10).toFloat();
              } else if (commaIndex == 5) {
                longitude = gpsData.substring(i + 1, i + 11).toFloat();
              } else if (commaIndex == 7) {
                speed = gpsData.substring(i + 1, i + 6);
                break;
              }
            }
Во втором примере так видно, что у neo 6m есть разные строки с данными.
"$GPGGA" и "$GPRMC".
В "$GPGGA" если правильно понял нет данных о скорости и я могу вытащить только координаты в формате, которые поймет OpenstreetMap :
координаты.png

В "$GPRMC" имеются данные о скорости, но в узлах (переводить в км/ч для меня пока невыполнимо) =)
1688536803388.png


+ получалось выводить скорость в узлах,она менялась при движении, НО на месте она показывает 0.450*

1688537128685.png

Собственно вопросы и просьба подсказать)
  • Как получать адекватную скорость?
  • Какие могут быть еще способы, получения данных по координатам об ограничении скорости на дороге?
 

Zish88

✩✩✩✩✩✩✩
10 Май 2023
7
0
Доступ в интернет реализовал так:
МК хранит последнее успешное подключение к Wi-FI и автоматически подключается к ней. Если сохраненная точка доступа недоступна, то МК переходит сам в режим точки доступа, подключаемся к нему, вводим имя и пароль нужной нам сети(это может быть точка доступа на телефоне), сохраняем, и всё, МК подключается , выводит информацию как только обработается первый запрос - примерно 3 сек.
 

Zish88

✩✩✩✩✩✩✩
10 Май 2023
7
0
С переводом узлов в км/ч вроде разобрался, не знаю на сколько верно,но разобрался) Код ниже.
получение координат и определение скорости. Конвертация из узлов в км/ч:
void loop() {
  if (gpsSerial.available()) {
    String gpsData = gpsSerial.readStringUntil('\n');
    float speedKnots = 0.0;

    if (gpsData.startsWith("$GPRMC")) { //"$GPRMC" используем 3,5,7 / "$PGRMF" - 6,8,12 / "$GPGGA" 2,4
      // Обработка данных GPS и получение координат
      String latitude = ""; // Полученная широта
      String longitude = ""; // Полученная долгота
      String speedStr = "";
      int commaIndex = 0;
      for (int i = 0; i < gpsData.length(); i++) {
        if (gpsData[i] == ',') {
          commaIndex++;
          if (commaIndex == 3) {
            latitude = gpsData.substring(i + 1, i + 10).toFloat();
          } else if (commaIndex == 5) {
            longitude = gpsData.substring(i + 1, i + 11).toFloat();
          } else if (commaIndex == 7) {
            speedKnots = gpsData.substring(i + 1, i + 6).toFloat();
            break;
          }
        }
      }
      float speedKmph = speedKnots * 0.659; // Конвертация скорости из узлов в километры в час
      speedStr = commaIndex;
Следующая проблема, это частота обновлений/запросов на сервер или же ответов от сервера. На месте промежуток запросов доходит до 3 минут, но не понял с чем связано, так как может прилететь и через 5-10 сек. В движении так же,обновление данных происходит очень редко, что не совсем подходит.
C++:
13:49:34.349 ->

13:49:34.349 -> <html>

13:49:34.383 -> <head><title>301 Moved Permanently</title></head>

13:49:34.417 -> <body>

13:49:34.449 -> <center><h1>301 Moved Permanently</h1></center>

13:49:34.484 -> <hr><center>nginx</center>

13:49:34.518 -> </body>

13:49:34.518 -> </html>

13:49:34.557 -> Запрос выполнен
13:49:34.602 -> lat: 5803.24 lon: 3416.80
13:50:25.600 -> Текущая скорость: 0.04
13:50:25.633 -> Подключено к серверу OpenStreetMap
13:50:26.133 -> HTTP/1.1 301 Moved Permanently

13:50:26.166 -> Server: nginx

13:50:26.166 -> Date: Wed, 05 Jul 2023 10:50:25 GMT

13:50:26.200 -> Content-Type: text/html

13:50:26.233 -> Content-Length: 162

13:50:26.266 -> Connection: close

13:50:26.266 -> Location: https://nominatim.openstreetmap.org/api/0.1/way?format=json&lat=5803.24&lon=3416.80

13:50:26.380 ->

13:50:26.380 -> <html>

13:50:26.417 -> <head><title>301 Moved Permanently</title></head>

13:50:26.449 -> <body>

13:50:26.483 -> <center><h1>301 Moved Permanently</h1></center>

13:50:26.516 -> <hr><center>nginx</center>

13:50:26.550 -> </body>

13:50:26.550 -> </html>

13:50:26.596 -> Запрос выполнен
13:50:26.637 -> lat: 5803.24 lon: 3416.80
13:51:05.186 -> Текущая скорость: 0.21
 

Zish88

✩✩✩✩✩✩✩
10 Май 2023
7
0
@Forgetweb, У меня стояли эти значения, с таким вариантом скорость показывает 7-9 км/ч. без движения.
Пока не понимаю как сделать ,что бы скорость адекватно отображалась

@Forgetweb,
Вот результат с 0.659
1688565044041.png
А такой с 1.854
1688565297619.png
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
GPS модуль совсем не микрометр. На малых скоростях там приличная ошибка будет. Попробуйте в телефоне постоять на месте с включенной записью трека в навигаторе. Вы с места не сойдете, а трек покажет что Вы все кусты в окрестности облазили )
Скорость в узлах дают потому, что это изначально морской протокол. Там так принято. 1 узел равен 1 морской миле. Или 1854 метрам. Отсюда и коэффициент. А Ваш кстати вообще непонятно откуда. Обратный перевод это умножение на 0,593.
 
  • Лойс +1
Реакции: Zish88