Öntözési figyelmeztetés a páratartalom-érzékelőkre. Beltéri növények automatikus öntözése Arduino-n

A projekt megvalósításához telepítenünk kell a könyvtárat:

  • iarduino_4LED könyvtár (négy számjegyű LED jelzővel való munkához).

A könyvtárak telepítését a Wiki oldalon találja - Könyvtárak telepítése az Arduino IDE-ben.

Videó:

Bekötési rajz:

Ebben a leckében a LED-jelző a 2-es és 3-as digitális érintkezőhöz, a gombok a 11-es és 12-es digitális érintkezőhöz, a tápkapcsoló a 10-es digitális érintkezőhöz (PWM-mel), a talajnedvesség-érzékelő analóg bemenethez csatlakozik. A0.

Munka algoritmus:

  • Az áramellátás bekapcsolásakor, a készülék nem aktív (az aktuális talajnedvesség-érték villog a kijelzőn).
    • Ha egyszer megnyomja mindkét „A” és „B” gombot, a talajnedvesség pillanatnyi állapota elmentődik küszöbként (az, amelyiknél az öntözést el kívánja kezdeni), és a készülék működési módba kapcsol. A talajnedvesség-küszöb értékbeviteli módban módosítható.
    • Ha 2 másodpercnél hosszabb ideig lenyomva tartja mindkét „A” és „B” gombot, a készülék értékbeviteli módba lép.
  • Üzemmódban a készülék kijelzi a mért értékeket a kijelzőn: aktuális talajnedvesség, talajnedvesség küszöbérték és az utolsó öntözés óta eltelt idő. (A talajnedvesség küszöbértéke halványabbnak tűnik, mint más értékek.) Ha a készülék működési módban van, és az aktuális talajnedvesség-érték a talajnedvesség küszöbértéke alá esik, a készülék öntözési üzemmódba kapcsol.
  • Öntözés üzemmódban a készülék megjeleníti az öntözés végéig eltelt másodpercek számát a jelzőn, és pontokkal villog, valamint PWM jelet küld a bekapcsológombnak, amely bekapcsolja a szivattyút. A PWM értéke (a szivattyú motor fordulatszáma) a vázlaton látható. Az öntözés időtartama értékbeviteli módban állítható be. Az öntözés végén a készülék készenléti üzemmódba kapcsol.
  • Készenléti állapotban a készülék kijelzi a STOP feliratot a jelzőn, és pontokkal villog. Ez az üzemmód annak biztosítására szolgál, hogy a nedvesség egyenletesen oszlik el a talajon, mielőtt a készülék működési módba kapcsolna. A készenléti állapotban töltött idő a vázlaton látható. A készenléti idő letelte után a készülék működési módba lép.
  • Lépjen be az érték módba Bármely üzemmódból válthat, ha 2 másodpercnél hosszabb ideig lenyomva tartja az „A” és „B” gombot. Ez a mód két elemből áll: a talajnedvesség küszöbértékének beállítása (amelynél el kell kezdeni az öntözést) és magának az öntözésnek az időtartamát. Először a páratartalom küszöbértéke jelenik meg, amelyet az "A" (csökkentés) vagy a "B" (növelés) gomb lenyomásával vagy nyomva tartásával lehet megváltoztatni. Ha egyszer megnyomja mindkét „A” és „B” gombot, az érték az aktuális talajnedvességre változik. A páratartalom küszöbértékének beállítása után az "A" és a "B" gombot 2 másodpercnél tovább kell nyomva tartani, a képernyőn megjelenik az öntözés időtartama, amelyet az "A" gomb megnyomásával vagy nyomva tartásával lehet megváltoztatni. (csökkentés), vagy a "B" gombbal (növelés). Az öntözés időtartamának beállítása után nyomja meg és tartsa lenyomva mindkét „A” és „B” gombot 2 másodpercnél hosszabb ideig, a készülék működési módba lép.
  • Ha öntözési módban bármelyik gombot megnyomja, az egység leállítja az öntözést és készenléti üzemmódba lép.
  • Ha készenléti állapotban bármelyik gombot megnyomja, a készülék munkamódba lép.

Program kód:

#beleértve // a könyvtár csatlakoztatása a négyjegyű LED-jelzővel való munkához iarduino_4LED dispLED(2,3); // objektum deklarálása az iarduino_4LED könyvtárfüggvényekkel való munkavégzéshez, jelezve a jelzőtűket (CLK , DIO) const uint8_t pinSensor = A0; // deklarálunk egy konstanst, amely jelzi az analóg bemenet számát, amelyhez a talajnedvesség-érzékelő csatlakozik const uint8_t pinButtonA = 12; // deklarálunk egy konstanst, amely azt a pin-számot jelzi, amelyhez az A gomb csatlakozik const uint8_t pinButtonB = 11; // deklarálunk egy konstanst, amely jelzi a pin számot, amelyhez a B gomb csatlakozik const uint8_t pinPump = 10; /* PWM kimenet */ // deklarál egy állandót, amely jelzi annak a kimenetnek a számát, amelyre a tápkapcsoló csatlakozik uint8_t btnState; // deklarál egy változót a gombállapotok tárolására: 0-nem lenyomva, 1-A lenyomva, 2-B lenyomva, 3-A és B nyomva, 4-A tartva, 5-B lenyomva, 6-A és B lenyomva uint16_t arrNedvesség; // deklarál egy tömböt az utolsó 10 talajnedvesség érték tárolására uint32_t valMoisture; // deklarálunk egy változót az átlagos talajnedvesség kiszámításához uint32_t timWatering; // deklarálunk egy változót az utolsó öntözés kezdési időpontjának tárolására (ezredmásodpercben) uint32_t timSketch; // deklarálunk egy változót a vázlat kezdete óta eltelt idő tárolására (ezredmásodpercben) const uint8_t timWaiting = 60; // Állandó deklarálása az öntözés utáni várakozási idő tárolására (másodpercben) 0 és 99 között const uint8_t pwmPump = 100; // deklarálunk egy állandót a szivattyú motor forgási sebességének (együttható) tárolására 0 és 255 között uint16_t timDuration = 5; /* alapértelmezés szerint */ // deklarál egy változót az öntözési időtartam tárolására (másodpercben) 0 és 99 között uint16_t limMoisture = 0; /* alapértelmezés szerint */ // deklarál egy változót a talajnedvesség küszöbértékének tárolására (a szivattyú bekapcsolásához) 0 és 999 között uint8_t modState = 0; /* induláskor */ // deklarál egy változót az eszköz állapotának tárolására: 0-inaktív, 1-várakozik, 2-aktív, 3-öntözés, 4-páratartalom küszöb beállítása, 5-öntözési idő beállítása void setup ()( dispLED. begin(); // iniciálja a LED jelzőfényét pinMode(pinButtonA, INPUT); // a pinButtonA beállítása bemeneti módra pinMode(pinButtonB, INPUT); // a pinButtonB beállítása pinMode(pinPump, OUTPUT) módba lépéshez; / / a kimeneti pinPump beállítása kilépési módból digitalWrite(pinPump, LOW); // kikapcsolja a szivattyút timWatering = 0; // az utolsó öntözés kezdési időpontjának visszaállítása ) void loop()( //********Olvasás data:****** * btnState = Func_buttons_control(); // beolvassa a gombok állapotát, de legfeljebb 2 másodpercig timSketch = millis(); // beolvassa az aktuális időt a vázlat kezdete óta if( timWatering>timSketch)(timWatering=0;) // az utolsó öntözés kezdési időpontjának visszaállítása, ha a millis() túlcsordul valMoisture = 0; for(int i=0; i<9; i++){arrMoisture[i]=arrMoisture;} arrMoisture=analogRead(pinSensor); for(int i=0; i<10; i++){valMoisture+=arrMoisture[i];} valMoisture/=10; // вычисляем среднее значение влажности почвы //*******Управление устройством:******* switch(modState){ // Устройство не активно case 0: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=4;} if(btnState==3){modState=2; limMoisture=valMoisture;} } if(timSketch%100==0){ // если начинается десятая доля секунды if(timSketch/1000%2){dispLED.print(valMoisture);}else{dispLED.print(" ");} } break; // Устройство в режиме ожидания (после полива) case 1: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=4;} if(btnState==1){modState=2;} if(btnState==2){modState=2;} if(btnState==3){modState=2;} } if(timSketch%100==0){ // если начинается десятая доля секунды dispLED.print("stop"); dispLED.point((timSketch/100%4)+1,true); } if(timDuration+timWaiting-((timSketch-timWatering)/1000)<=0){// если закончилось время ожидания modState=2; } break; // Устройство активно case 2: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=4; dispLED.light(7);} } if(timSketch%100==0){ // если начинается десятая доля секунды if(timSketch/1000%15<5){dispLED.light(7); dispLED.print(valMoisture);}else if(timSketch/1000%15<10){dispLED.light(1); dispLED.print(limMoisture,LEN4);}else {dispLED.light(7); if(timWatering){dispLED.print(int((timSketch-timWatering)/1000%3600/60),int((timSketch-timWatering)/1000%3600%60),TIME);}else{dispLED.print("----");}} } if(valMoisture<=limMoisture){ // если текущая влажность почвы меньше пороговой timWatering=timSketch; modState=3; dispLED.light(7); analogWrite(pinPump,pwmPump); } break; // Устройство в режиме полива case 3: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=4;}else{modState=1;} analogWrite(pinPump,0); } if(timSketch%100==0){ // если начинается десятая доля секунды dispLED.print(timDuration-((timSketch-timWatering)/1000)); dispLED.point(0,true); dispLED.point((timSketch/100%4)+1,true); } if(timDuration-((timSketch-timWatering)/1000)<=0){// если закончилось время полива modState=1; analogWrite(pinPump,0); } break; // Устройство в режиме установки пороговой влажности почвы case 4: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=5;} if(btnState==1){if(limMoisture>0)(limMoisture--;)) if(btnState==2)(if(limMoisture<999){limMoisture++;}} if(btnState==3){limMoisture=valMoisture;} if(btnState==4){while(digitalRead(pinButtonA)){if(limMoisture>0)(limMoisture--;) delay(100); dispLED.print(limMoisture);)) if(btnState==5)(while(digitalRead(pinButtonB))(if(limMoisture<999){limMoisture++;} delay(100); dispLED.print(limMoisture);}} } if(timSketch%100==0){ // если начинается десятая доля секунды dispLED.print(limMoisture); } break; // Устройство в режиме установки длительность полива case 5: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=2;} if(btnState==1){if(timDuration>0)(időtartam--;)) if(btnState==2)(if(időtartam<99){timDuration++;}} if(btnState==4){while(digitalRead(pinButtonA)){if(timDuration>0)(időtartam--;) késleltetés(100); dispLED.print(timDuration);)) if(btnState==5)(while(digitalRead(pinButtonB))(if(időtartam<99){timDuration++;} delay(100); dispLED.print(timDuration);}} } if(timSketch%100==0){ // если начинается десятая доля секунды dispLED.print(timDuration); dispLED.point(0,true); } break; } } // Функция определения состояния кнопок uint8_t Func_buttons_control(){ uint8_t a=0, b=0; // время удержания кнопок A и B (в десятых долях секунды) while(digitalRead(pinButtonA)||digitalRead(pinButtonB)){ // если нажата кнопка A и/или кнопка B, то создаём цикл, пока они нажаты if(digitalRead(pinButtonA)){if(a<200){a++;}} // если удерживается кнопка A, то увеличиваем время её удержания if(digitalRead(pinButtonB)){if(b<200){b++;}} // если удерживается кнопка B, то увеличиваем время её удержания if(a>20 && b>20)(dispLED.print("----");) // ha mindkét gombot 2 másodpercnél tovább nyomva tartja, kötőjelek jelennek meg, jelezve, hogy ideje elengedni őket, ha(a>20 && b= =0 )(vissza 4;) // ha az A gombot több mint 2 másodpercig lenyomva tartja, akkor visszatér a 4 ha(a==0 && b>20)(vissza 5;) // ha a B gombot hosszabb ideig lenyomva tartja 2 másodpercnél, visszatérés 3 késleltetés(100) ; // 0,1 másodperc késleltetés, a csevegés elnyomása ) (return 3;)else // ha mindkét gombot 2 másodpercnél rövidebb ideig tartotta lenyomva, akkor visszatér 5-öt if(a> 0 && b==0)(return 1;)else // ha az A gombot rövidebb ideig tartotta lenyomva 2 másodpercnél, visszatér 2 if(a ==0 && b> 0)(return 2;)else // ha a B gombot 2 másodpercnél rövidebb ideig tartotta lenyomva, akkor adjon vissza 1-et (return 0;) // ha egyik sem gombok megnyomva, visszatérés 0 )

