Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Eine städtische Pflanzenbewässerungslösung

Komponenten und Verbrauchsmaterialien

Bodenfeuchtesensor
Jeder Bodenfeuchtesensor mit Analogausgang kann verwendet werden. Es könnten auch zwei Elektroden und ein Spannungsteiler verwendet werden. DIESE SIND OPTIONAL.
× 2
Regensensor
× 1
Milchkrug
Jeder Behälter, der Wasser aufnehmen, geschnitten und an einer Oberfläche befestigt werden kann, ist ausreichend auf einer erhöhten Oberfläche montiert werden.
× 1
Flexibler Hohlschlauch aus weichem Kunststoff
Jede Art von Schlauch ist ausreichend. Ich habe ein Springseil mit abgeschnittenen Enden verwendet, da es sehr flexibel ist und die Mitte hohl ist.
× 1
Jumper (generisch)
Mehr oder weniger.
× 37
SparkFun Erfinder-Kit für Arduino 101
Ich habe Arduino 101, Servo, Steckbrett, Potentiometer und LCD verwendet.
× 1
Modelliermasse
× 1
Kurzer Kunststoffstab
Oder jede nicht flexible Stange. Dies wird verwendet, um das Auslassrohr des Wassertanks zu stützen.
× 1
Widerstand 330 Ohm
× 1

Notwendige Werkzeuge und Maschinen

Schere
Phillips-Schraubendreher
Elektrisches Klebeband
und auch normales Klebeband.

Apps und Onlinedienste

Nordic Semiconductor nRF Connect SDK
Arduino-IDE

Über dieses Projekt

Dieses Gerät verbessert die Pflanzenbewässerung in städtischen Umgebungen. Angetrieben von einem Arduino 101 verwendet es Bordwerkzeuge zusammen mit einigen externen Sensoren, um optimale Bedingungen für die Bewässerung von Pflanzen in seiner eigenen Umgebung zu berechnen, und bewässert dann die Pflanze selbst zum berechneten Zeitpunkt.

Es basiert auf den folgenden Konzepten:

Schwerkraft und Druck

Dieses Gerät zapft seine Wasserquelle aus einem Reservoir, das ich mit einem Milchkännchen, Plastikschlauch, Ton zum Versiegeln des Schlauchs und einem Servo hergestellt habe. Dieser Behälter ist so positioniert, dass er nicht nur hochgestellt ist, sondern auch Regenwasser über dem Gerät sammeln kann.

Die Kanne wird in erster Linie von einem Hauswasseranschluss befüllt (da Regen nicht immer verfügbar ist), wird aber durch Regenwasser ergänzt. Wenn sich Wasser in der Kanne befindet, zieht die anziehende Schwerkraft das Wasser im Inneren der Kanne zur Erde. In den Boden der Kanne ist ein Loch geschnitten, um das Einführen eines Auslassrohrs zu ermöglichen. Die Schwerkraft zieht somit Wasser durch dieses Austrittsrohr. Das Servo regelt, wenn das Wasser vollständig aus dem Rohr austreten kann. Unter normalen Umständen befindet sich der Servoarm in einer aufrechten Position, die verhindert, dass Wasser aus dem Rohr fließt. Beim Gießen der Pflanze senkt sich der Arm jedoch um 135 Grad ab, sodass Wasser aus dem Rohr fließen und die Pflanzen bewässern kann. Der Arm hebt sich wieder nach oben, sobald dies abgeschlossen ist.

Der Druck des Wassers gegen die Kanne unterstützt nicht nur die Stabilität der Kanne, sondern hilft auch beim Wasseraustritt und ermöglicht einen kontinuierlichen Wasserfluss während der Bewässerung.

TMP36-Temperatursensor und die Intel Curie Pattern Matching Engine

Diese Kombination von Konzepten hilft, die Berechnung voranzutreiben, die den optimalen Zeitpunkt für die Bewässerung von Pflanzen bestimmt. Der TMP36 ist ein Temperatursensor, der wie ein Thermometer arbeitet, jedoch mit einem elektronischen Analogausgang. Diese Ausgabe kann von einem Gerät, beispielsweise einem Mikrocontroller, gelesen und in eine Temperatur umgewandelt werden. In diesem Projekt versucht das Gerät, den optimalen Zeitpunkt für die Pflanzenbewässerung zu berechnen, der am nächsten bei 25 Grad Celsius liegt. Es macht 30 Aufzeichnungen pro Stunde im Abstand von zwei Minuten und berechnet am Ende jeder Periode den Durchschnitt von 29 davon (ohne die erste, da sie normalerweise ungenau ist). Hier kommt die Pattern Matching Engine ins Spiel.

