Hallo zusammen,
angefixt durch den Thread https://knx-user-forum.de/forum/%C3%...er-wlan-an-knx wollte ich auch Temperaturen günstig auf den Bus bringen.
Leider habe ich unglaubliche Probleme mit Multicast in meiner Netzwerkumgebung, so dass ich nach einem anderen Weg Ausschau gehalten habe auf einfache Art und Weise Temperaturen auswerten zu können.
Herausgekommen ist nachfolgender Code....ich weiß, andere können das deutlich schöner und bestimmt auch effektiver und sicherlich kann man den Code noch so anpassen, dass man jeden Temperaturwert auf ein anderes iKO senden kann und eventuell sogar über eine kleine Webpage das iKO angeben könnte, aber für mich reicht nachfolgender Sketch erst einmal aus um einen String mit allen Temperaturen auszugeben...
Vielleicht kann es ja jemand gebrauchen?!
LG
angefixt durch den Thread https://knx-user-forum.de/forum/%C3%...er-wlan-an-knx wollte ich auch Temperaturen günstig auf den Bus bringen.
Leider habe ich unglaubliche Probleme mit Multicast in meiner Netzwerkumgebung, so dass ich nach einem anderen Weg Ausschau gehalten habe auf einfache Art und Weise Temperaturen auswerten zu können.
Herausgekommen ist nachfolgender Code....ich weiß, andere können das deutlich schöner und bestimmt auch effektiver und sicherlich kann man den Code noch so anpassen, dass man jeden Temperaturwert auf ein anderes iKO senden kann und eventuell sogar über eine kleine Webpage das iKO angeben könnte, aber für mich reicht nachfolgender Sketch erst einmal aus um einen String mit allen Temperaturen auszugeben...
Vielleicht kann es ja jemand gebrauchen?!
Code:
/* WIFI Stuff */ #include <Arduino.h> #include <ESP8266WiFi.h> /* Sensor Stuff */ #include <OneWire.h> #include <DallasTemperature.h> /* Misc Stuff */ //#include <EEPROM.h> #define ONE_WIRE_BUS D3 /* Digitalport Pin 2 definieren */ #define ONE_WIRE_MAX_DEV 15 //The maximum number of devices OneWire ourWire(ONE_WIRE_BUS); /* Ini oneWire instance */ DallasTemperature DS18B20(&ourWire); int numberOfDevices; //Number of temperature devices found DeviceAddress devAddr[ONE_WIRE_MAX_DEV]; //An array device temperature sensors float tempDev[ONE_WIRE_MAX_DEV]; //Saving the last measurement of temperature float tempDevLast[ONE_WIRE_MAX_DEV]; //Previous temperature measurement long lastTemp; //The last measurement const int durationTemp = 5000; //The frequency of temperature measurement /* DS18B20 - Temperatursensor */ const char* ssid = ""; //Eure Wlan-SSID const char* password = ""; //Euer Wlan-Passwort const char* host = "XXX.XXX.XXX.XXX"; //Eure Edomi-Adresse #define LED_PIN LED_BUILTIN #define UPDATE_INTERVAL 10000 // Default send and debug interval unsigned long next_data_change = 0; unsigned long next_debug_change = 0; //------------------------------------------ //Device ID to string String GetAddressToString(DeviceAddress deviceAddress) { String str = ""; for (uint8_t i = 0; i < 8; i++) { if ( deviceAddress[i] < 16 ) str += String(0, HEX); str += String(deviceAddress[i], HEX); } return str; } //Setup Temperatursensoren void SetupDS18B20() { DS18B20.begin(); Serial.print("Parasite power is: "); if ( DS18B20.isParasitePowerMode() ) { Serial.println("ON"); } else { Serial.println("OFF"); } numberOfDevices = DS18B20.getDeviceCount(); Serial.print( "Device count: " ); Serial.println( numberOfDevices ); lastTemp = millis(); DS18B20.requestTemperatures(); // Loop through each device, print out address for (int i = 0; i < numberOfDevices; i++) { // Search the wire for address if ( DS18B20.getAddress(devAddr[i], i) ) { //devAddr[i] = tempDeviceAddress; Serial.print("Found device "); Serial.print(i, DEC); Serial.print(" with address: " + GetAddressToString(devAddr[i])); Serial.println(); } else { Serial.print("Found ghost device at "); Serial.print(i, DEC); Serial.print(" but could not detect address. Check power and cabling"); } //Get resolution of DS18b20 Serial.print("Resolution: "); Serial.print(DS18B20.getResolution( devAddr[i] )); Serial.println(); //Read temperature from DS18b20 float tempC = DS18B20.getTempC( devAddr[i] ); Serial.print("Temp C: "); Serial.println(tempC); } } //Loop Temperaturmessung void TempLoop(long now) { if ( now - lastTemp > durationTemp ) { //Take a measurement at a fixed time (durationTemp = 5000ms, 5s) for (int i = 0; i < numberOfDevices; i++) { float tempC = DS18B20.getTempC( devAddr[i] ); //Measuring temperature in Celsius tempDev[i] = tempC; //Save the measured value to the array } DS18B20.setWaitForConversion(false); //No waiting for measurement DS18B20.requestTemperatures(); //Initiate the temperature measurement lastTemp = millis(); //Remember the last time measurement } } //------------------------------------------ void setup() { // ### SERIAL Serial.begin(115200); // Serielle Verbindung aufbauen Serial.flush(); // Einmal das Serielle Fenster Flushen, damit es leer ist Serial.println("Starting Setup"); // Infos rausschreiben Serial.println(); Serial.print("Try to connect to the following Wifi: "); Serial.print(ssid); // ### WIFI Connect WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { // Whileschleife wird solange ausgeführt, bis das WLAN Verbunden ist delay(500); Serial.print("."); } // Infos rausschreiben Serial.println(""); Serial.println("WiFi uplink is running"); Serial.println("Here is my local IP Address: "); Serial.println(WiFi.localIP()); //Setup DS18b20 temperature sensor SetupDS18B20(); } void loop() { long t = millis(); TempLoop( t ); unsigned long now = millis(); // Infos rausschreiben Serial.print("Connect to: "); Serial.println(host); // ### WIFIClient initialisieren WiFiClient client; if (client.connect(host, 80)) { // URL die aufgerufen werden soll generieren String url = "//remote/?login=remote&pass=remote&koid=732&kovalue="; //732 ist nur ein Beispiel iKO, hier müsst ihr eure KO-ID angeben url += tempDev[0]; url += "|"; url += tempDev[1]; url += "|"; url += tempDev[2]; url += "|"; url += tempDev[3]; url += "|"; url += tempDev[4]; url += "|"; url += tempDev[5]; url += "|"; url += tempDev[6]; url += "|"; url += tempDev[7]; url += "|"; url += tempDev[8]; url += "|"; url += tempDev[9]; url += "|"; url += tempDev[10]; url += "|"; url += tempDev[11]; url += "|"; url += tempDev[12]; url += "|"; url += tempDev[13]; url += "|"; url += tempDev[14]; // Einen HTTP GET Request generieren und abschicken client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(10); // 10 milisekunden warten // Read all the lines of the reply from server and print them to Serial while(client.available()){ String line = client.readStringUntil('\r'); //Serial.print(line); } Serial.println("Website was called, closing connection"); Serial.print("Current temperature is: "); Serial.print(tempDev[0]); Serial.println(" Degree "); }else{ // Error schreiben //EEPROM.write(4, 1); Serial.println("Connection lost"); } }
Kommentar