Pro okos házak bizonyára hallottad. Sok ilyen irányú ötlet nagyon futurisztikus, de ennek nem szabad megállnia.

Néhányan még csak 20-25 évvel ezelőtt tudományos-fantasztikusnak tűntek, most pedig mindenhol alkalmazzák. A közeljövőben minden ház sokkal „bölcsebb” lesz, vagy legalábbis elkezd „okosabbá válni”. Az irány nem csak ígéretes, de érdekes is, így nem szabad félreállni.

Általában, okos Ház- ez egy nagyon összetett szenzorrendszer, mechanikus és elektronikus alkatrészek, programozott programmal vezérelve. Ez a rendszer figyeli a víz, gáz, elektromos áram fogyasztását (és szivárgását). A világítást szabályozza. Tűzoltó elemeket tartalmaz. Különböző eszközök távvezérlését biztosítja telefonon vagy SMS-ben. Tartalmazza a lopás és az illetéktelen hozzáférés elleni védelmi elemeket. Szünetmentes tápegységeket tartalmaz, amelyek létfontosságúak a teljes blokkrendszer számára.

Az ilyen rendszerek fő feladata, hogy megkönnyítsék az emberek életét azáltal, hogy a gondok egy részét az automatizálásra helyezik. Ezen elv szerint fogunk dolgozni, rábízva egy részt házi feladat mikrokontroller. Kezdjük, mint mindig, egy egyszerűvel.

Számos öntözőberendezés létezik, a primitív, például gézzel, amelynek egyik vége egy cserépbe van temetve, a másik pedig víztartályba merül, a csúcstechnológiás, elektronikusan vezérelt öntözőrendszerekig. Előbbiek minősége és öntözési hatásfoka alacsony, utóbbiak ára magas, és saját algoritmusuk szerint működnek, amin nem lehet változtatni.

Univerzális eszközt fogunk kifejleszteni, funkcióbővítési lehetőséggel, ugyanakkor olcsó és hatékony.

Munka algoritmus növényöntöző gép egyszerű: a föld egy edényben kiszáradt - öntözzük, öntözzük meg - várjunk, amíg megszárad. Első pillantásra minden egyszerűnek tűnik. Készítünk egy listát a szükséges alkatrészekről: mikrovezérlő kártya, szivattyú, bekapcsoló gomb a szivattyú motorjának vezérléséhez, talajnedvesség-érzékelő, tartály vízzel (sőt, jó lenne csatlakoztatni a vízellátáshoz, de jobb, ha nem :-) Ahhoz, hogy a rendszer teljesen autonóm legyen, fel kell szerelni vízfogyasztás figyelmeztető készülékkel, pl zöld LED - van elég víz, piros - kevés a víz , szükséges hozzá. Tehát szükség van egy vízszint-érzékelőre.

Szivattyú növényöntöző géphez

A fentiek közül a szivattyún kívül mindent magunk gyártunk le. A szivattyú minden kis teljesítményű szivattyúhoz megfelel. Kereshetsz régi és törött tintasugaras nyomtatókban vagy vehetsz ablakmosó pumpát autóalkatrészekben, én a legegyszerűbbet találtam 90 rubelért.

Fontos: mielőtt csatlakoztatná a szivattyút a kész készülékhez, ellenőrizze, hogy működik-e. Az autószivattyú több méteres szökőkutat is kiadhat; otthon az ilyen „öntözést” nem biztos, hogy eleve megértik és betiltják. Tapasztalat alapján találja meg az optimális feszültséget. Az automatikus szivattyút 12 V-os fedélzeti hálózat táplálja, az én példányomon már 8 feszültségnél elegendő nyomás jelenik meg ... mossák, és egy ilyen szivattyút a legpontosabb módon kell öblíteni.

Az érzékelőkről

A talajnedvesség-érzékelő legjobban grafitból készül, a fém elektrolízisnek és korróziónak van kitéve, ezért tulajdonságai idővel romlanak. Bár a mi kísérleti összeállításunkban a szögekből és rézhuzalból készült érzékelők normálisan működnek.

A körömérzékelő a legegyszerűbb kialakítás. Az elkészítéséhez szükség van egy darab műanyagra vagy gumira, két szögre, vezetékekre és kambriumra (szigetelőszalag).

A folyadékszint-érzékelő elkészíthető a talajnedvesség-érzékelővel megegyező módon, vagy jöhet az úszós kivitel. A második lehetőség előnyösebb. A 3. ábrán egy ilyen érzékelő egy változata látható, ahol az 1 az öntözéshez szükséges vizet tartalmazó tartály és egy minimum jelölés, a 4 pedig egy tetszőleges anyagból készült cső és 3 rúd, amely szabadon jár a csőben. A cső és a rúd egy régi golyóstollal vehető ki. Alul egy úszó 2 (egy darab hab) van a rúdra rögzítve. A felső, felületi, a csövön lévő szerkezetrészben műanyag lemezre helyezzük az 5 érintkezőket, ezek lesznek az érzékelő érintkezői. A rúd tetejére egy vezetőképes lemezt rögzítünk 6. A rúd lökete a csőben 1 ... 2 cm. A vezetékeket az 5 érintkezőkhöz forrasztjuk, hogy csatlakozzanak az Arduinohoz. A 4-es cső fixen van rögzítve a tartály belsejében.

Az érzékelő működési elve a következő. Ha sok a víz, a 2. úszó teljesen felfelé tolja a 3. rudat, míg a 6. lemez nem érinti az 5. érintkezőket. Amikor a vízszint a MIN jelzés alá esik, az úszó a vízszinttel együtt süllyed, és leengedi a botot b lemez, amely viszont érinti az 5 érintkezőket és összezárja azokat. A vezérlő csak az érintkezők állapotát tudja leolvasni 5. Ha lusta vacakolni, vásárolhat hasonlókat autóalkatrészekben, ott hűtőfolyadék szintérzékelőként árulják, a legegyszerűbbek ára 100-150 rubel.

Arduino bizalom ellenőrzése

