Ankündigung

Einklappen
Keine Ankündigung bisher.

ESP, 1-Wire und Edomi-Fernzugriff...

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Projekte] ESP, 1-Wire und Edomi-Fernzugriff...

    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?!

    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");
        }
    
    }
    LG

    #2
    Für mich ganz interessant, hat den Code zufällig jemand passend für einen bme280 Sensor für Temperatur und Luftfeuchtigkeit welcher dann an 2 iko an edomi übergeben wird?

    Kommentar


      #3
      ist jetzt zur Zeit kein Bedarf von mir, aber wenn ich mal was mit dem ESP und derlei Zwecke machen würde, dann wäre wohl MQTT für mich das Mittel der Wahl. Das ist einfach, asynchron, hinreichend schnell. Habe mit MQTT und ESP genau den entgegen gesetzten Weg (edomi -> MQTT -> ESP -> LEDs steuern, wo kein KNX liegt) mal probiert und das ging prima. Nur so als alternativer Lösungsansatz...

      Nachtrag: Das war das Projekt, was wunderbar funktionierte und nutze es mit LED-Stripe (einzeln adressierbar) - habe mir leider noch keine Zeit dafür genommen,es noch etwas auszustaffieren: https://www.heise.de/ratgeber/MQTT-L...u-4158000.html
      Zuletzt geändert von saegefisch; 10.01.2020, 11:31. Grund: Nachtrag: URL

      Kommentar


        #4
        das schau ich mir mal an. danke dir vorerst

        Kommentar

        Lädt...
        X