ESP8266 Arduino - szerver újraindítás vagy ön Reset

ESP8266, ESP32 chipek és az ESP-xx modulok. Programozási nyelvek, trükkök, hardware tippek.

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1030
Csatlakozott: 2009. február 28. szombat, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

HozzászólásSzerző: SanyiSay » 2016. július 22. péntek, 21:06

Hogy egy kicsit a AP név váltásra is visszatérjek.
Ez a forma is működik.

Kód: Egész kijelölése

WiFi.softAPdisconnect(true);
delay(100);
WiFi.mode(WIFI_AP);
WiFi.softAP(s.c_str(), AP_PASS, 4);

kszabi
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2016. április 11. hétfő, 14:22

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

HozzászólásSzerző: kszabi » 2016. július 23. szombat, 5:12

Szép kis gyűjtemény, köszi.

kszabi
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2016. április 11. hétfő, 14:22

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

HozzászólásSzerző: kszabi » 2016. július 24. vasárnap, 6:31

Sziasztok!
Két esp között próbálok kapcsolatot létrehozni egyenlőre sikertelenül.
AZ egyik AP a másik STA.
Az STA látja az AP-t, wifi kapcsolat létre is ön, de mint szerver kliens kapcsolat nem jön össze.
Viszont ha az egyszer AP-nak beállított modul tápot kap rögtön sugározni kezd, hiába fut rajta csak egy led villogtató program.
Ez a modul már nem tud a ruteremhez sem csatlakozni olyan kóddal ami az elött simán ment.
Van olyan megoldás hogy minden újra programozáskor tiszta lappal induljon, és ne legyenek benne a korábbi beállítások?

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1030
Csatlakozott: 2009. február 28. szombat, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

HozzászólásSzerző: SanyiSay » 2016. július 24. vasárnap, 7:33

Ha szerver megvan és eléred webes böngészőről, és az ott futtatott oldalon mondjuk ajaxal tudsz lekérni adatot az ESP-ről akkor már csak egy hasonló kliens kell az ESP-re.

Kód: Egész kijelölése

void client_read(IPAddress *ip, String *send_text) {

   WiFiClient client;
   if (!client.connect(*ip, 80)) {
      //Serial.println("connection failed");
      *send_text = "failed";
      return;
   }
   client.print(
         String("GET ") + *send_text + " HTTP/1.1\r\n" + "Host: " + "\r\n"
               + "Connection: close\r\n\r\n");
   unsigned long timeout = millis();
   while (client.available() == 0) {
      if (millis() - timeout > 5000) {
         //Serial.println(">>> Client Timeout !");
         client.stop();
         *send_text = "failed";
         return;
      }
   }
   while (client.available()) {
      *send_text = client.readStringUntil('\r');
      //Serial.print(line);
   }
}



Meghívása

Kód: Egész kijelölése

IPAddress ip = { 192, 168, x, x }; // szerver ESP címe
String send_text = F("/set_k?k=0"); // üzenet
client_read(&ip, &send_text); // &send_text = szerver válasz üzenete ebben jön vissza
Serial.print(send_text);


ESP rögzíti az előző kapcsolódási módot azt törölni kell ha nem szeretnéd használni.
Ezt pedig pont kicsit lejjebb tettem közzé, hogy lehet az AP módot kikapcsolni.

Következő kód azt csinálja magpróbál STA kapcsolatot felvennia routerrel ha ne jön össze akkor AP-STA (ilyenkor be lehet állítani a wifi csatlakozási adatokat akár) közben ha mégis sikerül STA mód akkor kikapcsolja az AP-STA módot és csak STA lesz még meg nem szakad megint.
Simán ezt teszem a loop ciklusba pár másodpercenként meghívva.
Itt kb látszik a Wifi mód váltogatás.
Régen azt tréfált meg hogy a egy új ESP modul beállítása WiFi.setAutoConnect(false); volt és nem csatlakozott. Pontosabban akkor még nem tudtam hogy van ilyen csak azt láttam hogy ha egyszer elveszti a kapcolatot többé nem kapcsolódik a routerhez.


Kód: Egész kijelölése

/**
 *
 * const char* sta_ssid
 * const char* sta_psk
 * byte* sta_ip
 * const char* ap_ssid
 * const char* ap_psk
 * byte* ap_channel              Sikertelen STA csatlakozás esetén érvényes,
 *                               minden más esetben az STA kapcsolat catornája
 *                               lesz az AP csatorna száma is.
 *
 * ha még nem volt STA csatlakozás
 * WiFi.status -> 6
 * WiFi.Mode -> 3
 */