Számára ez triviális feladat. Az érzékelőket az egyik érintkezővel az Arduino érintkezőhöz csatlakoztatjuk, és egy nagy ellenállású ellenálláson keresztül a "földre", a másik érintkezővel pedig az Arduino tápegység +5 V-ára húzzuk. A szivattyú csatlakoztatásának módjának kiválasztásához ismernünk kell az üzemi üzemmódban fogyasztott áramot, és ez szükséges a víz szivattyúzásakor; alapjáraton az áram kisebb lehet. Ha az áram kisebb, mint 3,5 A, akkor az uln2003 tranzisztor szerelvényt használhatja a szivattyú csatlakoztatásához.

Az uln2003 mindegyik kimenete 0,5A terhelést tud hajtani.A terhelési áram növelése érdekében mind a hét bemenetet és kimenetet párhuzamosan csatlakoztattam: 7×0,5=3,5A.Ha a szivattyú árama több, mint 3,5A, akkor rakhatja térhatású tranzisztor, például irf630 (de ehhez további elemekre van szükség). Ez a tranzisztor 9 A-ig bírja az áramerősséget. Ha a szivattyúdnak nagyobb áram kell, akkor cserélj szivattyút, különben nem locsolót, hanem tömlőt kapunk :-)

Táplálkozásra növényöntöző gép rádióvezérlésű játékokból vagy hálózati tápegységből származó elemeket használhat. A kiválasztott tápegységet a szivattyúk által igényelt áramerősségre kell méretezni. -nél megállnék elemmel működő, a szivattyúk ritkán és rövid időre kapcsolnak be, így nincs szükség folyamatosan hálózatra kötött tápra. Ezenkívül idővel hozzáadhatja a programhoz az akkumulátor töltésvezérlését és a töltés szükségességének jelzését.

A vezérlési algoritmus blokkvázlata az alábbi ábrán látható. A készülék indítása után a szenzorokat folyamatos munkaciklusban lekérdezi, és az egyes érzékelők állapota alapján intézkedik. A vízszint-érzékelő vezérli a LED-eket. A talajnedvesség-érzékelő vezérli a szivattyút.

A program egyszerű, de minden esetben módosítást igényel. Különös figyelmet kell fordítani a szivattyú be- és kikapcsolása közötti szünetre: minél kisebb a virágcserép és minél nagyobb a szivattyú teljesítménye, annál rövidebbnek kell lennie a szünetnek. A szivattyú kikapcsolása utáni szünet az edény méretétől is függ. Öntözés után a földnek telítettnek kell lennie, ellenkező esetben, ha a nedvesség nem éri el az érzékelőt, a rendszer újra bekapcsolja az öntözést. A legjobb megoldás az, ha a vízellátó csövet az érzékelő mellé helyezzük úgy, hogy az érzékelő területén a talaj azonnal telítődjön. Itt is megjegyzem: az öntözés bekapcsolásához szükséges páratartalom szintjét maga az érzékelő állíthatja be, különböző mélységekbe merítve.

Program kód

// állandók
const int dw = 12; // 12 tűs vízszint-érzékelő
const int dg = 11; // 11 tűs talajnedvesség-érzékelő
const int pumps = 2; // 2 tűs szivattyúvezérlés
const int ledG = 3; // zöld LED a 3. érintkezőn
const int ledR = 4; // piros LED 4 tűn
// változók
int dwS = 0; // a vízszintérzékelő állapota
int dgS = 0; // a talaj nedvességszint-érzékelőjének állapota
//beállítások
void setup()(
// deklarálja a LED-et és a szivattyú érintkezőit kimenetként:
pinMode(szivattyú, OUTPUT);
pinMode(ledG, OUTPUT);
pinMode(ledR, OUTPUT);
// az érzékelő és a szivattyú érintkezőit bemenetként nyilvánítja:
pinMode(dw, INPUT);
pinMode(dg, INPUT);
}
// munkaciklus
érvénytelen 1oop()(
// leolvassa a folyadékszint érzékelő állapotát
dwS = digitalRead(dw);
// ha sok a víz, kapcsold be a zöldet, egyébként pirosat
if (dwS == LOW) (
digitalWrite(ledG, HIGH);
digitalWrite(ledR, LOW);
}
más(
digitalWrite(ledG, LOW);
digitalWrite(ledR, HIGH);
}
// olvassa le a talajnedvesség-érzékelő állapotát
dgS = digitalRead(dg);
// ha a talaj száraz, kapcsolja be az öntözést
if (dgS == LOW) (
digitalWrite(szivattyúk, HIGH);
késleltetés (2000);
digitalWrite(szivattyúk, LOW);
késleltetés(30000);
}
más(
digitalWrite(szivattyúk, LOW);
}
}

A kóddal kapcsolatban a következőket szeretném elmondani. Az egyszerűsítés kedvéért beraktam a késleltetési parancsokat, amelyekre magam is megesküdtem. A késés miatt egy pillanatban 30 másodpercre lefagy a készülékünk (vagy esetleg többet kell telepítenünk). De ebben az eszközben ez nem kritikus. Ha a készülék végül 10 növényt öntöz, és egybeesik, hogy mindegyiket egyszerre kell öntözni, akkor szerintem nem olyan fontos az a 300 másodperc, amit az utolsó növénynek várnia kell.

De az áramforrás szempontjából egy ilyen megoldás pozitív szerepet játszik: nem engedi, hogy a készülék egyszerre 10 szivattyút kapcsoljon be. Az első késleltetés (2000) 2 másodpercre bekapcsolja a szivattyút, ha egy nagy növény van egy nagy cserépben, akkor növelnie kell az időt, ha a szivattyú nagyon produktív, akkor éppen ellenkezőleg, csökkentse. A második késleltetés (30000) 30 másodpercet ad a talajnak, hogy átitassa a vizet, erről korábban írtam. Talán ezt az időt is ki kell igazítani.

Szerkezetileg az eszköz két részből áll - elektronikus és mechanikus. Kívánatos az elektronikus részt és az elemeket a tokba helyezni, hogy a véletlen kifröccsenések ne akadályozzák az elektronikát. Nem az egész Arduino, hanem egy mikrokontroller, egy kvarc kondenzátorral és egy 5 V-os táppal.Ugyanabbi tokba rakjuk az uln2003 mikroáramkört, ellenállásokat, az előlapra kijelző LED-eket és szerelünk egy csatlakozót a szenzorok csatlakoztatására és egy szivattyú. Ha a szivattyú erős és az uln fűtött, akkor lyukakat fúrunk a házba a szellőzés érdekében. A készülék bekapcsolásához további jelzőfényt nem kell felszerelni, a vízszint LED-ek egyike folyamatosan világít, és ezt a funkciót fogja ellátni.

