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
(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
(edytowany)

Mam dokładnie ten sam problem z ESP01 i MQTT. Dokładnie te same objawy i brak rozwiązania. Rozumiem ten delay też znalazłem to rozwiązanie na innym forum i wiem, że jest on konieczny aby to w ogóle działało.

Dodam, że idąc za śladem różnych porad na forach wykonałem dodatkowe rzeczy:
1/ podłączyłem zasilanie dodatkowe (była gdzieś informacja, że może prądowo Arduino nie daje rady)
2/ zmniejszyłem baudrate do 9600 (podobno komuś to pomogło)
3/ podpiąłem ESP01 na dłuższych przewodach odsuwając je tym samym od płytki (ktoś napisał, że może zakłócenia jakieś się generują w pobliżu płytki stykowej)

Nic nie pomogło 😞 

@Kacper1263 Czy w końcu udało Ci się znaleźć remedium na ten problem?

 

Dodam, że na BR 9600 mam wrażenie, że działa jeszcze gorzej.

Edytowano przez mikims
dodatkowe informacje

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...