ESP8266 und HC-SR04

ESP8266-HC-SR04
Nachdem ich nun einige Zeit mit dem Espruino Board experimentiert habe, ist mir vor einigen Tagen das ESP8266 ESP201 Board in die Hände gefallen. Es handelt sich hierbei um einen Einplatinencomputer mit integriertem WLAN für weniger als 3 Euro.

Das ist Grund genug, das Espruino Board mal beiseite zu legen und mit dem ESP8266 ESP201 Board zu experimentieren. Mein erster Test ist die Nutzung des Ultraschall Messmoduls HC-SR04. Eine detaillierte Beschreibung der technischen Eckdaten des HC-SR04 kann man unter http://www.mikrocontroller.net/ nachlesen.

Um das ESP8266 Board und den HC-SR04 Sensor zu kombinieren muss der Mikrocontroller des Einplatinencomputers programmiert werden. Ich habe nicht gleich den großen Schritt zur Programmierung in C gewagt und erst mal die Lua Firmware NodeMCU installiert. Dank dieser Firmware versteht das Modul nicht nur AT Kommandos sondern kann in der Programmiersprache Lua programmiert werden.

Das Programm zur Nutzung des Ultraschall Sensors HC-SR04 ist recht simpel gehalten. Es misst die Zeit die der echo Pin des Sensors auf HIGH gesetzt ist, nachdem ich den trigger Pin auf LOW gesetzt habe.

Das Bild oben zeigt die Signale auf dem Hantek 6022BE USB Digital Oszilloskop. Das gelbe Signal oben zeigt den Trigger und das grüne Signal unten zeigt das Echo. Je länger das echo Signal High ist, desto größer ist die Distanz zum Objekt. In meinem Fall lagen die Werte zwischen 2 und > 100.

Das Programm in Lua zum auslesen des Ultraschall Sensors HC-SR04 sieht wie folgt aus.

trigger = 1
echo = 4

gpio.mode(trigger,gpio.OUTPUT)
gpio.mode(echo,gpio.INPUT)

wifi.setmode(wifi.STATION)
wifi.sta.config("SSID","PASSWORD")
wifi.sta.connect()
 
tmr.alarm(0, 1000, 1, function() 
   if wifi.sta.getip()==nil then
      print("connecting to AP...") 
   else
      print('ip: ',wifi.sta.getip())
      tmr.stop(0)
      tmr.alarm(1,250,1,function() 
        dist = measure_HC_SR04(trigger,echo)
        print (dist)
      end)
   end
end)

function measure_HC_SR04(trigger, echo)
  gpio.write(trigger, gpio.LOW)
  dist = 0
  for variable = 0, 200, 1 do
    dist = dist + gpio.read(echo)
  end  
  gpio.write(trigger, gpio.HIGH)
  return dist
end

Die Schaltung

Auf dem Bild habe ich mal grob die verwendete Schaltung aufgezeichnet. Man sieht hier das ESP8266 Modul und den HC-SR04 Sensor. Da der Sensor nicht so gut mit den 3,3 Volt klar kommt und der ESP8266 nur 3,3 Volt verträgt habe ich den Sensor direkt an den LiPo gehängt und das Echo Signal über einen 5K Ohm Widerstand wieder angeglichen. Das ist zwar nicht 100% sauber, aber funktioniert wunderbar.

Ähnlich habe ich die 3,7 Volt des LiPo mit einer simplen Silizium Diode auf ca. 3,3 Volt reduziert. Auch das ist nicht 100% OK, aber da der LiPo voll geladen ca. 4,2 Volt liefert und die Diode die Spannung um ca. 0,7 Volt reduziert passt das schon so ungefähr. Zusätzlich habe ich noch den netten Nebeneffekt, dass der LiPo nicht tiefentladen werden kann, da bei einer Ausgangsspannung von 3,5 Volt abzüglich der 0,7 Volt nur noch 2,8 Volt am Mikrocontroller abkommen und er damit nicht mehr arbeitet :-).

Die Schaltung ist recht simpel und sieht wie folgt aus. Auf dem Bild sieht man die Skizze und den Testaufbau auf einem Breadboard.

ESP8266-ESP201-Schaltung

Zum Schluss noch ein Kleines Video, das ich während der Experimente aufgenommen habe. Es zeigt die Signale Trigger und Echo am HC-SR04 auf dem Hantek 6022BE 2-Kanal USB Digital Oszilloskop. Man kann hier schön erkennen, wie sich das Echo Signal verändert, nachdem ich die Hand weiter vom Sensor entferne.

Nachdem dann die Schaltung und das Programm funktioniert wird dann noch mal eine Stunde der Lötkolben geschwungen :-). Das Endprodukt ist dann die folgende Platine.

20150404_122320

Auf ein cooles Gehäuse aus dem 3D Drucker verzichte ich erst einmal. Das kann man später noch machen. Jetzt erst mal zur praktischen Anwendung. So kann man z.B. die Schaltung an einem Fensterrahmen befestigen und damit die tracken, ob das Fenster offen oder geschlossen ist. So kann man z.B. die Heizung mit Hilfe von elektrisch steuerbaren Heizkörperthermostaten automatisch ausschalten, sobald das Fenster offen ist.

20150404_121827

Natürlich gibt es auch noch viele andere Einsatzmöglichkeiten. Für eine zentrale Datenbank in der mehrere Sensoren ihre Sensordaten speichern können, habe ich auch noch eine sehr sehr keine Web-Anwendung realisiert, in der die Daten zentral gespeichert werden. Wie viele unterschiedliche Sensoren man hier verwendet und wie man die Daten dann weiter verarbeitet ist völlig unabhängig von den Sensoren.

Das Folgende Bild Zeigt einen Ausschnitt aus der Tabelle, die den Zeitlichen Verlauf meines Fenster-Zustands in der Küche wiedergibt.
test.1br.de sr hc04
Wie man sieht, habe ich das Fenster nur kurz geöffnet. Ist aber auch noch ganz schön kalt draußen :-). Ob das Intervall von einer Sekunde für diesen Anwendungsfall eine gute Idee ist, darüber kann man sicher auch diskutieren. Allerdings kann man dieses Intervall in der init.lua Datei ganz einfach ändern.

Die endgültigen Sourcen der Web Anwendung (PHP und SQL) und die endgültigen Lua Sourcen für den ESP8266 findet man unter https://github.com/msoftware/esp8266_sr-hc04.

Damit bleibt nur noch die Frage nach der Stromversorgung. Hier kann ich mir sehr gut eine Solarzelle vorstellen. Ein Fenster bietet hier viel Sonnenlicht und eine kleine Zelle die ca. 200 mA liefert sollte völlig ausreichend sein. Dazu später mehr.

Update: Hier noch ein Link zu den Treibern für den USB 2 Serial Konverter ch340 den ich verwende.

Meine Apps im Google Play-Strore Jetzt bei Google Play