Az elektronikus rész háza bármilyen anyagból készülhet, vagy választhat készen is. Tartályhoz használhat megfelelő méretű műanyag palackot vagy üvegedényt, vagy ragaszthatja műanyagból. Rögzítjük a folyadékszint érzékelőt és beszereljük a szivattyút. Ha a szivattyút le kell meríteni (és van ilyen), akkor nagyon óvatosan izoláljuk az összes áramvezető vezetékét. A szivattyúból a növényt tartalmazó edénybe megfelelő átmérőjű csövet húzunk. Vásárolhat egy autóalkatrész-üzletben egy szivattyúval együtt, vagy vegyen fel egy megfelelő gumit vagy szilikont. Az edény peremén találunk egy tartót a csőhöz, hogy ne fröccsenjen ki vízellátáskor. A páratartalom-érzékelőt a cső közvetlen közelébe szereljük. Annak érdekében, hogy a növény mellett álló üveg vagy műanyag edény ne riasztjon el másokat megjelenésével, akril ólomüveg festékekkel szerzői stílust adhat.

További vizsgálatok. Ne feledje: a növény jóléte a készülék működésétől függ. Gyakorlati próbák elvégzése előtt végezzen próbapadi teszteket úgy, hogy a készüléket néhány napon keresztül növény nélküli cserépben teszteli. A benne lévő földet nem szabad elönteni vagy túlszárítani. Ha szükséges, mélyítse el a páratartalom-érzékelőt, vagy fordítva, emelje magasabbra. Állítsa be a szivattyú időtartamát a programban. Öt percenként egy cseppet se adjon ki, de hetente egyszer se töltse be a talajt. A kísérlet során figyelje az elektronikus alkatrészek hőmérsékletét.

Ne melegítse túl!

Ha minden hibakeresés megtörtént, folytassa a gyakorlati tesztekkel, és vegye ki a legszerényebb növényt. Gondosan figyelje az üzem állapotát, ha valami baj van, állítsa le a kísérletet az okok tisztázásáig. Ha minden rendben van, csatlakoztasson egy másik érzékelőt és szivattyút az Arduino-hoz, adjon hozzá kódot és automatizálja egy másik növény öntözését. További portbővítés nélkül az Arduino tucatnyi üzemet kezel majd.

Alkalmazás. Kód megjegyzés nélkül:
const int dw = 12;
const int dg = 11;
const int pumps = 2;
const int ledG = 3;
const int ledR = 4;
int dwS = 0;
int dgS = 0;
void setup() ( pinMode(nasos, OUTPUT);
pinMode(ledG, OUTPUT);
pinMode(ledR, OUTPUT);
pinMode(dw, INPUT);
pinMode(dg, INPUT); )
void loop()( dwS = digitalRead(dw);
if (dwS == LOW) ( digitalWrite(ledG, HIGH);
digitalWrite(ledR, LOW); )
else ( digitalWrite(ledG, LOW);
digitalWrite(ledR, HIGH); )
dgS = digitalRead(dg);
if (dgS == LOW) ( digitalWrite(szivattyúk, HIGH);
késleltetés (2000);
digitalWrite(szivattyúk, LOW);
késleltetés(30000); )
else ( digitalWrite(szivattyúk, LOW); ))

Előző cikk: Következő cikk:

Szeretné, ha a növényei megmondják, mikor kell öntözni? Vagy csak tájékozódhat a talaj nedvességtartalmáról?

Ebben a cikkben egy automatizált öntözési projektet vizsgálunk meg talajnedvesség-érzékelővel:

Talajnedvesség-érzékelő áttekintése

Az ilyen érzékelők egyszerűen csatlakoztathatók. A három csatlakozó közül kettő a táp (VCC) és a föld (GND). Az érzékelő használatakor tanácsos időnként lekapcsolni az áramforrásról, hogy elkerülje az esetleges oxidációt. A harmadik kimenet egy jel (sig), amelyből leolvasást fogunk venni. Két érzékelőérintkező a változtatható ellenállás elvén működik - minél több nedvesség van a talajban, annál jobban vezetik az érintkezők az elektromosságot, az ellenállás csökken, a SIG érintkezőn a jel növekszik. Az analóg értékek a tápfeszültségtől és a mikrokontroller analóg érintkezőinek felbontásától függően változhatnak.

Az érzékelő csatlakoztatására többféle lehetőség is használható. Az alábbi ábrán látható csatlakozó:

A második lehetőség rugalmasabb:

És természetesen közvetlenül forraszthatja az érintkezőket az érzékelőhöz.

Ha az érzékelőt a lakáson kívül kívánja használni, gondoljon az érintkezők szennyeződéstől és közvetlen napfénytől való védelmére is. Érdemes lehet a páratartalom-érzékelő érintkezőit és vezetékeit közvetlenül a házba helyezni vagy védőbevonatot felvinni (lásd az alábbi ábrát).

Talajnedvesség-érzékelő védőbevonattal az érintkezőkön és szigetelt vezetékekkel a csatlakozáshoz:

Talajnedvesség-érzékelő rövid élettartamú probléma

Az ilyen típusú érzékelők egyik hátránya az érzékeny elemeik törékenysége. Például a Sparkfun megoldja ezt a problémát egy további bevonattal (elektromos nikkel-immersziós arany). A második lehetőség az érzékelő élettartamának meghosszabbítására az, hogy közvetlenül rákapcsolják a tápfeszültséget a leolvasáskor. Az Arduino használatakor minden arra korlátozódik, hogy egy HIGH jelet adjon a tűre, amelyhez az érzékelő csatlakozik. Ha az érzékelőt nagyobb feszültséggel szeretné táplálni, mint amit az Arduino biztosít, mindig használhat egy extra tranzisztort.

Talajnedvesség-szabályozás – Projektpélda

Az alábbi projekt nedvességszint-érzékelőt, az Arduino kártya analógját - RedBoard - és egy LCD-kijelzőt használ, amely adatokat jelenít meg a talajnedvesség szintjéről.

SparkFun talajnedvesség érzékelő:

A piros vezeték (VCC) az Arduino-n 5 V-ra van kötve, a fekete a földre (GND), a zöld pedig az analóg 0 (A0) érintkezőre. Ha más analóg érintkezőt használ az Arduinón, feltétlenül végezze el a megfelelő módosításokat az alábbi mikrokontroller vázlaton.

