Bitte um Code Überprüfung. Irgendwie haut das noch nicht zuverlässig hin.

Hallo zusammen,

mit Eurer Hilfe habe ich die richtige URL Übermittlung irgendwann hinbekommen, nur irgendwas bockt da noch etwas.

Zu den Eckdaten.
Es sind 2 x ESP-02 verbaut (wegen der externen Antenne) die meiner Meinung nach wie der ESP-01 sein sollten nur mit externer Antenne.
Beim Drücken des Tasters (ist mit Reset verbunden) soll der ESP aufwachen, sich ins Wlan einloggen, eine vordefinierte URL aufrufen, dieses mit Blinken bestätigen und dann in den DeepSleep abwandern.
Aus diesem Grund sind auch 2 ESPs verbaut, da der eine einschaltet und der andere ausschaltet (url verändert) und das alles mittels 2 1,5V Monoblocks gespeist wird.

#include <ESP8266WiFi.h>

const char* ssid     = "geheim";
const char* password = "geheim";

const char* host = "192.168.10.25";

#define LEDpin 2


void setup() {

  pinMode(LEDpin, OUTPUT); 
  digitalWrite(LEDpin, HIGH);
  Serial.begin(115200);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  /*  Statische IP  */
  IPAddress ip(192, 168, 10, 26);
  IPAddress gateway(192, 168, 10, 2);
  IPAddress subnet(255, 255, 255, 0);
  IPAddress dns(192, 168, 10, 2);
  WiFi.config(ip, dns, gateway, subnet);
  

  while (WiFi.status() != WL_CONNECTED) {
  delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  WiFi.setAutoConnect(true);

int value = 0;

  ++value;

  Serial.print("connecting to ");
  Serial.println(host);

  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }

  // We now create a URI for the request
  String url = "/?relais=1";

  Serial.print("Requesting URL: ");
  Serial.println(url);

  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  delay(10);

  // Read all the lines of the reply from server and print them to Serial
  Serial.println("Respond:");
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

  Serial.println();
  Serial.println("closing connection");


    digitalWrite(LEDpin,LOW);    // Blinkimpulse für erfolgreiche Übermittlung
    delay(500);
    digitalWrite(LEDpin,HIGH);
    delay(500);
    digitalWrite(LEDpin,LOW);
    delay(1000);
    digitalWrite(LEDpin,HIGH);
    delay(500);
    digitalWrite(LEDpin,LOW);
    delay(2000);
    digitalWrite(LEDpin,HIGH);
    delay(2000);


ESP.deepSleep(0);
}


void loop() {
}

Die statische IP ist bisher nicht geschrieben, aktuell ist es noch DHCP.
Aufgefallen ist mir letztens nach einigen Wochen Ruhepause, dass der eine sich irgendwie verhaspelt.
Er bleibt lange im W-Lan und nichts passiert. Er hat wohl auch keine IP bekommen, deshalb soll es statisch werden.

Die Frage ist jetzt ob das mit dem Deepsleep so in Ordnung geht?

Und eventuell als Erweiterung wie ich ein zusätzliches Fehlerblinken einbauen kann.

Hallo noch mal.

Hat da keiner ne Idee wie er mir eventuell helfen kann??

Hallo

Ich danke Dir schon mal für Deine Hilfe.
Ich glaube dieses Verhaspeln von dem ich schrieb kam vom W-Lan. Ich habe ein W-Lan System, welches mir etwas mehr Einblicke verschafft und dort sah ich den ESP Online, jedoch ohne zugewiesener IP.
Also ist wohl genau diesen fehlende W-Lan Verbindung eingetreten.
Um dem aber zusätzlich zu umgehen, werde ich es statisch laufen lassen.

Ich habe den Code mal mit Deinen

Vorschlägen ergänzt/geändert. Die Änderungen sind zur Übersicht rot.

#include <ESP8266WiFi.h>

const char* ssid     = "geheim";
const char* password = "geheim";

const char* host = "192.168.10.25";

#define LEDpin 2


void setup() {

  pinMode(LEDpin, OUTPUT);
  digitalWrite(LEDpin, HIGH);
  Serial.begin(115200);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  /*  Statische IP  */
  IPAddress ip(192, 168, 10, 26);
  IPAddress gateway(192, 168, 10, 2);
  IPAddress subnet(255, 255, 255, 0);
  IPAddress dns(192, 168, 10, 2);
  WiFi.config(ip, dns, gateway, subnet);
 

  while (WiFi.status() != WL_CONNECTED) && millis(5000){
  delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected"); 
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  WiFi.setAutoConnect(true);

int value = 0;

  ++value;

  Serial.print("connecting to ");
  Serial.println(host);

  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }

  // We now create a URI for the request
  String url = "/?relais=1";

  Serial.print("Requesting URL: ");
  Serial.println(url);

  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  delay(10);

  // Read all the lines of the reply from server and print them to Serial
  Serial.println("Respond:");
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

  Serial.println();
  Serial.println("closing connection");


    digitalWrite(LEDpin,LOW);    // Blinkimpulse für erfolgreiche Übermittlung
    delay(500);
    digitalWrite(LEDpin,HIGH);
    delay(500);
    digitalWrite(LEDpin,LOW);
    delay(1000);
    digitalWrite(LEDpin,HIGH);
    delay(500);
    digitalWrite(LEDpin,LOW);
    delay(2000);
    digitalWrite(LEDpin,HIGH);
    delay(2000);


ESP.deepSleep(0);
delay(500);
}


