: Instabile WiFi/WLan Verbindung httpCode -1

Hallo,

ich möchte euch über die Erfolge/Misserfolge informieren.

  1. Die Sensoren laufen zu einen stabiler.
  2. Wenn die Sensoren ausfallen, dann richtig. d.h. ich muss sie ausschalten (Power Off/On)

Jetzt habe ich die Idee, wenn die Sensoren länger als 2 Min. sich nicht melden, dass sie sich resetten.

Hier mein Sketch:

#include <Arduino.h>
#include <ESP8266WebServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>

float temperatur;   // globale Varuable für Temperatur
uint32_t altzeit;   // speicher für millis()

// Timeout
unsigned long  startzeit = 0;


// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

const char* ssid = "xxx";
const char* pass =  "xxx";

ESP8266WebServer server(80);

//---------------------------------------------------
unsigned long void handleRootPath() {

  Serial.print("Requesting temperatures...");
  Serial.println("DONE");
  server.send(200, "text/plain", String(temperatur));
  unsigned long startzeit = 0;
  return startzeit;
  Serial.print("Startzeit ");Serial.println(startzeit);
}
//---------------------------------------------------

void setup() {

  Serial.begin(115200);

  // Start up the library
  sensors.begin();
  WiFi.persistent(false);   // daten nicht in EEprom
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  Serial.println(WiFi.localIP());
  server.on("/", handleRootPath);
  server.begin();
}

void loop() {
   startzeit = millis();

  if (millis() - startzeit > 150000 ) {     // 2,5 Minunte ist um
    Serial.println("Es sind über 2 Minuten vergangen ");
    Serial.println("Restart ESP");
    ESP.restart(); //ESP.reset();
  }
  
  server.handleClient();
  
  if (millis() - altzeit > 2000) {  // sind 2s vergangen ?
    altzeit = millis();
    temperatur = sensors.getTempCByIndex(0);
    sensors.setWaitForConversion(false);  // makes it async
    sensors.requestTemperatures();
    sensors.setWaitForConversion(true);
    Serial.print("Messzeit ms "); Serial.println(millis()-altzeit);
    Serial.print("Temperatur ");Serial.println(temperatur);
    Serial.print("Startzeit ");Serial.println(startzeit);
  }

}

Fehlermeldung

Arduino: 1.8.16 (Windows Store 1.8.51.0) (Windows 10), Board: "NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Disabled (new aborts on oom), Disabled, All SSL ciphers (most compatible), 32KB cache + 32KB IRAM (balanced), Use pgm_read macros for IRAM/PROGMEM, 4MB (FS:2MB OTA:~1019KB), 2, v2 Lower Memory, Disabled, None, Only Sketch, 115200"





















