Pflanzenkommunikator
Komponenten und Verbrauchsmaterialien
| × | 1 |
Apps und Onlinedienste
| ||||
|
Über dieses Projekt
Hinweis:Dieses Tutorial könnte veraltet sein, bitte gehen Sie hier für eine aktuellere Version.
Einführung
Wie der englische Dichter William Wordsworth einmal sagte:
"Dein Verstand ist der Garten, deine Gedanken sind die Saat, die Ernte kann entweder Blumen oder Unkraut sein."
Ihre Pflanzen am Leben zu erhalten kann eine ziemliche Herausforderung sein, da sie sehr schlecht in der Kommunikation sind.
Eine Möglichkeit, sie bei Laune zu halten, besteht darin, Ihre Pflanzen mitzubringen, aber vielleicht möchten Sie nicht mit diesem großen Kaktus oder Farn herumschleppen, der aus Ihren Winterjackentaschen ragt. Außerdem mögen die meisten Pflanzen die Kälte nicht.
Nachdem wir monatelang versucht hatten, mit unserer Spider Plant zu kommunizieren, gaben wir es auf und verwendeten die MKR IoT Bundle-Komponenten, um stattdessen ein Gerät zu entwickeln, das das Wohlbefinden jeder Anlage aus der Ferne überwacht.
Kurz gesagt:
In diesem Experiment lernen Sie, wie Sie Ihre Pflanzen schützen und sicherstellen können, dass sie überleben und wie Sie Arduino-Magie anwenden.
Durch die Überwachung von Feuchtigkeit, Temperatur und Licht können Sie sicherstellen, dass Ihre Pflanzen glücklich sind. Es kann täglich E-Mails und Grafiken senden und Sie über seine Bedürfnisse informieren.
Komponenten
- TMP36-Temperatursensor
- Fototransistor
- Selbstgemachter Feuchtigkeitssensor
Lernziele
- Einführung des Internetdienstes Zapier
- HTTP-Anfragen senden
- Echtzeituhr und Wecker verwalten
- Selbstbau eines Feuchtigkeitssensors
- Werte darstellen mit thingSpeak #ProTips
- Gestalten Sie Ihre E-Mails mit HTML und CSS #ProTips
- Testen Sie APIs mit PostMan #ProTips
Möchten Sie mehr wissen?
Dieses Tutorial ist Teil einer Reihe von Experimenten, die Sie mit dem MKR1000 und dem IoT vertraut machen. Alle Experimente können mit den im MKR IoT Bundle enthaltenen Komponenten erstellt werden.
- Liebe dich Kissen
- Puzzle-Box
- Pavlovs Katze
- Der Nerd
- Pflanzenkommunikator
Zapier einrichten
Zapier ist ein Online-Automatisierungstool, das die APIs anderer Apps für uns einfach verwalten kann. Es ist ein großartiges Werkzeug, um mehrere Aufgaben zu kombinieren oder wenn die App, die wir verwenden möchten, eine komplexe API hat, die von einem Arduino nicht verwaltet werden kann.
In unserem Fall verwenden wir es, um eine E-Mail mit den vom Arduino abgerufenen Daten zu senden.
Befolgen Sie diese wenigen einfachen Schritte, um Ihren eigenen Zap zu erstellen!
Um fortzufahren, müssen wir unseren Hook testen, indem wir zuerst die angegebene URL kopieren und dann die Schaltfläche Test and Review auswählen, die erscheint, wenn Sie auf Weiter klicken. Fügen Sie der URL diese Parameter hinzu:
custom_webhook_URL?temperature=0&moisture=0&light=0&warning=0
Jetzt kopieren Sie einfach diese URL und fügen Sie sie auf einer neuen Browserseite ein.
Sie sollten eine Antwort wie diese sehen:
Herzliche Glückwünsche! Sie haben gerade eine http-Anfrage gesendet!
Genau das werden wir mit unserem Arduino Board machen. Aber anstatt diese URL in eine Browserseite einzufügen, senden wir sie direkt an den Zapier-Server. Außerdem werden wir die Werte der Parameter, die jetzt auf Null gesetzt sind, mit unseren Sensorwerten ändern.
Eine erweiterte Möglichkeit zum Testen und Arbeiten mit API finden Sie in der #ProTip unten auf der Seite.
Nachdem Sie Ihre Anfrage getestet haben, können Sie mit der Erstellung des Zap fortfahren.
Fahren Sie im Bearbeiten mit der Tu dies... fort
Überprüfen Sie Ihr Postfach, um die generierte E-Mail von Zapier zu sehen. Es wird von dem Konto stammen, das Sie im ersten Schritt der Google Mail-Konfiguration verwendet haben.
Das Board einrichten
Um alle Funktionalitäten zu implementieren werden wir die folgenden Bibliotheken verwenden:
- WiFi101 // um eine Internetverbindung herzustellen und die Netzwerke zu scannen
- RTCZero // um zeitgesteuerte Ereignisse zu verwalten
Sie können sie wie in dieser Anleitung beschrieben vom Bibliotheksmanager herunterladen.
Um die API von Zapier verwenden zu können, müssen wir zuerst die Zertifikate hochladen beim MKR1000. Dies gilt für die meisten Onlinedienste und APIs!
Laden Sie das Firmware Updater-Beispiel aus der WiFi101-Bibliothek hoch und fügen Sie hooks.zapier.com hinzu zu den Domains.
> Beispiele> WiFi101> FirmwareUpdater
Wenn Sie den Arduino Web Editor verwenden, ist diese Funktion noch nicht implementiert und Sie müssen dies über das Arduino Desktop-Anwendung.
HTTP-Anfrage senden
Wir sind jetzt bereit, die HTTP-Anfrage vom Arduino-Board zu senden.
Vorerst werden wir unserem Parameter einen willkürlichen Wert setzen, der später durch echte Sensorwerte ersetzt wird.
Schwimmertemperatur =22; int Feuchtigkeit =150; int light =40; String warning ="Dies ist eine Warnmeldung"; warning.replace(" ", "%20");
Beachten Sie, dass die Zeichenfolge codiert werden muss , da in einer HTTP-Anfrage keine Leerzeichen gesendet werden können. Alle Leerzeichen werden durch das codierte Äquivalent %20
. ersetzt
Nachdem wir unsere Parameter eingerichtet haben, rufen wir die send_email()
. auf Funktion, die alle in Strings umwandelt und die gleiche URL neu erstellt, die wir zuvor verwendet haben um es dann auf dem Zapier-Server zu posten.
Füllen Sie diese Skizze mit Ihren WLAN-Anmeldeinformationen und der URL, die Sie von Zapier erhalten haben, aus und laden Sie sie hoch.
#include #include const char* ssid =SECRET_SSID; // Ihre Netzwerk-SSID (Name) const char* password =SECRET_PSWD; // Ihr Netzwerkpasswort String httpsRequest =SECRET_REQUEST; // Ihre Zapier-URL const char* host ="hooks.zapier.com"; WiFiSSLClient-Client; Void setup () { Serial.begin (9600); while (!Seriell); Verzögerung (2000); Serial.print("WLAN verbinden:"); Serial.println (ssid); while (WiFi.begin(ssid, passwort) !=WL_CONNECTED) { Serial.print("."); Verzögerung (500); } Serial.println(""); Serial.println ("WiFi verbunden"); aufrechtzuerhalten. Void Schleife () { Float-Temperatur =22; int Feuchtigkeit =150; int light =40; String warning ="Dies ist eine Warnmeldung"; warning.replace(" ", "%20"); send_email(Temperatur, Feuchtigkeit, Licht, Warnung); delay(20000)} void send_email(float temperature, int feuchtigkeit, int light, string warning) { // Werte in String umwandeln String _temperature =String(temperature); String_Feuchtigkeit =String(Feuchtigkeit); String_light =String(Licht); String _warning =Warnung; if (client.connect(host, 443)) { client.println("POST" + httpsRequest + "?temperature=" + _temperature + "&moisture=" + _moisture + "&light=" + _light + "&warning=" + _warning + "HTTP/1.1"); client.println("Host:" + String(Host)); client.println("Verbindung:schließen"); client.println(); Verzögerung (1000); while (client.available()) { // Auf der Konsole die Antwort des Servers ausgeben char c =client.read(); Serial.write (c); } client.stop(); // Vom Server trennen} else { Serial.println ( "Verbindung zum Client fehlgeschlagen"); } }
Es wird alle 20 Sekunden eine E-Mail an die von Ihnen gewählte Adresse gesendet.
Seien Sie vorsichtig mit den Anfragen, Zapier gewährt Ihnen nur 100 kostenlose Anfragen pro Monat.
RTC und Alarme
Wir können die Echtzeituhr des MKR1000 verwenden, um jeden Tag zu einer bestimmten Stunde eine E-Mail zu senden.
Diese Skizze stellt die Uhrzeit und das Datum am 4. Dezember 2017 um 16:00 Uhr und löst dann jeden Tag um 16:01 Uhr einen Alarm aus.
Beachten Sie, dass der Alarm an einen Interrupt angehängt ist Funktion Wir können keine Verzögerungen berücksichtigen , aber wir können eine boolesche Variable verwenden, um Aktionen in der loop()
. auszulösen
#include RTCZero rtc; // RTC-Objekt erstellen /* Ändern Sie diese Werte, um die aktuelle Anfangszeit festzulegen */ const byte seconds =0; const Byte Minuten =0; const Byte Stunden =16; /* Ändern Sie diese Werte, um das aktuelle Anfangsdatum festzulegen */ const byte day =4; const Byte Monat =12; const Byte Jahr =17; bool email_already_sent =false; Void setup () { Serial.begin (9600); while (!Seriell); Verzögerung (2000); rtc.begin(); // RTC 24H-Format initialisieren rtc.setTime (Stunden, Minuten, Sekunden); rtc.setDate(Tag, Monat, Jahr); rtc.setAlarmTime(16, 1, 0); // Stellen Sie die Zeit für das Arduino ein, um die E-Mail rtc.enableAlarm (rtc.MATCH_HHMMSS) zu senden; rtc.attachInterrupt(alarmMatch); } void loop() { if (!email_already_sent) { // send_email(); email_already_sent =true; aufrechtzuerhalten. aufrechtzuerhalten. Void alarmMatch () {// ausgelöst, wenn der Alarm auf Serial.println ("Alarm Match!"); email_already_sent =false; }
DIY Bodenfeuchtigkeitssensor
Zwei im Erdtopf platzierte Drähte bilden einen variablen Widerstand, dessen Widerstand je nach Bodenfeuchtigkeit variiert .
Dieser variable Widerstand ist in einer Spannungsteilerkonfiguration angeschlossen und Arduino sammelt eine Spannung proportional zum Widerstand zwischen den 2 Drähten.
Dies bedeutet, dass je feuchter der Boden ist, desto weniger Spannung wird vom Arduino gemessen.
Verwenden des 1-Mega-Ohm-Widerstands und zwei Drähte können wir unseren DIY-Bodenfeuchtigkeitssensor herstellen!
Wenn Sie die folgende Skizze hochladen, können Sie die Werte des Sensors ablesen. Wir empfehlen Ihnen, zuerst in einem trockenen Boden zu testen und notieren Sie den gelesenen Wert.
Dieser Wert wird verwendet, um einen Schwellenwert festzulegen damit der Arduino weiß, wann Ihre Pflanzen Wasser brauchen und Ihnen eine Notfall-E-Mail senden
int FeuchtePin =A2; // Stellen Sie diesen Dreipunkt entsprechend dem von Ihnen verwendeten Widerstand ein // Der einfachste Weg, diesen Wert zu kalibrieren, besteht darin, den Sensor sowohl in trockenem als auch in nassem Boden zu testen int threeshold =800; Void setup () { Serial.begin (9600); while (!Seriell); Verzögerung (2000); aufrechtzuerhalten. Void Schleife () {Serial.println (get_average_moisture ()); Verzögerung (5000); } int get_average_moisture () { // einen Durchschnitt von 10 Werten machen, um genauer zu sein int tempValue =0; // Variable zum vorübergehenden Speichern des Feuchtigkeitswerts für (int a =0; a <10; a++) { tempValue + =analogRead (moisturePin); Verzögerung (100); } tempValue / 10 zurückgeben; }
Temperatur- und Lichtsensor hinzufügen
Siehe das Schema unten, um die beiden Sensoren zu verdrahten. Wir verwenden diese beiden Funktionen, um Werte von den Sensoren auszulesen:
float get_temperature () { int Reading =analogRead (A1); Erhaltungsspannung =Messwert * 3,3; Spannung /=1024,0; // Drucktemperatur in Celsius float temperatureC =(Spannung - 0,5) * 100; // Konvertieren von 10 mv pro Grad mit 500 mV Offset // Konvertieren in Fahrenheit float temperatureF =(temperatureC * 9.0 / 5.0) + 32,0; RücklauftemperaturC; } Int get_light () { Int light_value =analogRead (A0); Lichtwert zurückgeben; }
Beachten Sie, dass Sie die Fahrenheit-Einheiten verwenden können, indem Sie temperatureF
. zurückgeben statt temperatureC
#ProTip:Werte mit ThingSpeak darstellen
Für alle Kontrollfreaks ist hier die Anleitung, um alle gesammelten Daten in einem schönen Diagramm wie folgt darzustellen:
Wir werden die ThingSpeak-Plattform verwenden, um Grafiken zu erstellen. Befolgen Sie diese Schritte, um zu beginnen.
Laden Sie die ThingSpeak-Bibliothek herunter und legen Sie los. Diese Skizze unten lädt jede Minute Sensorwerte in die Cloud. Geben Sie einfach Ihre WLAN-Anmeldeinformationen und die API-Schlüssel Ihres Kanals ein und laden Sie sie hoch.
#include #include #include "ThingSpeak.h" const char* ssid =SECRET_SSID; // Ihre Netzwerk-SSID (Name) const char* password =SECRET_PSWD; // Ihr Netzwerkpasswort WiFiClient ThingSpeakClient; unsigned long myChannelNumber =356392; const char * myWriteAPIKey =SECRET_WRITE_API; int lightPin =A0; // der analoge Pin des Lichtsensors ist mit Int tempPin =A1 verbunden; // der analoge Pin der Vout (Sense) Pin des TMP36 ist mit Int MoisturePin =A2 verbunden; Void setup () { Serial.begin (9600); while (!Seriell); Verzögerung (2000); Serial.print("WLAN verbinden:"); Serial.println (ssid); while (WiFi.begin(ssid, passwort) !=WL_CONNECTED) { Serial.print("."); Verzögerung (500); } Serial.println(""); Serial.println ("WiFi verbunden"); ThingSpeak.begin(ThingSpeakClient);} void loop() { ThingSpeak.setField(1, get_light()); ThingSpeak.setField(2, get_temperature()); ThingSpeak.setField(3, get_average_moisture()); ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey); Serial.println ( "Nachricht an Cloud gesendet"); Verzögerung(60000); // Werte alle 1 Minute senden aufrechtzuerhalten. Float get_temperature () { Int Reading =analogRead (tempPin); Erhaltungsspannung =Messwert * 3,3; Spannung /=1024,0; // Drucktemperatur in Celsius float temperatureC =(Spannung - 0,5) * 100; // Konvertieren von 10 mv pro Grad mit 500 mV Offset // Konvertieren in Fahrenheit float temperatureF =(temperatureC * 9.0 / 5.0) + 32,0; RücklauftemperaturC; }int get_average_moisture() {// Bilden Sie einen Durchschnitt von 10 Werten, um genauer zu sein int tempValue =0; // Variable zum vorübergehenden Speichern des Feuchtigkeitswerts für (int a =0; a <10; a++) { tempValue + =analogRead (moisturePin); Verzögerung(10); } tempValue / 10 zurückgeben; } Int get_light () { Int light_value =analogRead (A0); Lichtwert zurückgeben; }
In der vollständigen Pro-Skizze unten Sie können sehen, wie Sie diesen Upload an einen RTC-Alarm anhängen, der jede Minute ausgelöst wird.
Leider lässt sich Gmail nicht einbetten Grafiken und iframes im Textkörper der E-Mail, aber wir können den Link per E-Mail in einem schönen Button senden, siehe den Tipp unten.
Wir haben uns für ThingSpeak entschieden, aber es gibt unzählige Alternativen! Schauen Sie sich zum Beispiel Dweet.io und freeboard.io an.
#ProTip:Gestalten Sie Ihre E-Mail
Mit Zapier können wir etwas HTML- und CSS-Code in den Textkörper einbetten der E-Mail. Wir können damit ziemlich stilisierte E-Mails wie diese senden:
Um dieses Ergebnis zu erzielen, ändern Sie einfach den Texttyp in HTML auf der Zapier-Oberfläche und fügen Sie Ihr benutzerdefiniertes HTML und CSS hinzu.
Kopieren Sie diese Vorlage und fügen Sie sie ein:
HALLO !
Hier ist dein tägliches Update über deinen Garten ☘
♨ Temperatur:{{querystring__temperature}} C
☔ Feuchtigkeit:{{_querystring__moisture}}
☀ Licht:{{querystring__light}}
{{querystring__warning}}
SCHAUBILD ANSEHEN
#ProTip:API mit PostMan testen
Die Arbeit mit HTTP-Anfragen kann schwierig sein. Zum Glück gibt es viele Tools, die uns beim Erstellen der benötigten URL helfen können.
Postbote ist ein großartiges Beispiel:
Fügen Sie einfach die von Zapier angegebene Anfangs-URL ein, fügen Sie Parameter hinzu und senden Sie sie. Es druckt die Antwort vom Server aus und erstellt die URL für Sie.
Code
Vollständige Skizze
#ProTips komplette Skizze
Schaltpläne
Herstellungsprozess