Az LCD-kijelző 5V-os feszültséggel, földeléssel és digitális 2-es érintkezővel van összekötve (a kódot is módosíthatja és módosíthatja), hogy soros kommunikációs protokollon keresztül kommunikáljon a mikrovezérlővel.

Érdemes megjegyezni, hogy ha meg akarja hosszabbítani az érzékelő élettartamát, akkor a digitális érintkezőhöz csatlakoztathatja a tápfeszültséget, és csak adatolvasáskor táplálhatja, majd kikapcsolhatja. Ha az érzékelő folyamatosan áram alatt van, az érzékeny elemei hamarosan rozsdásodni kezdenek. Minél több a nedvesség a talajban, annál gyorsabban megy végbe a korrózió. Egy másik lehetőség a vakolat felhordása a jeladóra. Ennek eredményeként a nedvesség beáramlik, de a korrózió jelentősen lelassul.

Program az Arduino számára

A vázlat meglehetősen egyszerű. Az adatok LCD-kijelzőre való átviteléhez tartalmaznia kell a Software Serial könyvtárat. Ha nem rendelkezik vele, letöltheti innen: Arduino GitHub

További magyarázatok találhatók a kódhoz fűzött megjegyzésekben:

// Példa a talajnedvesség-érzékelő használatára LCD-kijelzővel.

SoftwareSerial mySerial(3,2); // 2. láb = TX, 3. láb = RX (nem használt)

int thresholdUp = 400;

int thresholdDown = 250;

int sensorPin = A0;

String DisplayWords;

int sensorValue;

mySerial.write(254);

mySerial.write(128);

// tiszta kijelző:

mySerial.write(" ");

mySerial.write(" ");

// mozgassa a kurzort az LCD-kijelző első sorának elejére:

mySerial.write(254);

mySerial.write(128);

// "Szárítsa meg, öntözze meg!"

mySerial.write(254);

mySerial.write(192);

