AVTONOM SUG`ORISH TIZIMLARINING APARAT TA`MINOTINI YIG`ISH
Avtonom sug`orish tizimi aparatni yig`ishni biz uchlik shield modulini Arduino platasiga o`rnatishdan boshlaymiz.
Ikkinchi qadamda tuproq namlini aniqlovchi sensorni uchlik shield moduliga anolog pinga ulaymiz, ya`ni bizning holda anolog pin sifatida A0 pin portidan foydalanamiz. Sensordaki tok kuchi va mavfiy (massa) qiymatlarini esa uchlik shield modulining mos ravishda 5.5 V yoki 3.5 V tok qiymatini beruvchi pinlariga shu bilan birga massa beruvchi grnd qiymat beruvchi pinlariga ulaymiz
Keyingi qisimda biz quvvat kalitini 4 kontaktiga ulaymiz.
P+ va P- razyomalarda tok kuchlanishini kummutatsiya quvvat kaliti o`tkazildi.
Keyin suv nasosini L+ va L- ga klemmnik quvvat kaliti orqali ulaymiz natijda rasmda berilgan aparat ta`minot hosil bo`lishi kerak.
To`liq aparat ta`minotining ko`rinishi esa rasmda keltirilgan.
Hosil bo`lgan aparat ta`minotimizni endi biz tuvakdagi tuproqqa tiqib qo`yamiz. Suv nasosini esa biror idishdagi suv ta`minotiga bog`laymiz.
Endi arduinoni tok ta`minotiga ulasak bizning aparat ta`minotimiz nihoyasiga yetadi.
AVTONOM SUG`ORISH TIZIMLARINING DASTURIY TA`MINOTINI ISHLAB CHIQISH
Endi aparat ta`minotiga mos dasturiy ta`minotni yozamiz. Avvalo buning uchun Aruduino platasini kompyuterning usb portiga usb kabel orqali ulaymiz. Unda keyin esa arduino IDE dasturini ishga tushiramiz. Avvalo dasturda Arduino ulangan portni ko`rsatamiz va to`g`ri ishlayotganiga amin bo`lish uchun tekshiramiz. Unda so`ng esa dastury taminotni yozishni boshlaymiz.
Sketch tuproq namligini aniqlovchi sketch bo`lib, birinchi bo`lib bibliotekalarni ulash uchun include buyurug`idan foydanamiz. Bunda displayda ko`rsatish uchun softwareserial library kutubxonasini ulaymiz.
#include SoftwareSerial
LCD monitordan foydalanish uchun uning arduinoga ulangan pinlarini dasturiy ta`minotda aniqlashtirib olamiz. Bunda RX raqamli pinni 2 ga va RX raqamli pinni 3 ga ulaymiz.
SoftwareSerial mySerial(3,2); // pin 2 = TX, pin 3 = RX
Keyin esa bir nechta o`zgarmaslarni beramiz. O`zgarmaslar sozlarmalari tashqi qurilmalar va sharoitlarga bog`liq bo`ladi. Bunda bu datchikining qiymatlarini beradi.
int thresholdUp = 400;
int thresholdDown = 250;
Endi tuproq namligini aniqlovchi sensorning pin qiymatini o`rnatamiz va bu pin qiymati analog A0 qiymatta ekanini aparat ta`minotida ko`rsatib o`tgandik.
int sensorPin = A0;
Dasturiy ta`minot asosiy funksiyasi setup o`rnatishlarni beruvchi funksiyani yozishni boshlaymiz va funksiya ichida ma`lumotlar almashivu tezligini beramiz. Ma`lumotlar almashishuvi tezligi Serial.begin orqali berilib, uning qiymati standart holat uchun 9600 hisoblanadi. Keyin esa kutish buyurug`ini beramiz. Kutish buyurug`i displayning yuklanish uchun kerak va bu buyuruq delay orqali beriladi. Delay(500) bu 5 sekunda ya`ni 500 millisekund kutib turish yoki ushlab turish kerakligni bildiradi.
void setup(){
mySerial.begin(9600);
delay(500);
}
Keyigi qadam loop ya`ni takrorlash va barcha buyurqlani berish funksiyasini yozishdir. Bu yerda biz ekranda ko`rsatish uchun kerak bo`lgan ma`lumot ya`ni matni saqlab olamiz. Bu yerda berilgan namlik sensoriga qarab displayda ko`rsatishi kerak bo`lgan ma`lumotlarni chiqaramiz. Buning uchun esa String tipidagi DisplayWords o`zgaruvchisini e`lon qilamiz. SensorValueda esa sensordagi A0 analog portdan olayotgan anolog qiymatlarni saqlaydi. SensonValuega anol qiymatlarni ta`minlash uchun esa analogRead(sensorPin) buyurug`ini beramiz.
void loop(){
String DisplayWords;
int sensorValue;
sensorValue = analogRead(sensorPin);
Keyingi buyuruq displayning boshlang`ich qatoriga kursorni olib kelish vazifasini bajaradi.
mySerial.write(254);
mySerial.write(128);
// Keyin esa diplayni tozalaymiz.
mySerial.write("");
mySerial.write("");
// Keyin esa displayga kerakli ma`lumotni yozamiz ya`ni namlik darajasini
mySerial.write("Water Level: ");
mySerial.print(sensorValue);
//keyin chiqarishda write operator o`rniga print operatorini ishlatamiz.
// keyin namlikni darajasini tekshiramiz. Bunda boshlang`ich berilgan taxmini konstanta qiymat bilan solishtiramiz. Agar bu qiymat thresholdDowndan kichik bo`lsa, Sug`or, Suv bilan! Ya`ni sug`or ma`nosidagi gapni beramiz.
if (sensorValue <= thresholdDown){
Endi kursorni displayni ikkinchi qismiga olib kelamiz.
mySerial.write(254);
mySerial.write(192);
DisplayWords = "Sug`or, Suv bilan!";
mySerial.print(DisplayWords);
Endi kursorni displayni ikkinchi qismiga olib kelamiz. Agar ThresholdUp yoki TresholdDown ni tekshiruviga qarab displayga kerakli buyuruqni chiqaradi. Ya`ni Namlik oshdi to`xtat! yozuvini chiqaradi.
} else if (sensorValue >= thresholdUp){
mySerial.write(254);
mySerial.write(192);
DisplayWords = "Namlik oshdi, to`xtat!";
mySerial.print(DisplayWords);
Agar minimal va maksimal diapazon orasidagi qiymatlarni olinayotgan bo`lsa va oldin u ho`l endi quriyotgan bo`lsa, Sug`or, Suv bilan yozuvini chiqarsin. Agar sensor quruq bo`lib, tez nam bo`layotgan bo`lsa, Namlik oshdi, to`xtat! yozuvini chiqaramiz.
} else {
mySerial.write(254);
mySerial.write(192);
mySerial.print(DisplayWords);
}
Hisob kitob uchun 5 sekund kutib turish vaqtini beramiz.
delay(500);
}
Bu dastur har qanday maksimal va minimal qiymatlarni qabul qila oladi.O`rtacha natijda tuproq namlik sensorining nam yoki quriligiga bog`liq holda olinadi. Agar o`rtacha qiymat ishlatmoqchi bo`lsangiz unda maksimal va minimal qiymatlarni bir hil deb qabul qilish kerak bo`ladi. Namlikdagi jarayonlarni expriment aniq bajarilayotganini ko`rsatib bera oladi. Real shartlarda o`rtacha aniq qiymatni aniqlash mavjud emas. Shunday ekan diapazon tanlashni ixtiyoriy qilishimiz mumkin. Namlik sensori o`ziga yarasha qiyin va qiziqarl detallardan va ishlash jarayonidan tashkil topgan. Har qanday holda namlik sensorini bizning o`zimizning sharoitga moslagan holda sozlash kerak bo`ladi. Shunga mos holda namlik sensorini turi va namlikni berish darajasini tanlash kerak. Tanlash esa eksprimentlar va testlar natijasida aniqlanadi.
Namlik sensor himoyalanganligiga qaramay, unda vaqt o`rishi bilan buzilish hollari uchraydi. Eng tez buziladigan qism bu tok bilan ulanuvchi qism hisoblanadi. Sensorni yashash vaqtini uzoqroq qilish mumkin, buning uchun unga tokni quvvat moduli orqali ulash shart. Bunda ma`lumot olingandan so`ng tokni sensordan o`chiramiz. Ko`rsatgichlarni olish uchun esa yana tok yaqamiz.
Yana bitta tomondan sensor uzoq ishlagani bilan suv zahirasining tugab qolish ehtimoli mavjud. Bu hollar uchun suv nasoso tezda kuyadi. Uni ishga tushirish mumkin emas. Bu muammoni yechimi suvni mavjud yuqligini tekshiruvchi sensorni o`rnatishni o`zi kifiya qiladi. Sensor suvning mavjudligini va uni yetari ekanligi haqidagi habarni bergandan so`ngina suv nasosini ishga tushiramiz. Yana bitta namlikni aniqlovchi sensor bo`lsa yatarli buning uchun. Bu qurilmani batareykalar bilan ishlovchi qilishimiz mumkin. BU holda anchagina xavfsiz bo`ladi. Lekin arduino uni uhlash rejimida gam10mАdan ko`p tok yeydi. Bunda buni yechimi sifatidaArduinoMini ishlatsak bo`ladi. Undagi tok kuchi uhlash holatida 100 mkA gacha tushirilgan.
Uy sharoitida o`simliklarni sug`orishni ko`plab qoidalari bor. Masalan kechqurun qish kunlari sug`orish mumkin emas. Bu hollarni aparatga dastur yordamida kiritish kifoya qiladi. Bu aparatga xatto soat va kunni real vatq tizimida ko`rsatuvchi display va sensorlarni o`rnatishimiz mumkin. Bu esa aparatni yanada mukammal bo`lishiga olib keladi.
To`liq kod
#include "QuadDisplay.h"
#define DISPLAY_PIN 3
#define POMP_PIN 4
#define HUMIDITY_PIN A0
#define HUMIDITY_MIN 200
#define HUMIDITY_MAX 700
#define INTERVAL 60000 * 3
unsigned int humidity = 0;
unsigned long waitTime = 0;
void setup(void)
{
pinMode(DISPLAY_PIN, OUTPUT);
pinMode(POMP_PIN, OUTPUT);
displayInt(DISPLAY_PIN, 0);
}
void loop(void)
{
int humidityNow = analogRead(HUMIDITY_PIN);
if (humidityNow != humidity) {
humidity= humidityNow;
displayInt(DISPLAY_PIN, humidityNow);
}
if ((waitTime == 0 || millis() - waitTime > INTERVAL) && humidity < HUMIDITY_MIN ) {
digitalWrite(POMP_PIN, HIGH);
delay(2000);
digitalWrite(POMP_PIN, LOW);
waitTime = millis();
}
}
#include
SoftwareSerial mySerial(3,2);
const int motorPin = 9;
int thresholdUp = 400;
int thresholdDown = 250;
int sensorPin = A0;
void setup(){
pinMode(motorPin, OUTPUT);
mySerial.begin(9600);
delay(500);
}
void loop(){
String DisplayWords;
int sensorValue;
sensorValue = analogRead(sensorPin);
mySerial.write(254);
mySerial.write(128);
mySerial.write("");
mySerial.write("");
mySerial.write(254);
mySerial.write(128);
mySerial.write("Water Level: ");
mySerial.print(sensorValue);
if (sensorValue <= thresholdDown){
mySerial.write(254);
mySerial.write(192);
DisplayWords = "Sug`or, Water it!";
mySerial.print(DisplayWords);
analogWrite(motorPin, 75);
} else if (sensorValue >= thresholdUp){
mySerial.write(254);
mySerial.write(192);
DisplayWords = "Wet, Leave it!";
mySerial.print(DisplayWords);
analogWrite(motorPin, 0);
} else {
mySerial.write(254);
mySerial.write(192);
mySerial.print(DisplayWords);
}
delay(500);
}