Hallo,
habe versucht als Anfänger in den Wettermonster code meiner Wetterstation zusätzlich den Versand der Messwerte an meinen netzwerkinternen MQTT Server zu senden. Komm aber hier einfach nicht weiter.
Ich hoffe jemand kann mir einen Tipp geben, wie ich das am besten bewerkstellige.
Anbei mein bisheriger Code. Die zusätzlichen Code Zeilen, die ich eingefügt habe, sind mit "//add for MQTT" gekennzeichnet.
Ziel ist es wie gesagt, alle Messwerte:
float temperature;
float humidity;
float pressure;
float Percipitation;
float numClicksRain;
float windSpeed;
float numRevsAnemometer;
char* windDirection;
float luminosity;
zusätzlich an meinen MQTT zu senden.
Hier noch der Gesamt Code:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <ESP8266WebServer.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "Adafruit_TSL2591.h"
#include <PubSubClient.h> //*add for MQTT
Adafruit_BME280 bme;
Adafruit_TSL2591 tsl = Adafruit_TSL2591(2591);
const char* ssid = "XXXX";
const char* password = "XXXX";
const char* id = "XXXX";
const char* key = "XXXX";
const int interval = 5;
const char* MQTT_BROKER = "192.168.178.2"; //add for MQTT
float temperature;
float humidity;
float pressure;
float Percipitation;
float numClicksRain;
float windSpeed;
float numRevsAnemometer;
char* windDirection;
float luminosity;
volatile unsigned long previousTimeRain=0, previousTimeSpeed=0, delayTime=20;
unsigned long lastMillis;
WiFiClient client;
PubSubClient client(client); //add for MQTT
void ICACHE_RAM_ATTR countAnemometer();
void ICACHE_RAM_ATTR countRain();
void sendToWettermonster() {
int i = 0;
while(WiFi.status() != WL_CONNECTED && i <= 5)
{
i++;
Serial.println("WiFi nicht verbunden. Versuche neu zu verbinden...");
WiFi.disconnect();
WiFi.mode(WIFI_OFF);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
delay(1000);
}
if(i > 5)
{
Serial.println("Verbindnung zu " + String(ssid) + " fehlgeschlagen. Neustart.");
ESP.restart();
}
if (WiFi.status() == WL_CONNECTED && client.connect("upload.wettermonster.de", 80)) // Verbindung zum Server aufbauen
{
Serial.println ("Verbunden mit upload.wettermonster.de");
client.print("GET /speichern.php");
client.print("?id=");
client.print(id);
client.print("&schluessel=");
client.print(key);
client.print("&temperatur=");
client.print(temperature);
client.print("&luftfeuchtigkeit=");
client.print(humidity);
client.print("&luftdruck=");
client.print(pressure);
client.print("&niederschlag=");
client.print(Percipitation);
client.print("&windgeschwindigkeit=");
client.print(windSpeed);
client.print("&windrichtung=");
client.print(windDirection);
client.print("&helligkeit=");
client.print(luminosity);
client.println(" HTTP/1.1");
client.println("Host: upload.wettermonster.de");
client.println("User-Agent: Wettermonster");
client.println("Accept: text/html");
client.println();
unsigned long timeout = millis();
while (client.available() == 0) {
yield();
if (millis() - timeout > 5000) {
Serial.println("Timeout !");
client.stop();
return;
}
}
Serial.println("Daten an Wettermonster gesendet");
}
else
{
Serial.println("Verbindung fehlgeschlagen");
}
client.stop();
}
void readBME() {
temperature = bme.readTemperature();
humidity = bme.readHumidity();
pressure = bme.readPressure() / 100.0F;
}
void readTSL() {
uint32_t lum;
uint16_t ir, full, visible, gain, timing;
boolean change = false;
String url_temp;
tslagain:
lum = tsl.getFullLuminosity();
gain = tsl.getGain();
timing = tsl.getTiming();
ir = lum >> 16;
full = lum & 0xFFFF;
luminosity = tsl.calculateLux(full, ir);
for (int i=0; i == 0 || luminosity > 150000.0 || luminosity < 0; i++){
while (((ir>16000) || (full > 40000) || (luminosity <= 0)) && (gain > 0)) {
change = true;
switch(gain)
{
case TSL2591_GAIN_MED:
tsl.setGain(TSL2591_GAIN_LOW);
break;
case TSL2591_GAIN_HIGH:
tsl.setGain(TSL2591_GAIN_MED);
break;
case TSL2591_GAIN_MAX:
if (timing > 0) {
timing--;
tsl.setTiming(tsl2591IntegrationTime_t(timing));
}
else {
tsl.setGain(TSL2591_GAIN_MED);
}
break;
default:
break;
}
lum = tsl.getFullLuminosity();
gain = tsl.getGain();
timing = tsl.getTiming();
ir = lum >> 16;
full = lum & 0xFFFF;
luminosity = tsl.calculateLux(full, ir);
delay (500);
}
while ((ir<500) && (full < 1000) && (timing < 5)) {
change = true;
switch(gain)
{
case TSL2591_GAIN_LOW:
tsl.setGain(TSL2591_GAIN_MED);
break;
case TSL2591_GAIN_MED:
tsl.setGain(TSL2591_GAIN_HIGH);
break;
case TSL2591_GAIN_HIGH:
tsl.setGain(TSL2591_GAIN_MAX);
break;
case TSL2591_GAIN_MAX:
if (timing < 5) {
timing++;
tsl.setTiming(tsl2591IntegrationTime_t(timing));
}
break;
default:
break;
}
lum = tsl.getFullLuminosity();
gain = tsl.getGain();
timing = tsl.getTiming();
ir = lum >> 16;
full = lum & 0xFFFF;
luminosity = tsl.calculateLux(full, ir);
delay (500);
}
if (change == true) {
lum = tsl.getFullLuminosity();
gain = tsl.getGain();
timing = tsl.getTiming();
ir = lum >> 16;
full = lum & 0xFFFF;
luminosity = tsl.calculateLux(full, ir);
}
delay (500);
}
}
void countAnemometer() {
if((millis() - previousTimeSpeed) > delayTime) {
numRevsAnemometer++;
previousTimeSpeed = millis();
}
}
void countRain() {
if((millis() - previousTimeRain) > delayTime) {
numClicksRain++;
previousTimeRain = millis();
}
}
void readWeatherMeters() {
windSpeed = (numRevsAnemometer / (interval * 60)) * 2.4;
numRevsAnemometer = 0;
Percipitation = 0.2794 * (numClicksRain * 60 / interval);
numClicksRain = 0;
int windDirectionVoltage = analogRead(A0);
if (windDirectionVoltage >= 212 && windDirectionVoltage < 273) {windDirection = "N";}
else if (windDirectionVoltage >= 577 && windDirectionVoltage < 665) {windDirection = "NNE";}
else if (windDirectionVoltage >= 483 && windDirectionVoltage < 577) {windDirection = "NE";}
else if (windDirectionVoltage >= 929 && windDirectionVoltage < 943) {windDirection = "ENE";}
else if (windDirectionVoltage >= 906 && windDirectionVoltage < 929) {windDirection = "E";}
else if (windDirectionVoltage >= 943 && windDirectionVoltage < 1023){windDirection = "ESE";}
else if (windDirectionVoltage >= 795 && windDirectionVoltage < 858) {windDirection = "SE";}
else if (windDirectionVoltage >= 858 && windDirectionVoltage < 906) {windDirection = "SSE";}
else if (windDirectionVoltage >= 665 && windDirectionVoltage < 748) {windDirection = "S";}
else if (windDirectionVoltage >= 748 && windDirectionVoltage < 795) {windDirection = "SSW";}
else if (windDirectionVoltage >= 348 && windDirectionVoltage < 399) {windDirection = "SW";}
else if (windDirectionVoltage >= 399 && windDirectionVoltage < 483) {windDirection = "WSW";}
else if (windDirectionVoltage >= 0 && windDirectionVoltage < 106) {windDirection = "W";}
else if (windDirectionVoltage >= 163 && windDirectionVoltage < 212) {windDirection = "WNW";}
else if (windDirectionVoltage >= 106 && windDirectionVoltage < 163) {windDirection = "NW";}
else if (windDirectionVoltage >= 273 && windDirectionVoltage < 348) {windDirection = "NNW";}
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
Serial.print("Verbinde mit " + String(ssid));
client.setServer(MQTT_BROKER, 1883); //add for MQTT
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("Wifi Aktiviert");
Serial.println("");
Serial.print("Verbunden mit: ");
Serial.println(ssid);
Serial.print("IP Adresse: ");
Serial.println(WiFi.localIP());
pinMode(2, INPUT_PULLUP);
attachInterrupt(2, countRain, FALLING);
pinMode(14, INPUT_PULLUP);
attachInterrupt(14, countAnemometer, FALLING);
if (!bme.begin()){
Serial.println("BME280 konnte nicht gefunden werde, checke bitte die Verbindungen!");
return;
}
if (tsl.begin()){
tsl.setGain(TSL2591_GAIN_LOW);
tsl.setTiming(TSL2591_INTEGRATIONTIME_100MS);
}
else{
Serial.println("TSL2591 konnte nicht gefunden werde, checke bitte die Verbindungen!");
return;
}
lastMillis = millis();
}
void loop() {
if (millis() - lastMillis > (interval * 60000)) {
readBME();
readTSL();
readWeatherMeters();
sendToWettermonster();
lastMillis = millis();
}
if(ESP.getFreeHeap() <= 20000){
Serial.println("Der freie Heap beträgt nur noch: " + String(ESP.getFreeHeap()) + " Der ESP wird deshalb neu gestartet.");
ESP.restart();
}
if (!client.connected()) { //add for MQTT
while (!client.connected()) { //add for MQTT
client.connect("ESP8266Client"); //add for MQTT
delay(100);
} //add for MQTT
client.loop(); //add for MQTT
client.publish("/home/data", temperature); //add for MQTT
} //add for MQTT
}
Danke
