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.
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 ?
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.
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.
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.
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();
}
}
@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 ?
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();
}
}
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
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