Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Een oplossing voor het bewateren van stedelijke planten

Componenten en benodigdheden

Bodemvochtsensor
Elke bodemvochtsensor met analoge uitgang kan worden gebruikt. Twee elektroden en een spanningsdeler kunnen ook worden gebruikt. DIT ZIJN OPTIONEEL.
× 2
Regensensor
× 1
Melkkan
Elke container die water kan bevatten, kan worden gesneden en aan een oppervlak kan worden bevestigd, is voldoende. op een verhoogd oppervlak worden gemonteerd.
× 1
Zacht plastic flexibele holle buis
Elke vorm van slangen is voldoende. Ik heb een springtouw gebruikt waarvan de uiteinden zijn afgesneden, omdat het erg flexibel is en het midden hol is.
× 1
Jumperdraden (algemeen)
Meer of minder.
× 37
SparkFun Inventor's Kit voor Arduino 101
Ik gebruikte de Arduino 101, servo, breadboard, potentiometer en LCD.
× 1
Modelklei
× 1
Korte plastic staaf
Of een niet-flexibele staaf. Dit wordt gebruikt om de uitlaatpijp van de watertank te ondersteunen.
× 1
Weerstand 330 ohm
× 1

Benodigde gereedschappen en machines

Schaar
Phillips-schroevendraaier
Elektrische tape
en ook gewone tape.

Apps en online services

Nordic Semiconductor nRF Connect SDK
Arduino IDE

Over dit project

Dit apparaat verbetert de irrigatie van planten in stedelijke omgevingen. Aangedreven door een Arduino 101, gebruikt het ingebouwde tools samen met een paar externe sensoren om de optimale omstandigheden te berekenen voor het bewateren van planten in zijn eigen omgeving, en bewatert de plant vervolgens zelf op het berekende tijdstip.

Het is gebaseerd op de volgende concepten:

Zwaartekracht en druk

Dit apparaat haalt zijn waterbron uit een reservoir, dat ik heb gemaakt met een melkkan, plastic slang, klei voor het afdichten van de slang en een servo. Deze container is zo geplaatst dat hij niet alleen verhoogd is, maar ook regenwater van boven het apparaat kan opvangen.

De kan wordt voornamelijk gevuld met een huishoudelijke watervoorziening (doordat regen niet altijd beschikbaar is), maar wordt aangevuld met regenwater. Wanneer er water in de kan aanwezig is, trekt de aantrekkingskracht van de zwaartekracht het water naar de aarde in de kan. In de bodem van de kan is een gat gemaakt om een ​​uitgangspijp in te kunnen steken. De zwaartekracht trekt dus water door deze uitlaatpijp. De servo regelt wanneer water de leiding volledig kan verlaten. Onder normale omstandigheden staat de servo-arm rechtop, waardoor er geen water uit de buis kan stromen. Bij het bewateren van de plant zakt de arm echter 135 graden, waardoor het water uit de leiding kan stromen en de planten kunnen irrigeren. De arm gaat weer omhoog zodra dit is voltooid.

De druk van het water tegen de kan draagt ​​niet alleen bij aan de stabiliteit van de kan, maar helpt ook bij het weglopen van het water, waardoor een continue waterstroom tijdens het irrigeren mogelijk is.

TMP36-temperatuursensor en de Intel Curie Pattern Matching Engine

Deze combinatie van concepten helpt om de berekening aan te sturen die de optimale tijd voor het bewateren van planten bepaalt. De TMP36 is een temperatuursensor die werkt als een thermometer, maar met een elektronische analoge uitgang. Deze output kan worden uitgelezen door een apparaat, zoals een microcontroller, en omgezet in een temperatuur. In dit project probeert het apparaat de optimale tijd voor het bewateren van planten te berekenen, die het dichtst bij 25 graden Celsius ligt. Het maakt 30 records per uur, met tussenpozen van twee minuten, en berekent aan het einde van elke periode het gemiddelde van 29 hiervan (exclusief de eerste, omdat deze meestal onnauwkeurig is). Dit is waar de Pattern Matching Engine van pas komt.

