Nabend allerseits,
ich bin aktuell dran, kleine "Datenstationen" mit einem ESP8266 bzw. Wemos D1 zu bauen und die Daten zu einer 1500er SPS zu schaufeln:
Diese erfassen aktuell über einen BME280 und BH1750 Temperatur, Feuchtigkeit, Druck sowie Beleuchtungsstärke. Die Kommunikation läuft Netzwerkintern über eine TCP Verbindung. Die SPS ist hierbei der Server, die ESP´s Clients.
Das Senden der Daten (aktuell arbeite ich hier mit Hercules von HW) klappt eigentlich problemlos. Aktuell im Testbetrieb baut der ESP eine Verbindung zu dem Terminal Programm auf und sendet die Daten aktuell noch im Klartext.
Da ich nun jedoch auch Daten zum ESP senden möchte, nervt jedoch eine Tatsache:
Der ESP baut die Verbindung auf, sendet die Daten und schließt die Verbindung dann. Sie wird erstwieder aufgebaut, wenn neue Daten gesendet werden sollten. Das heißt, dass ich nur Daten senden kann, wenn der ESP grade gesendet hat. Da ich jedoch nicht sekündlich Messe/Daten sende, bekomm ich so eine ziemliche Verzögerung rein, wenn ich dann erst senden kann.
Ich war es bei solch einer Kommunikation bisher (Im Industriellen Umfeld) immer gewohnt, dass die Verbindung aufrecht gehalten wird bis sie explizit geschlossen wird.
Habe ich hierzu eine Möglichkeit, dies zu erreichen?
Die Alternative wäre die Daten über OPC UA hin und her zu schaufeln, jedoch scheint es hier ESP/Arduino seitig keine Möglichkeit zu geben, diese als OPC Client arbeiten zu lassen.
/* Einbinden von benötigten Bibliotheken*/
#include <ESP8266WiFi.h> // Library für Wifi vom ESP8266
#include <Wire.h> // Library für I2C/SPI
#include <BH1750.h> // Library für BH1750 Beleuchtungssensor
#include <Adafruit_BME280.h> // ibrary für Bosch BME280 Temp/Humid./Druck Sensor
#include <Adafruit_Sensor.h> // Library/Definitionen für allgemeine Sensoren/Physikalische Einheiten
/* Setzen der W-Lan Parameter zur Verbindung*/
W_LAN Daten...
/* Globale Variablen Deklaration */
float rLux = 0; // Beleuchtungsstärke in [lux]
float rDruck = 0.0; // Druck in [hPa]
float rTemp = 0.0; // Temperatur in [C°]
float rHumid = 0.0; // relative Luftfeuchtigkeit [%]
float rAltitude = 0.0; // Höhe
long rssi = WiFi.RSSI(); // Wifi Signalstärke
int iDaten = 0;
String string = "";
/* Normalniveau (Druck) definieren*/
#define SEALEVELPRESSURE_HPA (1013.25) //Normaldruck US-Standardatmhosphäre
/* Definieren von "lightmeter" ??? */
BH1750 lightMeter;
/* Definieren von BME280 */
Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
void setup() {
//## WIFI/Serial ##//
Serial.begin (9600); // Serielle Kommunikation mit 9600 Baud aufbauen
Wire.begin(); // I2C Bus Verbindung aufbauen
//BME280 @ 0x76
//BH1750 @ 0x23
lightMeter.begin(); // Funktion für BHE1750 Beleuchtungssensor aufrufen
WiFi.begin(ssid, password); //W-Lan Verbindung zu vorher definiertem Partner Aufbauen
Serial.println(WiFi.localIP());
while (WiFi.status() != WL_CONNECTED) { //Solange keine Verbindung aufgebaut ist, in WHILE-Schleife Verbleiben und "LOOP" nicht ausführen ## FF ##
delay(500);
Serial.print(".");
}
/* Auto Reconnect */
//WiFi.setAutoReconnect(true);
//WiFi.persistent(true);
Serial.println(WiFi.localIP());
//## BME280 ##//
unsigned status; // Statuswort BME280
status = bme.begin();
}
void loop() {
WiFiClient client; //Client Verbindung aufbauen
if (!client.connect(host, serverPort)) { //Muss aus Gründen wohl nochmal im Loop Teil bearbeitet werden, anders keine TCP Verbindung möglich
Serial.print("X");
return;
}
delay(1000);
//## Einlesen der Sensorwerte ##//
//BH1750 Beleuchtung
rLux = lightMeter.readLightLevel();
//BME280 Temp, Druck....
rDruck = bme.readPressure();
rTemp = bme.readTemperature();
rHumid = bme.readHumidity();
rAltitude = bme.readAltitude(SEALEVELPRESSURE_HPA);
/* Senden der Werte über TCP an CPU 1510 NUR TEST*/
client.print("Beleuchtungsstaerke ");
client.print(rLux);
client.println(" lx");
client.print("Temperatur ");
client.print(rTemp);
client.println(" C");
client.print("relative Luftfeuchte ");
client.print(rHumid);
client.println(" %");
client.print("Luftdruck ");
client.print(rAltitude);
client.println(" m");
/* Lesen der Daten von Server */
iDaten = client.available();
string = client.read();
Serial.print("Anzahl Daten:");
Serial.println(iDaten);
Serial.print(string);
//client.flush(); //
//client.stop(); //
delay(5000); //Delay nach senden von Daten
}
Besten Dank und einen guten Rutsch