Habe vor einiger Zeit eine kleine Wetterstation mt einer NodeMCU gebaut die mi der CCU2 problemlos funktionierte. Seit dem Umstieg auf die CCU3 habe ich aber leider das Problem, das die per HTTP gesendeten Daten ein paar Stunden die Systemvariablen in der CCU3 einwandfrei setzten, danach ich aber den Fehlercode -2 erhalte. Nachdem ich die NodeMCU neu starte funktioniert es wieder eine Weile. Ich konnte leider auch nicht herausfinden was -2 zu bedeuten hat. Für etwaige Tipps wäre ich sehr dankbar!
Danke Thomas
Code: Alles auswählen
// Adresse BME 280: 0x76
// Adresse BH1750: 0x23
#include <Arduino.h>
//Netzwerk
#include <ESP8266WebServer.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiClient.h>
#include <ESP8266HTTPClient.h>
//Update per wlan
#include <ArduinoOTA.h> // OTA Upload via ArduinoIDE funktioniert leider nicht
// I2C
#include <Wire.h>
// BME280
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// Temperatursensor TSIC306
#include "TSIC.h"
// Helligkeitssensor BH1750 I2C 0x23
#include <BH1750.h>
BH1750 lightMeter;
Adafruit_BME280 bme; // I2C 0x76
TSIC TemperaturSensor(D5);
const byte Windsensorpin = D7;
const byte LED_Uebertragung = D0;
// Variablen, für die Zeitverzögerung bei der Übertragung
unsigned long previousMillis = 0;
const long Uebertragungsintervall = (3*60*1000);
unsigned long delayTime;
// Variablen für Temperaturmessung mit TSIC306
uint16_t temperature = 0;
float Temperatur_C = 0;
float BME280Luftdruck, BME280Luftfeuchtigkeit;
float BME280Temperatur;
// Variable für die Helligkeit
float Helligkeit = 0;
// Variablen für Windmessung
volatile boolean TX20IncomingData = false;
unsigned char chk;
unsigned char sa,sb,sd,se;
unsigned int sc,sf, pin;
unsigned int Himmelsrichtung;
String tx20RawDataS = "";
String Windrichtung_Gartensensor;
//Variablen für die Übertragung
unsigned int Windrichtung1, Windrichtung2;
unsigned int Windgeschwindigkeit1, Windgeschwindigkeit2, Windgeschwindigkeit3;
float Helligkeit1, Helligkeit2;
ESP8266WiFiMulti WiFiMulti;
WiFiClient client;
HTTPClient http;
int httpCode = http.GET();
ESP8266WebServer server(80);
const char* ssid="FRITZ!Box 4040 PL";
const char* password = "Passwort";
const char* HomematicIP = "192.168.0.11";
void isTX20Rising() {
if (!TX20IncomingData) {
TX20IncomingData = true;
}
}
/*
* SETUP
*/
void setup() {
pinMode(Windsensorpin, INPUT);
pinMode(LED_Uebertragung, OUTPUT);
digitalWrite(LED_Uebertragung, HIGH);
ArduinoOTA.begin(); // OTA Upload via ArduinoIDE
bool status;
status = bme.begin(0x76);
Wire.begin();
lightMeter.begin();
attachInterrupt(digitalPinToInterrupt(Windsensorpin), isTX20Rising, RISING);
Serial.begin(115200);
delay(50);
Serial.println();
Serial.print("Wifi verbindet zu ");
Serial.println( ssid );
WiFi.begin(ssid,password);
IPAddress staticIP(192, 168, 0, 120);
IPAddress gateway(192,168,0,1);
IPAddress subnet(255,255,255,0);
WiFi.config(staticIP, gateway, subnet);
ArduinoOTA.setHostname("Wetterstation");
Serial.println();
Serial.print("Verbinde");
while( WiFi.status() != WL_CONNECTED ){
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("Wifi Verbunden!");
Serial.print("NodeMCU Wetterstation IP Addresse : ");
Serial.println(WiFi.localIP() );
Serial.println();
server.on("/", handle_OnConnect);
server.onNotFound(handle_NotFound);
server.begin();
Serial.println("HTTP server started");
if (client.connect(HomematicIP, 80)) {
Serial.println("Connected to Homematic!");
Serial.println();
} else {
Serial.println("Connection to Homematic failed");
Serial.println();
}
String urlWindgeschwindigkeit = "http://Benutzername:Passwort@" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"Windgeschwindigkeit_Gartensensor\").State(0)";
Serial.println(urlWindgeschwindigkeit);
http.begin(urlWindgeschwindigkeit);
httpCode = http.GET();
Serial.println("httpcode = " + String(httpCode));
digitalWrite(LED_Uebertragung, HIGH);
delay(500);
digitalWrite(LED_Uebertragung, LOW);
String Leerzeile ="/n";
http.begin(Leerzeile);
httpCode = http.GET();
digitalWrite(LED_Uebertragung, HIGH);
}
boolean readTX20() {
int bitcount=0;
sa=sb=sd=se=0;
sc=0;sf=0;
tx20RawDataS = "";
for (bitcount=41; bitcount>0; bitcount--) {
pin = (digitalRead(Windsensorpin));
if (!pin) {
tx20RawDataS += "1";
} else {
tx20RawDataS += "0";
}
if ((bitcount==41-4) || (bitcount==41-8) || (bitcount==41-20) || (bitcount==41-24) || (bitcount==41-28)) {
tx20RawDataS += " ";
}
if (bitcount > 41-5){
// start, inverted
sa = (sa<<1)|(pin^1);
} else
if (bitcount > 41-5-4){
// wind dir, inverted
sb = sb>>1 | ((pin^1)<<3);
} else
if (bitcount > 41-5-4-12){
// windspeed, inverted
sc = sc>>1 | ((pin^1)<<11);
} else
if (bitcount > 41-5-4-12-4){
// checksum, inverted
sd = sd>>1 | ((pin^1)<<3);
} else
if (bitcount > 41-5-4-12-4-4){
// wind dir
se = se>>1 | (pin<<3);
} else {
// windspeed
sf = sf>>1 | (pin<<11);
}
delayMicroseconds(1220);
}
chk= ( sb + (sc&0xf) + ((sc>>4)&0xf) + ((sc>>8)&0xf) );chk&=0xf;
delayMicroseconds(2000); // just in case
TX20IncomingData = false;
if (sa==4 && sb==se && sc==sf && sd==chk){
return true;
} else {
return false;
}
}
/*
* LOOP
*/
void loop() {
/* Wenn Webserver aktiv, funktioniert Anemometer nicht mehr
handle_OnConnect();
server.handleClient();
*/
ArduinoOTA.handle();
if (TX20IncomingData) {
char a[90];
boolean validData = readTX20();
Serial.println(tx20RawDataS);
sprintf(a, "ID: %d\t%d\n", sa, B00100);
Serial.write (a);
sprintf(a, "Wind direction: %d\t%d\n", sb, se);
Serial.write (a);
sprintf(a, "Wind speed: %d\t%d\n", sc, sf);
Serial.write (a);
sprintf(a, "Checksum: %d\t%d\n", sd, chk);
Serial.write (a);
if (validData){
Serial.println(" :) OK :) OK :) OK :) OK");
// Übertragung Windgeschwindigkeit
Windgeschwindigkeit2 = Windgeschwindigkeit1;
Serial.print("Windgeschwindigkeit 2: ");
Serial.println(Windgeschwindigkeit2);
Windgeschwindigkeit1 = sf;
Serial.print("Windgeschwindigkeit 1: ");
Serial.println(Windgeschwindigkeit1);
if (Windgeschwindigkeit2 != Windgeschwindigkeit1) {
digitalWrite(LED_Uebertragung, LOW);
String urlWindgeschwindigkeit = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"Windgeschwindigkeit_Gartensensor\").State(" + sc + ")";
Serial.println(urlWindgeschwindigkeit);
http.begin(urlWindgeschwindigkeit);
httpCode = http.GET();
Serial.println("httpcode = " + String(httpCode));
digitalWrite(LED_Uebertragung, HIGH);
delay(500);
digitalWrite(LED_Uebertragung, LOW);
String Leerzeile ="/n";
http.begin(Leerzeile);
httpCode = http.GET();
digitalWrite(LED_Uebertragung, HIGH);
delay(500);
}
// Übertragung Windrichtung
Windrichtung2 = Windrichtung1;
Serial.print("Windrichtung 2: ");
Serial.println(Windrichtung2);
Windrichtung1 = se;
Serial.print("Windrichtung 1: ");
Serial.println(Windrichtung1);
if (Windrichtung2 != Windrichtung1) {
digitalWrite(LED_Uebertragung, LOW);
Windrichtung();
String urlWindrichtung = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"Windrichtung_Gartensensor\").State(" + Himmelsrichtung + ")";
Serial.println(urlWindrichtung);
http.begin(urlWindrichtung);
httpCode = http.GET();
Serial.println("httpcode = " + String(httpCode));
digitalWrite(LED_Uebertragung, HIGH);
delay(500);
digitalWrite(LED_Uebertragung, LOW);
String Leerzeile ="/n";
http.begin(Leerzeile);
httpCode = http.GET();
digitalWrite(LED_Uebertragung, HIGH);
delay(500);
}
} else {
Serial.println(" !!! ERROR !!! ERROR !!!");
}
Serial.println("");
}
Uebertragung();
}
void Uebertragung() {
unsigned long currentMillis = millis();
if ((unsigned long)(currentMillis - previousMillis) >= Uebertragungsintervall) {
// Damit sollen die Markisen bei starken Wind nach X Minuten eingefahren werden
Windgeschwindigkeit3 = Windgeschwindigkeit2;
Serial.print("Windgeschwindigkeit 3: ");
Serial.println(Windgeschwindigkeit3);
digitalWrite(LED_Uebertragung, LOW);
String urlWindgeschwindigkeit3 = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"Windgeschwindigkeit_Einfahrwert\").State(" + Windgeschwindigkeit3 + ")";
http.begin(urlWindgeschwindigkeit3);
httpCode = http.GET();
Serial.println("httpcode = " + String(httpCode));
digitalWrite(LED_Uebertragung, HIGH);
delay(500);
digitalWrite(LED_Uebertragung, LOW);
String Leerzeile ="/n";
http.begin(Leerzeile);
httpCode = http.GET();
digitalWrite(LED_Uebertragung, HIGH);
delay(500);
// Übertragung Helligkeit
int Helligkeit = lightMeter.readLightLevel();
Helligkeit2 = Helligkeit1;
Serial.print("Helligkeit 2: ");
Serial.println(Helligkeit2);
Helligkeit1 = Helligkeit;
Serial.print("Helligkeit 1: ");
Serial.println(Helligkeit1);
if (Helligkeit1 != Helligkeit2) {
digitalWrite(LED_Uebertragung, LOW);
String urlHelligkeit = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"Helligkeit\").State(" + Helligkeit + ")";
Serial.println(urlHelligkeit);
http.begin(urlHelligkeit);
httpCode = http.GET();
Serial.println("httpcode = " + String(httpCode));
digitalWrite(LED_Uebertragung, HIGH);
delay(500);
digitalWrite(LED_Uebertragung, LOW);
String Leerzeile ="/n";
http.begin(Leerzeile);
httpCode = http.GET();
digitalWrite(LED_Uebertragung, HIGH);
// Übertragung und Temperaturmessung TSIC306
if (TemperaturSensor.getTemperature(&temperature)) {
Temperatur_C = TemperaturSensor.calc_Celsius(&temperature);
}
digitalWrite(LED_Uebertragung, LOW);
String urlTSIC306 = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"Temperatur_Gartensensor_TSIC306\").State(" + Temperatur_C + ")";
Serial.println(urlTSIC306);
http.begin(urlTSIC306);
httpCode = http.GET();
Serial.println("httpcode = " + String(httpCode));
digitalWrite(LED_Uebertragung, HIGH);
delay(500);
digitalWrite(LED_Uebertragung, LOW);
Leerzeile ="/n";
http.begin(Leerzeile);
httpCode = http.GET();
digitalWrite(LED_Uebertragung, HIGH);
// Übertragung BME280 Temperatur
BME280Temperatur = (bme.readTemperature());
digitalWrite(LED_Uebertragung, LOW);
String urlBME280Temperatur = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"BME280_Temperatur\").State(" + BME280Temperatur + ")";
Serial.println(urlBME280Temperatur);
http.begin(urlBME280Temperatur);
httpCode = http.GET();
Serial.println("httpcode = " + String(httpCode));
digitalWrite(LED_Uebertragung, HIGH);
delay(500);
digitalWrite(LED_Uebertragung, LOW);
Leerzeile ="/n";
http.begin(Leerzeile);
httpCode = http.GET();
digitalWrite(LED_Uebertragung, HIGH);
// Übertragung BME280 Luftfeuchtigkeit
BME280Luftfeuchtigkeit = (bme.readHumidity());
digitalWrite(LED_Uebertragung, LOW);
String urlBME280Luftfeuchtigkeit = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"BME280_Luftfeuchtigkeit\").State(" + BME280Luftfeuchtigkeit + ")";
Serial.println(urlBME280Luftfeuchtigkeit);
http.begin(urlBME280Luftfeuchtigkeit);
httpCode = http.GET();
Serial.println("httpcode = " + String(httpCode));
digitalWrite(LED_Uebertragung, HIGH);
delay(500);
digitalWrite(LED_Uebertragung, LOW);
Leerzeile ="/n";
http.begin(Leerzeile);
httpCode = http.GET();
digitalWrite(LED_Uebertragung, HIGH);
// Übertragung BME280 Luftdruck
BME280Luftdruck = (bme.readPressure() / 100.0F);
digitalWrite(LED_Uebertragung, LOW);
String urlBME280Luftdruck = "http://" + String(HomematicIP) + ":8181/x.exe?ret=dom.GetObject(\"BME280_Luftdruck\").State(" + BME280Luftdruck + ")";
Serial.println(urlBME280Luftdruck);
http.begin(urlBME280Luftdruck);
httpCode = http.GET();
Serial.println("httpcode = " + String(httpCode));
digitalWrite(LED_Uebertragung, HIGH);
delay(500);
digitalWrite(LED_Uebertragung, LOW);
Leerzeile ="/n";
http.begin(Leerzeile);
httpCode = http.GET();
digitalWrite(LED_Uebertragung, HIGH);
}
previousMillis = currentMillis;
}
}