void STA_AP_STA(const char* sta_ssid, const char* sta_psk, byte* sta_ip,
      const char* ap_ssid, const char* ap_psk, byte* ap_channel) {
   IPAddress f_ip = WiFi.localIP();

//   Serial.print("WiFi.status -> ");
//   Serial.println(WiFi.status());
//   Serial.print("WiFi.Mode -> ");
//   Serial.println(WiFi.getMode());
//   Serial.println();

// ha STA módban van IP ellenőrzés
   if (WiFi.status() == 3) { // ha STA módban van
      // ha nem fix IP cím és nem 0 akkor beállítja a fix IP címet
      if (f_ip[3] != *sta_ip and *sta_ip != 0) {
         f_ip[3] = *sta_ip;
         WiFi.config(f_ip, WiFi.gatewayIP(), WiFi.subnetMask());
//         WifiData();

      }
      //Serial.println("STA OK");
      if (WiFi.getMode()!= 3) {
         WiFi.softAPdisconnect(true);
         WiFi.mode(WIFI_STA);
         return;
      }
   } else { // ha megszűnt az STA kapsolat
      // AP-STA  mód beállítása ha még nincs beállítva
      if (WiFi.getMode() != WIFI_AP_STA) {
         WiFi.mode(WIFI_AP_STA);
         WiFi.softAP(ap_ssid, ap_psk, *ap_channel, 0);
      }
   }
   // ha 1 a status akkor már próbált csatlakozni de nem sikerült.
   // innen már magától csatlakozik    WiFi.setAutoConnect(true); miatt nem kell nekünk
   if (WiFi.status() == 1) {
      return;
   }

   // STA csatlakozás indítása, beállítása
   WiFi.softAPdisconnect(true);
   WiFi.mode(WIFI_STA);
   WiFi.setAutoConnect(true);
   WiFi.begin(sta_ssid, sta_psk);
   byte b = 0;
   while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
      // 10 x próbál meg csatlakozni AP_STA módba lép
      b++;
      if (b > 10) {
         WiFi.mode(WIFI_AP_STA);
         return;
      }
   }
   // fix IP cím beállítása ha nem 0
   if (*sta_ip != 0) {
      f_ip = WiFi.localIP();
      f_ip[3] = *sta_ip;
      WiFi.config(f_ip, WiFi.gatewayIP(), WiFi.subnetMask());
   }
}


Estig nem vagyok addig remélem sikerül az infókból gazdálkodni. :)

kszabi
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2016. április 11. hétfő, 14:22

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

HozzászólásSzerző: kszabi » 2016. július 24. vasárnap, 7:40

Köszi Sanyi!
Átnézem ezeket, majd írom mire mentem.
Az előbb sikerült a kapcsolat, a hiba okát még nem értem, de sikerült megkerülni.
Köszi Szabolcs

kszabi
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2016. április 11. hétfő, 14:22

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

HozzászólásSzerző: kszabi » 2016. augusztus 10. szerda, 18:28

Sziasztok!
Újabb kérdésem lenne,
Ha az esp modult AP módba állítom, van e arra lehetőség hogy én határozzam meg mi legyen a modul ip címe?
Köszi Szabolcs.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9970
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

HozzászólásSzerző: Robert » 2016. augusztus 10. szerda, 18:42

A modul címe AP-re kötött. Nem átírható.

kszabi
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2016. április 11. hétfő, 14:22

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

HozzászólásSzerző: kszabi » 2016. augusztus 10. szerda, 19:14

Találtam egy ilyen megoldást:
IPAddress ip(192, 168, 2, 10);
IPAddress SubnetMask(255, 255, 255, 0);

WiFi.softAPConfig(ip, ip, SubnetMask);
WiFi.softAP(AP_SSID, AP_PASS);

Ezen az ip-n elérem másik esp ről vagy laptopról is.
Ez így jó lehet, vagy félreértek valamit?

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1030
Csatlakozott: 2009. február 28. szombat, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

HozzászólásSzerző: SanyiSay » 2016. augusztus 10. szerda, 19:30

Vagy ha mégis akkor pld. így. :)

Kód: Egész kijelölése

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

char ap_ssid[] = "ESP";
char ap_pass[] = "12345678";
IPAddress ap_ip(192, 168, 4, 12);
IPAddress ap_sub(255, 255, 255, 0);
int ap_channel = 4;

ESP8266WebServer server(80);

