Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Błąd połączenia Arduino Leonardo z Cytron ESP8266 WiFi Shield

mageron 12 Sty 2019 18:09 84 2
  • #1 12 Sty 2019 18:09
    mageron
    Poziom 2  

    Dzień dobry.
    Do mojej stacji pogodowej chcę wykorzystać Cytron ESP8266 WiFi Shield które będzie wysyłało dane na serwer.

    Po przeczytaniu manuala dołączonego od producenta (nie mogę załączać linków zewnętrznych)
    i wykoniu zaleceń krok po kroku układ nie odpowiada. Przy teście AT port szeregowy nie pokazuje nic. Przy wykorzystaniu biblioteki od producenta i wykorzystaniu przykładu CytronWiFiDemo

    Otrzymuje komunikat:
    17:48:23.339 -> AT+RST
    17:48:33.449 -> Error talking to shield

    Załączam kod oraz komuniakt z monitora portu szeregowego.

    Code:

    #include <CytronWiFiShield.h>
    #include <CytronWiFiClient.h>
    #include <CytronWiFiServer.h>
    #include <SoftwareSerial.h>

    const char *ssid = "UPC1A313EF";
    const char *pass = "vhhkafxFQbb5";
    IPAddress ip(192, 168, 1 ,242);
    ESP8266Server server(80);

    const char htmlHeader[] = "HTTP/1.1 200 OK\r\n"
                            "Content-Type: text/html\r\n"
                            "Connection: close\r\n\r\n"
                            "<!DOCTYPE HTML>\r\n"
                            "<html>\r\n";
                             
    void setup() {
     
      // put your setup code here, to run once:
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for Leonardo only
      }
     
      if(!wifi.begin(0, 1))
      {
        Serial.println(F("Error talking to shield"));
        while(1);
      }
      Serial.println(wifi.firmwareVersion());
      Serial.print(F("Mode: "));Serial.println(wifi.getMode());// 1- station mode, 2- softap mode, 3- both
      // Uncomment these 2 lines if you are using static IP Address
     //  Serial.println(F("Setup wifi config"));
     //  wifi.config(ip);
      Serial.println(F("Start wifi connection"));
      if(!wifi.connectAP(ssid, pass))
      {
        Serial.println(F("Error connecting to WiFi"));
        while(1);
      }
      Serial.print(F("Connected to "));Serial.println(wifi.SSID());




      Serial.println(F("IP address: "));
      Serial.println(wifi.localIP());
      wifi.updateStatus();
      Serial.println(wifi.status()); //2- wifi connected with ip, 3- got connection with servers or clients, 4- disconnect with clients or servers, 5- no wifi
      clientTest();
      espblink(100);
      server.begin();
    }

    void loop() {
      // put your main code here, to run repeatedly:
      serverTest();
    }

    void espblink(int time)
    {
      for(int i = 0;i<12;i++)
      {
        wifi.digitalWrite(2,wifi.digitalRead(2)^1);
        delay(time);
      }
    }

    void serverTest()
    {
      ESP8266Client client = server.available();
     
      if(client.available()>0)
      {
        String req = client.readStringUntil('\r');
        // First line of HTTP request looks like "GET /path HTTP/1.1"
        // Retrieve the "/path" part by finding the spaces
        int addr_start = req.indexOf(' ');
        int addr_end = req.indexOf(' ', addr_start + 1);
        if (addr_start == -1 || addr_end == -1) {
          Serial.print(F("Invalid request: "));
          Serial.println(req);
          return;
        }
        req = req.substring(addr_start + 1, addr_end);
        Serial.print(F("Request: "));
        Serial.println(req);
        client.flush();
       
        if(req.equals("/"))
        {
          IPAddress ip = wifi.localIP();
          String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);
          client.print(htmlHeader);
          String htmlBody = "Hello from ESP8266 at ";
          htmlBody += ipStr;
          htmlBody += "</html>\r\n\r\n";
          client.print(htmlBody);
        }
       
        else if(req.equals("/analog"))
        {
          client.print(htmlHeader);
          String htmlBody="";
          for (int a = 0; a < 6; a++)
          {
            htmlBody += "A";
            htmlBody += String(a);
            htmlBody += ": ";
            htmlBody += String(analogRead(a));
            htmlBody += "<br>\r\n";
          }
          htmlBody += "\r\n</html>\r\n";
          client.print(htmlBody);
        }
       
        else if(req.equals("/gpio2"))
        {
          wifi.digitalWrite(2, wifi.digitalRead(2)^1);
          client.print(htmlHeader);
          String htmlBody="GPIO2 is now ";
          htmlBody += wifi.digitalRead(2)==HIGH?"HIGH":"LOW";
          htmlBody += "</html>\r\n";
          client.print(htmlBody);
        }
       
        else if(req.equals("/info"))
        {
          String toSend = wifi.firmwareVersion();
          toSend.replace("\r\n","<br>");
          client.print(htmlHeader);
          client.print(toSend);
          client.print("</html>\r\n");
        }

        else
          client.print("HTTP/1.1 404 Not Found\r\n\r\n");
       
        client.stop();
     
      }
    }

    void clientTest()
    {
      const char destServer[] = "strona producenta";
      ESP8266Client client;
      if (!client.connect(destServer, 80))
      {
        Serial.println(F("Failed to connect to server."));
        client.stop();
        return;
      }
     
      const char *httpRequest = "GET /testwifi/index.html HTTP/1.1\r\n"
                               "Host: "strona producenta"\r\n"
                               "Connection: close\r\n\r\n";
      if(!client.print(httpRequest))
      {
        Serial.println(F("Sending failed"));
        client.stop();
        return;;
      }

      // set timeout approximately 5s for server reply
      int i=5000;
      while (client.available()<=0&&i--)
      {
        delay(1);
        if(i==1) {
          Serial.println(F("Timeout"));
          return;
          }
      }

      while (client.available()>0)
      {
        //char c = (char)client.read();
        //Serial.print(c);
        Serial.write(client.read());
      }
     
      client.stop();
    }

    Arduino jest podłączone przez USB i dodatkowo zasilone zasilaczem.

    Przy próbie wykorzystania Firmware producenta występuję błąd połączenia z portem. Dodam, że program się kompiluje i wgrywa do płytki.
    Za wszelką pomoc z góry dziękuję.

    0 2
  • #2 13 Sty 2019 19:06
    emarcus
    Poziom 35  

    mageron napisał:
    Dzień dobry.
    Do mojej stacji pogodowej chcę wykorzystać Cytron ESP8266 WiFi Shield które będzie wysyłało dane na serwer.

    Po przeczytaniu manuala ........

    Otrzymuje komunikat:
    17:48:23.339 -> AT+RST
    17:48:33.449 -> Error talking to shield


    Na wstępie zaznaczę że nie znam tej płytki (Cytron_shield ), ale przegladajac pobieżnie manual wyhamowałem na sekcji 6.1 ; Ustawienie jumpers dla użytej płyty głównej, gdzie referuje się ustawienie ich w/g tabeli w sekcji 5.1
    Czy jesteś pewny że te zworki masz ustawione poprawnie?
    Objawy wskazywałyby na brak komunikacji....

    W czym ten układ/zespół: (Leo + Cytron Shield ) jest lepszy od bezpośredniego modułu :NodeMcu V3 Lua WIFI board based on ESP8266,
    czy chocby tańsza versja (ok $2) WeMos D1 Mini WIFI Development Board D1 Mini NodeMCU Lua IOT Board 3.3V?

    e marcus

    0
  • #3 13 Sty 2019 22:44
    mageron
    Poziom 2  

    Nie odpowiem Ci na to pytanie, bo mój projekt ma w założeniu być na arduino, a płytkę Cytron wybrałem bo nie mogłem dostać sparkfun wifi shield. Napisałem, że zworki ustawiłem odpowiednio, a problem już pojawia się na podstawowym teście w trybie USB. Zastanawiam się czy to może być problem samego arduino. Mam nadzieję, że ktoś może już miał podobny problem albo zauważy jakiś błąd, który popełniam.

    0