Hallo,
ich bastel jetzt schon seit über 1 Woche an einer kleinen "Wetterstation". Es gibt einige Beispiele im Netz (und auch hier im Forum - ich glaube von Tommy56), für die allermeisten bin ich aber zu doof und verstehe nicht, was da passiert. Deshalb versuche ich möglichst (für mich) verständliche Beispiele zu finden und diese auf meine Bedürfnisse anzupassen.
Zielsetzung:
Zwei ESP8266, jeweils mit einem DHT-Sensor verbunden. Einer davon soll im Keller, der andere draußen am Haus sitzen. Beide ESP sind mit dem Hausnetzwerk verbunden und auf dem einen der beiden läuft ein html-Server. Auf dieser html-Seite sollen jeweils beide Messwerte (Luftfeuchtigkeit & Temperatur) dieser beiden DHT-Sensoren angezeigt werden.
Was bisher klappt:
Beide ESP sind mit dem Hausnetzwerk verbunden, auf die html-Seite kann ich von einem Endgerät aus zugreifen und ich kann bisher ein char über UDP von einem zum anderen ESP senden, der auch auf der html-Seite angezeigt wird. Also im Prinzip ist mein kleines Projekt zu 99% fertig.
Was ich aber nicht hinbekomme:
Ich weiß nicht, wie ich beide Messwerte von dem einen ESP zum anderen schicken kann. Ich habe es nur hinbekommen, eine feste Zeichenkette zu übertragen. Ich denke, ich müsste es also entweder schaffen zwei Datenpakete zu schicken oder beide Messwerte in ein Datenpaket zu packen. Mit beidem bin ich aber schon überfordert
Kann mir da einer auf die Sprünge helfen?
Hier der Empfänger mit der html-Seite
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <WiFiUdp.h>
#include "DHT.h" //DHT Bibliothek laden
#define DHTPIN_1 5 //Der Sensor wird an PIN 2 angeschlossen
#define DHTTYPE DHT22 // Es handelt sich um den DHT22 Sensor
DHT dht1(DHTPIN_1, DHTTYPE); //Der Sensor wird ab jetzt mit „dth1“ angesprochen
WiFiUDP Udp;
unsigned int localUdpPort = 4210; // local port to listen on
char daten[10];
float Luftfeuchtigkeit_1;
float Temperatur_1;
float Luftfeuchtigkeit_2;
float Temperatur_2;
unsigned long zeit; // Variable um den aktuellen Timestamp zu speichern
unsigned long zeitupdate; // Variable um den Timestamp des letzten Update zu speichern
const char* ssid = "geheim";
const char* password = "geheim";
String header;
WiFiServer server(80);
void setup()
{ zeitupdate = millis ();
WiFi.begin(ssid, password); // Versucht mit WLAN Name und Schlüssel zu verbinden
Serial.begin(9600);
dht1.begin(); //DHT22 Sensor starten
Udp.begin(localUdpPort);
server.begin();
// erste Messungen
for (int i = 0; i < 50; i++) {
float Lf_1 = dht1.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeuchtigkeit“ speichern
Luftfeuchtigkeit_1 = Lf_1 + Luftfeuchtigkeit_1;
float Temp_1 = dht1.readTemperature(); //die Temperatur auslesen und unter „Temperatur“ speichern
Temperatur_1 = Temp_1 + Temperatur_1;
}
Luftfeuchtigkeit_1 = Luftfeuchtigkeit_1 / 50;
Temperatur_1 = Temperatur_1 / 50;
}
void messung() {
zeit = millis ();
if (zeit - zeitupdate > 5000) {
Luftfeuchtigkeit_1 = 0;
Temperatur_1 = 0;
for (int i = 0; i < 50; i++) {
float Lf_1 = dht1.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeuchtigkeit“ speichern
Luftfeuchtigkeit_1 = Lf_1 + Luftfeuchtigkeit_1;
float Temp_1 = dht1.readTemperature(); //die Temperatur auslesen und unter „Temperatur“ speichern
Temperatur_1 = Temp_1 + Temperatur_1;
}
Luftfeuchtigkeit_1 = Luftfeuchtigkeit_1 / 50;
Temperatur_1 = Temperatur_1 / 50;
zeitupdate = zeit;
}
}
void empfang() {
int packetSize, len;
// UDP
packetSize = Udp.parsePacket();
// Da ist was da
if (packetSize) {
len = Udp.read(daten, 10);
Luftfeuchtigkeit_2 = atof (daten) / 100;
Temperatur_2 = atof (daten + 5) / 100;
}
}
void loop() {
WiFiClient client = server.available(); // Listen for incoming clients
messung();
empfang();
if (client) { // If a new client connects,
String currentLine = ""; // make a String to hold incoming data from the client
while (client.connected()) { // loop while the client's connected
if (client.available()) { // if there's bytes to read from the client,
char c = client.read(); // read a byte, then
header += c;
if (c == '\n') { // if the byte is a newline character
if (currentLine.length() == 0) {
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println("Refresh: 4");
client.println();
// Display the HTML web page
client.println("<!DOCTYPE html><html>");
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");
client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}</style></head>");
// Web Page Heading
client.println("<body><h1>Hygrometeranzeige</h1>");
client.println("<center><table border=0 width=40% height=100><tr><th></th><th>Luftfeuchtigkeit</th><th>Temperatur</th></tr>");
client.println("<tr><td align=right><h4>Sensor 1</h4></td><td align=center>");
client.println(Luftfeuchtigkeit_1);
client.println("%</td><td align=center>");
client.println(Temperatur_1);
client.println("℃</td></tr>");
client.println("<tr><td align=right><h4>Sensor 2</h4></td><td align=center>");
client.println(Luftfeuchtigkeit_2); // Luftfeuchtigkeit_2
client.println("%</td><td align=center>");
client.println(Temperatur_2); // Temperatur_2
client.println("℃</td></tr></table></center>");
client.println("</body></html>");
// The HTTP response ends with another blank line
client.println();
// Break out of the while loop
break;
} else { // if you got a newline, then clear currentLine
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage return character,
currentLine += c; // add it to the end of the currentLine
}
}
}
header = "";
client.stop();
}
}
Hier der Sender:
// Sendet Daten
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include "DHT.h" //DHT Bibliothek laden
#define DHTPIN_2 5 //Der Sensor wird an PIN 2 angeschlossen
#define DHTTYPE DHT22 // Es handelt sich um den DHT22 Sensor
DHT dht2(DHTPIN_2, DHTTYPE); //Der Sensor wird ab jetzt mit „dth1“ angesprochen
float Luftfeuchtigkeit_2;
float Temperatur_2;
int Lf;
int Temp;
char daten[10]= "4150X2250";
unsigned long zeit; // Variable um den aktuellen Timestamp zu speichern
unsigned long zeitupdate; // Variable um den Timestamp des letzten Update zu speichern
char *ssid = "geheim";
char *password = "geheim";
// hier die Adresse vom Slave eintragen
IPAddress remoteIP(192, 168, 1, 37);
unsigned int remotePort = 4210; // remote port to listen on
WiFiUDP Udp;
uint32_t aktMillis;
uint32_t prevMillis;
void setup()
{
Serial.begin(9600);
Serial.println();
Serial.println("Start");
Serial.print("Connecting to "); Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.print("\n connected.");
Serial.println(WiFi.localIP());
dht2.begin();
// erste Messungen
for (int i = 0; i < 50; i++) {
float Lf = dht2.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeuchtigkeit“ speichern
Luftfeuchtigkeit_2 = Luftfeuchtigkeit_2 + Lf;
float Temp = dht2.readTemperature(); //die Temperatur auslesen und unter „Temperatur“ speichern
Temperatur_2 = Temperatur_2 + Temp;
}
Lf = Luftfeuchtigkeit_2 / 50;
Temp = Temperatur_2 / 50;
}
void messung() {
zeit = millis ();
if (zeit - zeitupdate > 5000) {
Luftfeuchtigkeit_2 = 0;
Temperatur_2 = 0;
for (int i = 0; i < 50; i++) {
float Lf_2 = dht2.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeuchtigkeit“ speichern
Luftfeuchtigkeit_2 = Lf_2 + Luftfeuchtigkeit_2;
float Temp_2 = dht2.readTemperature(); //die Temperatur auslesen und unter „Temperatur“ speichern
Temperatur_2 = Temp_2 + Temperatur_2;
}
Lf = Luftfeuchtigkeit_2 / 50;
Temp = Temperatur_2 / 50;
zeitupdate = zeit;
}
}
void loop() {
messung();
aktMillis = millis();
if (aktMillis - prevMillis >= 5000) {
prevMillis = aktMillis;
Udp.beginPacket(remoteIP, remotePort);
Udp.write(daten,10);
Udp.endPacket();
}
}
Viele Grüße,
Faddi