Günstiges drahtloses Sensornetzwerk für Zuhause selbst bauen
Überblick
Dieses Tutorial zeigt, wie Sie ein Netzwerk kostengünstiger, drahtloser Sensormodule erstellen. Viele fertige Funkmodule sind für den Einsatz in mehreren Sensoreinheiten zu teuer. Während Wi-Fi- und Zigbee-Module beliebt und einfach zu nutzen sind, macht ihr Preis den Einsatz in Sensorarrays oft unpraktisch. Es gibt jedoch preiswerte RF-Module ohne teure Zusatzfunktionen, die für diese Zwecke hervorragend funktionieren. Die Arduino-Plattform kann Low-End-Funkmodule einfach und zuverlässig zur Kommunikation nutzen.
Nach dem Hardwareaufbau nutzen Sie die Raspberry Pi-Plattform, um die Daten an Xively's Internet-of-Things-Service zu senden, wo Sie Werte zeitlich verfolgen und bei Schwellenwerten Aktionen auslösen können.
Komponenten & Werkzeuge zusammenstellen
Das Projekt umfasst drei Teile: zwei Sendereinheiten und eine Empfängereinheit. Die Sender bestehen aus Arduino-Board, Sensor und RF-Sender. Die Empfängereinheit setzt sich aus Arduino-Board, RF-Empfänger, Logic-Level-Converter und Raspberry Pi zusammen.
Es gibt eine breite Palette Arduino-kompatibler Boards. Mindestanforderung für dieses Projekt sind zwei digitale GPIO-Pins und ein analoger Pin. Wählen Sie ein Board, das Kosten- und Simplizitätsanforderungen entspricht.
In diesem Tutorial verwende ich Arduino Nano Boards, die gut ins Breadboard passen und einfach zu programmieren sind. Die 5V-Versionen von Arduino Pro Mini oder Trinket funktionieren ebenfalls gut und zu deutlich niedrigerem Preis, erfordern aber etwas mehr Erfahrung. Wählen Sie weise.
Empfänger
- Raspberry Pi – Model B mit Netzteil, Gehäuse, SD-Karte – GPIO-Pins müssen mit dem Gehäuse zugänglich bleiben
- Pi-kompatibler WLAN-Adapter
- Arduino
- Breadboard-Jumperkabel
- Male-to-Female Jumperkabel
- Logic Level Converter
- 434 MHz RF-Empfänger
- Halbes Breadboard
Sender (zwei Einheiten)
- 2 x Arduino
- 2 x Temperatur/Feuchtigkeitssensoren
- 2 x 434 MHz RF-Sender
- 2 x Halbes Breadboard
- 2 x Breadboard-taugliche 2,1 mm DC-Buchsen
- 2 x 9V Netzteil mit 2,1 mm x 5
- Breadboard-Jumperkabel
Werkzeuge
- PC/Mac mit installierter Arduino IDE
- USB-Kabel zum Programmieren der Arduino-Boards
- USB-Tastatur und Maus (kombiniert oder per Hub für einzelnen USB-Port)
- Quellpaket dieses Tutorials auf der Programmier-Workstation
Sender aufbauen
Die Sender sind relativ einfache Schaltungen. Ein Pin liest den Temperatur/Feuchtigkeitssensor, ein weiterer sendet die Daten an den RF-Sender. Das Breadboard-Layout ist unten dargestellt.
Das 9V-Netzteil verbindet sich mit der Buchse, wodurch die unteren Schienen 9V führen. Der Spannungsregler im Arduino erzeugt 5V für Funkmodul und Sensoren (obere Stromschiene im Diagramm).
Der Sensor bringt einen 10 kΩ Pull-Up-Widerstand mit, der den Datenpin mit VCC verbindet, während ein weiterer Draht ihn an GPIO D3 anschließt.
Achten Sie darauf, dem Aufbau exakt zu folgen und das Datenblatt von Sensor und RF-Modul zu prüfen, damit Komponenten korrekt im Breadboard positioniert sind und Strom-, Masse- und Signalpins an die richtigen Pins angeschlossen sind. Das Fritzing-Diagramm ist im Quellpaket enthalten.
Die Antenne ist wichtig, da das RF-Modul keine eingebaute Antenne hat. Ich nutzte ein 6-Zoll Female-to-Male Jumperkabel, das in das Breadboard gesteckt wurde – es funktionierte gut genug für Empfang in allen Bereichen meines Hauses und etwas draußen. Wie im Diagramm vermerkt, ist 6,5 Zoll optimal für zusätzliche Reichweite.
Hinweis zu RF-Nutzung: In verschiedenen Ländern gelten unterschiedliche Gesetze und Regeln zur Frequenznutzung. Stellen Sie sicher, dass Sie diese einhalten, bevor Sie senden. Die Signale dieser Module sind kaum stark genug, um das Haus zu verlassen. Unter idealen Bedingungen können sie bis zu 500 Fuß (ca. 150 m) reichen.
Bibliotheken für Komponenten herunterladen
Der Sender nutzt zwei Bibliotheken, die nicht im Arduino IDE enthalten sind. Laden Sie sie wie folgt herunter und entpacken Sie in Ihr Sketch-Verzeichnis in einen Unterordner namens Libraries.
- VirtualWire Quellpaket für dieses Tutorial herunterladen und den
wirelesstransmitterSketch-Ordner in Ihren Arduino Sketch-Ordner entpacken - Im
wirelesstransmitterOrdner einen OrdnerLibrarieserstellen - Neueste Version des VirtualWire-Codes (1.23 zum Zeitpunkt der Erstellung) von der Projektseite herunterladen
VirtualWireOrdner inwirelesstransmitter/Libraries/entpacken, sodass ein weiterer UnterordnerVirtualWireentsteht- DHT-Sensorbibliothek von deren GitHub-Projektseite herunterladen
DHTOrdner ebenfalls in den Libraries-Ordner entpacken. Sie sollten nun die zwei erforderlichen BibliotheksordnerDHTundVirtualWireinwirelesstransmitter/Librarieshaben.
Arduino Board programmieren
Dieses Tutorial setzt grundlegende Arduino-Erfahrung voraus. Falls nicht, finden Sie gute Anleitungen auf der offiziellen Arduino-Seite.
wirelesstransmitterSketch aus dem Quellarchiv in der Arduino IDE öffnen und lokal speichern- Sicherstellen, dass der Arduino NICHT über die Buchse mit Strom versorgt wird
- Board per passendem USB-Kabel mit der Programmier-Workstation verbinden
- Board-Typ unter Tools > Board auf Ihr gewähltes Arduino-Board setzen
- Seriellen Port unter Tools > Port auf den beim Verbinden erkannten Port setzen
- Sicherstellen, dass
MYIDdefine auf 1 gesetzt ist undTRANSPINsowieDHTPINkorrekt auf die mit RF-Sender bzw. DHT-Sensor verbundenen Pins zeigen. Bei Aufbau gemäß Diagramm sollte dies bereits passen. Siehe Codebeispiel unten. UNITkorrekt für Ihre Präferenz setzen (Fahrenheit oder Celsius).
| 12345 |
#define MYID 1 //die ID-Nummer dieses Boards. Für jedes geflashte Board ändern.
//Die ID wird mit den Daten übertragen, damit Sie erkennen können, welches Gerät sendet
#define TRANSPIN 3 //welcher Pin zum Senden genutzt wird
#define DHTPIN 4 // an welchem Pin der DHT angeschlossen ist
#define UNIT 0 // 0 für Fahrenheit, 1 für Celsius
|
Der MYID define ist eine numerische ID, die der Sender zur eindeutigen Identifikation nutzt. Da Sie mehrere Sender an verschiedenen Orten betreiben, ist eine einzigartige ID für jeden wichtig. Diese Nummer wird wieder verwendet, wenn Sie das Empfängerskript einrichten.
- Code durch Drücken von Strg+R verifizieren, um sicherzustellen, dass Bibliotheken korrekt eingebunden und kompiliert werden.
- Code per Klick auf Upload-Button auf das Board laden.
- Serial Monitor per Strg+Shift+M öffnen.
Der Serial Monitor setzt den Arduino zurück, Sie sollten eine Zeile sehen wie:
| 12 |
Humidity: 44.00 % Temperature: 60.80 *F
Sending Message: ID:1:TS:23143:TF:60.79:RH:44.00
|
Die Nachricht besteht aus Name:Value-Paaren, die der Empfänger verarbeitet. Der Sender liest und sendet sein Signal in einem langen zufälligen Intervall. Da sich Sensordaten nicht stark oder häufig ändern, bringt häufigeres Senden als einmal pro Minute keinen Mehrwert. Die zufällige Wartezeit erlaubt mehreren Sensoren die Koexistenz.
Selbst bei Kollision und Verlust beider Signale sorgt das zufällige Intervall dafür, dass die nächsten Sendungen nicht überlappen. Der Zufalls-Seed wird von einem analogRead an einem ungenutzten Analogport gesetzt, der zufällige Werte liefert, damit keine zwei Sender im gleichen Muster senden.
Der Beispielcode oben nutzt Fahrenheit. Man sieht TF:60.79 in der Nachricht – mein Labor ist knapp unter 61 °F. Die relative Luftfeuchte RH:44.00 ist angenehme 44 %. Man könnte schließen, dass mein Labor im Keller ist. Wäre man richtig.
Sender warten standardmäßig 2 bis 5 Minuten zwischen Sendungen. Zum Debuggen können Sie den delay()-Wert am Sketch-Ende auf 5000 (ms) ändern. Für den Dauerbetrieb dringend empfohlen, den Wert zurückzusetzen und den Code neu hochzuladen.
- Zweites Senderboard aufbauen
- Transmitter-Sketch so modifizieren, dass
MYIDauf 2 gesetzt ist - Code auf zweites Board hochladen
- Serial Monitor öffnen (Strg+Shift+M) und prüfen, ob Ausgabe wie beim ersten Sender aussieht, abgesehen davon, dass die gesendete Nachricht mit
ID:2beginnt
Empfängerboard aufbauen
Das Empfängerboard empfängt die Broadcast-Nachricht über seinen RF-Empfänger und leitet sie über serielle Leitungen an den Raspberry Pi weiter. Der Arduino wird für den Empfang aus zwei wichtigen Gründen genutzt: Der VirtualWire-Code nutzt die Echtzeitfähigkeit des Arduino zum Modulieren und Demodulieren des Signals.
Das bedeutet, die Empfangseinheit muss auf der gleichen Frequenz arbeiten. Zudem gibt es wenig Spielraum für Jitter auf dem empfangenden Prozessor, wozu der Raspberry Pi aufgrund seines präemptiven, nicht echtzeitfähigen Betriebssystems neigt. Der Kostenvergleich von Arduino Pro Mini plus RF-Empfänger gegen ein Zigbee-Modul, das direkt mit dem Pi sprechen könnte, zeigte, dass der externe Arduino immer noch sehr ökonomisch ist.
An diesem Punkt die 5V- und Masse-Leitungen vom Pi NICHT an das Breadboard anschließen. Jumperkabel griffbereit halten, aber Sie wollen den Arduino nicht sowohl über USB als auch über den Pi mit Strom versorgen.
Beachten Sie, dass der Logic Level Converter in der Materialliste nicht exakt dem im Fritzing-Library entspricht, aber die Pin-Bezeichnungen sind gut beschriftet, nur an anderen Positionen. Stellen Sie sicher, dass die korrekten Drähte an die korrekten Pins des tatsächlichen Converters angeschlossen sind.
Dieses Bauteil ist erforderlich, um das 5V Arduino-Serialsignal auf 3,3V Raspberry Pi-Serialsignal zu wandeln und den Pi nicht zu beschädigen. Siehe Bild unten für zusätzliche Hilfe.
Für weitere Details: Building a Wireless Sensor Network in Your Home
Herstellungsprozess
- Wireless Sensor Networks wechseln: 6 Schlüsselfaktoren für Technologie-Migration
- Low-Power Wireless Sensor Networks verstehen: Effiziente IoT-Lösungen antreiben
- Zuverlässiger kabelloser Einfahrtssensor für lange Einfahrten – Einfache Raspberry Pi Integration
- Drahtloses Sensornetzwerk in einer Mühle des 18. Jahrhunderts einsetzen
- Deploying und Managing Wireless Sensor Networks im Enterprise
- Kabellose Datenübertragung per Magnetfeld: Arduino & Infineon 3D-Sensor (TLE493D)
- K30 CO₂-Sensor: Echtzeit-Luftqualitätsmessung mit Arduino
- Digitales Stadiometer bauen: Körpergröße messen mit Arduino & Lasersensor VL53L0X
- DFRobot Kapazitiver Fingerabdrucksensor mit Arduino oder ESP8266 einbinden
- Robuste Langstrecken-Funk-Sensornetzwerke für Fernüberwachung