Die Intel Curie PME oder Pattern-Matching-Engine ist ein künstliches neuronales Netzwerk, das in den Arduino 101 integriert ist. Seine Bibliotheken sind auf GitHub verfügbar. Es besteht aus 128 Neuronen und ist in der Lage, Daten zu lernen und zu klassifizieren, die in Vektoren gespeichert sind, basierend auf vorhandenen Daten oder Vektoren, die in Kategorien eingeteilt sind. Je mehr Kategorien zur Verfügung stehen, desto mehr Optionen für die Klassifizierung können vom PME verfolgt werden.

Für dieses Projekt zeichnet das PME über einen Tag Temperaturdaten auf und versucht, daraus den optimalen Zustand von 25 Grad Celsius zu klassifizieren. Das Ergebnis wird am nächsten Tag zum Gießen der Pflanze.

Die Datenaufzeichnung erfolgt stündlich von 8 bis 21 Uhr. Beim ersten Mal werden die Daten auf dem Onboard Serial Flash gespeichert . Dadurch kann das Gerät auch dann von einem Datensatz booten, wenn es ausgeschaltet wurde. Nach Erhalt des Datensatzes versucht es, die optimalen Bedingungen zu klassifizieren. Wenn dies möglich ist, wird die ausgewählte Kategorie zur Stunde der nächsten Runde. Wenn nicht, verwendet das Gerät monatliche Konstanten oder die Tageszeit jedes Monats, zu der die Temperaturen am höchsten sind. Es sollte beachtet werden, dass das sind nicht immer die besten Temperaturen zum Gießen von Pflanzen , weshalb ich die PME verwendet habe.

Nach der ersten Lernsitzung werden die Daten gelöscht und am nächsten Tag neu gelernt, wobei die Pflanze zur gewählten Stunde bewässert wird. Dieser Zyklus wiederholt sich endlos oder bis das Gerät vom Strom getrennt wird, wobei es beim erneuten Einschalten die gespeicherten Parameter als ausgewählte Stunde verwendet und weiterläuft.

Intel Curie Echtzeituhr und Bluetooth Low Energy

Die Intel Curie RTC oder Echtzeituhr ist eine entscheidende Komponente dieses Geräts. Die RTC steuert, wann alles auf dem Gerät passiert. Für dieses Projekt ist die RTC besonders wichtig, um die Stunde, die für die Bewässerung der Pflanze und die Datenaufzeichnung verwendet wird, sowie den Monat, der zur Bestimmung der Backup-Spitzentemperaturkonstanten verwendet wird, zu verfolgen. Das genaue Datum für diese Echtzeituhr muss jedoch manuell eingestellt werden, entweder im Code oder durch Benutzereingabe. Dies wurde mit BLE gelöst.

Bluetooth Low Energy ist eine neuere Version von Bluetooth, die für Geräte mit geringem Stromverbrauch entwickelt wurde. Es arbeitet auf einem Zentral-Peripherie-System, in dem eine Zentrale oder ein Eingang in Peripheriegeräte oder Ausgänge schreibt. Dies funktioniert eher wie ein Bulletin-Board-System, bei dem die Zentrale Daten auf einem Bulletin ablegt, damit alle Peripheriegeräte sie lesen können. In diesem Fall habe ich nRF Connect von Nordic Semiconductor auf meinem Mobilgerät als Zentrale und das Arduino 101 als Peripheriegerät verwendet. Das mobile Gerät kann sich mit dem Arduino verbinden und Daten an ihn senden. In diesem Fall muss das Mobilgerät viermal Daten senden, einmal für jedes der erforderlichen Eingabefelder.

Die Dateneingabe auf dem Mobilgerät erfolgt hexadezimal. Dies ist relativ einfach von Basis 10 zu konvertieren, aber ein Online-Konverter kann verwendet werden.

Anleitung

Der Aufbau dieser Bewässerungslösung erfordert ein wenig Schaltungswissen, aber nicht zu viel. Es erfordert auch einige nicht-elektrische Komponenten, um fertig zu werden. Hier ist die komplette Teileliste:

Elektrische Komponenten

  • Arduino 101
  • 400 Tie Breadboard, mit +- Schienen
  • Drehpotentiometer
  • 16x2-LCD
  • 330 Ohm Widerstand
  • TMP36-Temperatursensor
  • 180-Grad-Servo, mit Servohorn
  • Regensensor und Steuerplatine
  • Bodenfeuchtesensor und Steuerplatine (optional, Hardware als Referenz enthalten)
  • Eine beträchtliche Anzahl von Überbrückungsdrähten; siehe Fritzing-Diagramm

Um mit Batterien zu laufen (kann nicht allzu lange dauern; das Setup, das ich verwendet habe):

  • 2X 4xAA Batterieboxen mit Ein-/Ausschalter und Kabeln
  • 8X AA 1,2V NiMH-Akkus

Zum Betrieb mit USB-Strom, entweder von einer Wandwarze oder einem Laptop:

  • USB Stecker A - Stecker B Kabel, dessen Länge von Ihren Bedürfnissen abhängt