void loop() {
}

Hinter dem deepsleep kommt so das delay?
Also leg Dich schlafen, höre auf nichts mehr und dann noch ein Kommando hinterher?

Das Codefragment:
ESP.deepSleep(0);
delay(500);

Das mit dem Abbruch habe ich auf 5000, sprich 5 Sekunden gelegt. Das sollte wohl massig langen.

Hier das andere Fragment
while (WiFi.status() != WL_CONNECTED) && millis(5000){

Ist das so richtig eingebettet? Kann der 02er wie der 01er wo man die PowerLED zerstört richtigen Deepsleep?

Hallo

versuch mal dich abzumelden. Ich benutze das so an einem ESP Modul und einer Fritz-Box. Der ESP wird alle 30 minuten aufgeweckt , sendet was und geht wieder pennen. Das läuft jetzt seit Mai so, wurde nur 2-3 mal neu gestartet weil ich noch was geändert habe.

bei mir sieht das so aus, das mit der Sleeptime fällt bei Dir ja weg.

//----------------- ESP sleep
void ESP_sleep(uint16_t sl) {
  delay(500);// noch warten sonst fehlen Telegramme
  // anpassung der esp Frequenz +5%
  sl = sl + sl * 5 / 100;
  Serial.printf("gehe schlafen für %us Laufzeit war %lums\n", sleeptime, millis());
  WiFi.disconnect(true);
  delay(1);
  WiFi.mode(WIFI_OFF);
  WiFi.forceSleepBegin ();
  delay(1);
  ESP.deepSleep(sl * 1000000, WAKE_NO_RFCAL);
  delay(1);
}

wenn Du die Daten zum einloggen so im Sketch stehen hast werden die bei jedem Start in den Festspeicher geschrieben. Irgendwann ist der dann hin.

um das zu verhindern

WiFi.persistent(false);   // daten nicht in EEprom
WiFi.config(ip, dns, gateway, subnet);

Heinz

Also vor dem deepsleep noch ein WiFi.mode(WIFI_OFF); um das wlan auszuschalten?

WiFi.persistent(false); // daten nicht in EEprom und das bevor er sich die IP gibt

Hallo,

zu Punkt 1 so hätte ich mir das gedacht

  WiFi.disconnect(true);
  delay(1);
  WiFi.mode(WIFI_OFF);
  WiFi.forceSleepBegin ();
  delay(1);
  ESP.deepSleep();
  delay(1);

zu Punk2 : ja vor dem WiFi.config()

Heinz

noiasca:
richtig ja, aber nun musst du unterhalb auch noch prüfen, ob du eine Verbindung hast und nicht einfach hart rausschreiben "Wifi connected"

Die while()-Schleife kann so wie es aussieht doch nur verlassen werden, wenn eine Verbindung da ist. Wieso soll man das dann noch einmal prüfen?! Habe ich etwas falsch verstanden?

Gruß

Gregor

Hallo,

grundlegende Frage. Sind alle ESP dem Router überhaupt bekannt? Also dürfen die ESP überhaupt ins WLAN vom Router? Worauf ich hinaus möchte ist folgendes. Bei der Fritzbox zum Bsp. sind fremde WLAN Gerät erstmal gesperrt. Man muss es freischalten und sollte es nach erfolgreicher Bekanntmachung wieder sperren.

An folgendes sollte man dabei auch denken:
Wenn man dem ESP per WiFi.config eine eigene IP verpasst wird kein DHCP-Dialog mit dem Router geführt und der ESP damit auch nicht in diesem angezeigt.

Gruß Tommy

Zu den Fragen:

Den Code while (WiFi.status() != WL_CONNECTED && millis() < maxConnectionTime*1000 ) habe ich nicht so als solches erkannt, sondern dass ich den Wert heraussuchen soll.
Wobei das mit dem millis so meine ich sogar hinhauen würde wie ich es geschrieben habe (Ist noch nicht von der Software geprüft)

DHCP und das komplette Routing übernimmt bei mir eine pfSense. Ich habe in den Static Leases die IPs zwar vergeben, kann sie aber auch statisch vergeben, gesperrt habe ich da nichts.

Als W-Lan System nutze ich unifi von Ubiquiti. Dort wird mir jeder Client nebst seiner IP angezeigt.
In dem Fall von letztens halt keine IP, weshalb ich verwundert war.
Vielleicht lief da die Anfrage schief und dann hing er fest.
Der Abbruch, wenn er denn auch so funktioniert sollte da helfen.

Da das gesamte System Batteriebetrieben ist, sollte bei einem Verbindungsfehler oder sollte die andere IP welche geöffnet werden soll nicht erreichbar sein, das System auch in Deepsleep abwandern und nicht ewig versuchen und die Batterien leer juckeln.
Dann lieber später mit dem Reset alles neu ausführen.

Hast recht.

if (millis() - Relais_timestore > 600000 ) { //10 Minuten (600.000)

So ist es in einem anderen Sketch