mySerial.print(DisplayWords);

) else if (sensorValue >= thresholdUp)(

// mozgassa a kurzort a kijelző második sorának elejére:

mySerial.write(254);

mySerial.write(192);

mySerial.print(DisplayWords);

// mozgassa a kurzort a kijelző második sorának elejére:

mySerial.write(254);

mySerial.write(192);

mySerial.print(DisplayWords);

A program különböző minimum és maximum értékeket használ. Ennek eredményeként az átlagérték jellemezheti a nedvességet attól függően, hogy a talaj nedves vagy szárított. Ha nem kívánja ezt az átlagértéket használni, akkor a maximális és a minimális értékek azonosnak tekinthetők. A kísérletek azonban azt mutatják, hogy a javasolt megközelítés lehetővé teszi a talajban végbemenő folyamatok pontosabb jellemzését. Valós körülmények között nincs határozott pontos átlagérték. Így játszhat a tartomány kiválasztásával. Ha érdeklik a talajban a vízzel való kölcsönhatás során fellépő folyamatok, olvassa el például itt: Wiki. A folyamatok meglehetősen összetettek és érdekesek.

Mindenesetre a változókat a saját adottságaihoz kell igazítania: talajtípus, szükséges nedvességtartalom. Tehát teszteljen, kísérletezzen, amíg el nem dönti a megfelelő értékeket.

A páratartalom-érzékelő adatainak leolvasásának és megjelenítésének megszervezése után a projekt továbbfejleszthető egy automata öntözőrendszer megszervezésével.

Páratartalom-érzékelő az Arduino alapú automatikus öntözőrendszer részeként:

Az öntözés automatizálásához további alkatrészekre lesz szükségünk: esetleg szíjtárcsákra, fogaskerekekre, motorra, tengelykapcsolóra, tranzisztorokra, ellenállásokra. A lista a projekttől függ. Hát mindent, ami a hétköznapokban a hóna alá eshet. Az alábbiakban egy példát mutatunk be részletesebben:

Ez az egyik a sok lehetőség közül az automatikus öntözőrendszer motorjának beszerelésére. A kerék közvetlenül a vízbe szerelhető. Ebben az esetben gyors forgásával víz kerül a növénybe. Általában meg tudja mutatni a képzeletét.

Az alábbiakban látható az egyenáramú motor csatlakozási diagramja () a SparkFun Arduino példányának példáján:

Alább látható az Arduino vázlata (lényegében ugyanaz, mint a fenti, egy kis kiegészítéssel a motor vezérléséhez):

// A vázlat adatokat olvas ki az érzékelőről, és megjeleníti a talaj nedvességszintjét

// ha a talaj száraz, a motor beindul

// A kijelzővel való munkához a szoftversoros könyvtárat kell használni

#include <SoftwareSerial.h>

// Csatlakoztassa az RX soros LCD kommunikációs érintkezőt az Arduino 2. digitális érintkezőjéhez

SoftwareSerial mySerial(3,2); // 2. láb = TX, 3. láb = RX (nem használt)

// A motor vezérlése a 9-es tűvel.

// Ennek a tűnek támogatnia kell a PWM modulációt.

const int motorPin = 9;

// Itt beállítunk néhány állandót.

// Az állandók beállítása a feltételektől függ külső környezet, amely az érzékelőt használja

int thresholdUp = 400;

int thresholdDown = 250;

// Állítsa be az A0 érintkezőt az Arduino-n, hogy működjön az érzékelővel:

int sensorPin = A0;

pinMode(motorPin, OUTPUT); // állítsa be kimenetként azt a tűt, amelyre a motor csatlakozik

mySerial.begin(9600); // az adatátviteli sebesség beállítása 9600 baudra

késleltetés(500); // várja meg, amíg a kijelző betöltődik

// Itt deklarálunk egy karakterláncot, amely a megjelenítendő adatokat tárolja

// az LCD-n. Az értékek változni fognak

// a talaj nedvességtartalmától függően

String DisplayWords;

// A sensorValue változó az érzékelő analóg értékét tárolja az A0 lábról

int sensorValue;

sensorValue = analógRead(sensorPin);

mySerial.write(128);

// tiszta kijelző:

mySerial.write(" ");

mySerial.write(" ");

// mozgassa a kurzort az LCD kijelző első sorának elejére: mySerial.write(254);

mySerial.write(128);

// a szükséges információk kiírása a kijelzőre:

mySerial.write("Vízszint: ");

mySerial.print(sensorValue); //A .print használata a .write helyett az értékekhez

// Most ellenőrizzük a páratartalom szintjét a korábban beállított numerikus állandókkal.

// Ha az érték kisebb, mint a thresholdDown, akkor jelenítse meg a következő szavakat:

// "Szárítsa meg, öntözze meg!"

// mozgassa a kurzort a kijelző második sorának elejére:

mySerial.write(254);

mySerial.write(192);

DisplayWords = "Szárítsa meg, öntözze meg!";

mySerial.print(DisplayWords);

// indítsa be a motort alacsony fordulatszámon (0 - leállítás, 255 - maximális fordulatszám):

analógWrite(motorPin, 75);

// Ha az érték nem alacsonyabb, mint a thresholdDown, akkor ellenőrizni kell, nem lesz

// nagyobb-e, mint a thresholdUp, és ha igen,

// jelenítse meg a „Nedves, hagyja!” feliratot:

) else if (sensorValue >= thresholdUp)(

// mozgassa a kurzort a kijelző második sorának elejére:

mySerial.write(254);

mySerial.write(192);

DisplayWords = "Nedves, hagyd!";

mySerial.print(DisplayWords);

// állítsa le a motort (0 - leállítás, 255 - maximális sebesség):

analógWrite(motorcsap, 0);

// Ha a kapott érték a minimum és maximum között van

// és a talaj korábban nedves volt, de most már szárad,

// megjelenítése "Dry, Water it!" (vagyis amikor mi

// közel kerülni a thresholdDown-hoz). Ha száraz volt a talaj és most

//gyorsan nedves, jelenítse meg a "Wet, Leave it!" (vagyis amikor mi

// közelebb kerülni a thresholdUp-hoz):

// mozgassa a kurzort a kijelző második sorának elejére:

mySerial.write(254);

mySerial.write(192);

mySerial.print(DisplayWords);

késleltetés(500); // Fél másodperces késleltetés a leolvasások között

Sok sikert a növények automatikus öntözésének megvalósításához!

Az alábbi ábra az öntözőrendszer távvezérlésére és felügyeletére szolgáló teljes megoldás blokkvázlata.

A vezérlőrendszer vezérlője adatokat gyűjt a rendszer érzékelőitől és GPRS modem segítségével továbbítja a szerverre. Válaszul parancsokat kap a szervertől a rendszer működtetőinek vezérlésére (öntözőszelepek, szivattyú és egy szelep a tartályba való víz utántöltés blokkolására).

A felhasználó PC-ről vagy mobileszközről egy webes alkalmazáson keresztül férhet hozzá a szerverhez.

Rendszervezérlő szekrény

A következő ábrán a kapcsolószekrény szerkezeti és működési diagramja látható.

A rendszer szíve az Arduino Mega vezérlő.

A vezérlő a SIM900 modemet a COM porton keresztül küldött AT parancsokkal vezérli.

Így történik az adatcsere a szerverrel.

Vannak esetek, amikor a modem bejuthat a " nehéz helyzet". Néha hard reset szükséges a normál működés visszaállításához. Ehhez egy modem-reset modul került a rendszerbe, amely egy elektromágneses relé, amelyen keresztül a modem áramellátása történik.

A tartályban lévő vízszint-érzékelők jeleit a diszkrét jelbemeneti modul fogadja. Az érzékelők "száraz érintkezős" típusú kimenettel rendelkeznek. Bővebben olvashatsz róluk. Annak érdekében, hogy az érzékelők diszkrét jelei a vezérlőbe kerüljenek, 24 V-os tápfeszültséggel impregnáljuk őket. A bemeneti modul egy optocsatolt digitális bemenet, amely a 24V-os bemeneti feszültségszintet a vezérlő számára érthető 5V-os szintre alakítja át.

A külső hőmérséklet méréséhez egy DS18B20 érzékelőt kell csatlakoztatni a vezérlőhöz. A vezérlő a OneWire interfészen keresztül cserél vele.

Ebben a cikkben nem adjuk meg a vezérlőszekrény elektromos áramkörét, az Arduino programkódot, és nem beszélünk részletesen a webszerver működéséről, mert. ez egy külön beszélgetés témája. Azok számára, akik szeretnének elmélyülni ebben a témában, elkészítettük.

WEB alkalmazás öntözésszabályozáshoz az interneten keresztül

A webalkalmazáson keresztül a felhasználó:

  • figyeli a rendszer aktuális állapotát: a tartályban lévő vízszintet, a külső hőmérsékletet, az öntözővezetékek állapotát (öntözés folyamatban / öntözés leállítva).
  • vezérli az öntözést (be- és kikapcsolja a szükséges vezetékeket) kézi üzemmódban
  • ütemezi az automatikus öntözést
  • értesítést kap a rendszerben bekövetkezett fontos eseményekről (kommunikáció megszakadása, alacsony vízszint a tartályban stb.)
  • elemzi az utca hőmérséklet-változásainak grafikonját a rendszer működése során
  • Megtekinti az objektumon előforduló eseményeket az eseménynapló segítségével

Főképernyő a rendszer állapotának kezeléséhez és figyeléséhez

A webalkalmazás főképernyőjén a rendszer összes csomópontjának aktuális állapota látható: a tartályban lévő vízszint-érzékelők és a hőmérséklet-érzékelő (táblázat a bal oldalon), valamint az összes mágnesszelep állapota. öntözőköröket (a táblázat a jobb oldalon).

Ugyanazon a képernyőn a felhasználó manuálisan be- vagy kikapcsolhatja bármelyik öntözővezetéket.

A képernyő alján az állomáson történt legutóbbi események láthatók.

Automatikus öntözési ütemezés képernyő

Ezen a képernyőn a felhasználó ütemezést készíthet a rendszer automatikus üzemmódban történő működéséhez, így a szerver felhasználói beavatkozás nélkül kapcsolja be és ki az öntözést az állomáson.

Az eseménynapló

bekerülnek a naplóba fontos események az állomáson: az öntözővezetékek be/kikapcsolása, megszakadt a kommunikáció az állomással, helyreállt a kommunikáció az állomással, a külső hőmérséklet a beállított szint alatt van, a tartály üres, a tartály majdnem üres.

Felhasználói figyelmeztetés

Az állomás beállításaiban a felhasználó bizonyos eseményeket „figyelmeztetésként” vagy „vészhelyzetként” rendelhet hozzá. Amikor ezek az események bekövetkeznek, a szerver értesíti a felhasználót emailés/vagy SMS-ben. Ezek lehetnek az állomással való kommunikáció megszakadása, alacsony vízszint a tartályban vagy alacsony külső hőmérséklet.

Az alsó hőmérsékleti határ és az időkorlát, amely után a rendszer kommunikációs megszakítást regisztrál, a beállításokban van beállítva.

Külső hőmérséklet diagram

Ez a képernyő a hőmérséklet változásának grafikonját jeleníti meg egy beállított időtartam alatt (10 perc, 30 perc, óra, 12 óra, nap, hét, hónap).

A rendszer továbbfejlesztése

A jövőben tervezik a rendszer információtartalmának növelését vízmérőkkel való kiegészítéssel. A mérőállások a webalkalmazáson keresztül lesznek láthatók a felhasználó számára. Ezen adatok alapján hosszú időn keresztül lehet majd grafikonokat készíteni a vízfogyasztásról.

Ezen kívül tervezik az öntözővezetékek talajnedvesség-érzékelőkkel való felszerelését, illetve azok leolvasása alapján az öntözés szabályozását. Ez még kényelmesebb feltételeket teremt a növények növekedéséhez és növeli a vízmegtakarítást.

Következtetés

Azok számára, akik szeretnének többet megtudni a távoli szerverrel Arduino és a SIM900 modem segítségével történő kommunikáció technológiájáról, leckéket készítettünk erről a témáról. Itt .

Ez minden most! Reméljük érdekes volt! Újra találkozunk LASTY SMART! Hogy ne maradjon le egy új cikkről, csatlakozzon hozzánk

Miután a következő virágom kiszáradt, rájöttem, hogy jó lenne valahogy automatizálni az öntözési folyamatot. Mert biztos vagyok benne, hogy vízhiány miatt halt meg.
Úgy döntöttem, hogy összeállítok egy szerkezetet, ami helyettem öntözi meg a virágot. Ennek eredményeként egy ilyen készüléket kaptam, ami elég jól teszi a dolgát:

Két szabályozó segítségével állíthatja be az egyszerre öntözött víz mennyiségét, valamint az öntözés közötti időszakot. Akit érdekel - bővebben részletes utasításokat hogyan készítsünk ilyen eszközt. Az Arduino Megát használtam az agy alapjaként.
A sprinkler összeszereléséhez számos alkatrészre van szüksége, és legfeljebb 30 perc szabadidőre lesz szüksége.

Felhasznált alkatrészek:

  • Arduino Mega (csak kéznél volt, de bármelyik másik megteszi)
  • Szivattyú és szilikon cső (egy autós ablakmosó szivattyú működni fog - bármelyik autóalkatrész boltban megvásárolhatod, vagy vásárolhatsz egy kis búvárszivattyút az ebay-en)
  • Tápegység
  • Két változó ellenállás a beállításhoz (bármilyen)
  • IRL3705N tranzisztor
  • Két ellenállás (100 ohm és 100 kOhm)
  • Dióda (bármilyen)
  • Víztartály (az én esetemben Ikea műanyag doboz)
  • elrendezés

Mindent a következő séma szerint gyűjtünk:

Vagy pontosabban:

Íme, mi történt velem:

Először teszteljük a szivattyút. Adjunk rá 5V-ot. Ha zümmögött, minden rendben, megyünk tovább.

Most csatlakoztassuk a szivattyút az Arduino-hoz. Csináljunk egy kis kábelköteget a kenyérsütőtáblán, hogy arduinóval vezérelhessük a pumpát.

Próbáljuk meg Arduinóval irányítani a szivattyút. Töltsük fel ezt a kódot

int pumpPin = 5 ; void setup() ( pinMode(pumpPin, OUTPUT); digitalWrite(pumpPin, LOW); ) void loop() ( digitalWrite(pumpPin, HIGH); delay(1000); digitalWrite(pumpPin, LOW); késleltetés(1000); )

Ha időnként zúg, akkor ismét minden rendben van.

Most két szabályozót kell hozzáadnunk. Csatlakoztassunk változó ellenállásokat a készülékünkhöz, és ellenőrizzük a teljesítményüket.

Töltsük fel ezt a kódot az Arduino-ba

int volumePin = A0; void setup() ( pinMode(volumePin, INPUT); Serial.begin(9600); ) void loop() ( Serial.println(analogRead(volumePin)); delay(100); )

Menjünk a Serial Monitorhoz, és győződjön meg arról, hogy van-e reakció a szabályozó fordulására. Körülbelül 0 és 1024 között kell változnia

Most az kell, hogy mindez együtt működjön.

Itt van magának a sprinklernek a kódja:

// Az első gomb a víz folyási idejét szabályozza (4-15 másodperc) #define MAX_FLOWTIME 15 // másodperc #define MIN_FLOWTIME 4 // másodperc // A második gomb az öntözés gyakoriságát napi egyszeritől heti egyszeriig szabályozza#define MAX_PERIOD 7 // nap #define MIN_PERIOD 1 // nap #define MAX 1015 #define MIN 0 int volumePin = A0; // Csap, amelyre a szabályozó csatlakozik, amely a kiöntendő víz mennyiségéért felelős int periodPin = A1; // Pin, amelyre a szabályozó csatlakozik, amely az öntözések közötti időszakért felelős int pumpPin = 5 ; // Pin, amelyhez a szivattyúvezérlő csatlakozik int kötet; int időszak; // Eljárás, amely bekapcsolja a szivattyút a térfogatban megadott ideig void water() ( digitalWrite(pumpPin, HIGH); // kapcsolja be a szivattyút késleltetés (hangerő); digitalWrite(pumpPin, LOW); // kapcsolja ki a szivattyút késleltetés (időszak); ) void setup() ( pinMode(pumpPin, OUTPUT); digitalWrite(pumpPin, LOW); ) void loop() ( // Olvassa le a szabályozók (változó ellenállások) értékeit, és hozza azokat a megadott határértékekre kötet = térkép (analogRead(volumePin), MIN, MAX, MIN_FLOWTIME, MAX_FLOWTIME) * 1000 ; periódus = térkép (analogRead(periodPin), MIN, MAX, MIN_PERIOD, MAX_PERIOD) * 1000 * 60 * 60 * 24 ; víz(); )

Ez kész. Élvezzük a többit. és mindig tudni fogja, hogy a növényei vizet kapnak.

Kérdései vannak?

Elírási hiba bejelentése

Szerkesztőségünkhöz küldendő szöveg: