• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Arduino + ESP8266 + Ноутбук

arantar

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

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

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

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

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

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

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

CodeNameHawk

Moderator
Команда форума
Покажите электрическую схему и два скетча, из которых все выкинуто, кроме работы с сериал.
 

arantar

New member
Код:
#include <WiFiUdp.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

const char *ssid = "Notebook";
const char *password = "12345670";

const uint16_t port = 11000;
const char *host = "192.168.137.1";
const int sizeBuffer = 350;

WiFiUDP Udp;
ESP8266WiFiMulti WiFiMulti;

void setup() {
    Serial.begin(19200);
    WiFiMulti.addAP(ssid, password);
    while (WiFiMulti.run() != WL_CONNECTED) {
        delay(500);
    }
    delay(500);
}

void loop() {
    char incomingChars[sizeBuffer];
    for (int i = 0; i < sizeBuffer; i++) {
        incomingChars[i] = Serial.read();
    }
    Udp.beginPacket(host, 11000);
    Udp.write(incomingChars);
    Udp.endPacket();
}
На ноутбук приходит следующее:
https://goo.gl/photos/UDJbNJrn1ifbHtx6A

А это рабочий вариант. Отличие от нерабочего - это использование программного serial и подключение к пину D7 (gpio 13), вместо RX (gpio 3) на плате ESP8266.
Код:
#include <SoftwareSerial.h>
#include <WiFiUdp.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

SoftwareSerial ESPserial(13, 15);

const char *ssid = "Notebook";
const char *password = "12345670";

const uint16_t port = 11000;
const char *host = "192.168.137.1";
const int sizeBuffer = 350;

WiFiUDP Udp;
ESP8266WiFiMulti WiFiMulti;

void setup() {
    Serial.begin(19200);
    ESPserial.begin(19200);
    WiFiMulti.addAP(ssid, password);
    while (WiFiMulti.run() != WL_CONNECTED) {
        delay(500);
    }
    delay(500);
}

void loop() {
    char incomingChars[sizeBuffer];
    for (int i = 0; i < sizeBuffer; i++) {
        incomingChars[i] = ESPserial.read();
        Serial.print(incomingChars[i]);
    }
    Udp.beginPacket(host, 11000);
    Udp.write(incomingChars);
    Udp.endPacket();
}
На ноутбук приходит все нормально :
https://goo.gl/photos/t7aySwuXVt2VEEQg6

Код:
#include <ArduinoJson.h>
#include <Wire.h>
#include <TroykaIMU.h>
#include <TinyGPS++.h>

. . .
void setup() {
    Serial1.begin(ESP8266Baund);
    . . .
}

void loop() {
    GenerationJson();
}

void GenerationJson() {
    . . .
    // сериализация массива значений в JSON строку
    dataSensors.prettyPrintTo(str);
    Serial1.println(str);
}

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

CodeNameHawk

Moderator
Команда форума
Почему читаете Serial.read(); не проверив поступило ли туда что нибудь?
 

RusikOk

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