NodeMCU (Esp) i Arduino zapętlenie na find(OK)

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
Qrczaak
Młodszy majsterkowicz
Posty: 1
Rejestracja: 18 cze 2019, 00:19

NodeMCU (Esp) i Arduino zapętlenie na find(OK)

Post autor: Qrczaak » 18 cze 2019, 00:42

Hej, jakiś czas temu zacząłem swoją przygodę z Arduino i jeszcze jestem w tym zielony. Aktualnie próbuję zrobić projekt w którym połączylem Arduino UNO z nodemcu, wzorowałem się na tym tutorialu electronicshub. org/wifi-controlled-led-using-esp8266-and-arduino, więc zgodnie z nim połączyłem układy jak w ten sposób

Arduino NodeMCU
pin2 - TX
pin3 - RX

Pominąłem CH_PD bo z tego co czytalem w przypadku NodeMCU jest to zbędne.

Problematyczna część kodu wygląda następująco:

Kod: Zaznacz cały

#include <SoftwareSerial.h>
SoftwareSerial esp8266(2,3); //Pin 2 & 3 of Arduino as RX and TX. Connect TX and RX of ESP8266 respectively.
#define DEBUG true
#define led_pin 11 //LED is connected to Pin 11 of Arduino


void setup()
  {
    pinMode(led_pin, OUTPUT);
    digitalWrite(led_pin, LOW);
    Serial.begin(9600);
    esp8266.begin(115200); //Baud rate for communicating with ESP8266. Your's might be different.
    esp8266Serial("AT+RST\r\n", 5000, DEBUG); // Reset the ESP8266
    esp8266Serial("AT+CWMODE=1\r\n", 5000, DEBUG); //Set station mode Operation
    esp8266Serial("AT+CWJAP=\"MojeWifi\",\"abcdefgh\"\r\n", 5000, DEBUG);//Enter your WiFi network's SSID and Password.
                                   
    while(!esp8266.find("OK")) 
    {
      }
    esp8266Serial("AT+CIFSR\r\n", 5000, DEBUG);//You will get the IP Address of the ESP8266 from this command. 
    esp8266Serial("AT+CIPMUX=1\r\n", 5000, DEBUG);
    esp8266Serial("AT+CIPSERVER=1,80\r\n", 5000, DEBUG);
  }
Ogólnie samo połączenie działa bo za pierwszym wgraniem programu na płytkę, wszystko fajnie zadzialalo, udało się połączyć z wifi i nawet do arduino doszedł GET który wyslalem. Problem pojawił się jednak kiedy próbowałem po raz drugi wgrać program na plytkę, od tej pory łapie on zawiechę na pętli while(!esp8266.find("OK")). Jako, że nie do końca ogarniam jak działają połączenia szeregowe czy to może być spowodowane złym połączeniem arduino z nodemcu?

Druga sprawa, udało mi się obejść problem, chociaż nie wiem czy jest to rozwiązanie dobre. Zamieniłem

Kod: Zaznacz cały

    esp8266Serial("AT+CWJAP=\"MojeWifi\",\"abcdefgh\"\r\n", 5000, DEBUG);//Enter your WiFi network's SSID and Password.
                                   
    while(!esp8266.find("OK")) 
    {
      }
na następujący kod:

Kod: Zaznacz cały

String connection = esp8266Serial("AT+CWJAP=\"MojeWifi\",\"abcdefgh\"\r\n", 5000, DEBUG);//Enter your WiFi network's SSID and Password.
                                   
    if(connection.indexOf("OK") > 0){
    	    esp8266Serial("AT+CIFSR\r\n", 5000, DEBUG);//You will get the IP Address of the ESP8266 from this command. 
            esp8266Serial("AT+CIPMUX=1\r\n", 5000, DEBUG);
            esp8266Serial("AT+CIPSERVER=1,80\r\n", 5000, DEBUG);
    }
To rozwiązanie zadziałało, i udało się znowu połączyć z wifi. Zastanawiam się jednak czy jest to dobre rozwiązanie. Zakładam że pętla while(!esp8266.find("OK")) czeka aż uda się połączyć z wifi po czym poprzez połączenie szeregowe dostajemy wiadomość że udało się połączyć ale coś tutaj zawodzi. Po mojej zmianie na if, nie czekamy aż wifi się połączy tylko sprawdzamy odrazu i jeśli łączenie będzie trwało dłużej to program nie zadziała?

Także właściwie mam dwa pytania do osób mądrzejszych ode mnie. Jaki może być powód tego że pętla się... zapętla. I czy rozwiązanie z if jest w miarę odporne na błędy?

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


ODPOWIEDZ

Strony partnerskie: