ESP8266 mit Bosch BME680 an Onewire Bus

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • crouser7
    Extension Master
    • 06.06.2016
    • 111

    #1

    ESP8266 mit Bosch BME680 an Onewire Bus

    Hallo zusammen,

    Ich habe mir mal zum experimentieren einen exp8266 und einen bosch bme680 sensor bestellt.
    Ich will damit im Raum Temperatur, Luftdruck, Feuchtigkeit und CO2 messen.

    Das ist ja alles kein Problem und per WLAN könnte man die Daten zum Beispiel and die InfluxDB schicken und von da dann dem Miniserver wieder verfügbar machen.

    Jedoch hatte ich die Idee um auf das WLAN verzichten zu können, dass ich den ESP8266 als Sensor am OneWire Bus anmelde und er mir darüber die Werte direkt an die OneWire Extension von Loxone schickt. Es soll nur ein Versuch sein um weiterhin Kabelgebunden die Daten zu übertragen.

    Falls jemand Erfahrungen hat ob man den ESP8266 oder einen anderen Mikrocontroller als Client am Bus nutzen kann würde ich mich über geteiltes Wissen sehr freuen.

    Gruß
  • challo
    LoxBus Spammer
    • 21.09.2016
    • 372

    #2
    Wenn man mit Arduino oder ESP8266 ein Loxone kompatiblen OneWire Chip emuliert funktioniert das.
    Library gibts zum Beispiel hier: https://github.com/orgua/OneWireHub
    Damit einen der Folgenden Typen emulieren und die Daten von dem BME680 übertragen.
    • DS1822 (22) Temperatur
    • DS18B20 (28) Temperatur
    • DS18S20 (10) Temperatur
    • DS1963S (18) Schlüsselschalter
    • DS1990 (01) Schlüsselschalter
    • DS2438 (26) Temperatur, Spannung VDD, Spannung VAD, Spannung VSens

    Kommentar

    • crouser7
      Extension Master
      • 06.06.2016
      • 111

      #3
      perfekt, genau das habe ich gesucht, aber wahrscheinlich fehlte der Begriff Slave bei meiner Google Suche um auf die Bibliothek zu kommen.

      Kommentar

      • Maruu
        LoxBus Spammer
        • 07.03.2017
        • 489

        #4
        Die Frage ist ob der ESP8266 auf Dauer nicht zu viel Strom zieht?

        Kommentar

        • hismastersvoice
          Supermoderator
          • 25.08.2015
          • 7319

          #5
          Der ESP braucht ca 0,5 Watt, wenn du also nicht 20 dieser Sensoren brauchst sollte das keine Rolle spielen.

          Ich verstehe aber nicht was du machst...
          Warum ein ESP wenn du das WLAN nicht nutzt?
          Da würde ich eher ein Arduino Mini Pro nutzen

          Ich sende die Daten per WLAN direkt per UDP an den MiniServer
          Kein Support per PN!

          Kommentar

          • crouser7
            Extension Master
            • 06.06.2016
            • 111

            #6
            Ich hatte tatsächlich genau das erst überleget, also per WLAN entweder an den Miniserver oder in die InfluxDB oder NodeRed.
            Jedoch ist mir danach erst das mit OneWire aufgefallen und da hatte ich mir schon einen bestellt, und außerdem ist der für 2,x€ bei Ebay auch echt ein schnapper und bauform technisch auch super.

            So hab ich jetzt beides offen und werde beides mal ausprobieren und mal schauen was ich dann anstelle am Ende. Vielleicht bleibe ich bei Wlan oder ich wechsel vielleicht noch auf einen anderen einfacheren Chip ohne Wlan und nutze den rein über OneWire.

            Für mich das interessanteste ist aber tatsächlich der Bosch BME680 Sensor mit Luftqualitäts Messung. Das will ich als Regelgröße (Anhaltswert) für die Regelung der Lüftungsanlage nutzen.

            Kommentar

            • hismastersvoice
              Supermoderator
              • 25.08.2015
              • 7319

              #7
              Gleich eines zur Info der BME hat so wie ich das lese keine eigene Baseline-Kalibration.
              Ich kann die die iAQ Core empfehlen, ich nutze selber 4 Stück davon (mit ESP8266) sein 2 Jahren und bin sehr zufrieden.
              Sind zwar teuer und nur für Air-Qual aber diese kalibrieren sich selber wenn sie eine weile Frischluft bekommen.


              Please note, this sensor, like all VOC/gas sensors, has variability and to get precise measurements you will want to calibrate it against known sources! That said, for general environmental sensors, it will give you a good idea of trends and comparisons. We recommend that you run this sensor for 48 hours when you first receive it to "burn it in", and then 30 minutes in the desired mode every time the sensor is in use. This is because the sensitivity levels of the sensor will change during early use and the resistance will slowly rise over time as the MOX warms up to its baseline reading.
              Kein Support per PN!

              Kommentar


              • Buffy
                Buffy kommentierte
                Kommentar bearbeiten
                Hi,
                bin gerade über diesen Post gestoßen. Ich suche eine Lösung den IAQ-Core über Wlan zu nutzen. Kannst du mir den Code und eine kleine Anleitung von dir zukommen lassen?
                MfG Tobi
            • Gast

              #8
              Den Ansatz eines 1-Wire Slave, an dem man beliebig I2C Sensoren anschliessen kann, verfolge ich nun schon seit mehr als einem Jahr. Das Projekt ist aber aus Mangel an Zeit etwas ins Stocken geraden. Wobei die Schaltung liegt noch immer aufgebaut auf dem Steckbrett vor mir und sie funktioniert auch bestens.

              Die Grundsoftware habe nahm ich von hier: https://tm3d.de/elektronik-projekte/...-simulation-v2
              GIT: https://smho.de/gw/?p=public/owSlave...s/heads/master

              Kommentar

              • Gast

                #9
                Das Protokoll mit dem man ein DS18B20 und/oder ein DS2438 simulieren kann ist in Assembler geschrieben. Main-Programm und die Libs für I2C und die Sensoren in C. Verwende im Moment ein Attiny84A @4MHz, müsste aber auch mit einem Attiny85 funktionieren. Benötigt bei 5V etwa 2-4mA, inkl. einigen Sensoren, wenn ich mich noch richtig erinnere. Als IDE verwende ich die neuste Version von Atmel Studio.

                Am Ende eine Übersicht, welche Sensoren unterstützt werden. Ich habe selber noch einige andere Sensoren integriert, u.a. ein paar verschiedene I2C Temperatursensoren, Luftdruck etc. Nebst I2C kann auch ein DS18B20 angeschlossen werden, d.h. ich habe dann ein 1-Wire Slave, der ein 1-Wire Master implementiert hat und darüber ein DS18B20 auslesen kann und den Temperaturwert an die Loxone übergibt!!! Schlussendlich gehen fast alle Sensoren, für die man eine C-Lib hat und keine Interrupts verwenden. Arduino Libraries die in C++ geschreiben wurden, können nicht verwendet werden. ASM, C und C++ wäre etwas viel für einen kleinen Controller mit 8kB Flash.
                Betreffend CO2 Sensoren, ich habe einige ausprobiert und bekomme auch die Werte übermittelt, aber die meisten sind nicht brauchbar, weil die automatische Kalibrierung fehlt. Den iAQ Core habe ich selber noch nicht ausprobiert, steht aber irgend wo auf der ToDo Liste.


                Ach noch was, die Originalsoftware vom obigen Link hatte ich etwas umgeschrieben, damit ich bis zu 8 DS18B20/DS2438 simulieren kann. Pro DS18B20 ist es ein Temperaturwert und bei einem DS2438 die Werte Temperatur, Vdd (Busspannung), Vad (AD-Wandler) und Vsens (Stromeingang). Wobei beide Typen zu verwenden ist nicht wirklich sinnvoll, weil man dann zu viel Speicher braucht und schnell zu wenig Platz für den C-Code hat. Zudem braucht man bei einem DS2438 mehr Zeit um die gleiche Anzahl an Werten auf dem Bus auszulesen als bei einem DS18B20. Zumindest ist das bei der Loxone 1-Wire Extension der Fall.

                Müsste das ganze Projekt nach meinen Ferien wieder aktivieren. Hatte noch einiges vor damit. U.a. können auch Zähler gebaut werden (inkl. Speicherung des Zählerwerts im EEPROM) und man kann auch die AD Eingänge des Controllers direkt verwenden ohne ein ADS1115 oder was auch immer einzusetzen.
                Zuletzt geändert von Gast; 21.07.2018, 21:58.

                Kommentar


                • pmayer
                  pmayer kommentierte
                  Kommentar bearbeiten
                  Planst du den Quellcode zu releasen?
              • pmayer
                LoxBus Spammer
                • 26.02.2017
                • 382

                #10
                Ich mache das bei mir, aktuell noch ohne Luftqaulität, mit mehreren ESP8266 an 18650er Zellen im Deepsleep. Halten ungefähr 4 Monate (ist nicht optimal, ich weiß). Also Software setze ich das "fertige" ESP-Easy ein: https://www.letscontrolit.com/wiki/index.php/ESPEasy
                Für Luftqualität hatte hier schon mal was aus CCS811 und BME280 (Kalibrierung des CCS) gebaut, aber bist jetzt nicht weiter verfolgt: https://github.com/codmpm/esp-ccs811-bme280-mqtt

                In meinem Raum- Außentemperatur/Luftfeuchte Fall droppe ich per WLAN sowieso alles in MQTT, die Übertragung in Influx besorgt dann node-red. Mit ESPEasy könntest du die Daten aber per HTTP sogar direkt an den Miniserver melden.

                Hier ein Screenshot von Grafana:

                Klicke auf die Grafik für eine vergrößerte Ansicht  Name: Bildschirmfoto 2018-07-20 um 12.21.14.png Ansichten: 1 Größe: 46,7 KB ID: 161278

                Alternativ spiele ich gerade mit Homematic-Nachbau-Sensoren rum: https://twitter.com/pregopm/status/1004093423278837760
                Der Testaufbau mit einem ATMega328 und CC1101 an 18650er Zelle läuft jetzt schon über drei Monate und hat noch 3,8V Batteriespannung. Sollte also 2 Jahre halten ;-)
                Arduino Files findest du hier: https://github.com/TomMajor/AskSinPP...HB-UNI-Sensor1

                Wir haben in der Firma ausserdem einen Bodenfeuchtesensor entwickelt, wo wir einen DS2438 emulieren: https://allgeek.de/2018/07/11/kapazi...or-mit-1-wire/
                Du hast da leider nur zwei Spannungs und einen Temperaturwert, den du übermitteln kannst und die Loxone lesen kann. Die Spannungen sind 0,00-10,00V - Frage wäre wie man da eCO2 und TVOC drin abbildet.


                Meine Empfehlung: Den ESP per WLan zu nutzen...

                Zuletzt geändert von pmayer; 20.07.2018, 11:38.
                https://allgeek.de/

                https://twitter.com/pregopm, https://github.com/codmpm/
                https://github.com/codmpm/node-red-contrib-loxone
                https://github.com/codm/wled-controller

                Kommentar

                • Gast

                  #11
                  Ich kann meinen Code schon zur Verfügung stellen, nur muss ich diesen zuvor etwas überarbeiten (sinnlose Bemerkungen entfernen), ansonsten wird es peinlich.

                  Bei einem emulierten DS2438 hast nicht 3 sondern 4 Werte, welche du übermitteln und in der Loxone einlesen kannst. Nur nicht beim Erstellen der Sensoren, also im Monitor (Version 7.3). Wenn ich mich noch richtig erinnere, wurde Isens nicht angezeigt. Erst im eigentlichen Programm. Hat mich Stunden gekostet.
                  Als Bild die möglichen Register zum übertragen von Daten bei einem DS2438. Das Voltage Register wird je nach Statusflag als Vdd oder Vad interpretiert. Wie ich die Werte übertrage, kann ich dir erst nach meinen Ferien mitteilen.

                  Kommentar


                  • pmayer
                    pmayer kommentierte
                    Kommentar bearbeiten
                    Meld dich einfach mal, wenn es soweit ist. :-)
                • Gast

                  #12
                  Hallo,

                  Hast du dir den ESP8285 schon mal angesehen?
                  Downloads: SDK & Demos, APKs, Tools and Documents for Espressif Systems products and solutions


                  Hat euch einen kleinen Speicher jetzt on Board und noch weniger Stromverbrauch...

                  Kommentar

                  • hismastersvoice
                    Supermoderator
                    • 25.08.2015
                    • 7319

                    #13
                    Buffy



                    Code:
                    include <ArduinoOTA.h>
                    #include <ESP8266WiFi.h>
                    #include <WiFiUdp.h>
                    #include <Wire.h>
                    #include <iAQcore.h>
                    
                    // WLAN configuration
                    const char* ssid     = "WLAN-NAME";
                    const char* password = "<<WLAN-PASSWORT>>";
                    const char* BoardName = "iAQ-Sensor-WC-EG"; //Name für OTA
                    const char* room = "WC-EG"; // Raumname für UDP-Erkennung am MiniServer
                    const char* roomshort = "wceiaq";//Kürzel für UDP-Erkennung am MiniServer
                    IPAddress udpAddress(192, 168, 1, 1); // IP Adresse Loxone-MiniServer
                    unsigned int udpPort = 7000; // Port Loxone-MiniServer
                    unsigned int localUdpPort = 7000; // ESP8266 Empfangsport
                    
                    unsigned long startTime = millis();
                    char incomingPacket[255];
                    long rssi;
                    const char* chipstatus = "";
                    const char* chipstatusnr = "";
                    
                    iAQcore iaqcore;
                    WiFiUDP udp;
                    
                    void setup() {
                      // Begin Serial
                      Serial.begin(115200);
                      delay(100);
                      Serial.println("Booting");
                      Serial.println();
                      // Connect to WiFi network
                      Serial.print("Connecting to ");
                      Serial.println(ssid);
                      udp.begin(localUdpPort);
                      WiFi.mode(WIFI_STA);
                      WiFi.begin(ssid, password);
                      WiFi.setAutoReconnect (true);
                      // ... Give ESP 10 seconds to connect to station.
                      while (WiFi.status() != WL_CONNECTED && millis() - startTime < 10000)
                      {
                        delay(500);
                        Serial.print(".");
                      }
                      Serial.println();
                    
                      while (WiFi.status() != WL_CONNECTED)
                      {
                        Serial.println("Connection Failed! Rebooting ...");
                        delay(5000);
                        ESP.restart();
                      }
                      Serial.println("WiFi connected");
                      // Print the IP address
                      Serial.println(WiFi.localIP());
                      rssi = WiFi.RSSI();
                      Serial.print("RSSI: ");
                      Serial.println(rssi);
                    
                      // Start OTA Update
                      ArduinoOTA.setPort(3232);
                      ArduinoOTA.setHostname(BoardName);
                      ArduinoOTA.setPassword("OTA-PASSWORT"); // Passwort für OTA setzen
                      ArduinoOTA.onStart([]() {
                        Serial.println("Start updating");
                      });
                      ArduinoOTA.onEnd([]() {
                        Serial.println("\nEnd updating");
                      });
                      ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
                        Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
                      });
                      ArduinoOTA.onError([](ota_error_t error) {
                        Serial.printf("Error[%u]: ", error);
                        if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
                        else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
                        else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
                        else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
                        else if (error == OTA_END_ERROR) Serial.println("End Failed");
                      });
                      ArduinoOTA.begin();
                      // Enable I2C for ESP8266 NodeMCU boards [VDD to 3V3, GND to GND, SDA to D2, SCL to D1]
                      Wire.begin(D2, D1);
                      Wire.setClockStretchLimit(1000);
                      // Enable iAQcore
                      bool ok = iaqcore.begin();
                      Serial.println(ok ? "iAQcore initialized" : "ERROR initializing iAQcore");
                    }
                    
                    
                    void read_iaq()
                    {
                      // Read
                      uint16_t eco2;
                      uint16_t stat;
                      uint32_t resist;
                      uint16_t etvoc;
                      iaqcore.read(&eco2, &stat, &resist, &etvoc);
                    
                      if ( stat & IAQCORE_STAT_I2CERR ) {
                        chipstatus = "I2C_error";
                        chipstatusnr = "5";
                      } else if ( stat & IAQCORE_STAT_ERROR ) {
                        chipstatus = "chip_broken";
                        chipstatusnr = "4";
                      } else if ( stat & IAQCORE_STAT_BUSY ) {
                        chipstatus = "chip_busy";
                        chipstatusnr = "3";
                      } else if ( stat & IAQCORE_STAT_RUNIN ) {
                        chipstatus = "chip_warm_up";
                        chipstatusnr = "2";
                      } else {
                        chipstatus = "chip_ok";
                        chipstatusnr = "1";
                      }
                    
                      Serial.print("iAQcore: ");
                      Serial.print("eco2=");    Serial.print(eco2);     Serial.print(" ppm,  ");
                      Serial.print("tvoc=");    Serial.print(etvoc);    Serial.print(" ppb  ");
                      Serial.print("(resist="); Serial.print(resist);   Serial.print(" ohm)  ");
                      Serial.print("status="); Serial.print(chipstatus); Serial.println(" ");
                    
                      //Send a packet
                      udp.beginPacket(udpAddress, udpPort);
                      udp.print("room=");   udp.print(room);          udp.print(" ");
                      udp.print(roomshort); udp.print("_co2=");       udp.print(eco2);         udp.print(" ");
                      udp.print(roomshort); udp.print("_voc=");       udp.print(etvoc);        udp.print(" ");
                      udp.print(roomshort); udp.print("_status=");    udp.print(chipstatus);   udp.print(" ");
                      udp.print(roomshort); udp.print("_status_nr="); udp.print(chipstatusnr); udp.print(" ");
                      udp.print(roomshort); udp.print("_wlan=");      udp.print(ssid);         udp.print(" ");
                      udp.print(roomshort); udp.print("_rssi=");      udp.print(rssi);
                      udp.endPacket();
                    
                    
                    }
                    
                    void loop() {
                      ArduinoOTA.handle();
                    
                      if (!strcmp(incomingPacket, "000") || !strcmp(incomingPacket, "000\n"))
                      {
                        read_iaq();
                        for (int i = 0; i < 255; i++) incomingPacket[i] = 0;
                      }
                    
                      int packetSize = udp.parsePacket();
                      if (packetSize)
                      {
                        int len = udp.read(incomingPacket, 255);
                        if (len > 0)
                        {
                          incomingPacket[len] = 0;
                        }
                        Serial.print("UDP packet: ");
                        Serial.println(incomingPacket);
                      }
                    }
                    Lib installieren
                    WLAN Name / Passwort
                    IP und Ports anpassen
                    Name und Kürzel anpassen
                    OTA-Passwort und Port anpassen (bei // Start OTA Update suchen)
                    per Virtuellen Ausgang 000 an die Adresse des ESP senden, ich mache zB alle 30 Sekunden ein Messung
                    UDP Erkennung am MiniServer anlegen
                    Kein Support per PN!

                    Kommentar

                    • cabstar1
                      Extension Master
                      • 24.08.2016
                      • 131

                      #14
                      @hismastersvoise

                      Hi, ich bin gerade dabei mir solche Co2 Melder nach deiner Anleitung zu bauen.
                      Ich bekomme jedoch keine Werte per UDP zum Miniserver.
                      Bei der Zeile mit der IPAddress, ist es richtig nur die IP auszubessern also (192, 168, 1, 90) wäre es dann bei mir. Oder müssen die Klammern weg oder ein = einfügen?

                      IPAddress udpAddress(192, 168, 1, 1);

                      Das UDP Paket vom Miniserver kommt allerdings an, deswegen vermute ich eben hier meinen Fehler.

                      Vielen Dank

                      Kommentar

                      • hismastersvoice
                        Supermoderator
                        • 25.08.2015
                        • 7319

                        #15
                        Ist schon richtig ohne =
                        Da müsste ich schon das ganze Programm sehen.
                        Kein Support per PN!

                        Kommentar

                        Lädt...