Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Arduino + ESP8266 + Ноутбук

Тема в разделе "Раздел для начинающих", создана пользователем arantar, 28 авг 2017.

  1. arantar

    arantar Новичок

    Сообщения:
    3
    Симпатии:
    0
    Есть Ардуино Мега 2560, датчики которые к ней присоединены (gps, акселерометр и т.д.), ESP8266 Lolin, которая подключена к Ардуино для передачи данных на ноутбук.

    Программирую все в Arduino IDE.

    ESP подкючена к Ардуино через аппаратный serial и делитель напряжения. Проблема в том, что на ноут данные не приходят, только знаки вопроса. С Ардуино данные отправляются и приходят на ESP нормально, но только если использовать программный serial на ESP, и если передавать их дальше на ноут, то также все нормально. Проблема получается именно в аппаратном serial (gpio1 и gpio3).

    Их я проверял, замыкая и отправляя через монитор порта данные, все приходит.

    Если переназначить аппаратный serial на контакты gpio13 и gpio15, то данные на ноутбук приходят частично, в сильно искаженной форме.

    Пробовал менять скорость serial - без эффекта.

    Помогите разобраться, пожалуйста. Если какая инфа еще нужна, скажите.
     
  2. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.651
    Симпатии:
    181
    Покажите электрическую схему и два скетча, из которых все выкинуто, кроме работы с сериал.
     
  3. arantar

    arantar Новичок

    Сообщения:
    3
    Симпатии:
    0
    Скетч для ESP8266. Не рабочий вариант. (раскрыть)
    Код (C):
    1. #include <WiFiUdp.h>
    2. #include <ESP8266WiFi.h>
    3. #include <ESP8266WiFiMulti.h>
    4.  
    5. const char *ssid = "Notebook";
    6. const char *password = "12345670";
    7.  
    8. const uint16_t port = 11000;
    9. const char *host = "192.168.137.1";
    10. const int sizeBuffer = 350;
    11.  
    12. WiFiUDP Udp;
    13. ESP8266WiFiMulti WiFiMulti;
    14.  
    15. void setup() {
    16.     Serial.begin(19200);
    17.     WiFiMulti.addAP(ssid, password);
    18.     while (WiFiMulti.run() != WL_CONNECTED) {
    19.         delay(500);
    20.     }
    21.     delay(500);
    22. }
    23.  
    24. void loop() {
    25.     char incomingChars[sizeBuffer];
    26.     for (int i = 0; i < sizeBuffer; i++) {
    27.         incomingChars[i] = Serial.read();
    28.     }
    29.     Udp.beginPacket(host, 11000);
    30.     Udp.write(incomingChars);
    31.     Udp.endPacket();
    32. }

    На ноутбук приходит следующее:
    https://goo.gl/photos/UDJbNJrn1ifbHtx6A

    А это рабочий вариант. Отличие от нерабочего - это использование программного serial и подключение к пину D7 (gpio 13), вместо RX (gpio 3) на плате ESP8266.
    Скетч для ESP8266. Рабочий вариант. (раскрыть)
    Код (C):
    1. #include <SoftwareSerial.h>
    2. #include <WiFiUdp.h>
    3. #include <ESP8266WiFi.h>
    4. #include <ESP8266WiFiMulti.h>
    5.  
    6. SoftwareSerial ESPserial(13, 15);
    7.  
    8. const char *ssid = "Notebook";
    9. const char *password = "12345670";
    10.  
    11. const uint16_t port = 11000;
    12. const char *host = "192.168.137.1";
    13. const int sizeBuffer = 350;
    14.  
    15. WiFiUDP Udp;
    16. ESP8266WiFiMulti WiFiMulti;
    17.  
    18. void setup() {
    19.     Serial.begin(19200);
    20.     ESPserial.begin(19200);
    21.     WiFiMulti.addAP(ssid, password);
    22.     while (WiFiMulti.run() != WL_CONNECTED) {
    23.         delay(500);
    24.     }
    25.     delay(500);
    26. }
    27.  
    28. void loop() {
    29.     char incomingChars[sizeBuffer];
    30.     for (int i = 0; i < sizeBuffer; i++) {
    31.         incomingChars[i] = ESPserial.read();
    32.         Serial.print(incomingChars[i]);
    33.     }
    34.     Udp.beginPacket(host, 11000);
    35.     Udp.write(incomingChars);
    36.     Udp.endPacket();
    37. }

    На ноутбук приходит все нормально :
    https://goo.gl/photos/t7aySwuXVt2VEEQg6

    Скетч для Arduino Mega. (раскрыть)
    Код (C):
    1. #include <ArduinoJson.h>
    2. #include <Wire.h>
    3. #include <TroykaIMU.h>
    4. #include <TinyGPS++.h>
    5.  
    6. . . .
    7. void setup() {
    8.     Serial1.begin(ESP8266Baund);
    9.     . . .
    10. }
    11.  
    12. void loop() {
    13.     GenerationJson();
    14. }
    15.  
    16. void GenerationJson() {
    17.     . . .
    18.     // сериализация массива значений в JSON строку
    19.     dataSensors.prettyPrintTo(str);
    20.     Serial1.println(str);
    21. }


    Фото макета.
    https://goo.gl/photos/aM5tQ5HcgCbh5rLH6
     
    Последнее редактирование: 30 авг 2017
  4. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.651
    Симпатии:
    181
    Почему читаете Serial.read(); не проверив поступило ли туда что нибудь?
     
  5. arantar

    arantar Новичок

    Сообщения:
    3
    Симпатии:
    0
    Добавлял Serial.avalable() результат то же, т.е. не работает.
     
  6. RusikOk

    RusikOk Новичок

    Сообщения:
    22
    Симпатии:
    0
    не перечитывал всю тему но у меня тоже была такая проблема на STM32. при чем в отладчике я четко видел что данные в буфер прилетали но scanf("%s", &buf); не работал. при чем это происходило не всегда. помогло посимвольное чтение scanf("%с", &buf); со всеми вытекающими из этого неудобствами
     

Поделиться этой страницей