Homeautomation mit dem Raspberry Pi - Teil 3

In Teil 1 hab ich einen groben Plan und die Übersicht beschrieben, wobei Teil 2 den Aufbau der kleinen Sendermodule beschreibt. In diesem Artikel geht es darum wie man nun Code auf die Chips (ATTiny) der Sendermodule bekommt.

USB Programmierer

Um den ATTiny programmieren zu können, braucht man ein Modul, welches den Code von einem PC auf den Chip überträgt. Z.B. den USBASP AVR Programmer. Daran steckt man am besten einen ITC-14A Test Clip, den man dann direkt an den Chip klemmen kann. Das hat den Vorteil, dass man auch einen fest angelöteten ATTiny unkompliziert im Nachhinein programmieren kann. Wie man den USB Programmierer mit dem Clip, und damit direkt mit dem ATTiny, verbindet hab ich hier dargestellt:

Links: Verbindungsplan des USB Programmierers mit dem ITC Test Clip (ATTiny). Rechts: Fertiger Programmierer und ein ATTiny daneben.

Jetzt fehlt noch der richtige Treiber für den Programmierer. Den findet man hier unter “Drivers”. Unter Umständen (besonders unter Windows 8.1) muss man die Treibersignierung ausschalten. Leider hat wohl Microsoft die Treiber für den USBasp nicht signiert. Aber keine Panik! Nachdem man die Treiber installiert hat kann man die Treibersignierung auch wieder aktivieren.

Arduino Setup

Hat man den Programmierer fertig gehts nun endlich in Richtung Software. Der Code für den ATTiny selbst wird in C geschrieben. Für die, die nicht programmieren können: Kein Problem! Es gibt mehrere Beispielprogramme wo man nur sehr wenig anpassen muss. Der Code kann ganz bequem vom Windows-Rechner über USB an den ATTiny, die Recheneinheit des Moduls, übertragen werden. Die nötige Software dazu heißt Arduino. Das Programm ist ein Open Source Projekt, welches auf allen gängigen Betriebssystemen (Windows, Linux, Mac OS) läuft. Ich selbst nutze die Version 1.6.0.

Nach kurzer Installation muss man noch die passenden Bibliotheken für den ATTiny installieren. Diese werden in Arduino auch boards genannt. Hierzu läd man sich einfach die aktuellsten arduino-tiny boards als ZIP-Archiv runter. Arduino hat unter Windows während der Installation einen Ordner in “Dokumente” erstellt (z.B. C:\Users\<Benutzername>\Documents\Arduino). Hier kopiert man nun den Ordner “tiny” aus dem ZIP-Archiv in den Ordner “hardware”, sodass folgende Ordnerstruktur vorliegt:

C:\Users\<Benutzername>\Documents\Arduino\hardware\tiny\avr…

Hat man die Dateien richtig kopiert sollte man nun nach einem Neustart von Arduino unter Tools->Board->ATtiny84 @ 8Mhz (internal oszillator, BOD disabled) anwählen können.

Auswahl des richtigen Boards in Arduino.

Ab jetzt kann man den USB Programmierer und die Verkabelung testen. Ist alles richtig angeschlossen kann man unter Tools->Burn Bootloader dem ATTiny eine Frequenz von 8Mhz zuweisen. Ein wirklicher Bootloader wird dabei aber nicht geschrieben, da der ATTiny so etwas nicht nutzt. Ist alles korrekt verlaufen sollte man folgendes sehen:

Ausgabefenster nach korrektem Ausführen von Tools->Burn Bootloader.

Ist irgendetwas schief gelaufen, z.B. der ATTiny nicht korrekt verbunden, erscheint eine Fehlermeldung. Am besten nochmal genau die Verbindungen checken!

Code schreiben

Den Code, den man braucht um Temperatur, Feuchtigkeit und Batteriestand eines Moduls auszulesen, bekommt man direkt über Nathans Github-Seite. Der Code ist unter der Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) freigegeben. Das bedeutet unter anderem, dass man den Code verändern, erweitern und sogar für kommerzielle Projekte frei nutzen darf.

Ich werde hier jetzt nicht auf den kompletten Code und seine Einzelheiten eingehen. Um jedoch den Code so anpassen zu können, dass man mehrere DHT22 Funkmodule bauen kann, werde ich die relevanten Stellen kurz beschreiben. Wenn man Erweiterungen, wie z.B. einen Fensterkontaktsensor MC38 nutzen will, nutzt hier die Kommentarfunktion. Ich helf da gern weiter!

#include <DHT22.h> // https://github.com/nathanchantrell/Arduino-DHT22
#include <JeeLib.h> // https://github.com/jcw/jeelib

Der erste Teil des Codes bindet zwei wichtige Bibliotheken ein, die man sich herunterladen und in den Ordner “C:\Users<Benutzername>\Documents\Arduino\libraries” kopieren muss. Die Bibliothek für den DHT22 ermöglicht einfaches Auslesen und Berechnen der Temperatur und Feuchtigkeitsdaten. Jeelib ist eine Bibliothek mit Funktionen zur effizienten Energienutzung und Nutzung von Ruhephasen. Das Funkmodul soll nämlich fast die ganze Zeit “schlafen” und nur ab und zu ein Update der Daten senden.

#define myNodeID 18      // RF12 node ID in the range 1-30
#define network 210      // RF12 Network group
#define freq RF12_433MHZ // Frequency of RFM12B module

Danach wird die ID 18, die Netzgruppe 210 und die Frequenz von 433Mhz gesetzt. Die ID könnt ihr zwischen 1-30 frei wählen. Wichtig: Jedes Modul braucht eine eigene ID! Es darf also keine ID doppelt vorkommen. Am besten man schreibt sie sich direkt auf die Rückseite des Moduls und macht eine Liste. Dann behält man auch bei mehreren Modulen den Überblick.

int minutes = 5;
for (byte i = 0; i < minutes; ++i){
	Sleepy::loseSomeTime(60000); //JeeLabs power save function: enter low power mode for 60 seconds (valid range 16-65000 ms)
}

Zum Schluss kann man noch die Sendehäufigkeit einstellen. Als Standard sind 60.000 Millisekunden eingestellt. Das würde bedeuten, dass das Modul jede Minute ein Update senden würde. Ich finde jedoch, dass Temperatur und Feuchtigkeit sich nicht so schnell ändern. Eine For-Schleife um die Funktion “loseSomeTime()” verlängert die Intervalle auf z.B. 5 Minuten. Damit sollte man auch nicht alle 6 Monate die Batterien wechseln müssen.

Mit ein wenig Programmiererfahrung kann man die Logik und die Möglichkeiten natürlich stark erweitern: Lötet man eine Leuchtdiode an das Modul, kann man auch den Status einer LED (an, aus oder blinkend) prüfen. Damit bekomm ich dann sogar mit, wenn der Waschgang meiner Waschmaschine fertig ist. Man kann auch zweifarbige (grün/rot) LEDs an das Modul löten um die Funkverbindung über größere Distanzen (2 Stockwerke) zu testen. Grünes Licht für eine gelungene Übertragung, rotes Licht für einen Fehler. Schreibt ruhig eure Ideen/Umsetzungen hier in die Kommentare rein!

Damit ist das Einrichten der Sendemodule abgeschlossen. Im nächsten Teil beschreib ich die Einrichtung des Raspberry Pis, einer MySQL Datenbank und der Weboberfläche. Ab dann können wir auch endlich die Funkverbindung testen und zuschauen wie die ersten Daten ankommen!