void get_wifi() {
   Serial.print(F("**********************************\n"));
   Serial.print(F("* STA MAC: "));
   Serial.println(WiFi.macAddress()); // ESP  MAC címmét adja vissza
   Serial.print(F("* STA localIP: "));
   Serial.println(WiFi.localIP()); // STA IP cím
   Serial.print(F("* AP MAC: "));
   Serial.println(WiFi.softAPmacAddress()); // ESP  MAC címmét adja vissza
   Serial.print(F("* AP localIP: "));
   Serial.println(WiFi.softAPIP()); // IP cím
   Serial.print(F("* wifi Status: "));
   Serial.println(WiFi.status());
   Serial.print(F("* wifi STA SSID: "));
   Serial.println(WiFi.SSID());
   Serial.print(F("* wifi STA psk: "));
   Serial.println(WiFi.psk());
   Serial.print(F("* wifi STA RSSI: "));
   Serial.println(WiFi.RSSI());
   Serial.print(F("* wifi getAutoConnect(): "));
   Serial.println(WiFi.getAutoConnect());
   Serial.print(F("* wifi waitForConnectResult(): "));
   Serial.println(WiFi.waitForConnectResult());
   Serial.print(F("* wifi Mode: "));
   Serial.println(WiFi.getMode()); // Wifi mode  WIFI_OFF = 0, WIFI_STA = 1, WIFI_AP = 2, WIFI_AP_STA = 3

   Serial.print(F("*********\n"));
   WiFi.printDiag(Serial);
   Serial.print(F("**********************************\n"));
}

/***************************/
void setup(void) {
   Serial.begin(115200);
   delay(10);
   Serial.println();

   WiFi.disconnect();
   WiFi.mode(WIFI_AP);
   WiFi.softAPConfig(ap_ip, ap_ip, ap_sub);
   WiFi.softAP(ap_ssid, ap_pass, ap_channel);

   get_wifi();

   server.on("/", []() { // ip cím hez tartozó html oldal megrajzolása
            server.send ( 200, "text/plain", "Sikeres AP kapcsolat teszt oldal" );
         });
   server.begin(); 
}

/***************************/
void loop(void) {
   server.handleClient(); 
}

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1030
Csatlakozott: 2009. február 28. szombat, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

HozzászólásSzerző: SanyiSay » 2016. augusztus 10. szerda, 19:32

Jól érted, és gyorsabb is voltál.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9970
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

HozzászólásSzerző: Robert » 2016. augusztus 10. szerda, 20:03

Ezzel nem azt írhtod át, amivel a helyi hálózaton lehet?
Amikor önálló (router nélküli), akkor nem kötött?

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1030
Csatlakozott: 2009. február 28. szombat, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

HozzászólásSzerző: SanyiSay » 2016. augusztus 10. szerda, 20:22

Nem kötött.
STA módban amikor routerhez csatlakozol akkor ezt kell használni

Kód: Egész kijelölése

  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());



Itt nem mindegy mikor adod meg az IP címet mert ha jól emlékezem akkor pld a gmail levelező nem működik ha ebben a formában kap egyedi IP címet az ESP, de ha a routerhez csatlakozás után kap fix IP címet akkor szépen működik.

ami a következő képen alakul

Kód: Egész kijelölése

  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  WiFi.config(ip, gateway, subnet);

  Serial.println("");
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());


kszabi
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2016. április 11. hétfő, 14:22

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

HozzászólásSzerző: kszabi » 2016. augusztus 10. szerda, 21:59

Nekem mindkét változatra szükségem van.
Az az esp amin a szerver fut AP_STA módban van. A DHCP-től kér fix IP-t. Ehhez csatlakozik a többi kliensként a ruteren keresztül.
Ha a ruter megszűnik akkor direkt kapcsolódnak, majd lehetőség szerint vissza. Ugyanerre akarom állítani az AP mód IP címét hogy kliens-szerver kapcsolatnál ne kelljen külön kezelni. Hogy ez okoz e ütközést, az még tesztelésre vár.
Most azon vesződők hogy kliens oldalon az autóconnekt mindig az elsődleges (ruter) kapcsolat irányába menjen.

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1030
Csatlakozott: 2009. február 28. szombat, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: ESP8266 Arduino - szerver újraindítás vagy ön Reset

HozzászólásSzerző: SanyiSay » 2016. augusztus 10. szerda, 22:12

Hajdanán nekem is volt efféle elképzelésem hogy ugyanazt a ssid és IP címet kapja az esp mint a router és ha nincs router akkor az esp veszi át a szerepét. Aztán erre nem volt akkora szükség mégsem és így már halva született, nem lett kidogozva.

Az hogy ide oda váltogat STA és AP-STA mód között a router elérhetőségtől függően, arra már közzé tettem az én megoldásom nemrég. Csak ott az AP maradt a gyári IP címen.


Vissza: “ExpressIf WiFi”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég