Um FHEM und Arduino zusammen zu bringen möchte ich erst etwas ausholen und zur Geschichte des Arduino kurz eingehen.

Das Arduino-Projekt ist eine open-source-Initiative, die „easy-to-use“ Hardware und Software bereitstellt. Als Hardware stehen unterschiedliche Platinen zur Verfügung, auf denen ein Microcontroller sowie grundlegende Schnittstellen, z.B. ein USB-Port bereits „ready-to-use“ vorhanden sind. An diese Boards (ab ca. 15€ Stand Sept. 2017, China-Klone ab 2€) lassen sich einfach und recht preisgünstig eigene Sensoren/Aktoren an FHEM anbinden.

Das Board lässt sich u.A. mit Hilfe der Projekt-Software Arduino-IDE relativ einfach programmieren, um Sensorwerte zu verarbeiten und diese z.B. per Ethernet an FHEM zu senden oder abfragen zu lassen. Über zahlreiche Schnittstellen (Standard: RS232, TWI/1-Wire, SPI, PWM, analog/digital-I/O, I2C) mit den entsprechenden Software-Libraries kann auf viele gängige Sensoren zugegriffen werden. Über Erweiterungsboards („Shields“) können die Anschlussmöglichkeiten ausgebaut werden. Zudem ist der Anschluss von Parallel-/Seriell-/I2C-LCD-Displays und SD-Karten möglich. Die IDE läßt sich auch für andere Enwicklerboards nutzen, insbesondere den ESP8266 (für WLAN) oder Boards auf STM32-Basis.

Die Arduino-Boards bzw. Klone und eine Vielfalt an Sensoren/Aktoren sind über Online-Auktionen bzw. -Anbieter einfach zu bekommen. Kommunikation mit dem Arduino ist z.B. per Netzwerk/Ethernet, WLAN, 433/868MHz/2,4GHz-RF, Bluetooth, 1-Wire etc. möglich.

Bei der Anbindnung der Arduinos über USB ist zu beachten, dass auf China-Klonen in der Regel ein einfacher USB-seriell-Wandler verbaut ist, der eine eindeutige Zuordnung der Schnittstellen innerhalb des Linux-Dateisystems erschwert. Daher sind Boards mit eindeutiger Idetifizierungsmöglichkeit (in der Regel auf FTDI-Basis) für derartige Anwendungsfälle besser geeignet.

Das folgende kleine Projekt  Arduino mit Ethernet möchte ich hier beschreiben.

Es ist eine schaltbare LED-Leiste im Eigenbau für das Smarthome zu schalten.
Was benötigen wir hierzu?

  1. Arduino (bzw. Klon) mit Ethernet-Shield (z.B. mit Chip) und gewünschten Sensoren kaufen
  2. Arduino-IDE von der Arduino-Homepage (für Windows, Mac OS X und Linux vorhanden) herunterladen und installieren
  3. Falls ENC28J60-Ethernet-Shield verwendet wird: Ethernet-Library für ENC28J60 herunterladen und in Arduino-IDE-Installation hineinkopieren (z.B. von hier: [1], alternativ nach arduino+ENC28J60+library googeln). Eine Arduino-library für den ENC28J60, die richtige (persistente) TCP/IP-Verbindungen unterstützt und von der API her vollständig kompatibel zur original-Ethernetlibrary ist findet sich hier: UIPEthernet (arduino_uip)
  4. Folgenden Beispiel-Sketch mit Arduino-IDE öffnen Arduino_FHEM.ino [2]
  5. IP Adresse im Sketch passend zum eigenen Netzwerk ändern (steht im Sketch auf 192.168.1.45)
  6. Sketch auf Arduino laden
  7. Arduino mit 5V-USB-Netzteil ans Netzwerk anschliessen
  8. Verbindung testen indem in einem Webbrowser /?cmd=set_D5_ON [3] eingegeben wird (natürlich hier die im Sketch verwendete IP-Adresse angeben). Falls an Ausgang D5 eine Leuchtdiode o.ä. angeschlossen wurde sollte diese nun leuchten.
  9. Wenn das geklappt hat sollte sich der Ausgang auch aus der FHEM-Kommandozeile ausschalten lassen mit { GetHttpFile('192.168.2.44:80', '/?cmd=set_D5_OFF');; } -> natürlich wieder die im Sketch verwendete IP-Adresse verwenden.
  10. Letzter Schritt wäre eine Definition in die fhem.cfg einzutragen um auch entsprechende Buttons in der FHEM-Oberfläche zu haben, ggf. wieder die verwendete IP-Adresse statt arduino:80 verwenden (für die Buttons wurde das FS20-Modul verwendet):

Aber nun alles der Reihe nach – fangen wir an.
Ich habe mich für den Arduino Nano entschieden da das Modul recht klein ist. Im nachfolgendem Bild zeige ich wie der Nano mit dem ETH-Shield (so heißen die Erweiterungen für den Arduino) verkabelt wird.

