HydroMazing Smart Garden System: Fortgeschrittene IoT-Pflanzenpflege
Komponenten und Zubehör
| Raspberry Pi 3 Model B (optional – für IoT/Textnachrichten) | × | 1 |
| Arduino Nano R3 | × | 2 |
| Arduino Nano Expansion Shield | × | 2 |
| DHT21/22 Temperatur-/Feuchtigkeitssensor (evtl. 10k Pull-up zwischen Vcc/Data) | × | 1 |
| Fotowiderstand-Modul (Lichtsensor) | × | 1 |
| nRF24L01 2,4GHz Funkmodul (mit/ohne SMA-Antenne) | × | 1 |
| Dallas Temperatursensor (für Nährlösung) (Stecker nötig) | × | 1 |
| 433MHz RF Sender & Empfänger Modul | × | 1 |
| Set 3-5 Funk-Schaltsteckdosen mit Fernbedienung | × | 1 |
| DFRobot LCD mit Buttons Shield für Arduino Uno | × | 1 |
Benötigte Werkzeuge
- Lötkolben
Apps und Online-Dienste
- Arduino IDE
- Microsoft Visual Studio 2015
Über dieses Projekt
Es war nicht meine Absicht, ein Produkt zu entwickeln. Ich wollte ein häufiges Problem lösen: Pflanzen drinnen oder unter kontrollierten Bedingungen anzubauen. Wie schafft man eine optimale Umgebung mit gängiger Elektronik und Haushaltsgegenständen? Erde oder Hydroponik?
hydroMazing ist ein Werkzeug, um optimale Wachstumsbedingungen für erfolgreiches Pflanzenzuhause zu schaffen. Ein unabhängiges Datenerfassungssystem mit Weboberfläche auf dem eigenen Gerät – nicht in einer fremden Cloud.
Hausautomation
Die Idee: Funkgesteuerte AC-Steckdosen mit Handsender. Den Sender hacken, um ON/OFF-Signale per Arduino-Pin auszulösen. Zuerst Relais-Versuch (Kabelsalat), dann 433MHz Sender/Empfänger-Paare (günstig, Arduino-kompatibel). Mit der RCSwitch-Bibliothek ließen sich Codes der Fernbedienung auslesen und per Arduino senden. Die funkgesteuerten Steckdosen erwiesen sich als zuverlässig für Lüftersteuerung basierend auf Temperatursensoren.
Programmierung
Die Software läuft auf dem Mikrocontroller und verwaltet „Sensor“- und „Appliance“-Objekte. Der Algorithmus TheDecider entscheidet basierend auf Sensorwerten und Schwellwerten, ob Funksteckdosen ein-/ausgeschaltet werden. Das System ist modular für Aquaponik, Pilzzucht etc. erweiterbar. Die Codegröße des Arduino Uno zwang zu effizienter Programmierung – schließlich war ein zweiter Mikrocontroller nötig.
Drahtloses Monitoring ohne Internet
Kommunikation zwischen Mikrocontrollern via nRF24L01 (günstig, niedriger Verbrauch). Ein zweiter Arduino Uno mit LCD-Shield zeigt Sensorwerte, Gerätezustände und Alarme an. Offene, anpassbare Plattform für vielfältige Gartenbedürfnisse, selbstständiges Funksystem. Offene Architektur erlaubt einfache Internet-Anbindung.
Internet-Monitoring
Raspberry Pi mit nRF24L01 empfängt Daten, schreibt Log-Dateien, Sensor-/Aktuator-Zustände und Alarme in Dateien. PHP-Skript liest Daten und zeigt sie live auf Apache-Server an. Python-Skript überwacht Alarm-Dateien, versendet E-Mail/SMS, verschiebt Alarme für Web-Anzeige. Log-Daten können in Datenbank importiert werden für Analysen/Reports. Das hydroMazing Garden Wizard führt durch den gesamten Anbauzyklus: https://www.hydroMazing.com
Nährlösungs-Monitoring
Der Füllstand der Hydroponik-Nährlösung muss überwacht werden. Sinkt er, wird frisches Wasser nachgefüllt („topping-off“), um Konzentration konstant zu halten. Der hydroMazing Nutrient Controller überwacht auch pH und EC, steuert Pumpen und benachrichtigt bei Handlungsbedarf.
Weiterführende Themen
- Existential Crisis – Arduino Rollenspiel-Simulator
- Warum DIY statt Kaufen?
- Was ist ein „Smart“ Garden?
- Smart Indoor Garden starten
- Tiefer in Indoor-Gardening eintauchen
- Indoor Gardening: Was kann schiefgehen?
- Nährlösungs-Systeme managen
- Warum Arduino wenn man Pi haben kann?
Code: CoreSettings.h (C/C++) – Zentrale Einstellungen
Enthält nRF-Netzwerk-Adressen, Funksteckdosen-Codes, Timer-, Appliance- und Sensor-Objektdefinitionen.
/* CoreSettings.h - Copyright (C) 2015 Cory J. Potter - All Rights Reserved
LICENSE.txt beachten! NICHT FÜR KOMMERZIELLE ZWECKE! */
#ifndef __CORESETTINGS_H__
#define __CORESETTINGS_H__
#ifdef ARDUINO
#define RX_PIN 103
#define TONE_PIN 104
#define TX_PIN 8
uint8_t node_address = 1;
uint8_t totalNodes = 3;
unsigned long lastRxTimeStamp = 0;
const uint64_t nRFbaseAddress = 1034834473100;
uint8_t nRFaddress = 0;
uint64_t tx_pipes[3] = { 0xF0F0F0F0F8LL, 0xF0F0F0F0F7LL, 0xF0F0F0F0F6LL };
uint64_t rx_pipes[3] = { 0xF0F0F0F0F1LL, 0xF0F0F0F0F2LL, 0xF0F0F0F0F3LL };
/* Funksteckdosen-Codes (ETEKCITY #0319) */
uint8_t totalSwitches = 5;
unsigned long mySwitchOn[] = {24,333107,333251,333571,335107,341251};
unsigned long mySwitchOff[] = {24,333116,333260,333580,335116,341260};
/* I2C */
const int MY_ADDRESS = 42;
const int SEND_TO_ADDRESS = 22;
/* Timer */
Timer Timer_txData = { TIMER_TX_DATA, 30000UL, true, false, 0, NULL };
Timer Timer_Lcd = { TIMER_LCD, 12000UL, true, false, 0, &Timer_Log };
Timer Timer_Lcd_Cycle = { TIMER_LCD_CYCLE, 6000UL, true, false, 0, &Timer_Lcd };
Timer Timer_Lcd_Scroller = { TIMER_LCD_SCROLLER, 500UL, true, false, 0, &Timer_Lcd_Cycle };
Timer Timer_Save_Settings = { TIMER_SAVE_SETTINGS, 3600000UL, true, false, 0, &Timer_txData };
Timer Timer_Sensor_Read = { TIMER_SENSOR_READINGS, 7000UL, true, false, 0, &Timer_Save_Settings };
Timer Timer_Alerts = { TIMER_ALERTS, 45000UL, true, false, 0, &Timer_Sensor_Read };
Timer Timer_rxData = { TIMER_RX_DATA, 6000UL, true, false, 0, &Timer_Save_Settings };
/* Appliances */
Appliance Appliance_Light_1 = {101, 1, APPLIANCE_LIGHT, DEFAULT_TIME, true, false, OFF, NULL };
Appliance Appliance_IntakeFan = {104, 1, APPLIANCE_INTAKE_FAN, DEFAULT_TIME, true, false, OFF, &Appliance_Light_1 };
Appliance Appliance_ExhaustFan = {103, 1, APPLIANCE_EXHAUST_FAN, DEFAULT_TIME, true, false, OFF, &Appliance_IntakeFan };
Appliance Appliance_Humidifier = {102, 0, APPLIANCE_HUMIDIFIER, DEFAULT_TIME, true, false, OFF, &Appliance_ExhaustFan };
Appliance Appliance_Heater = {101, 0, APPLIANCE_HEATER, DEFAULT_TIME, true, false, OFF, &Appliance_Humidifier };
Appliance Appliance_FeedPump = {105, 1, APPLIANCE_PUMP, DEFAULT_TIME, true, false, OFF, &Appliance_Heater };
uint8_t totalAppliances = 6;
/* Sensors */
Sensor Sensor_Photocell = { PIN_A0, 1, SENSOR_PHOTO, 100, 50, 100, 0, 25, NULL };
Sensor Sensor_Temp = { PIN7, 1, SENSOR_TEMPF, 50, 70, 80, 0, 75, &Sensor_Photocell };
Sensor Sensor_Humidity = { PIN7, 1, SENSOR_HUMIDITY, 50, 40, 70, 0, 50, &Sensor_Temp };
Sensor Sensor_WaterTemp = { PIN3_INT1, 1, SENSOR_WATER_TEMPF, 100, 50, 70, 0, 65, &Sensor_Humidity };
Sensor Sensor_Flow = { PIN2_INT0, 2, SENSOR_FLOW, 100, 50, 50, 0, 75, &Sensor_WaterTemp };
Sensor Sensor_Float = { PIN_A2, 1, SENSOR_FLOAT, 100, 0, 1, 0, 1, &Sensor_Flow };
Sensor Sensor_Voltage = { PIN1_TX, 1, SENSOR_VOLTAGE, 100, 0, 100, 0, 50, &Sensor_Float };
uint8_t totalSensors = 7;
#endif
#endif
Schaltpläne
- Lüfter, Lampen, Heizer, Entfeuchter, Pumpen per Funksteckdosen gesteuert
- Gängige funkgesteuerte AC-Steckdosen
- Aufbau und Test
- Web-Interface Prototyp
- Web-Interface für Alarm-Benachrichtigungen
Herstellungsprozess
- Professionelle Temperaturüberwachung mit Raspberry Pi und DS18B20
- LM35-basiertes Temperatursteuerungssystem mit AT89S52 Mikrocontroller
- MCP3008 ADC zum Auslesen analoger Sensoren mit Raspberry Pi nutzen
- Smart Home Skills Gap überbrücken: Warum Großbritannien hinter Europa zurückbleibt
- Die Zukunft des urbanen Lebens: Schlüsselmerkmale aufstrebender Smart Cities – Teil 1
- Getränkeproduktion durch IoT-Füllstandmonitoring optimieren
- Antiblockiersystem (ABS) einfach erklärt: Funktion, Aufbau & Vorteile
- Elektronische Zündanlage: Aufbau, Funktion, Vorteile & Diagnose
- Magnetzündung: Funktionsweise, Aufbau, Vor- & Nachteile
- Das amerikanische Fertigungssystem: Geschichte, Techniken & Wirkung