Hi,
ich wollte euch nur mal mein kleines Projekt vorstellen. Es geht um der Vergleich von 2 Drücken vor und nach einer Filtermatte. Es gibt dafür ja Druckmessgeräte mit Rohren. Das wollte aber keiner bezahlen bzw. war demjenigen bzw. mir auch nicht bekannt. Am ESP hängen 2 BME280 Sensoren. der eine mit Adresse 0x77, der andere mit 0x76. Bei dem einen wurde sozusagen die Leiterbahn mit einem Cuttermesser gekappt und mit dem Lötkolben eine Brücke eingelötet. Die Daten werden dann an den ioBroker gesendet und da von MQTT empfangen. Mit einem Script im ioBroker prüfe ich die Differenz der 2 Drücke und sende entsprechend eine Mail. Im unten aufgeführten Code gibt es noch einen Abschnitt mit der Lampe. Dieser sollte ursprünglich dazu dienen ein Relais zu schalten eine Lampe zu steuern, wenn der Druckunterschied zu groß wird. Ist jetzt per Mail umgesetzt. Des WEiteren kann der ESP auch per Web abgerufen werden, der MQTT dient vor allem der Visualsierung mittels Graphen.
WICHTIG:
Leider kann ich noch nicht sagen ob das System seinen Zweck erfüllt. Der Code läuft, aber die Matte wurde generell alle 4 Wochen getauscht. Egal ob es eine Mail gibt oder nicht. Sprich ich weiß nicht, ob die Sensoren genau genug bzw. feinfühlig genug sind um einen Druckunterschied zu erkennen, falls die Filtermatte wirklich einmal verstopft ist. Bzw. wir groß der Druckunterschied eigentlich sein kann, wenn die Matte mal dicht ist. Dies wird erst in den nächsten Wochen/Monaten ermittelt werden können, da die Arbeiter erst vor kurzen darauf hingewiesen wurden, die Matte nicht zu wechseln.
Weiter unten findet ihr noch das Script für die Mail. Es enthält eine Endlosschliefe und wird 1x/Tag ausgeführt.
Ich bin kein Programmierer und ich denke den Code könnte man bestimmt noch vereinfachen/kürzen. Aber er macht was er soll. Falls ihr Tipps habt oder Fehler findet lasst es mich wissen. Eventuell hilft dieser Code auch jemanden.
Bis dahin
Burnz
#include <ESP8266WiFi.h>
#include <Adafruit_BME280.h>
#include <PubSubClient.h>
#define SEALEVELPRESSURE_HPA (1013.25)
#define temperature_topic "01_sensor/temperatur BME280" //Name für Sensorenwerte
#define hum_topic "01_sensor/luftfeuchte BME280" //Name für Sensorenwerte
#define drk_topic "01_sensor/druck BME280" //Name für Sensorenwerte
#define temperature_topic2 "02_sensor/temperatur BME280 hinter Filter" //Name für Sensorenwerte
#define hum_topic2 "02_sensor/luftfeuchte BME280 hinter Filter"//Name für Sensorenwerte
#define drk_topic2 "02_sensor/druck BME280 hinter Filter" //Name für Sensorenwerte
#define mqtt_server "192.168.11.85"
#define mqtt_user "mqtt" // if exist
#define mqtt_password "xxxx" //if needed
//Buffer to decode MQTT messages
char message_buff[100];
float tempds18b20;
long lastMsg = 0;
long lastRecu = 0;
bool debug = false; //Display log message if True
WiFiClient espclient280;
PubSubClient client(espclient280);
const char* SSID = "verrate";
const char* PSK = "ichnicht";
char msg[50];
int value = 0;
unsigned long delayTime;
float h1, t1, p1, h2, t2, p2, luftdruck, luftdruck2, ld1, ld2;
char temperatureCString1[6];
char humidityString1[6];
char pressureString1[7];
int hoehe = 349;
char temperatureCString2[6];
char humidityString2[6];
char pressureString2[7];
Adafruit_BME280 bme;
//Daten an MQTT senden
void pub() {
client.publish(temperature_topic, String(t1).c_str(), true);
client.publish(hum_topic, String(h1).c_str(),true);
client.publish(drk_topic, String(luftdruck).c_str(),true);
client.publish(temperature_topic2, String(t2).c_str(), true);
client.publish(hum_topic2, String(h2).c_str(),true);
client.publish(drk_topic2, String(luftdruck2).c_str(),true);
}
//mit WLAN verbinden
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(SSID);
WiFi.begin(SSID, PSK);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
WiFiServer server(80);
void setup() {
// Pin D5&D6
pinMode(12, OUTPUT);
pinMode(14, OUTPUT);
Serial.begin(115200);
delay(10);
Serial.println(F("BME280 test"));
// Initializing serial port for debugging purposes
Serial.begin(115200);
delay(10);
Wire.begin(D2, D1);
Wire.setClock(100000);
bool status;
status = bme.begin(0x76); //BME 1
status = bme.begin(0x77); //BME 2
// Connect to WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(SSID);
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PSK);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
//-----------------------------------------------------------------------------------------------------
client.setServer(mqtt_server, 1883); // Configure MQTT connexion
client.setCallback(callback); // callback function to execute when a MQTT message
//-----------------------------------------------------------------------------------------------------
// Start the server
server.begin();
Serial.println("Server started");
// Print the IP address
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Reconnecting...");
if (!client.connect("ESP8266Client")) {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5 seconds");
delay(5000);
}
}
}
void getWeather() {
bme.begin(0x76);
float readReducedPress(hoehe);
h1 = bme.readHumidity();
t1 = bme.readTemperature();
p1 = bme.readPressure() / 100.0F;
luftdruck = (p1 / pow(1 - ((0.0065 * hoehe) / (t1 + (0.0065 * hoehe) + 273.15)), 5.257));
ld1 = luftdruck;
dtostrf(t1, 5, 1, temperatureCString1);
dtostrf(h1, 5, 1, humidityString1);
dtostrf(luftdruck, 6, 1, pressureString1);
float h1 = bme.readHumidity();
float d1 = bme.readTemperature();
delay(100);
}
void getWeather2() {
bme.begin(0x77);
float readReducedPress(hoehe);
h2 = bme.readHumidity();
t2 = bme.readTemperature();
p2 = bme.readPressure() / 100.0F;
luftdruck2 = (p2 / pow(1 - ((0.0065 * hoehe) / (t2 + (0.0065 * hoehe) + 273.15)), 5.257));
ld2 = luftdruck2;
dtostrf(t2, 5, 1, temperatureCString2);
dtostrf(h2, 5, 1, humidityString2);
dtostrf(luftdruck2, 6, 1, pressureString2);
float h2 = bme.readHumidity();
float d2 = bme.readTemperature();
delay(100);
}
void loop() {
// Check if a client has connected
if (!client.connected()) {
reconnect();
}
client.loop();
WiFiClient client = server.available();
getWeather();
Serial.println(ld1);
Serial.println(t1);
Serial.println(h1);
getWeather2();
Serial.println(ld2);
Serial.println(t2);
Serial.println(h2);
delay(10000);
if (client) {
Serial.println("New client");
// bolean to locate when the http request ends
boolean blank_line = true;
//Bedingung für Lampe an/aus
if (p1-p2>2)
{
digitalWrite(12, HIGH);
digitalWrite(14, HIGH);
}
else
{
digitalWrite(12, LOW);
digitalWrite(14, LOW);
}
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n' && blank_line) {
getWeather();
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
// your actual web page that displays temperature
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head><META HTTP-EQUIV=\"refresh\" CONTENT=\"15\"></head>");
client.println("<body><h1>BME280 #1 Web Server</h1>");
client.println("<table border=\"2\" width=\"456\" cellpadding=\"10\"><tbody><tr><td>");
client.println("<h3>Temperatur = ");
client.println(temperatureCString1);
client.println("°C</h3><h3>Luftfeuchte = ");
client.println(humidityString1);
client.println("%</h3>");
client.println("<h3>Luftdruck = ");
client.println(pressureString1);
client.println("hPa");
client.println("</h3></td></tr></tbody></table></body></html>");
Serial.println(p1);
// your actual web page that displays temperature
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head><META HTTP-EQUIV=\"refresh\" CONTENT=\"15\"></head>");
client.println("<body><h1>BME280 #2 Web Server</h1>");
client.println("<table border=\"2\" width=\"456\" cellpadding=\"10\"><tbody><tr><td>");
client.println("<h3>Temperatur = ");
client.println(temperatureCString2);
client.println("°C</h3><h3>Luftfeuchte = ");
client.println(humidityString2);
client.println("%</h3>");
client.println("<h3>Luftdruck = ");
client.println(pressureString2);
client.println("hPa");
client.println("</h3></td></tr></tbody></table></body></html>");
Serial.println(p2);
break;
}
if (c == '\n') {
// when starts reading a new line
blank_line = true;
}
else if (c != '\r') {
// when finds a character on the current line
blank_line = false;
}
}
}
// closing the client connection
delay(1);
client.stop();
Serial.println("Client disconnected.");
}
pub();
}
//---------------MQTT callback function-------------------
// D'après http://m2mio.tumblr.com/post/30048662088/a-simple-example-arduino-mqtt-m2mio
void callback(char* topic, byte* payload, unsigned int length) {
int i = 0;
if ( debug ) {
Serial.println("Message recu => topic: " + String(topic));
Serial.print(" | longueur: " + String(length, DEC));
}
// create character buffer with ending null terminator (string)
for (i = 0; i < length; i++) {
message_buff[i] = payload[i];
}
message_buff[i] = '\0';
String msgString = String(message_buff);
if ( debug ) {
Serial.println("Payload: " + msgString);
}
if ( msgString == "ON" ) {
digitalWrite(D2, HIGH);
} else {
digitalWrite(D2, LOW);
}
}
Display More
var Zahl, Differenz;
Zahl = 1;
while (!(Zahl >= 10)) {
Differenz = getState("mqtt.0.02_sensor.druck_BME280_hinter_Filter").val - getState("mqtt.0.01_sensor.druck_BME280").val;
if (Differenz >= 1) {
sendTo("email", "send", {
html: 'Die zulässige Druckdifferenz wurde überschritten',
to: 'info@gehteuchnichtsan.de',
subject: 'Druckdifferenz überschritten'
});
console.debug("email: " + 'Die zulässige Druckdifferenz wurde überschritten');
await wait(86400000);
}
}
Display More