Mess-Server-sensor-DS18B20-v3:28:1: error: 'unsigned' specified with 'void'

   28 | unsigned long void handleRootPath() {

      | ^~~~~~~~

Mess-Server-sensor-DS18B20-v3:28:1: error: 'unsigned' specified with 'void'

   28 | unsigned long void handleRootPath() {

      | ^~~~~~~~

C:\Users\Horst\Documents\Arduino\Mess-Server-sensor-DS18B20-v3\Mess-Server-sensor-DS18B20-v3.ino: In function 'void handleRootPath()':

Mess-Server-sensor-DS18B20-v3:34:10: error: return-statement with a value, in function returning 'void' [-fpermissive]

   34 |   return startzeit;

      |          ^~~~~~~~~

exit status 1

'unsigned' specified with 'void'



Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

Was mache ich falsch oder habt ihr eine bessere Idee

Gruß
Horst

Mach Dich mal schlau, wie Funktionen in C++ gebildet werden.
Das ist völliger Unsinn und das meckert der Compiler mit Recht an:

unsigned long void handleRootPath()

Vor dem Funktionsnamen steht der Typ des Rückgabewertes. Der ist entweder void (nichts) oder etwas Anderes, wie z.B. unsigned long. Beides zusammen ergibt keien Sinn.

Gruß Tommy

Beschreibe doch mal genau, was du mit "stabiler laufen" meinst.
Und wie du erkennst, dass die Sensoren ausgefallen sind.

Ich betreibe hier 5 DS18B20 an einem Wemos D1 mini seit ca. 6 Monaten, davor diese an einem Atmega328 und das komplett ohne Ausfälle. Da frage ich mich, was du machst, das die ständig ausfallen. Sicher etwas falsch, aber was ?

Hallo Tommy,

Danke.
Vor lauter Bäume sieht man den Wald nicht. Ich habe es so geändert.

unsigned long handleRootPath()

Aber der Wert "startzeit" zählt immer weiter hoch und wird nicht auf 0 zurückgesetzt.

Ich muss doch nicht den Parameter "startzeit" an die Funktion übergeben, oder?

Irgendwie habe ich heute einen Hänger.

Grüß
Horst

Das wird nie eintreten:

  if (millis() - startzeit > 150000 ) {     // 2,5 Minunte ist um
    Serial.println("Es sind über 2 Minuten vergangen ");

und das wird auch nie was vernünftiges ausgeben.

    Serial.print("Messzeit ms "); Serial.println(millis()-altzeit);

Ich glaube Du machst Dir das viel zu umständlich.

Hallo,

also, ich habe eine Heizungssteuerung (Hardware siehe weiter oben) mit einer Steuerung und 6 Sensoren für die Heizschleifen (Fußboden). Plus zusätzliche Sensoren für Außentemperatur und Luftfeuchtigkeit in anderen Räumen (wird noch nicht für eine Steuerung benutzt)
Die Sensoren messen alle 2 Sec. die Temperatur und stellen dieses Werte in einem Server bereit.
Die Steuerung fragt jede Minute die Werte ab.
Wenn die Steuerung einen Fehler Code bekommt wird eine BOT Mitteilung per Telegram verschickt.

Das funktioniert alles soweit ganz gut. Fehlermeldungen pro Tag 10-15
Aber manchmal fallen 2, 3 Sensoren komplett aus.

Erst habe ich vermutet, dass mein Netzwerkdrucker das Problem macht.
Der Drucker ist seit 5 Tagen aus und die Probleme sind immer noch da.

Dann kam ich auf die Idee, dass mein DECT Telefon daran schuld sein könnte.
Ich habe das DECT in der Fritz Box ausgeschaltet. Felder ist trotzdem.

Ich bin für jede Hilfe dankbar.
Gruß
Horst

Warum alle 2 Sek. ?
Ist deine Heizung so schnell ?
Sind die Sensoren alle an einem Controller ?
Wie überträgt du die Daten an deinen "Server" ?

Schau dir das doch mal auf der Seite von fips an.

Und was genau möchtest du mit dieser Funktion
"void handleRootPath()"
erreichen ?

Das ist vollkommen frei gewählt. Damit wird nur der ESP8266 beschäftigt.
Und wenn ich die Temperatur über die IP Adresse abfrage, dann ist der Wert schnell zur Verfügung.

Nein. ist eine Fußbodenheizung.

Jeder Temperatursensor ist:

Die Seite von fips habe ich ja so verstanden, dass die Funktion

das tut.

Zusätzlich möchte ich den Wert von "startzeit" auf 0 setzen, wenn eine Abfrage war.

Gruß
Horst

??? Das ich einen Hänger habe???
Spaß beiseite.

Der Software-Reset passiert, aber der Wert "startzeit" wird nicht zurückgesetzt.

Besser wäre wie???
Gruß
Horst

Ok, bei einer Fußbodenheizung reichen Minuten !

Und das

bereitet die Daten für die Webseite vor. Das brauchst du def. nicht. Es sei denn, du möchtest es im Browser ansehen. Aber Achtung. Da gibt es eine Falle. Ohne besondere Vorkehrungen wird der Wert nur aktualisiert, wenn du es im Web ansiehst.

Überträgst du die Daten per UDP ?

Doch andauernd in Zeile 60.
Darum wird die Bedingung millis()-startzeit nie größer und somit nie erfüllt.

In Zeile 76 mit dem Aufruf in Zeile 70 ist das nicht die reine Messzeit.
gemessen soll nur Zeile 73. Also muss in 72 die Variable gefüttert und in 74 die Auswertung erfolgen, oder eine zweite variable gefüttert werden.

Dann verstehe ich nicht, warum Du das setWaitForConversation false und wieder true setzt...
Las doch die lib machen allein zu überprüfen, wann einer neuer Wert angefordert werden kann und übernehme nur alle xx Sekunden den Wert.

Ich hab mal aus einem Projekt von mir was ausgebaut um Dir was zu zeigen...
Also Hintergrund ist, das Du mit dem

setWaitForConversion(false);

der lib überlässt, wann die Sensoren erneut wieder ausgelesen werden. Der Temperaturwert steht ja trotzdem zur Verfügung.
Der Code wird zum auslesen nicht angehalten.
Um das zu verdeutlichen, wird alle 100ms der Wert übernommen.
Dannn wird parallel dazu alle 5 Sekunden alles was zu der Zeit an gespeicherten Werten vorhanden ist auf einer Zeile ausgegeben.
Wenn das geht, bauen wird das, das es auch irgendwie an den handleRootPath passt.

(Hinweis: Ich hab das für max 10 Sensoren vorgesehen)

#define debug_tmp false  // Großteil der Temperatur

// DS18* Temperatursensoren
#include <DallasTemperature.h>
const uint8_t OWPin = 2; // erster OW-Bus
OneWire OW(OWPin); // erster OW-Bus
DallasTemperature tempBus(&OW); // für T-Sensoren
float tempSensors[10] = { -127};
uint32_t lastTemperaturMillis = 1000;
uint8_t deviceCount;
void setup()
{
  Serial.begin (115200);
  Serial.println (F ("Start..."));
  Serial.println(__FILE__);
  Serial.print(__DATE__);
  Serial.print(" ");
  Serial.println(__TIME__);
  tempBus.begin();
  tempBus.setWaitForConversion(false);
  deviceCount = tempBus.getDeviceCount();
}

void loop()
{
  getOneWireTemperature();
  ausgabe();
}

void getOneWireTemperature()
{
  DeviceAddress t;
  static unsigned long lastMillis = 0;
  if (millis() - lastMillis > 100)
  {
    lastMillis = millis();
    for (uint8_t index = 0; index < deviceCount; index++)
    {
      tempBus.getAddress(t, index);
      tempSensors[index] = tempBus.getTempC(t);
      Serial.print(F("übernommen: "));
      Serial.print(F("sensors "));
      Serial.print(index);
      Serial.print("\t");
      Serial.println(tempSensors[index]);
    }
  }
  tempBus.requestTemperatures();
}

void ausgabe()
{
  // Gibt alle 5 Sekunden alle Werte aus
  static unsigned long lastMillis = 0;
  if (millis() - lastMillis > 5000)
  {
    lastMillis = millis();
    for (byte b = 0; b < deviceCount; b++)
    {
      Serial.print(tempSensors[b]); Serial.print(" ");
    }
    Serial.println();
  }
}

Hallo
das stammt aus dem Beispiel der Lib "WaitForConversation", das hatte ich dem T0 #18 so gezeigt.

aus dem Beispiel

 // Request temperature conversion - non-blocking / async
  Serial.println("Before NON-blocking/async requestForConversion");
  start = millis();       
  sensors.setWaitForConversion(false);  // makes it async
  sensors.requestTemperatures();
  sensors.setWaitForConversion(true);
  stop = millis();
  Serial.println("After NON-blocking/async requestForConversion");
  Serial.print("Time used: ");
  Serial.println(stop - start);

@topgun-811 Wenn Du der Meinung bist das die Sensoren ausfallen dann solltest Du herausfinden warum das so ist. Das Reset ist doch nur eine Not-Lösung. Sind die Kabel zu lang ?

Nochmal die Frage nach dem richtigen Pullup Widerstand 4,7KOhm ist der vorhanden ?

Gruß Heinz

Ach ja stimmt. Ein Déjà-vu - das Vorgehen der Messung hatte ich früher schon kritisiert.
Danke für die Aufklärung.
Aber wenn Du so gut bei bist... willst mal testen?
Bitte nicht schlagen....
[edit] Danke @Tommy64 -Siehe #36 [/edit]

#include <Arduino.h>
#include <ESP8266WebServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>

float tempSensors[10] = { -127};
uint32_t lastTemperaturMillis = 1000;
uint8_t deviceCount;

// Data wire is plugged into port 2 on the Arduino
const uint8_t OWPin = 2;

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire OW(OWPin); // erster OW-Bus

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature tempBus(&OW); // für T-Sensoren

const char *ssid = "xxx";
const char *pass =  "xxx";

ESP8266WebServer server(80);

//---------------------------------------------------
void handleRootPath()
{
  Serial.print("Requesting temperatures for Sensor 0...");
  server.send(200, "text/plain", String(tempSensors[0]));
  Serial.println("DONE");
}
//---------------------------------------------------

void setup()
{
  Serial.begin(115200);
  // Start up the library
  tempBus.begin();
  WiFi.persistent(false);   // daten nicht in EEprom
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }
  Serial.println(WiFi.localIP());
  server.on("/", handleRootPath);
  server.begin();
  startzeit = millis();
}

void loop()
{
  server.handleClient();
  restartESP();
  getOneWireTemperature();
  // ausgabe();
  /*
    if (millis() - altzeit > 2000)    // sind 2s vergangen ?
    {
    altzeit = millis();
    temperatur = sensors.getTempCByIndex(0);
    sensors.setWaitForConversion(false);  // makes it async
    sensors.requestTemperatures();
    sensors.setWaitForConversion(true);
    Serial.print("Messzeit ms "); Serial.println(millis() - altzeit);
    Serial.print("Temperatur "); Serial.println(temperatur);
    Serial.print("Startzeit "); Serial.println(startzeit);
    }
  */
}

void restartESP()
{
  if (millis() - startzeit > 150000 )       // 2,5 Minunte ist um
  {
    Serial.println("Es sind über 2 Minuten vergangen ");
    Serial.println("Restart ESP");
    ESP.restart(); //ESP.reset();
  }
}

void getOneWireTemperature()
{
  DeviceAddress t;
  static unsigned long lastMillis = 0;
  if (millis() - lastMillis > 100)
  {
    lastMillis = millis();
    for (uint8_t index = 0; index < deviceCount; index++)
    {
      tempBus.getAddress(t, index);
      tempSensors[index] = tempBus.getTempC(t);
      Serial.print(F("übernommen: "));
      Serial.print(F("sensors "));
      Serial.print(index);
      Serial.print("\t");
      Serial.println(tempSensors[index]);
    }
  }
  tempBus.requestTemperatures();
}

void ausgabe()
{
  // Gibt alle 5 Sekunden alle Werte aus
  static unsigned long lastMillis = 0;
  if (millis() - lastMillis > 5000)
  {
    lastMillis = millis();
    for (byte b = 0; b < deviceCount; b++)
    {
      Serial.print(tempSensors[b]); Serial.print(" ");
    }
    Serial.println();
  }
}

Das wird nicht kompilieren. Das hatte ich in #22 schon bemängelt.

Gruß Tommy

GRR! Danke! Ich hatte seinen Sketch neu geladen...

Hallo ,
@my_xy_projekt wozu sollte ich das testen

soweit ich das verstanden habe hat der T0 an jedem ESP genau einen Sensor. Und die will er nacheinander von einem zus. Controller abfragen. Warum soll ich ein Beispiel aus der Lib anzweifeln wenn es funktioniert. ?
Ich denke wir reden aneinander vorbei.
Gruß Heinz

Möglich.
Aber offensichtlich kann er weder Sensoren fortlaufend lesen, Werte zwischenspeichern oder Timings behandeln.

Es war ein Versuch. Ich frag nicht mehr.

Hallo,
warum ??
ich bin nicht sicher ob das Konzept eines Webservers für eine Messstelle das Richtig ist. ich Würde da ehr TCP oder auch UDP verwenden. Da kann eventuell jemand anderes was zu sagen. Aber das scheint ja nicht das Problem zu sein. Die Sensoren streiken anscheinend , Warum ??

Wenn der T0 als Möglichkeit sieht in dem Fall einen Reset zu machen , kann ich da nur abraten .
Heinz

Ich wollte nur sehen, ob der Code geht. Nicht mehr und nicht weniger.
Du willst das nicht testen. Ist doch ok.
Nein Keine Grundsatzdiskussion.