De Intel Curie PME, of pattern-matching engine, is een kunstmatig neuraal netwerk ingebouwd in de Arduino 101. De bibliotheken zijn beschikbaar op GitHub. Het bestaat uit 128 neuronen en is in staat om gegevens te leren en te classificeren, opgeslagen in vectoren, op basis van bestaande gegevens of vectoren die in categorieën zijn ingedeeld. Hoe meer categorieën beschikbaar zijn, hoe meer opties voor classificatie door de PME kunnen worden nagestreefd.

De PME registreert voor dit project temperatuurgegevens over een dag en probeert daarin de optimale conditie, 25 graden Celsius, te classificeren. Het resultaat wordt de volgende dag de tijd om de plant water te geven.

De gegevens worden elk uur geregistreerd van 08.00 uur tot 21.00 uur. De eerste keer dat dit wordt gedaan, worden de gegevens opgeslagen op de Onboard Serial Flash . Hierdoor kan het apparaat opstarten naar een dataset, zelfs als het is uitgeschakeld. Na het verkrijgen van de dataset probeert het de optimale omstandigheden te classificeren. Als hij daartoe in staat is, wordt de geselecteerde categorie het uur dat gebruikt wordt voor de volgende ronde. Als dat niet het geval is, gebruikt het apparaat maandelijkse constanten of het tijdstip van elke maand waarop de temperatuur het hoogst is. Opgemerkt moet worden dat dit niet altijd de beste temperaturen zijn om planten water te geven , daarom heb ik de PME gebruikt.

Na de eerste leersessie worden de gegevens gewist en de volgende dag opnieuw geleerd, waarbij de plant op het gekozen uur wordt bewaterd. Deze cyclus wordt oneindig herhaald, of totdat het apparaat wordt losgekoppeld van de stroom, waarna het, wanneer het weer wordt ingeschakeld, de opgeslagen parameters als het geselecteerde uur gebruikt en blijft doorgaan.

Intel Curie real-time klok en Bluetooth Low Energy

De Intel Curie RTC, of ​​real-time klok, is een cruciaal onderdeel van dit apparaat. De RTC regelt wanneer alles op het apparaat plaatsvindt. Voor dit project is de RTC vooral essentieel voor het bijhouden van het uur dat wordt gebruikt voor het bewateren van de plant en wanneer gegevens moeten worden geregistreerd, en de maand die wordt gebruikt om de back-uppiektemperatuurconstanten te bepalen. De precieze datum voor deze RTC moet echter handmatig worden ingesteld, in code of door gebruikersinvoer. Dit is opgelost met BLE.

Bluetooth Low Energy is een nieuwere versie van Bluetooth die is ontworpen voor apparaten met een laag stroomverbruik. Het werkt op een centraal-periferaal systeem, waar een centrale, of ingang, schrijft naar randapparatuur of uitgangen. Dit werkt meer als een bulletinboard-systeem, waarbij de centrale gegevens op een bulletin plaatst zodat alle randapparatuur kan worden gelezen. In dit geval gebruikte ik nRF Connect van Nordic Semiconductor op mijn mobiele apparaat als centrale en de Arduino 101 als randapparaat. Het mobiele apparaat heeft de mogelijkheid om verbinding te maken met de Arduino en er gegevens naar te verzenden. In dit geval moet het mobiele apparaat vier keer gegevens verzenden, één keer voor elk van de vereiste invoervelden.

De gegevensinvoer op het mobiele apparaat wordt in hexadecimaal ingevoerd. Dit is vrij eenvoudig te converteren vanaf basis 10, maar er kan een online converter worden gebruikt.

Hoe te bouwen

Het bouwen van deze irrigatieoplossing vereist een beetje kennis van circuits, maar niet te veel. Het vereist ook een paar niet-elektrische componenten om te voltooien. Hier is de complete onderdelenlijst:

Elektrische componenten

  • Arduino 101
  • 400 stropdas breadboard, met +- rails
  • Draaipotentiometer
  • 16x2 LCD
  • 330 Ohm weerstand
  • TMP36 temperatuursensor
  • 180 graden servo, met servohoorn
  • Regensensor en besturingskaart
  • Bodemvochtsensor en besturingskaart (optioneel, hardware meegeleverd als referentie)
  • Een aanzienlijk aantal jumperdraden; zie het Fritzing-diagram

Om op batterijen te werken (kan niet te lang meegaan; de opstelling die ik heb gebruikt):

  • 2X 4xAA batterijboxen met aan/uit schakelaar en draadkabels
  • 8X AA 1,2V oplaadbare NiMH-batterijen

Om op USB-stroom te werken, vanaf een muurwrat of een laptop:

  • USB Male A - Male B-kabel, waarvan de lengte afhangt van uw behoeften

Niet-elektrische hardwarecomponenten

  • Melkkan
  • Flexibele plastic slang, ongeveer 20-30 cm lang
  • Boetseerklei, hete lijm of iets anders dat als afdichtmiddel kan worden gebruikt
  • Plastic staaf, om de buisarm te ondersteunen
  • Ambachtelijke mand, om het apparaat in op te bergen
  • Verhoogd oppervlak om de kan vast te houden, bijvoorbeeld een kleine bank of een tafel
  • Een plant

Hulpprogramma's

  • Tape, zowel normaal als elektrisch
  • Schaar
  • Phillips-schroevendraaier, om de servohoorn aan de servo te bevestigen

Stappen

1. Bouw het circuit op volgens het onderstaande Fritzing-diagram. Houd er rekening mee dat de bodemvochtsensoren optioneel zijn en dat de regensensor en servo mogelijk langere draden moeten hebben om de gewenste locaties te bereiken. Zie de tweede foto hieronder voor de definitieve opstelling van het circuit.

2. (Ga door naar stap 5 als u USB-voeding gebruikt). Plaats batterijen in de twee batterijkasten en bind de positieve kabel van de ene doos en de negatieve kabel van de andere samen.

3. Plak de dozen aan elkaar met isolatietape. Zet de dozen zo vast dat de deksels van beide zijn bevestigd en de koffers van beide zijn bevestigd, en de deksel kan als één stuk worden verwijderd. Laat de sleuven open voor de aan/uit-schakelaars.

4. Plak het dubbele deksel van de accubak vast aan de onderkant van de Arduino 101 en het breadboard. Hierdoor kunnen de batterijen gemakkelijk worden vervangen door ze onder het bord uit te schuiven.

5. Plaats het apparaat in de knutselmand en snijd twee sleuven aan één kant van het apparaat. De eerste sleuf is voor programmering (of USB-voeding als u daarvoor kiest), en de tweede is een uitgang voor de sensoren en actuatoren die zich niet op het apparaat bevinden. Gebruik gerust isolatietape om losse draden in dit stopcontact aan elkaar te bevestigen.

6. Neem een ​​melkkan en snijd de bovenkant eraf, zodat de kan een opening heeft die groot genoeg is om water op te vangen en een capaciteit heeft die groot genoeg is om betrouwbaar te zijn. Ik raad aan om de snede ergens dicht bij de basis van het handvat te maken.

7. Snijd een klein gaatje in de bodem van de kan direct onder het grootste deel van de opening in de bovenkant van de kan. Steek het ene uiteinde van de plastic slang in dit gat. Zorg ervoor dat het gat klein genoeg is om de pijp op zijn plaats te houden, maar groot genoeg om de pijp niet samen te drukken.

8. Gebruik de klei om de boven- en onderkant rond de pijp in het gat af te dichten. Zorg ervoor dat de klei niet in de pijp zelf komt.

9. Gebruik de klei en elektrische tape om de servo zo laag mogelijk op de basis van de melkkan te bevestigen. Tape het midden van de buis en een plastic staaf aan de servohoorn. Zorg ervoor dat de plastic staaf ook aan het bovenste uiteinde van de buis is geplakt. Gebruik de onderstaande afbeelding als referentie voor stap 8 tot 10.