Nichtelektrische Hardwarekomponenten

  • Milchkrug
  • Flexibler Kunststoffschlauch, ca. 20-30 cm lang
  • Modelliermasse, Heißkleber oder alles, was als Versiegelung verwendet werden kann
  • Kunststoffstange, um den Schlaucharm zu stützen
  • Bastelkorb, um das Gerät zu halten
  • Erhöhte Ablagefläche für die Kanne, z. B. eine kleine Bank oder ein Tisch
  • Eine Pflanze

Tools

  • Band, sowohl normales als auch elektrisches Band
  • Schere
  • Kreuzschlitzschraubendreher, um das Servohorn am Servo zu befestigen

Schritte

1. Bauen Sie die Schaltung gemäß dem folgenden Fritzing-Diagramm auf. Bitte beachten Sie, dass die Bodenfeuchtigkeitssensoren optional sind und dass der Regensensor und das Servo möglicherweise längere Kabel haben müssen, um die gewünschten Positionen zu erreichen. Siehe das zweite Foto unten für die endgültige Anordnung der Schaltung.

2. (Fahren Sie mit Schritt 5 fort, wenn Sie USB-Strom verwenden). Legen Sie die Batterien in die beiden Batteriekästen ein und binden Sie das Pluskabel des einen Kastens und das Minuskabel des anderen zusammen.

3. Kleben Sie die Kartons mit Isolierband zusammen. Sichern Sie die Kartons so, dass die Abdeckungen von beiden angebracht sind und die Koffer von beiden angebracht sind und die Abdeckung als ein Stück abnehmbar ist. Lassen Sie die Steckplätze für die Netzschalter offen.

4. Kleben Sie die Doppelabdeckung des Batteriekastens auf die Unterseite des Arduino 101 und des Steckbretts. Dadurch können die Batterien leicht ausgetauscht werden, indem sie unter der Platine herausgezogen werden.

5. Setzen Sie das Gerät in den Bastelkorb ein und schneiden Sie zwei Schlitze an einer Seite des Geräts. Der erste Steckplatz dient der Programmierung (oder USB-Strom, wenn Sie dies wünschen), und der zweite ist eine Steckdose für die Sensoren und Aktoren, die sich nicht am Gerät befinden. Fühlen Sie sich frei, Isolierband zu verwenden, um lose Drähte in dieser Steckdose zusammenzuhalten.

6. Nehmen Sie einen Milchkrug und schneiden Sie den oberen Teil ab, damit der Krug eine ausreichend große Öffnung zum Auffangen von Wasser und ein ausreichend großes Fassungsvermögen hat, um zuverlässig zu sein. Ich empfehle, dass der Schnitt nahe der Basis des Griffs liegt.

7. Schneiden Sie ein kleines Loch in den Boden der Kanne direkt unter dem größten Teil der Öffnung im oberen Teil der Kanne. Führen Sie ein Ende des Kunststoffschlauchs in dieses Loch ein. Stellen Sie sicher, dass das Loch klein genug ist, damit das Rohr in Position bleibt, aber groß genug, um das Rohr nicht zu quetschen.

8. Verwenden Sie den Ton, um den oberen und unteren Bereich um das Rohr im Loch abzudichten. Achte darauf, dass der Ton nicht in das Rohr selbst gelangt.

9. Befestigen Sie das Servo mit Ton und Isolierband so tief wie möglich am Boden des Milchkännchens. Kleben Sie die Mitte des Rohres und eine Plastikstange auf das Servohorn. Stellen Sie sicher, dass der Kunststoffstab auch am oberen Ende des Rohres befestigt ist. Verwenden Sie das Bild unten als Referenz für die Schritte 8 bis 10.

10. Befestigen Sie die Kanne auf der erhöhten Fläche. Verwenden Sie ggf. Klebeband.

11. Platzieren Sie eine Pflanze in der abgesenkten Position direkt unter dem Rohrauslass. Stecken Sie die Feuchtigkeitssensoren in den Boden, wenn Sie sie verwenden, und platzieren Sie den Regensensor in der Nähe der Pflanze entlang des Bodens. Stecken Sie die Sensoren und das Servo in das Gerät ein, wobei das Gerät etwas weiter von der Kanne und Pflanze entfernt platziert wird.

Programmierung

Programmieren Sie den Arduino 101 mit dem beigefügten Code. Laden Sie mit der Arduino IDE und Curie Core 2.0.2 oder höher (falls verfügbar) hoch. Viele hilfreiche Kommentare sind im Code enthalten.

Gerätebetrieb

Wenn das Gerät zum ersten Mal eingeschaltet wird, wartet es, bis ein mobiles Gerät verbunden ist. Sobald ein Gerät über nRF Connect verbunden ist, wartet es auf die Zeiteingabe. Geben Sie dazu nacheinander die Hex-Codes für die Basis 10 Stunde, Minute, Tag und Monat in nRF Connect ein, wie in der Abbildung unten gezeigt.

Vor der Zeiteingabe muss eine ID-Eingabe oder eine beliebige Zahl eingegeben und gesendet werden.

