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