Ankündigung

Einklappen
Keine Ankündigung bisher.

NodeMCu mit VOC Sensor

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

    NodeMCu mit VOC Sensor

    Arduino kennen die meisten ja. Aber von NodeMCU (http://www.nodemcu.com/index_en.html) haben noch die wenigsten gehört. Und trotzdem scheint sich ein gewisser Hype um diese Dinger zu entwickeln.


    Für nicht ganz 5 EUR bekommt man ein kleines Board, welches wie der Arduino einiges an Ein-/Ausgängen hat und zusätzlich noch über WLAN verfügt:

    http://de.aliexpress.com/item/New-Wi.../www.wemos.cc/

    Wer nicht direkt bei den Chinesten bestellen will: In der Bucht bekommt man das gleiche Modul für knapp 8EUR. Kommt auch aus China, lässt sich aber mit Paypal statt Kreditkarte bezahlen.

    Und so sieht das Ding aus:
    esp.png


    Hersteller-Webseite (Achtung, nix professionelles erwarten...): http://www.wemos.cc/

    Unterschied zum Arduino:

    * Man kann es zwar über USB mit 5V versorgen, aber es arbeitet komplett mit 3.3V. D.h. die GPIO-Pins haben 3.3V Pegel statt wie die normalen Arduinos die 5V haben.
    * Man entwickeln nicht in C/C++, sondern in "Lua".

    Nun, aus einer kleines Sammelbestellung heraus, hab ich mir den AMS iAQ Core VOC Sensor gegönnt:

    http://ams.com/eng/content/download/...heet_EN_v1.pdf

    Bekommt man unter anderem bei digikey....

    Dank einer kleinen, aber recht feinen IDE ist der erste Kontakt mit NodeMCU ganz einfach:

    http://esp8266.ru/esplorer/

    Wenn man unter Windows arbeitet, muss man sich noch den CH340 Treiber für den USB-RS232 Adapterchip installieren. Den bekommt man von oben genannter Herstellerseite.

    Esplorer installieren (bzw. entpacken und dank Java starten), COM-Port auswählen, LUA Script schreiben, speichern und schon wir der Code auf den NodeMCU geschickt und auch gleich ausgeführt.


    Hier mal mein Code um die VOC Sensordaten über einen Socketserver auszuliefern:

    Code:
    -- reference id
    id=0
    -- D1
    sda=1
    -- D2
    scl=2
    
    iaqAddr = 0x5a;
    iaqReg = 0xb5;
    
    local measure = {}
    
    -- initialize i2c
    i2c.setup(id,sda,scl,i2c.SLOW);
    
    -- read data register
    -- i2c_addr: i2c address of i2c device to read
    -- reg_addr: register address to read
    -- lenght: number of bytes to read
    local function read_reg(i2c_addr, reg_addr, length)
      i2c.start(id)
      i2c.address(id, i2c_addr, i2c.RECEIVER)
      bytes = i2c.read(id, length)
      i2c.stop(id)
      return bytes
    end
    
    local function getByte(b, nr)
        return string.byte(b,nr+1)
    end
    
    
    -- read iaq data
    local function readIaq()
        data = read_reg(iaqAddr, iaqReg, 9) -- read 9 bytes
    
        -- print each byte to hex
        --for i=0,8 do
        --    print("byte["..i.."]="..string.format("%02x", string.byte(data, i+1)))
        --end
    
        -- prepare human-readable values
        voc = bit.lshift(getByte(data,0), 8) + getByte(data, 1);  
        status = getByte(data,2);    
        resistance = bit.lshift(getByte(data,3), 24) + bit.lshift(getByte(data,4), 16) + bit.lshift(getByte(data,5), 8) + getByte(data,5);    
        tvoc = bit.lshift(getByte(data,7), 8) + getByte(data, 8);
    
        -- prepare json structure
        measure['voc'] = voc;
        measure['status'] = status;
        measure['resistance'] = resistance;
        measure['tvoc'] = tvoc;      
    end
    
    
    wifi.setmode(wifi.STATION)
    wifi.sta.config("SSID", "PASSWORT")
    wifi.sta.connect()
    print("MAC: "..wifi.sta.getmac())
    
    tmr.alarm(0, 1000, 1, function()
       if wifi.sta.getip() == nil then
          print("Connecting to AP...\n")
       else
          ip, nm, gw=wifi.sta.getip()
          print("IP Info: \nIP Address: ",ip)
          print("Netmask: ",nm)
          print("Gateway Addr: ",gw,'\n')
          tmr.stop(0)
       end
    end)
    
     -- Start a simple socket server
    srv=net.createServer(net.TCP)
    srv:listen(44444,function(conn)
      conn:on("receive",function(conn, c)    
        readIaq();
        print("response: "..cjson.encode(measure));      
        conn:send(cjson.encode(measure))
      end)
      conn:on("sent",function(conn) conn:close() end)
    end)
    Verkabelung: 3.3V und Gnd bekommt man vom NodeMCU Board. SDA hängt an Pin D1 und SCL an Pin D2.

    Man verbindet sich zu Port 44444 (Telnet z.B.) des NodeMCU, sendet "irgendein byte" und bekommt als Antwort sowas hier im JSON Format:

    {"status":0,"tvoc":206,"voc":744,"resistance":3 464 41}
    Wenn Status den Wert 0x10 hat, dann ist der Sensor noch in der Start-Phase. Bei einem Status-Wert von 0, kommen verlässliche Daten raus.

    Nächster Schritt:

    MQTT evaluieren.... (NodeMCU ist klein, aber doch recht mächtig...) Damit ließe sich wohl ein kleines aber feines Sensor/Aktor-Netzwerk aufbauen. Und wenn die NodeMCU Doku recht behält, dann ist die MQTT Kommunikation auch verschlüsselt möglich. Eigentlich eine super Sache. Aber Dokumentiert ist diese Verschlüsselung wohl überhaupt nicht. Werde mir da den Code anschauen müssen.

    Soweit so gut. Viel Spaß beim basteln...

    Gruß
    Alex

    P.S. Die ganze Bastelei hat gerade mal, inkl. einlernen in Lua und anlöten von Pins an den VOC, rund 3h gedauert.

    #2
    Hallo Alex,

    vielen Dank für den Bericht!

    Ich verstehe zwar nur Bahnhof was die Software angeht (bei sieht das eher nach 300h Einarbeitungszeit statt 3h aus), aber das Teil gefällt mir richtig gut! Da fallen mir gleich wieder zig Ideen ein, wie man den kleinen Racker sinnvoll beschäftigen könnte :-)

    Hast Du schon Erfahrungswerte was die Reichweite/Qualität der WLAN-Verbindung angeht? Und meinst Du es ist möglich, UDP-Telegramme zu versenden? Gerade letzteres wäre ja ideal, um z.B. einen Homeserver o.ä. mit Daten zu füttern...
    Viele Grüße,
    Stefan

    DIY-Bastelprojekte: || >> Smelly One << || >> BURLI << ||

    Kommentar


      #3
      Ja, die Software... Lua ist etwas gewöhnungsbedürftig. War selbst verdutzt dass man für einfaches bit-schieben eine Funktion braucht und nicht einfach "<<" nutzen kann.
      Alles in allem geht das mit Lua aber doch recht gut von der Hand. Und wer mit Lua nicht umgehen kann oder will, der nutzt eben keine NodeMCU-Firmware, sondern schreibt alles direkt in C/C++ mittels des Espressif SDKs des Herstellers: http://espressif.com/new-sdk-release/
      Für das meiste reicht aber Lua aus.
      Was ich wirklich toll finde: Das kleine Teil hat 4MB Speicher. Das ist wirklich genug Platz um sogar Webseiten damit auszuliefern oder eine aufwendige REST-Schnittstelle zu implementieren. Zusätzlich kann man den Speicher auch zum Ablegen von Daten und Konfigurationen nutzen. Auch zur Laufzeit. Ist quasi wie ein kleines Dateisystem.

      Bzgl. der Reichweite:
      Man kann den Netzwerkmodus zwischen B, G und N umstellen. Damit ändert man nicht nur die Geschwindigkeit, sondern auch die Reichweite und Stromaufnahme: http://www.wemos.cc/wiki/API/Wifi

      Hab das noch auf Default stehen. Werde aber bei Gelegenheit mal prüfen wie sehr sich die einzelnen Einstellungen unterscheiden.
      btw: Es gibt die ESP8266 auch mit Antennenanschluss. Spätestens dann kann man ne Anständige Antenne montieren und die Reichweite erhöhen.

      UDP Telegramme sollen genauso funktionieren wie TCP. Aber bei mir hat das irgendwie noch nicht geklappt. Hab in einem Blog gelesen, dass es eine unbestimmte Zeit dauern kann nach dem WLAN Verbindungsaufbau mit UDP Telegramme gesendet werden können. Aber ein offizielles Statement war das nicht, und im Github-Bugtracker hab ich nix bzgl. "UDP geht nicht" gefunden (oder ich hab nicht richtig geschaut).

      Man kann den ESP8266 auch als Access-Point mit DHCP-Server einstellen. Damit könnte man auch einen Master-Knoten aufbauen und viele Clients dran hängen.

      Am meisten interessiert mich aber MQTT. Hab damit bisher noch nix gemacht, aber es liest sich so als sei es optimal für die Hausautomation. Wenn das noch verschlüsselt funktioniert, könnte ich mir vorstellen an meinen Server einen USB-WLAN-Dongle zu stecken, der als AccessPoint dient und mit ein bisschen Software "Server/Gateway" für vielerlei MQTT-Sensoren/Aktoren herhält. Dann hätte man ein

      * separates WLAN
      * mit WLAN-Verschlüsselung
      * und zusätzlich verschlüsselter MQTT Übertragung

      Mal schauen wie es weiter geht. Würde mich aber freuen wenn ich den einen oder anderen für diesen uC begeistern könnte. Preislich und Funktional ist er jedenfalls äußerst interessant.

      Kommentar


        #4
        Hab nochmal etwas gegoogelt:

        Bzgl. "secure connection", die laut NodeMCU API eigentlich unterstützt wird, lese ich unterschiedliches:

        Die einen schreiben, dass es grundsätzlich nicht geht, die anderen dass Espressif zu doof wäre, und wiederum andere haben "das schon mal gefixt"...
        Wie man aber durch einfaches ändern eines Arguments von "0" nach "1" nun auf einmal eine sichere Verbindung herstellen kann will mir noch nicht in den Kopf gehen. Für SSL/TLS/<whatever> muss doch mehr getan werden?!

        Bei all der Sucherei bin ich aber auf eine nette Anleitung gestoßen, die eines der kleineren ESP8266 Module nutzt. Hier gibt es nur 2 GPIOs die man dann per eingebauter Websiete ein/ausschalten kann.
        --> http://randomnerdtutorials.com/esp8266-web-server/

        Aber zurück zum Thema "sicher": Bin ich vielleicht einfach zu paranoid? Spätestens wenn ich für den ESP8266 Teile ein eigenes WLAN mit maximaler Schlüssellänge und maximaler Schlüsselkomplexität habe, sollte das doch sicher genug sein, oder?

        Kommentar


          #5
          Auch nicht schlecht: Man kann das NodeMCU Board das ich verwende auch mit der Arduino Umgebung und C/C++ nutzen:
          http://www.wemos.cc/d1/Getting_Started

          Kommentar


            #6
            FYI - Ein Heads-up für den ESP32, der Nachfolger des ESP8266:
            https://twitter.com/EspressifSystem/status/662205725125414912/photo/1?ref_src=twsrc^tfw

            Kommentar


              #7
              Sieht interessant aus. Mal abwarten wie der Markt die Dinger annimmt und wie sich das preislich gestaltet.

              Kommentar


                #8
                Yep, bin auch gespannt. Ein Kollege, der schon ein Buch über den ESP8266 geschrieben hat bekommt wohl eines der Entwicklerboards.
                http://neilkolban.com/tech/esp8266/
                [Disclaimer: Ich hab noch null Ahnung von den Dingern, beobachte nur gespannt, was es da so gibt]

                Kommentar


                  #9
                  Hallo, ich nutze die ESP8266 module derzeit auch für schon sehr viele aufgaben
                  natürlich für diverse Temperatur Sensoren DHT22 und ds18b20 sowie für bmp180
                  und ich habe mir auf basis des esp's auch schon meine ersten eigenen Aktoren gebaut damit kann ich 8 relays schalten und habe auch 8 Eingänge für normale schalter


                  ein weiteres Projekt von mir ist, es den ESP hinter normalen Schaltern einzubauen und quasi als Unterputz Aktor zu verwenden, mehr dazu hier :
                  http://rpi-controlcenter.de/showthread.php?tid=547

                  Kommentar


                    #10
                    Hallo,

                    kann man in der CometVisu die Daten vom ESP8266 irgendwie darstellen/anzeigen?

                    Kommentar


                      #11
                      Dein CometVisu Backend muss dir Zugang zu den Daten geben.
                      Mit OpenHAB lässt sich das sicherlich erledigen.
                      Mein eigenes Backend setzt die Daten auf KNX um, und somit ist das dann mit der Visu kein Thema.
                      Mit dem knxd wird's schwer. Außer du bastelst dir entsprechende Scripte die den ESP abfragen und das Ergebnis mit dem knxd auf den Bus senden, so dass die knxd-CV-Backend-Instanz die änderung sieht und zur Visu senden kann.

                      Kommentar


                        #12
                        Verstehe ich es richtig, dass ich einen ds18b20 an den ESP8266 anschliessen kann und dieser mir dann die Temp sendet?
                        Ist die Einbindung in SmartVisu, bzw. auf den KNX dann noch kompliziert?

                        Suche noch eine Möglichkeit, die Teichtemperatur zu messen.

                        Danke und Grüße,
                        Lio

                        Kommentar


                          #13
                          Hallo Lio,

                          ds18b20 --> onewire... Das ist in der lua-API vorgesehen. Ausprobiert hab ich das noch nicht.

                          Der ESP8266 macht erstmal kein KNX. Du kannst aber die gelesene Temperatur per TCP oder UDP Telegramm über's Netzwerk schicken. MQTT geht auch.

                          Mit der Smartvisu kenn ich mich leider 0 aus. Wenn du dort aber auf TCP oder UDP oder MQTT reagieren kannst, kannst du den Wert auch anzeigen.

                          Gruß
                          Alex

                          Kommentar


                            #14
                            Hi Lio,

                            DerMitdemBusSpricht hat das über den EibPC gelöst..

                            siehe hier: knx-user-forum.de/forum/supportforen/eibpc/873055-datenübertragung-mqtt

                            Gruß Martin
                            Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                            Kommentar


                              #15
                              Hab mir mal auch einen aus China bestellt.

                              Hat jmd ne deutsche Adresse? Sonst wird das nix mit basteln über die Feiertage

                              Kommentar

                              Lädt...
                              X