Skocz do zawartości
Kacper1263

ESP-01 i Arduino Mega, Lag podczas odbioru większej ilości danych

Pomocna odpowiedź

Witam,

Od dłuższego czasu próbuje rozwiązać problem z modułem ESP-01 podpiętym pod Arduino Mega. Mianowicie kiedy wysyłam dane przez serwer MQTT do ESP np. z telefonu i wyślę tych danych zbyt dużo w czasie od 1 do 5 sekund, to cały program przestaje reagować na kolejne dane przez najbliższe 20-40 sekund lub następuje ponowne uruchomienie Arduino.

Program nie jest jakoś super skomplikowany (ponieważ służył mi tylko do testów ESP) więc myślę, że nie będzie on trudny do zrozumienia.

Moduł jest podpięty do Arduino przez konwerter poziomów logicznych. Myślę, że problemem nie będzie połączenie, ponieważ wysyłanie danych działa bez problemu, a kiedy dane są wysyłane do ESP w odstępach 1-2 s to wszystko działa bez problemu.

Kod:


#include <LiquidCrystal.h>
#include <WiFiEsp.h>
#include <WiFiEspClient.h>
#include <WiFiEspUdp.h>
#include <PubSubClient.h>
#include <SPI.h>

char ssid[] = "My-WiFi"; // your network SSID (name)
char pass[] = "1234567890"; // your network password
char server[] = "broker.hivemq.com"; // your network password
int status = WL_IDLE_STATUS; // the Wifi radio's status

// Initialize the Ethernet client object
WiFiEspClient espClient;
PubSubClient client(espClient);

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() {
    lcd.begin(16, 2);
    lcd.clear();
    lcd.print("Loading: ");
    delay(1500);
    lcd.clear();
    // initialize serial for debugging
    Serial.begin(115200);
    // initialize serial for ESP module
    Serial1.begin(115200);
    // initialize ESP module
    lcd.setCursor(0, 0);
    lcd.print("ESP initialize  ");
    lcd.setCursor(0, 1);
    lcd.print("40%");

    WiFi.init(&Serial1);
    
    lcd.setCursor(0, 0);
    lcd.print("Connect to WiFi ");
    lcd.setCursor(0, 1);
    lcd.print("65%");
    // check for the presence of the shield
    if (WiFi.status() == WL_NO_SHIELD) {
        Serial.println("WiFi shield not present");
        // don't continue
        while (true);
    }

    // attempt to connect to WiFi network
    while (status != WL_CONNECTED) {
        Serial.print("Attempting to connect to WPA SSID: ");
        Serial.println(ssid);
        // Connect to WPA/WPA2 network
        status = WiFi.begin(ssid, pass);
    }

    lcd.setCursor(0, 0);
    lcd.print("Connect to MQTT ");
    lcd.setCursor(0, 1);
    lcd.print("80%");

    Serial.println("You're connected to the network");

    //connect to MQTT server
    client.setServer(server , 1883);
    client.setCallback(callback);
    
    lcd.setCursor(0, 0);
    lcd.print("Connect to MQTT ");
    lcd.setCursor(0, 1);
    lcd.print("100%");
    delay(400);
    lcd.clear();
}

//print any message received for subscribed topic
void callback(char* topic, byte* payload, unsigned int length) {
    payload[length] = '\0';
    String value = String((char*)payload);
   
    Serial.println(value);
    lcd.clear();
    lcd.print(value);

    if (value == "State" || value == "state") {
        lcd.clear();
        lcd.print("ESP is ready");
        client.publish("km/esp/data", "ESP is still ready");
    }
    else
    {
        client.publish("km/esp/data", "OK");
    }
}

void loop() {
    if (!client.connected()) {
        reconnect();
    }
    client.loop();
    delay(250);
}

void reconnect() {
    // Loop until we're reconnected
    while (!client.connected()) {
        Serial.print("Attempting connection ");
        // Attempt to connect, just a name to identify the client
        if (client.connect("AMega")) {
            Serial.println("connected");
            // Once connected, publish an announcement…
            client.publish("km/esp/data","ESP is ready");
            // … and resubscribe
            client.subscribe("km/esp/input", 0);

        }
        else {
            Serial.print("failed");
            Serial.print(client.state());
            Serial.println(" try again in 5 seconds");
            // Wait 5 seconds before retrying
            delay(5000);
        }
    }
}

 

Z góry dziękuje za pomoc.

Udostępnij ten post


Link to post
Share on other sites

Tak z czystej ciekawości - po co Ci ten

delay(250);

w loop()?

Udostępnij ten post


Link to post
Share on other sites

Bez tego odbieranie danych w ogóle nie działało. Znalazłem to rozwiązanie na jakimś zagranicznym forum.

Udostępnij ten post


Link to post
Share on other sites

Domyśliłem się, że to "ulep" żeby jakoś działało 🙂 Pytanie, czy wiesz dlaczego 😉 

Udostępnij ten post


Link to post
Share on other sites

Szczerze przyznaje, że nie mam pojęcia dlaczego to pomogło. Mogę się tylko domyślać 🙂

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Nie mam dość czasu, żeby analizować teraz dokładnie działanie tej biblioteki od mqtt, ale mam pewne podejrzenia 🙂 próbowałeś możliwie zmniejszyć ten delay?

Edytowano przez Nawyk

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Tak. Jeśli ustawiłem za mało milisekund to Arduino nie odbierało żadnych danych, a jeśli za dużo to dane dochodziły z opóźnieniem ale to nic dziwnego 🙂 .

Dzisiaj po południu spróbuję ustawić dla testów jakiś większy delay i przetestuję reakcję.

Edytowano przez Kacper1263

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Pokombinowałem trochę z tym delay'em. Kiedy ustawiłem go na większą wartość np 2,5 s to arduino oczywiście odbierało dane co 2,5 s, ale ciągle przy szybszym tempie wysyłania danych Arduino padało. Przy ustawieniu niskich wartości Arduino ciągle padało. Jako ciekawostkę podam ze podczas gdy ustawiłem delay na 100 ms to kiedy już zauważyłem że Arduino się zacięło i przestała migać niebieska dioda ESP to kiedy wysyłałem jakieś dane to mimo braku reakcji samego Arduino oraz diody na ESP widziałem ze lekko przygasa ekran LCD czyli dane docierały do samego Arduino. Po chwili Arduino sie zresetowało. Czasem sytuacja wygląda tak że Arduino nie reaguje, dioda TX nie miga podczas odbioru danych ale dioda na ESP mruga, czyli ESP odbiera dane. Oczywiście po kilku sekundach następuje samoczynny reset Arduino.

 

EDIT:

Właśnie zauważyłem, że jeśli ustawiłem delay na 10 ms to dane bardzo czesto nie pokazywaly sie na LCD, ale podczas "spamienia" klawisza wyślij Arduino nie padało.

Może uda mi się nieco zmniejszyć intensywność tego problemu ustawiając odpowiedni delay. Mimo wszystko chcialbym się dowiedzieć czym jest to wszystko powodowane.

Czasem kiedy Arduino się zetnie, to dostaję w serial monitorze: [WiFiEsp] TIMEOUT: 21

Edytowano przez Kacper1263

Udostępnij ten post


Link to post
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »

×