Hallo allerseits,
mein Name ist Torsten und ich hab mich gerade erst angemeldet.
Ich bin dabei, mit einem ESP32 und einem Nextion-Display mir eine Art Smarthomezentrale zu bauen.
Anfangen wollte ich damit, erstmal ein paar Umweltdaten zu sammeln und anzuzeigen.
An einem ESP8266 habe ich einen GY-21 angeschlossen und sende Temperatur und Luftfeuchtigkeit über UDP.
Beim Empfänger, im seriellen Monitor werden die Daten angezeigt, aber ich weiss nicht, wie ich die Daten, die ja im packetBuffer ständig überschrieben werden, weiter verarbeiten soll.
Langer Text, sorry!
Kann mir da jemand weiter helfen?
VG
Hier der Code des "Senders"
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
//#include <WiFiUdp_Generic.h>
#include <OneWire.h> // https://github.com/PaulStoffregen/OneWire Version 2.3.5
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include <Adafruit_HTU21DF.h>
//#include <SHT2x.h>
//#include <SHT2x.h>
#include <Adafruit_Si7021.h>
//#include <GY21.h>
const char* ssid = "xxx"; // Darf bis zu 32 Zeichen haben.
const char* password = "xxx"; // Mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen.
IPAddress IP(192, 168, 178, 43);
IPAddress mask = (255, 255, 255, 0);
//#define I2C_SDA 19
//#define I2C_SCL 20
//float temperature = 0;
//float humidity = 0;
//Adafruit_HTU21DF (I2C_SDA, I2C_SCL);
//Adafruit_HTU21DF sht21 = Adafruit_HTU21DF();
//Adafruit_HTU21DF htu = Adafruit_HTU21DF();
Adafruit_Si7021 Sensor = Adafruit_Si7021();
//HTU21DF Sensor;
WiFiUDP Udp;
IPAddress unicastIP(192, 168, 178, 40); // Adresse des Esp, welcher als Empfänger der Nachricht dient, eintragen.
//constexpr uint16_t PORT = 8266; // UDP Port an welchen gesendet wird.
constexpr uint16_t PORT = 32; // UDP Port an welchen gesendet wird.
void setup() {
Serial.begin(115200);
Sensor.begin();
delay(100);
Serial.printf("\nSketchname: %s\nBuild: %s\t\tIDE: %d.%d.%d\n%s\n\n",
(__FILE__), (__TIMESTAMP__), ARDUINO / 10000, ARDUINO % 10000 / 100, ARDUINO % 100 / 10 ? ARDUINO % 100 : ARDUINO % 10, ESP.getFullVersion().c_str());
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print("._");
}
Serial.println("\nVerbunden mit: " + WiFi.SSID());
}
void loop() {
float temp = Sensor.readTemperature();
float rel_hum = Sensor.readHumidity();
Serial.print("Temperatur: ");
Serial.print(temp);
Serial.println("°C");
// Serial.print("\t\t"); //Platzhalter; 2 Tabs
Serial.print("Luftfeuchtigkeit: ");
Serial.print(rel_hum);
Serial.println("%");
delay(5000);
static unsigned long previousMillis;
constexpr unsigned long INTERVAL(5000); // Aller 5 Sekunden wird die Temperatur gemessen und anschliesend gesendet.
if (millis() - previousMillis >= INTERVAL) {
previousMillis += INTERVAL;
Sensor.readTemperature();
sendUdp1(Sensor.readTemperature());
Sensor.readHumidity(); // Sendet einen Befehl für alle Geräte am Bus, um eine Temperaturumwandlung durchzuführen.
sendUdp2(Sensor.readHumidity()); // Holt die Temperatur vom Sensor und übergibt diese an die Funktion zum senden.
}
}
void sendUdp1(float tempC) {
Udp.beginPacket(unicastIP, PORT);
Udp.printf("SZ: %.1f°C", tempC);
Udp.endPacket();
//delay(1000);
}
void sendUdp2(float rel_hum) {
Udp.beginPacket(unicastIP, PORT);
Udp.printf("SZ: %.1f%%", rel_hum); //Zwei Prozentzeichen, um eins zu zeigen?????.
Udp.endPacket();
}
Hier der Code des "Empfängers"
Wahrscheinlich viel unnützes Zeug drin, aber ich hab eben schon viel probiert.
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <iostream>
#include <string>
const char* ssid = "xxx"; // Darf bis zu 32 Zeichen haben.
const char* password = "xxx"; // Mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen.
IPAddress IP(192, 168, 178, 40);
IPAddress mask = (255, 255, 255, 0);
SoftwareSerial nextion(22, 21);
#define UDP_TX_PACKET_MAX_SIZE 8192
constexpr uint16_t PORT = 32; // Lokaler UDP Port.
//constexpr uint16_t PORT = 8266; // Lokaler UDP Port.
char packetBuffer[30]; //orig. 21 // Puffer für eingehendes Paket.
//float packetBuffer ("Schlafzimmer: %.1f°C")
//float var ("Schlafzimmer: %.1f°C")
//float var (udp1)
/*const int SERIAL_BUFFER_SIZE = 20;
char serialBuffer[SERIAL_BUFFER_SIZE];
const int NUMBER_OF_VALUES = 8;
unsigned int values[NUMBER_OF_VALUES];*/
WiFiUDP Udp;
void setup() {
Serial.begin(115200);
delay(100);
nextion.begin(115200); // start software serial with Nextion Display
Serial.printf("\nSketchname: %s\nBuild: %s\t\tIDE: %d.%d.%d\n%s\n\n",
(__FILE__), (__TIMESTAMP__), ARDUINO / 10000, ARDUINO % 10000 / 100, ARDUINO % 100 / 10 ? ARDUINO % 100 : ARDUINO % 10, ESP.getFullVersion().c_str());
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}
Serial.println("\nVerbunden! Esp8266 IP: " + WiFi.localIP().toString());
Serial.printf("UDP Server lauscht am Port: %d\n\n", PORT);
Udp.begin(PORT);
float packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //Puffer zum Speichern eingehender Pakete,
float Udp1();
}
void loop() {
uint16_t packetSize = Udp.parsePacket(); // Eingehende UDP-Pakete empfangen.
if (packetSize) { // Prüfen ob UDP-Pakete empfangen wurden.
Udp.read(packetBuffer, sizeof(packetBuffer)); // Einlesen des UDP Paket in den Buffer.
packetBuffer[packetSize] = 0; // String Ende hinzufügen.
Serial.println(packetBuffer); // Visualisierung des empfangenen Packets
float packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //Puffer zum Speichern eingehender Pakete,
//Udp.read(packetBuffer);
//Serial.println(packetBuffer); // Visualisierung des empfangenen Packets
//Serial.println(Udp);
}
}