Welche Massnahmen, Änderungen würdet Ihr vorschlagen?
Gruß
Horst
Projekt : Heizungssteuerung mit 6 Temperatur Sensor und 1 Outside Sensor
Beschreibung
Die Heizungssteuerung besteht aus einer Steuereinheit mit NodeMCU Modul,
6 Sensorstellen für die einzelnen Zimmer und einem Sensor für die Außentemperatur.
Jede Minute werden der Reihe nach alle 7 Sensoren über WIFI von der Steuereinheit abgefragt.
Die Regelung erfolgt per Sollwert / Istwert Vergleich
Als IP-Stelle ist eine Fritz-Box 7362 SL im Einsatz.
Heizungssteuerung
1: Program Sprache Arduino
2: NodeMCU Modul
Heizung-Stellglied
1: Program Sprache Arduino
2: NodeMCU Modul
3: Relay-Board
Temperatur Sensor
1: Program Sprache Arduino
3: ESP 8266-01 (Black)
4: 1-Wire DS18B20 Temperatur Sensor
5: Power Supply 3.3V YS-12V450A
Dann gilt es als erstes rauszufinden, ob der Client keine Verbindung hat oder der Server.
Wer ist der schuldige und wie hast du das festgestellt?
wer oder was ist
bot.
so rumgerate in unvollständigen Codes ist Sinnarm. Mach zwei funktionierende, kompilierbare Beispiele die das Problem zeigen, dann kann man sich das ansehen.
Oder arbeite ein Beispiel ab das funktioniert.
p.s. wenn dein Sensor keine Werte ausgibt, dann ist das ein anderes Problem, das würde ich zunächst bei seite lassen. Andere Baustelle.
zu Deinen Fragen:
Client = Heizung-Steuerung
Server = Temperatur-Sensor
Der Fehlercode wird am Client empfangen.
Der Client sendet eine Fehlermeldung (bot) über Telegram auf mein Handy.
Ich habe den komplette Sketch vom Server oben bereits eingefügt.
Die Abfrage vom Client auch.
Natürlich kann ich auch den kompletten Sketch vom Client hier reinstellen, aber macht das Sinn?
Das Ganze funktioniert ja auch ganz gut. Nur es kommt halt immer wieder zu diesen Aussetzern.
Das hätte ich jetzt getippt, da ich so einige Webserver mit dem ESP8266 hier ohne Probleme am Laufen habe und in deinen Sketchfragmenten nichts anderes gefunden habe, was der Grund sein könnte.
Hallo,
ich würde jetzt erst mal den Server etwas umbauen und das auslesen des Temp. Sensors in einem festgelegten Zeitraster ständig machen. Das kann man auch so machen das der Sensor nicht blockiert.
Wenn dann eine Anforderung vom client kommt sendest Du nur noch den letzten Messwert. Dann könntest Du auch noch eine kleine Webseite einbauen um den auch auf dem Handy auslesen zu können. Damit bekommst Du dann auch heraus ob der Server immer erreichbar ist.
was Du da in deinem Hauptprogram der Steuerung machs ist mit nicht klar. Wozu die delay() dienen ?? die sollten auf jeden Fall raus. Du kannst Doch die IP abfragen um das zuordnen zu können. Das muss doch nicht zeitlich nach 2 s abgefragt werden . Du kannst auch in dem Telegramm eine Adresse mit senden von wo die Messwerte stammen. z.B Adresse ; Messwert.
Nochmal nachgefragt , Ich hab Dein Konzept noch nicht ganz verstanden. Von den Servern hast Du letztlich mehrere mit je einem Sensor? Deine Steuereinheit fragt die der Reihe nach ab. Das macht Sie mittels der unterschiedlichen IP Adresse. Die sollten dann aber besser fest eingestellt sein. Irgendwie soll die dann wiederum das an das Stellglied weiter geben. Warum macht die Steuereinheit das nicht selbst. ?
Das werde ich tun. ist fest in der nächsten Version geplant.
Das würde mich interessieren wie?
Die habe ich aus zwei Gründen dir.
Ich hatte Serial.print Befehle zum testen und mir wurde gesagt, dass die Zeit brauchen.
Da insgesamt 10 Sensoren (6 Sensoren für Heizungsteuerung, 1 Sensor Außentemperatur und 3 Sensoren für Temperatur und Luftfeuchtigkeit) abgefragt werden, komme ich ziemlich genau auf 1 Minute pro Durchlauf.
Richtig. 10 Sensoren (siehe oben). Alle werden der Reihe nach abgefragt. Jeder Sensor hat eine feste IP-Adresse.
Die Heizungssteuerung und Stellglied ist ein NodeMCU Modul.
Das habe ich in der Projektbeschreibung etwas dumm formuliert. Sorry.
Dann schau Dir mal das Beispiel "wait for Conversation aus der DallasTemperatur lib an . Schau Dir an wie man millis() verwendet. dann kannst Du durchaus jede Sekunde die Werte vom Sensor holen und gleichzeitig den Server verarbeiten.
Heinz
#include <Arduino.h>
#include <ESP8266WebServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// 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);
//---------------------------------------------------
void handleRootPath(){
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
float t = (sensors.getTempCByIndex(0));
server.send(200, "text/plain", String(t));
}
//---------------------------------------------------
void setup() {
Serial.begin(115200);
// Start up the library
sensors.begin();
WiFi.begin(ssid, pass);
WiFi.mode(WIFI_STA);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
Serial.println(WiFi.localIP());
server.on("/", handleRootPath);
server.begin();
}
void loop() {
server.handleClient();
sensors.setWaitForConversion(false); // makes it async
sensors.requestTemperatures();
sensors.setWaitForConversion(true);
// 9 bit resolution by default
// Note the programmer is responsible for the right delay
// we could do something usefull here instead of the delay
int resolution = 9;
delay(750/ (1 << (12-resolution)));
// get temperature
Serial.print("Temperature: ");
Serial.println(sensors.getTempCByIndex(0));
Serial.println("\n\n\n\n");
}
Dann musst Du das in der Funktion machen, die den Request beantwortet.
Das ist aber ungünstig, weil der Anfrager dann ca. 1 Sekunge auf das Ergebnis warten muss. Besser ist, in konstanten Abständen (z.B. 1 Sekunde, abhängig von der Wärmeträgheit Deines Systems) zu messen und nur noch den vorhandenen Wert zurück zu liefern.
Hallo
warum willst Du den Sensor nur auslesen wenn eine Anfrage kommt. Kann man machen kostet Dich dann aber Zeit, wenn Du sie eigentlich nicht hast.
ich habe Deinen Sketch mal ein wenig umgebaut. Der Sensor wird alle 2s abgefragt und der Messwert in einer globalen Variablen gespeichert. Auf diese kannst du dann jederzeit zugreifen.
Ich bin noch nicht ganz sicher ob das so richtig mit dem Webserver laufen kann, ich denke da fehlt was. Ich würde da ehr TCP oder auch UDP nehmen. Schau Dir das noch mal bei Werner IoT: Datenübertragung mit dem ESP8266 an einen Webserver an , da gibt's Beispiele zu HTTP
Heinz
#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()
// 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 = "xxxx";
const char* pass = "yyyyy";
ESP8266WebServer server(80);
//---------------------------------------------------
void handleRootPath() {
Serial.print("Requesting temperatures...");
Serial.println("DONE");
server.send(200, "text/plain", String(temperatur));
}
//---------------------------------------------------
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() {
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);
}
}
Hallo Heinz, ich war so frei und habe deinen Sketch übernommen und in 4 Sensoren geladen.
Bin gespannt, ob die Stabilität noch besser wird.
Werde natürlich darüber berichten.
Mal eine ganz andere Frage:
ich habe jetzt zum zweiten Mal das Problem, dass ich beim Kompilieren Fehlermeldungen bekomme. Meine Vermutung ist, dass ich neue Versionen der Includes eingespielt habe.
Wie verhindert ihr das?
Es installiert sich nichts, ohne das Du es tust.
Ansonsten Fehlermeldung anschauen und Fehler beseitigen.
Mehr kann man ohne Code und Fehlermeldung nicht sagen.