10. Zet de kan vast op het verhoogde oppervlak. Gebruik indien nodig tape.

11. Plaats een plant in verlaagde stand net onder de buisuitlaat. Steek de vochtsensoren in de grond als je ze gebruikt en plaats de regensensor dicht bij de plant langs de vloer. Steek de sensoren en servo in het apparaat, waarbij het apparaat iets verder van de kan en plant wordt geplaatst.

Programmeren

Programmeer de Arduino 101 met de bijgevoegde code. Upload met behulp van de Arduino IDE en Curie Core 2.0.2 of hoger (indien beschikbaar). Veel nuttige opmerkingen zijn opgenomen in de code.

Apparaatbediening

Wanneer het apparaat voor het eerst wordt ingeschakeld, wacht het totdat een mobiel apparaat is verbonden. Zodra een apparaat is aangesloten via nRF Connect, wacht het op tijdinvoer. Om dit te doen, typt u achtereenvolgens de hexadecimale codes voor de basis 10 uur, minuten, dag en maand in nRF Connect, zoals weergegeven in het onderstaande diagram.

Een ID-invoer, of een willekeurig nummer, moet worden ingevoerd en verzonden voordat de tijden worden ingevoerd.

Na het invoeren van de tijd wacht de 101 tot het mobiele apparaat de verbinding verbreekt. Nadat het dit heeft gedaan, wacht het tot 8 uur 's ochtends, de huidige dag of de volgende.

Bij het bereiken van 8 uur 's ochtends zal het bord controleren of er iets is opgeslagen in het flashgeheugen. Zo niet, dan zal het het 14-uurs verzamelproces doorlopen zoals eerder beschreven, en vervolgens de gegevens classificeren en het optimale tijdstip bepalen, waarna het de verzamelcyclus zal herhalen. Als er iets is opgeslagen, worden die gegevens gebruikt als de uurconstante en gaan de cycli gewoon door.

Gedurende de perioden dat de plank de plant water geeft, zal de aanwezigheid van regen of een teveel aan bodemvocht (optioneel) voorkomen dat de plant water krijgt. Het zal dan de bewatering van de dag overslaan en wachten op de volgende.

Deze oplossing is ontworpen om de irrigatie van stedelijke planten eenvoudiger en meer geoptimaliseerd te maken door een automatische instelling te gebruiken om hiervoor te zorgen. Het bespaart ook regenwater samen met bestaande huisvoorraden door een reservoir te gebruiken, waardoor regen die niet op de planten is gericht, goed wordt gebruikt.

Hopelijk zal dit project van onze steeds veranderende wereld een iets betere plek maken!

Code

  • Arduino 101 irrigatiesysteem
Arduino 101 irrigatiesysteemArduino
Code voor het bedienen van het Arduino 101-irrigatiesysteem. Upload met Curie core 2.0.2 en elke 1.8.x of hogere IDE. CuriePME is te vinden op GitHub.
/*Dit is een schets voor een stedelijke irrigatie-oplossing. Het gebruikt de CuriePME om temperatuurgegevens te leren en de optimale bewateringsconditie van de plant te classificeren. Het geeft vervolgens de plant water op dat moment en leert de gegevens opnieuw en fietst oneindig. Houd er rekening mee dat deze schets VOOR 8 uur van de beoogde dag MOET WORDEN UITGEVOERD om het apparaat te starten. Gegevensbronnen:"WeatherSpark.com." Gemiddeld weer in Vancouver, Canada, het hele jaar door - Weather Spark. n.p., n.d. Web. 04 juli 2017. ."Just 4 Growers:Global Garden Community." Alleen voor kwekers. n.p., n.d. Web. 10 juli 2017. . */// Bibliotheken voor gebruik met deze code. Ze zijn allemaal te vinden in de ide, behalve CuriePME. CuriePME kan worden gedownload van de GitHub-repository.#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 constanten/variabelen.#define thermometer A3 #define rainSensor 1#define vochtigheid1 A4#define vochtigheid2 A1int tm1;int tm2;int tm3;int tm4;int tm5;int tm6;int tm7;int tm8;int tm9;int tm10;int tm11;int tm1312;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 tm29;;int gemiddelde;int progav;vlotterspanning;vlottertemperatuurC;int tm;int uurTijd =-1;int minuutTijd =-1;int dagTijd =-1;int maandTijd =-1;int confirmTime =-1;// BLE-service data.BLEService plantService("19B10000-E8F2-537E-4F6C-D104768A1214");// BLE-kenmerk, leesbaar/beschrijfbaar door centrale.BLEUnsignedCharacteristic timeCha racteristisch ("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);void setup() { // Dit wordt eenmaal uitgevoerd. waterPipe.attach(9); waterPipe.write(0); pinMode (regensensor, INGANG); lcd.begin (16, 2); // Begin en wis het LCD-scherm. lcd.wissen(); if (!SerialFlash.begin(ONBOARD_FLASH_SPI_PORT, ONBOARD_FLASH_CS_PIN)); lcd.setCursor(0, 0); lcd.print ("Invoertijd:BLE"); // Initialiseer de BLE-service met naam, service, kenmerk en kenmerkwaarde. BLE.begin(); BLE.setLocalName ("Arduino 101"); BLE.setAdvertisedService(plantService); plantService.addCharacteristic(timeCharacteristic); BLE.addService(plantService); timeCharacteristic.setValue(0); // 0 tot geschreven door centraal. BLE.adverteren(); lcd.setCursor(0, 1); lcd.print("Wachten"); // Klaar om te connecteren.x:BLEDevice central =BLE.central(); if (central) { // Als een apparaat verbinding maakt met het bord. lcd.setCursor(8, 1); lcd.print("Gereed"); vertraging (3000); while (central.connected()) { // Terwijl het apparaat nog steeds verbonden is. if (timeCharacteristic.written()) { // Code die opeenvolgend alle tijdvariabele slots opvult nadat elke byte vanaf het apparaat is verzonden. Gegevens worden vier keer verzonden, plus één voor bevestiging van koppeling. if (confirmTime ==-1) { confirmTime =timeCharacteristic.value(); } else if (hourTime ==-1) { hourTime =timeCharacteristic.value(); } else if (minuteTime ==-1) { minuteTime =timeCharacteristic.value(); } else if (dayTime ==-1) { dayTime =timeCharacteristic.value(); } else if (monthTime ==-1) { monthTime =timeCharacteristic.value(); lcd.wissen(); lcd.setCursor(0, 0); lcd.print("Tijd ingesteld."); lcd.setCursor(0, 1); lcd.print("Apparaat loskoppelen."); } } } } else { ga naar x; // Loop terug als er nog geen apparaat is aangesloten. } // Stel de tijd in met de verzamelde variabelen. Seconden en jaar zijn niet van belang voor dit systeem. setTime (hourTime, minuteTime, 00, dayTime, MonthTime, 2017); // Initialiseer de PME. lcd.wissen(); CuriePME.begin(); lcd.setCursor(0, 0); lcd.print("Bezig met opslaan."); vertraging (3000); const char *bestandsnaam ="NeurData.dat"; if (check_if_exists(bestandsnaam) ==true) { restoreNetworkKnowledge(); lcd.setCursor(0, 1); lcd.print("Gevonden!"); vertraging (3000); lcd.wissen(); ga naar z; } else { lcd.setCursor(0, 1); lcd.print("Niet gevonden!"); vertraging (3000); lcd.wissen(); } /* Het resterende deel van de installatie verzamelt temperatuurgegevens in de loop van de dag. Het voert 30 controles per uur uit, met tussenpozen van 2 minuten, en aan het einde van het uur neemt het een gemiddelde van de uurgegevens door het rekenkundig gemiddelde te vinden van alle gegevens behalve de eerste scan. Dit gemiddelde wordt vervolgens in de PME gezet en geleerd. Dit herhaalt zich van 08.00 uur tot 21.00 uur, waarna de volledige dataset die door de PME is geleerd, standaard wordt opgeslagen in het CurieFlash-geheugen voor als en wanneer het apparaat stroom verliest of opnieuw moet worden opgestart. */ lcd.clear(); lcd.setCursor(0, 0); lcd.print("Leren"); for (int i =8; i <22; i++) // Herhaal dit 14 keer, elke keer opslaan onder een andere categorie. { // Verzamel 30 stukjes temperatuurgegevens, opgeslagen als een int toegewezen tussen 0 en 255. voltage =analogRead (thermometer) * 3.3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm1 =beperking (tm, 0, 255); vertraging (114000); // Compenseer bovenstaande vertraging van de check. spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm2 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm3 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm4 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm5 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm6 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm7 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm8 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm9 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm10 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm11 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm12 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm13 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm14 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm15 =beperking (tm, 0, 255); // Tijdens de eerste leerperiode wordt de plant water gegeven op het hoogtepunt van de temperaturen van die maand. if ((maand() ==1 || maand() ==2 || maand() ==11 || maand() ==12) &&uur() ==12) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Loopt..."); // Geef de plant water als het niet regent en het bodemvocht laag genoeg is. int readRain =digitalRead (regenSensor); if (readRain ==HOOG) { lcd.setCursor (0, 1); lcd.print("Het regent nu."); ga naar a2; } // Uncomment om vochtsensoren te gebruiken. // else if (analogRead (humidity1)> 400 || analogRead (humidity2)> 400) // Pas deze aan zodat ze overeenkomen met uw bodem. //{ //lcd.setCursor (0, 1); //lcd.print("Bodem te vochtig."); //ga naar a2; //} else { waterPipe.write (135); vertraging (7000); // Geef 7 seconden water. waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print("Gereed");a2:vertraging(3000); lcd.wissen(); lcd.setCursor(0, 0); lcd.print("Leren"); } else if ((maand() ==3 || maand() ==4 || maand() ==10) &&uur() ==14) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Loopt..."); lcd.wissen(); lcd.setCursor(0, 0); lcd.print("Loopt..."); // Geef de plant water als het niet regent en het bodemvocht laag genoeg is. int readRain =digitalRead (regenSensor); if (readRain ==HOOG) { lcd.setCursor (0, 1); lcd.print("Het regent nu."); ga naar a31; } // Uncomment om vochtsensoren te gebruiken. // else if (analogRead (humidity1)> 400 || analogRead (humidity2)> 400) // Pas deze aan zodat ze overeenkomen met uw bodem. //{ //lcd.setCursor (0, 1); //lcd.print("Bodem te vochtig."); //ga naar a31; //} else { waterPipe.write (135); vertraging (7000); // Geef 7 seconden water. waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print("Gereed");a31:vertraging(3000); lcd.wissen(); lcd.setCursor(0, 0); lcd.print("Leren"); lcd.wissen(); lcd.setCursor(0, 0); lcd.print("Leren"); } else if ((maand() ==5 || maand() ==6 || maand() ==9) &&uur() ==15) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Loopt..."); lcd.wissen(); lcd.setCursor(0, 0); lcd.print("Loopt..."); // Geef de plant water als het niet regent en het bodemvocht laag genoeg is. int readRain =digitalRead (regenSensor); if (readRain ==HOOG) { lcd.setCursor (0, 1); lcd.print("Het regent nu."); ga naar a3; } // Uncomment om vochtsensoren te gebruiken. // else if (analogRead (humidity1)> 400 || analogRead (humidity2)> 400) // Pas deze aan zodat ze overeenkomen met uw bodem. //{ //lcd.setCursor (0, 1); //lcd.print("Bodem te vochtig."); //ga naar a3; //} else { waterPipe.write (135); vertraging (7000); // Geef 7 seconden water. waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print("Gereed");a3:vertraging(3000); lcd.wissen(); lcd.setCursor(0, 0); lcd.print("Leren"); } else if ((maand() ==7 || maand() ==8) &&uur() ==16) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Loopt..."); lcd.wissen(); lcd.setCursor(0, 0); lcd.print("Loopt..."); // Geef de plant water als het niet regent en het bodemvocht laag genoeg is. int readRain =digitalRead (regenSensor); if (readRain ==HOOG) { lcd.setCursor (0, 1); lcd.print("Het regent nu."); ga naar a4; } // Uncomment om vochtsensoren te gebruiken. // else if (analogRead (humidity1)> 400 || analogRead (humidity2)> 400) // Pas deze aan zodat ze overeenkomen met uw bodem. //{ //lcd.setCursor (0, 1); //lcd.print("Bodem te vochtig."); //ga naar a4; //} else { waterPipe.write (135); vertraging (7000); // Geef 7 seconden water. waterPipe.write(0); } lcd.setCursor(0, 1); lcd.print("Gereed");a4:vertraging(3000); lcd.wissen(); lcd.setCursor(0, 0); lcd.print("Leren"); } vertraging (110000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm16 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm17 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm18 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm19 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm20 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm21 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm22 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm23 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm24 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm25 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm26 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm27 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm28 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm29 =beperking (tm, 0, 255); vertraging (120000); spanning =analoog lezen (thermometer) * 3,3; spanning /=1024,0; temperatuurC =(spanning - 0,5) * 100; tm =kaart(temperatuurC, -40, 125, 0, 255); tm30 =beperking (tm, 0, 255); vertraging (120000); // Zet de gegevens opnieuw om naar de specificaties van de temperatuursensor. tm1 =kaart (tm1, 0, 255, -40, 125); tm1 =beperking (tm1, -40, 125); tm2 =kaart (tm2, 0, 255, -40, 125); tm2 =beperking (tm2, -40, 125); tm3 =kaart (tm3, 0, 255, -40, 125); tm3 =beperking (tm3, -40, 125); tm4 =kaart (tm4, 0, 255, -40, 125); tm4 =beperking (tm4, -40, 125); tm5 =kaart (tm5, 0, 255, -40, 125); tm5 =beperking (tm5, -40, 125); tm6 =kaart (tm6, 0, 255, -40, 125); tm6 =beperking (tm6, -40, 125); tm7 =kaart (tm7, 0, 255, -40, 125); tm7 =beperking (tm7, -40, 125); tm8 =kaart (tm8, 0, 255, -40, 125); tm8 =beperking (tm8, -40, 125); tm9 =kaart (tm9, 0, 255, -40, 125); tm9 =beperking (tm9, -40, 125); tm10 =kaart (tm10, 0, 255, -40, 125); tm10 =beperking (tm10, -40, 125); tm11 =kaart (tm11, 0, 255, -40, 125); tm11 =beperking (tm11, -40, 125); tm12 =kaart (tm12, 0, 255, -40, 125); tm12 =beperking (tm12, -40, 125); tm13 =kaart (tm13, 0, 255, -40, 125); tm13 =beperking (tm13, -40, 125); tm14 =kaart (tm14, 0, 255, -40, 125); tm14 =beperking (tm14, -40, 125); tm15 =kaart (tm15, 0, 255, -40, 125); tm15 =beperking (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); } vertraging (3000); lcd.wissen(); lcd.setCursor(0, 0); lcd.print("Optimization Done"); vertraging (3000); CuriePME.forget(); // Erase and relearn. This does not erase the flash memory. lcd.wissen(); lcd.setCursor(0, 0); lcd.print("Waiting"); while (hour() !=8); lcd.wissen(); 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.wissen(); 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.

Schema's

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

Productieproces

  1. Titanium
  2. Castanets
  3. Lijm
  4. Thread
  5. Acetyleen
  6. Asbest
  7. Dobbelstenen
  8. Multiplex
  9. Tin
  10. Raspberry Pi geautomatiseerde bewatering van planten met website
  11. Siemens, Bentley lanceert oplossing om fabrieksdigitalisering te versnellen