Die Stückliste:

  1. Breadboard
  2. Cables
  3. 12 Power Supply
  4. RGB LED Strip
  5. Arduino Nano
  6. ENC28J60 Ethernet module
  7. 3 x TIP120 NPN Transistors 
  8. 3 x 330 Ohm Resistors
Arduino Nano und ETH Modul

Verdrahtung Arduino Nano mit ETH

So sieht die Verkabelung fertig aufgebaut aus:

Nano mit ETH

Fertig verkabelter Arduino Nano mit ETH

Code:

  1. #include <EtherCard.h>
  2.  
  3. #define B_PIN 3
  4. #define R_PIN 5
  5. #define G_PIN 6
  6.  
  7. static byte mymac[] = { 0x74, 0x69, 0x69, 0x2D, 0x30, 0x31 };
  8. static byte myip[] = { 192, 168, 1, 45 };
  9.  
  10. byte Ethernet::buffer[500];
  11. BufferFiller bfill;
  12.  
  13. const char HttpNotFound[] PROGMEM =
  14.   "HTTP/1.0 404 Unauthorized\r\n"
  15.   "Content-Type: text/html\r\n\r\n"
  16.   "<h1>404 Page Not Found</h1>";
  17.  
  18.  
  19. void setup ()
  20. {
  21.   if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
  22.   {
  23.     Serial.println("Failed to access Ethernet controller");
  24.   }
  25.   ether.staticSetup(myip);
  26. }
  27.  
  28. static word HomePage(byte r, byte g, byte b)
  29. {
  30.   bfill = ether.tcpOffset();  
  31.   bfill.emit_p(PSTR(
  32.     "HTTP/1.0 200 OK\r\n"
  33.     "Content-Type: application/json\r\n"
  34.     "Pragma: no-cache\r\n"
  35.     "\r\n"
  36.     "{ 'red': $D, 'green': $D, 'blue': $D }"), r, g, b);
  37.   return bfill.position();
  38. }
  39.  
  40. int r = 0;
  41. int g = 0;
  42. int b = 0;
  43.  
  44. void loop ()
  45. {
  46.   word len = ether.packetReceive();
  47.   word pos = ether.packetLoop(len);
  48.   if (pos)  // check if valid tcp data is received
  49.   {
  50.     bfill = ether.tcpOffset();
  51.     char* data = (char*) Ethernet::buffer + pos;
  52.     if (strncmp("GET /", data, 5) != 0)
  53.     {
  54.       bfill.emit_p(HttpNotFound);
  55.     }
  56.     else
  57.     {
  58.       data += 5;
  59.       sscanf(data, "?r=%d&g=%d&b=%d", &r, &g, &b);
  60.       HomePage(r, g, b);
  61.     }
  62.     ether.httpServerReply(bfill.position());    // send http response
  63.   }
  64.   analogWrite(B_PIN, b);
  65.   analogWrite(R_PIN, r);
  66.   analogWrite(G_PIN, g);
  67. }

Ich setze an den Leitungen „rot“ und „drün“ die 12V für den LED Streifen und Ground. Der Leistungstransistor und die ext. Stromversorgung sorgen dafür das der Arduino an seinen Ausgängen nicht überlastet wird.

Ardunino Nano am ETH Modul

Relaisanschluss und Leistungselektronik

Hier nun die vollständige Verdrahtung

Arduino ETH RGB

Arduino Verdrahtung RGB

Die 3 TIP120 NPN Transistoren sind NPN Epitaxial Darlington Transistoren.TIP120

Die Schaltung lässt sich sehr leicht abändern um anstelle des LED-Streifens zum Beispiel ein Relais zu schalten.

Hier nun der fertige Aufbau meiner IKEA Fernschalt Vitrinenbeleuchtung

Nun muss der neue Aktor in FHEM eingebunden werden. Ich habe hierzu folgenden Code für meine FHEM Konfiguration verwendet

FHEM.cfg

  1. define arduinobutton FS20 55d1 00
  2. attr arduinobutton room Arduino
  3. define FileLog_arduinobutton FileLog /otp/fhem/log/arduinobuttonon-%Y.log arduinobutton
  4. attr FileLog_arduinobutton room Arduino
  5. define arduinoswitchon notify FS20_55d100:on { GetHttpFile("arduino:80","/?cmd=set_D5_ON")}
  6. attr arduinoswitchon room Arduino
  7. define arduinoswitchoff notify FS20_55d100:off { GetHttpFile("arduino:80","/?cmd=set_D5_OFF")}
  8. attr arduinoswitchoff room Arduino
  9. define weblink_arduinobutton weblink fileplot FileLog_arduinobutton:fs20:CURRENT
  10. attr weblink_arduinobutton label "arduinobutton Min $data{min1}, Max $data{max1}, Last $data{currval1}"
  11. attr weblink_arduinobutton room Arduino

In FHEM wird mit dem Systemaufruf GetHttpFile der Arduino über das Ethernet angesprochen