Nachdem Sie die Uhrzeit eingegeben haben, wartet das 101, bis das Mobilgerät die Verbindung getrennt hat. Danach wartet es bis 8 Uhr morgens, entweder am aktuellen oder am nächsten Tag.

Bei Erreichen von 8:00 Uhr überprüft das Board, ob im Flash-Speicher noch etwas gespeichert ist. Wenn nicht, durchläuft es den 14-stündigen Erfassungsprozess, wie zuvor beschrieben, und klassifiziert dann die Daten und bestimmt den optimalen Zeitpunkt, an welchem ​​Punkt der Erfassungszyklus wiederholt wird. Wenn etwas gespeichert ist, werden diese Daten als Stundenkonstante verwendet und die Zyklen werden normal fortgesetzt.

Während der Zeit, in der das Brett die Pflanze bewässert, verhindert Regen oder eine übermäßige Bodenfeuchtigkeit (optional) die Bewässerung der Pflanze. Es überspringt dann die Bewässerung für den Tag und wartet auf den nächsten.

Diese Lösung wurde entwickelt, um die Bewässerung von städtischen Pflanzen einfacher und optimierter zu machen, indem eine automatische Einrichtung verwendet wird, die sich darum kümmert. Es spart auch Regenwasser zusammen mit dem vorhandenen Hausbedarf, indem es ein Reservoir verwendet, das Regen, der nicht auf die Pflanzen gerichtet ist, sinnvoll nutzt.

Hoffentlich wird dieses Projekt unsere sich ständig verändernde Welt zu einem etwas besseren Ort machen!

Code

  • Arduino 101 Bewässerungssystem
Arduino 101 BewässerungssystemArduino
Code für den Betrieb des Arduino 101 Bewässerungssystems. Hochladen mit Curie Core 2.0.2 und jeder 1.8.x oder höher IDE. CuriePME kann auf GitHub gefunden werden.
/*Dies ist eine Skizze für eine städtische Bewässerungslösung. Es verwendet die CuriePME, um Temperaturdaten zu lernen und die optimalen Bedingungen für die Pflanzenbewässerung dagegen zu klassifizieren. Es bewässert dann die Pflanze zu diesem Zeitpunkt und Erlernt die Daten neu und läuft unendlich.Bitte beachten Sie, dass diese Skizze VOR 8:00 Uhr des Zieltages ausgeführt werden muss, um das Gerät zu starten.Datenquellen:"WeatherSpark.com." Durchschnittswetter in Vancouver, Kanada das ganze Jahr über - Weather Spark. N.S., N.D. Netz. 04. Juli 2017. ."Nur 4 Züchter:Globale Gartengemeinschaft." Nur für Züchter. N.S., N.D. Netz. 10. Juli 2017. . */// Bibliotheken zur Verwendung mit diesem Code. Alle außer CuriePME sind in der ide zu finden. CuriePME kann vom GitHub-Repository heruntergeladen werden.#include "CuriePME.h"#include #include #include #include #include #include // Servo-Pinout-Code.Servo waterPipe;// LCD-Pinout-Code.LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Globale Konstanten/Variablen. #define Thermometer A3 #define rainSensor 1#define Feuchte1 A4#define Feuchte2 A1int tm1;int tm2;int tm3;int tm4;int tm5;int tm6;int tm7;int tm8;int tm9;int tm10;int tm11;int tm12;int tm13; int tm14;int tm15;int tm16;int tm17;int tm18;int tm19;int tm20;int tm21;int tm22;int tm23;int tm24;int tm25;int tm26;int tm27;int tm28;int tm3029 .;;int durchschnittlich;int progav;float voltage;float temperatureC;int tm;int hourTime =-1;int minuteTime =-1;int dayTime =-1;int monthTime =-1;int ConfirmTime =-1;// BLE service data.BLEService plantService("19B10000-E8F2-537E-4F6C-D104768A1214"); // BLE-Kennlinie, lesbar/beschreibbar durch zentrale.BLEUnsignedCharacteristic timeCha rakteristisch("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);void setup() { // Dies wird einmal ausgeführt. waterPipe.attach(9); waterPipe.write(0); pinMode (Regensensor, EINGANG); lcd.begin(16, 2); // Beginnen und löschen Sie das LCD. lcd.clear(); if (!SerialFlash.begin(ONBOARD_FLASH_SPI_PORT, ONBOARD_FLASH_CS_PIN)); lcd.setCursor(0, 0); lcd.print("Eingabezeit:BLE"); // BLE-Dienst mit Name, Dienst, Merkmal und Merkmalswert initialisieren. BLE.begin(); BLE.setLocalName("Arduino 101"); BLE.setAdvertisedService(plantService); plantService.addCharacteristic(timeCharacteristic); BLE.addService(plantService); timeCharacteristic.setValue(0); // 0 bis es von der Zentrale geschrieben wird. BLE.advertise(); lcd.setCursor(0, 1); lcd.print("Warten"); // Bereit für connect.x:BLEDevice central =BLE.central(); if (central) { // Wenn ein Gerät mit dem Board verbunden ist. lcd.setCursor(8, 1); lcd.print("Fertig"); Verzögerung (3000); while (central.connected()) {// Während das Gerät noch verbunden ist. if (timeCharacteristic.write()) { // Code, der sequentiell alle Zeitvariablen-Slots auffüllt, nachdem jedes Byte vom Gerät gesendet wurde. Die Daten werden viermal gesendet, plus einmal zur Bestätigung der Verknüpfung. if (confirmTime ==-1) { ConfirmTime =timeCharacteristic.value(); aufrechtzuerhalten. Sonst if (hourTime ==-1) {hourTime =timeCharacteristic.value(); aufrechtzuerhalten. Sonst if (minuteTime ==-1) { minuteTime =timeCharacteristic.value(); aufrechtzuerhalten. Sonst if (dayTime ==-1) { dayTime =timeCharacteristic.value(); aufrechtzuerhalten. Sonst if (monthTime ==-1) { monthTime =timeCharacteristic.value(); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Zeit eingestellt."); lcd.setCursor(0, 1); lcd.print("Gerät trennen."); } } } } else { goto x; // Schleife zurück, wenn noch kein Gerät verbunden ist. } // Setze die Zeit mit den gesammelten Variablen. Sekunden und Jahr spielen bei diesem System keine Rolle. setTime (hourTime, minuteTime, 00, dayTime, monthTime, 2017); // PME initialisieren. lcd.clear(); CuriePME.begin(); lcd.setCursor(0, 0); lcd.print("Überprüfe auf Speichern."); Verzögerung (3000); const char *filename ="NeurData.dat"; if (check_if_exists(filename) ==true) { restoreNetworkKnowledge(); lcd.setCursor(0, 1); lcd.print("Gefunden!"); Verzögerung (3000); lcd.clear(); gehe z; aufrechtzuerhalten. Sonst { lcd.setCursor (0, 1); lcd.print("Nicht gefunden!"); Verzögerung (3000); lcd.clear(); } /* Der verbleibende Teil des Setups sammelt Temperaturdaten im Laufe des Tages. Es führt 30 Kontrollen pro Stunde in Abständen von 2 Minuten durch, und am Ende der Stunde nimmt es den Durchschnitt der Stundendaten, indem es das arithmetische Mittel aller Daten mit Ausnahme des ersten Scans ermittelt. Dieser Mittelwert wird dann in die PME eingegeben und gelernt. Dies wiederholt sich von 8:00 bis 21:00 Uhr, wobei der vollständige vom PME gelernte Datensatz standardmäßig im CurieFlash-Speicher gespeichert wird, falls das Gerät Strom verliert oder neu gestartet werden muss. */ lcd.clear(); lcd.setCursor(0, 0); lcd.print("Lernen"); for (int i =8; i <22; i++) // Wiederholen Sie dies 14 Mal, wobei jede Speicherung unter einer anderen Kategorie erfolgt. {// Sammeln Sie 30 Temperaturdaten, die als Int zwischen 0 und 255 gespeichert werden. voltage =analogRead (Thermometer) * 3.3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm1 =einschränken(tm, 0, 255); Verzögerung(114.000); // Obige Überprüfungsverzögerung kompensieren. Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm2 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm3 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm4 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm5 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm6 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm7 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm8 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm9 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm10 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm11 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm12 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm13 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm14 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm15 =einschränken(tm, 0, 255); // Während der ersten Lernphase wird die Pflanzenbewässerung bei den höchsten Temperaturen für diesen Monat durchgeführt. if ((Monat() ==1 || Monat() ==2 || Monat() ==11 || Monat() ==12) &&Stunde() ==12) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wird ausgeführt..."); // Gießen Sie die Pflanze, wenn es nicht regnet und die Bodenfeuchtigkeit niedrig genug ist. int readRain =digitalRead (Regensensor); if (readRain ==HIGH) {lcd.setCursor (0, 1); lcd.print("Es regnet gerade."); gehe zu a2; } // Kommentar entfernen, um Feuchtigkeitssensoren zu verwenden. // sonst if (analogRead (humidity1)> 400 || analogRead (humidity2)> 400) // Passen Sie diese an Ihren Boden an. //{ //lcd.setCursor(0, 1); // lcd.print ( "Boden zu feucht."); //zu a2 gehen; //} sonst { waterPipe.write(135); Verzögerung (7000); // Wasser für 7 Sekunden. waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print("Fertig");a2:Verzögerung(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Lernen"); aufrechtzuerhalten. Sonst if ((Monat () ==3 || Monat () ==4 || Monat () ==10) &&Stunde () ==14) { lcd.clear (); lcd.setCursor(0, 0); lcd.print("Wird ausgeführt..."); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wird ausgeführt..."); // Gießen Sie die Pflanze, wenn es nicht regnet und die Bodenfeuchtigkeit niedrig genug ist. int readRain =digitalRead (Regensensor); if (readRain ==HIGH) {lcd.setCursor (0, 1); lcd.print("Es regnet gerade."); gehe zu a31; } // Kommentar entfernen, um Feuchtigkeitssensoren zu verwenden. // sonst if (analogRead (humidity1)> 400 || analogRead (humidity2)> 400) // Passen Sie diese an Ihren Boden an. //{ //lcd.setCursor(0, 1); // lcd.print ( "Boden zu feucht."); // gehe zu a31; //} sonst { waterPipe.write(135); Verzögerung (7000); // Wasser für 7 Sekunden. waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print("Fertig");a31:delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Lernen"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Lernen"); aufrechtzuerhalten. Sonst if ((Monat () ==5 || Monat () ==6 || Monat () ==9) &&Stunde () ==15) { lcd.clear (); lcd.setCursor(0, 0); lcd.print("Wird ausgeführt..."); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wird ausgeführt..."); // Gießen Sie die Pflanze, wenn es nicht regnet und die Bodenfeuchtigkeit niedrig genug ist. int readRain =digitalRead (Regensensor); if (readRain ==HIGH) {lcd.setCursor (0, 1); lcd.print("Es regnet gerade."); gehe zu a3; } // Kommentar entfernen, um Feuchtigkeitssensoren zu verwenden. // sonst if (analogRead (humidity1)> 400 || analogRead (humidity2)> 400) // Passen Sie diese an Ihren Boden an. //{ //lcd.setCursor(0, 1); //lcd.print("Boden zu feucht."); // gehe zu a3; //} sonst { waterPipe.write(135); Verzögerung (7000); // Wasser für 7 Sekunden. waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print("Fertig");a3:Verzögerung(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Lernen"); aufrechtzuerhalten. Sonst if ((Monat () ==7 || Monat () ==8) &&Stunde () ==16) { lcd.clear (); lcd.setCursor(0, 0); lcd.print("Wird ausgeführt..."); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wird ausgeführt..."); // Gießen Sie die Pflanze, wenn es nicht regnet und die Bodenfeuchtigkeit niedrig genug ist. int readRain =digitalRead (Regensensor); if (readRain ==HIGH) {lcd.setCursor (0, 1); lcd.print("Es regnet gerade."); gehe zu a4; } // Kommentar entfernen, um Feuchtigkeitssensoren zu verwenden. // sonst if (analogRead (humidity1)> 400 || analogRead (humidity2)> 400) // Passen Sie diese an Ihren Boden an. //{ //lcd.setCursor(0, 1); // lcd.print ( "Boden zu feucht."); // gehe zu a4; //} sonst { waterPipe.write(135); Verzögerung (7000); // Wasser für 7 Sekunden. waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print("Fertig");a4:Verzögerung(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Lernen"); } Verzögerung(110000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm16 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm17 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm18 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm19 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm20 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm21 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm22 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm23 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm24 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm25 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm26 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm27 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm28 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm29 =einschränken(tm, 0, 255); Verzögerung (120000); Spannung =analogRead (Thermometer) * 3,3; Spannung /=1024,0; TemperaturC =(Spannung - 0,5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm30 =einschränken(tm, 0, 255); Verzögerung (120000); // Konvertieren Sie die Daten wieder in die Spezifikationen des Temperatursensors. tm1 =map(tm1, 0, 255, -40, 125); tm1 =einschränken(tm1, -40, 125); tm2 =map(tm2, 0, 255, -40, 125); tm2 =einschränken(tm2, -40, 125); tm3 =map(tm3, 0, 255, -40, 125); tm3 =einschränken(tm3, -40, 125); tm4 =map(tm4, 0, 255, -40, 125); tm4 =constrain(tm4, -40, 125); tm5 =map(tm5, 0, 255, -40, 125); tm5 =constrain(tm5, -40, 125); tm6 =map(tm6, 0, 255, -40, 125); tm6 =constrain(tm6, -40, 125); tm7 =map(tm7, 0, 255, -40, 125); tm7 =constrain(tm7, -40, 125); tm8 =map(tm8, 0, 255, -40, 125); tm8 =constrain(tm8, -40, 125); tm9 =map(tm9, 0, 255, -40, 125); tm9 =constrain(tm9, -40, 125); tm10 =map(tm10, 0, 255, -40, 125); tm10 =constrain(tm10, -40, 125); tm11 =map(tm11, 0, 255, -40, 125); tm11 =constrain(tm11, -40, 125); tm12 =map(tm12, 0, 255, -40, 125); tm12 =constrain(tm12, -40, 125); tm13 =map(tm13, 0, 255, -40, 125); tm13 =constrain(tm13, -40, 125); tm14 =map(tm14, 0, 255, -40, 125); tm14 =constrain(tm14, -40, 125); tm15 =map(tm15, 0, 255, -40, 125); tm15 =constrain(tm15, -40, 125); tm16 =map(tm16, 0, 255, -40, 125); tm16 =constrain(tm16, -40, 125); tm17 =map(tm17, 0, 255, -40, 125); tm17 =constrain(tm17, -40, 125); tm18 =map(tm18, 0, 255, -40, 125); tm18 =constrain(tm18, -40, 125); tm19 =map(tm19, 0, 255, -40, 125); tm19 =constrain(tm19, -40, 125); tm20 =map(tm20, 0, 255, -40, 125); tm20 =constrain(tm20, -40, 125); tm21 =map(tm21, 0, 255, -40, 125); tm21 =constrain(tm21, -40, 125); tm22 =map(tm22, 0, 255, -40, 125); tm22 =constrain(tm22, -40, 125); tm23 =map(tm23, 0, 255, -40, 125); tm23 =constrain(tm23, -40, 125); tm24 =map(tm24, 0, 255, -40, 125); tm24 =constrain(tm24, -40, 125); tm25 =map(tm25, 0, 255, -40, 125); tm25 =constrain(tm25, -40, 125); tm26 =map(tm26, 0, 255, -40, 125); tm26 =constrain(tm26, -40, 125); tm27 =map(tm27, 0, 255, -40, 125); tm27 =constrain(tm27, -40, 125); tm28 =map(tm28, 0, 255, -40, 125); tm28 =constrain(tm28, -40, 125); tm29 =map(tm29, 0, 255, -40, 125); tm29 =constrain(tm29, -40, 125); tm30 =map(tm30, 0, 255, -40, 125); tm30 =constrain(tm30, -40, 125); // Find the arithmetic mean and commit it to memory. average =(tm2 + tm3 + tm4 + tm5 + tm6 + tm7 + tm8 + tm9 + tm10 + tm11 + tm12 + tm13 + tm14 + tm15 + tm16 + tm17 + tm18 + tm19 + tm20 + tm21 + tm22 + tm23 + tm24 + tm25 + tm26 + tm27 + tm28 + tm29 + tm30) / 29; commitSample(i, average); } saveNetworkKnowledge(); // Save this new data to flash memory.z:delay(1);}void commitSample (int category, uint8_t s1){ // Commit to memory a single vector (the average), along with the category, which represents the hour of that data. uint8_t vector[1]; vector[0] =s1; CuriePME.learn(vector, 1, category);}void loop() { // Infinitely repeats. /* This code attempts to classify the optimum temperature for watering plants, 25 Celsius, among the data learned by the PME. If it can classify the data, the returned category becomes the hour at which the plant will be watered. The data is then erased and relearned, which infinitely repeats. IF IT CANNOT CLASSIFY THE DATA, it will take the monthly defaults from earlier in the sketch. */ uint8_t vector[1]; vector[0] =25; int answer =CuriePME.classify(vector, 1 ); if (answer ==CuriePME.noMatch) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("NO MATCHES!"); if (month() ==1 || month() ==2 || month() ==11 || month() ==12) { answer =12; } else if (month() ==3 || month() ==4 || month() ==10) { answer =14; } else if (month() ==5 || month() ==6 || month() ==9) { answer =15; } else if (month() ==7 || month() ==8) { answer =16; } } else { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Category:"); lcd.setCursor(0, 1); lcd.print(answer); } delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Optimization Done"); delay(3000); CuriePME.forget(); // Erase and relearn. This does not erase the flash memory. lcd.clear(); lcd.setCursor(0, 0); lcd.print("Waiting"); while (hour() !=8); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Learning"); // Learn the data again. for (int i =8; i <22; i++) { voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm1 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm2 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm3 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm4 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm5 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm6 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm7 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm8 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm9 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm10 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm11 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm12 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm13 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm14 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm15 =constrain(tm, 0, 255); // The time in the day at which to water the plant, as determined by the PME. if (hour() ==answer) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Running..."); // Water the plant if it is not raining and soil moisture is low enough. int readRain =digitalRead(rainSensor); if (readRain ==HIGH) { lcd.setCursor(0, 1); lcd.print("Raining right now."); goto a5; } // Uncomment to use moisture sensors. //else if (analogRead(humidity1)> 400 || analogRead(humidity2)> 400) // Adjust these to match your soil. //{ // lcd.setCursor(0, 1); // lcd.print("Soil too moist."); // goto a5; //} else { waterPipe.write(135); delay(7000); // Water for 7 seconds. waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print("Done");a5:delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Learning"); } delay(110000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm16 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm17 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm18 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm19 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm20 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm21 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm22 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm23 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm24 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm25 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm26 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm27 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm28 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm29 =constrain(tm, 0, 255); delay(120000); voltage =analogRead(thermometer) * 3.3; voltage /=1024.0; temperatureC =(voltage - 0.5) * 100; tm =map(temperatureC, -40, 125, 0, 255); tm30 =constrain(tm, 0, 255); delay(120000); tm1 =map(tm1, 0, 255, -40, 125); tm1 =constrain(tm1, -40, 125); tm2 =map(tm2, 0, 255, -40, 125); tm2 =constrain(tm2, -40, 125); tm3 =map(tm3, 0, 255, -40, 125); tm3 =constrain(tm3, -40, 125); tm4 =map(tm4, 0, 255, -40, 125); tm4 =constrain(tm4, -40, 125); tm5 =map(tm5, 0, 255, -40, 125); tm5 =constrain(tm5, -40, 125); tm6 =map(tm6, 0, 255, -40, 125); tm6 =constrain(tm6, -40, 125); tm7 =map(tm7, 0, 255, -40, 125); tm7 =constrain(tm7, -40, 125); tm8 =map(tm8, 0, 255, -40, 125); tm8 =constrain(tm8, -40, 125); tm9 =map(tm9, 0, 255, -40, 125); tm9 =constrain(tm9, -40, 125); tm10 =map(tm10, 0, 255, -40, 125); tm10 =constrain(tm10, -40, 125); tm11 =map(tm11, 0, 255, -40, 125); tm11 =constrain(tm11, -40, 125); tm12 =map(tm12, 0, 255, -40, 125); tm12 =constrain(tm12, -40, 125); tm13 =map(tm13, 0, 255, -40, 125); tm13 =constrain(tm13, -40, 125); tm14 =map(tm14, 0, 255, -40, 125); tm14 =constrain(tm14, -40, 125); tm15 =map(tm15, 0, 255, -40, 125); tm15 =constrain(tm15, -40, 125); tm16 =map(tm16, 0, 255, -40, 125); tm16 =constrain(tm16, -40, 125); tm17 =map(tm17, 0, 255, -40, 125); tm17 =constrain(tm17, -40, 125); tm18 =map(tm18, 0, 255, -40, 125); tm18 =constrain(tm18, -40, 125); tm19 =map(tm19, 0, 255, -40, 125); tm19 =constrain(tm19, -40, 125); tm20 =map(tm20, 0, 255, -40, 125); tm20 =constrain(tm20, -40, 125); tm21 =map(tm21, 0, 255, -40, 125); tm21 =constrain(tm21, -40, 125); tm22 =map(tm22, 0, 255, -40, 125); tm22 =constrain(tm22, -40, 125); tm23 =map(tm23, 0, 255, -40, 125); tm23 =constrain(tm23, -40, 125); tm24 =map(tm24, 0, 255, -40, 125); tm24 =constrain(tm24, -40, 125); tm25 =map(tm25, 0, 255, -40, 125); tm25 =constrain(tm25, -40, 125); tm26 =map(tm26, 0, 255, -40, 125); tm26 =constrain(tm26, -40, 125); tm27 =map(tm27, 0, 255, -40, 125); tm27 =constrain(tm27, -40, 125); tm28 =map(tm28, 0, 255, -40, 125); tm28 =constrain(tm28, -40, 125); tm29 =map(tm29, 0, 255, -40, 125); tm29 =constrain(tm29, -40, 125); tm30 =map(tm30, 0, 255, -40, 125); tm30 =constrain(tm30, -40, 125); average =(tm2 + tm3 + tm4 + tm5 + tm6 + tm7 + tm8 + tm9 + tm10 + tm11 + tm12 + tm13 + tm14 + tm15 + tm16 + tm17 + tm18 + tm19 + tm20 + tm21 + tm22 + tm23 + tm24 + tm25 + tm26 + tm27 + tm28 + tm29 + tm30) / 29; progav =(tm30 - tm2) / 2; commitSample(i, average); }}/* A quick note on the flash memory data:The data will only ever be saved once; that is, it cannot be changed with this code. As a result, if the device loses power, IT WILL DEFAULT TO THE SETTINGS OF THE FIRST TIME IT WAS USED WHEN IT IS REACTIVATED, even if the monthly averages have changed. Keeping the device on an extra day will allow it to software obtain new averages, but the flash memory will stay the same. To erase flash completely, upload "EraseEverything" from "CurieSerialFlash" in the IDE. Then reupload this sketch to save new averages to the flash memory.*/void saveNetworkKnowledge() // Code for saving to flash memory....This file has been truncated, please download it to see its full contents.

Schaltpläne

Fritzing diagram for the circuit. Note that batteries would be attached on the left. The soil moisture sensors are optional. rainpoweredsmartirrigationsystem_OHtd4bVfb3.fzz

Herstellungsprozess

  1. Titan
  2. Kastagnetten
  3. Kleber
  4. Thread
  5. Acetylen
  6. Asbest
  7. Würfel
  8. Zinn
  9. Raspberry Pi Automatisierte Pflanzenbewässerung mit Website
  10. Siemens, Bentley führt Lösung zur Beschleunigung der Anlagendigitalisierung ein