Arduino ile çiçek sulama

//1.saksı için

soilMoistureValue1 = analogRead(A0);
percentage1 = map(soilMoistureValue1, 490, 1023, 0, 100);
while (percentage1 >80)
{
digitalWrite(3,HIGH);
delay(500);
soilMoistureValue1 = analogRead(A0);
percentage1 = map(soilMoistureValue1, 490, 1023, 0, 100);
}
digitalWrite(3,LOW);
delay(3000);


""Nem değeri ölçülsün.
map fonksiyonu ile yüzdeye dönüştürsün.
80 den büyükse while döngüsüne girsin.sulama başlasın.
500milisaniye sulama devam etsin.
sonra tekrar nem ölçülerek yüzdeye dönüştürülsün.
hala 80den büyükse döngü devam etsin.
80 den küçük değere ulaşınca while döngüsünden çıkılsın ve pompa kapansın.""

sanırım bu şekilde olur...
 
Kodda saniye yapmak yerine tekrar bir nem okuma yapıp istenilen seviyede su kapatması sağlanması bitkinin çok fazla su ile zarar görmesini engeller
Pompada, toprağın suyu emmesinde ve nem sensöründe gecikme olacağı için sensörden veri alana kadar su vermek bitkinin fazla sulanmasına neden olur. Bu nedenle bu tarz sistemlerde saksı boyutuna göre bir miktar su verilir, durulur ve toprağın suyu emmesi için yeteri kadar delay eklenir. Zaten döngü devam ettiği için toprak az sulanmışsa süreç tekrarlanır. Eğer ilk döngüde fazla sulama varsa, sulama süresi kısaltılarak optimize edilir.
 
loop içinde while ve delay kullanmayın. millis() fonksiyonunu kullanın. Loop içinde sürekli nem sensöründen bilgi okunacak, belirlenen nem yüzdesi altındaysa ve çalışma süresi belirlenen süreden az ise motoru çalıştır (zaten çalışıyor olabilir). Yeterli nem yüzdesi oluşmuşsa ya da çalışma süresi dolmuş veya aşılmışsa (>=) motoru durdur. Her üç pompa için aynı şekilde kodlanacak. Dolaysıyla pompalar aynı zamanda çalışabileceği gibi bağımsız olarak da çalışabilir, biri diğerini delay()'larda beklememiş olur. Köydeyim, telefondan bu kadar!
 
Biraz daha araştırarak kodu tekrar düzenledim. IDE ile derledim. hata vermiyor ama mantık hatası var mı yok mu diye Arduino kodlamadan anlayan arkadaşlar yorumlayabilir mi?

// çiçek_sulama V1.01
// 6 adet saksı sulanabiliyor
//sensörler analog giriş pinlerine tanımlandı
#define sensor1 A0
#define sensor2 A1
#define sensor3 A2
#define sensor4 A3
#define sensor5 A4
#define sensor6 A6

//delay için süre belirlendi
int sure=3000;

// nem oranının kıyaslanma değeri
int esik_deger = 700;

//pompalar dijital çıkış pinlerine tanımlandı

#define pompa_1 3
#define pompa_2 4
#define pompa_3 5
#define pompa_4 6
#define pompa_5 7
#define pompa_6 8

//okunan sensör değerleri eşik değerle kıyaslanabilmesi için saksı değişkenine aktarıldı
int okunan_saksi1 = 0;
int okunan_saksi2 = 0;
int okunan_saksi3 = 0;
int okunan_saksi4 = 0;
int okunan_saksi5 = 0;
int okunan_saksi6 = 0;

void setup() {
pinMode(pompa_1, OUTPUT);
pinMode(pompa_2, OUTPUT);
pinMode(pompa_3, OUTPUT);
pinMode(pompa_4, OUTPUT);
pinMode(pompa_5, OUTPUT);
pinMode(pompa_6, OUTPUT);

}

void loop() {
// 1. saksı için SENSÖR 1 OKUNACAK
okunan_saksi1 = analogRead(sensor1); //sensör 1 okundu ve saksı 1 değerine atandı
while(okunan_saksi1<esik_deger)
{ digitalWrite(pompa_1,HIGH);
delay(sure);
okunan_saksi1 = analogRead(sensor1); //sensör kıyas için tekrar okundu
}
digitalWrite(pompa_1,LOW); //NEM DEĞERİ İSTENEN DEĞERE ULAŞINCA DÖNGÜDEN ÇIKILDI VE POMPA KAPATILDI

// 2. saksı için SENSÖR 2 OKUNACAK
okunan_saksi2 = analogRead(sensor2);
while(okunan_saksi2<esik_deger)
{ digitalWrite(pompa_2,HIGH);
delay(sure);
okunan_saksi2 = analogRead(sensor2); //sensör kıyas için tekrar okundu
}
digitalWrite(pompa_2,LOW); //NEM DEĞERİ İSTENEN DEĞERE ULAŞINCA DÖNGÜDEN ÇIKILDI VE POMPA KAPATILDI

// 3. saksı için SENSÖR 3 OKUNACAK
okunan_saksi3 = analogRead(sensor3);
while(okunan_saksi3<esik_deger)
{ digitalWrite(pompa_3,HIGH);
delay(sure);
okunan_saksi3 = analogRead(sensor3); //sensör kıyas için tekrar okundu
}
digitalWrite(pompa_3,LOW); //NEM DEĞERİ İSTENEN DEĞERE ULAŞINCA DÖNGÜDEN ÇIKILDI VE POMPA KAPATILDI

// 4. saksı için SENSÖR 4 OKUNACAK
okunan_saksi4 = analogRead(sensor4);
while(okunan_saksi4<esik_deger)
{ digitalWrite(pompa_4,HIGH);
delay(sure);
okunan_saksi4 = analogRead(sensor4); //sensör kıyas için tekrar okundu
}
digitalWrite(pompa_4,LOW); //NEM DEĞERİ İSTENEN DEĞERE ULAŞINCA DÖNGÜDEN ÇIKILDI VE POMPA KAPATILDI

// 5. saksı için SENSÖR 5 OKUNACAK
okunan_saksi5 = analogRead(sensor5);
while(okunan_saksi5<esik_deger)
{ digitalWrite(pompa_5,HIGH);
delay(sure);
okunan_saksi5 = analogRead(sensor5); //sensör kıyas için tekrar okundu
}
digitalWrite(pompa_5,LOW); //NEM DEĞERİ İSTENEN DEĞERE ULAŞINCA DÖNGÜDEN ÇIKILDI VE POMPA KAPATILDI

//6. saksı için SENSÖR 6 OKUNACAK
okunan_saksi6 = analogRead(sensor6);
while(okunan_saksi6<esik_deger)
{ digitalWrite(pompa_6,HIGH);
delay(sure);
okunan_saksi6 = analogRead(sensor6); //sensör kıyas için tekrar okundu
}
digitalWrite(pompa_6,LOW); //NEM DEĞERİ İSTENEN DEĞERE ULAŞINCA DÖNGÜDEN ÇIKILDI VE POMPA KAPATILDI

}
 
Son düzenleme:
While ve delay kullanmayın, millis() kullanın diye önermiştim. Bu şekilde de çalışır tabi, ama sensörün birinde hata olur da nemi algılamazsa diğerleri devreye girmez. Tabi bu durumda sistem zaten suyu boca etmiş olur. O yüzden bu durumda da nem oranı olmasa da bir sigorta görevi olarak belli bir süre sonra pompa durmalı.

Kod:
void loop() {
// 1. saksı için SENSÖR 1 OKUNACAK
okunan_saksi1 = analogRead(sensor1); //sensör 1 okundu ve saksı 1 değerine atandı
while((okunan_saksi1<esik_deger)&&(millis()-pompa_acma_suresi<3000)) // millis e göre yazdım, çalışma süresi 3 saniyeden küçükse
{ digitalWrite(pompa_1,HIGH);
delay(sure);
okunan_saksi1 = analogRead(sensor1); //sensör kıyas için tekrar okundu
}
digitalWrite(pompa_1,LOW); //NEM DEĞERİ İSTENEN DEĞERE ULAŞINCA DÖNGÜDEN ÇIKILDI VE POMPA KAPATILDI
Bir de okunaklı olması için kodunuzu < / > (kod) içine alınız.
 
While ve delay kullanmayın, millis() kullanın diye önermiştim. Bu şekilde de çalışır tabi, ama sensörün birinde hata olur da nemi algılamazsa diğerleri devreye girmez. Tabi bu durumda sistem zaten suyu boca etmiş olur. O yüzden bu durumda da nem oranı olmasa da bir sigorta görevi olarak belli bir süre sonra pompa durmalı.

Kod:
void loop() {
// 1. saksı için SENSÖR 1 OKUNACAK
okunan_saksi1 = analogRead(sensor1); //sensör 1 okundu ve saksı 1 değerine atandı
while((okunan_saksi1<esik_deger)&&(millis()-pompa_acma_suresi<3000)) // millis e göre yazdım, çalışma süresi 3 saniyeden küçükse
{ digitalWrite(pompa_1,HIGH);
delay(sure);
okunan_saksi1 = analogRead(sensor1); //sensör kıyas için tekrar okundu
}
digitalWrite(pompa_1,LOW); //NEM DEĞERİ İSTENEN DEĞERE ULAŞINCA DÖNGÜDEN ÇIKILDI VE POMPA KAPATILDI
Bir de okunaklı olması için kodunuzu < / > (kod) içine alınız.
millis() nedir/nasıl kullanılır çalışmam lazım....
while kısmını ise anlayamadım . Sensör okumasını if ile mi kontrol edelim ?
While ve delay kullanmayın, millis() kullanın diye önermiştim. Bu şekilde de çalışır tabi, ama sensörün birinde hata olur da nemi algılamazsa diğerleri devreye girmez. Tabi bu durumda sistem zaten suyu boca etmiş olur. O yüzden bu durumda da nem oranı olmasa da bir sigorta görevi olarak belli bir süre sonra pompa durmalı.

Kod:
void loop() {
// 1. saksı için SENSÖR 1 OKUNACAK
okunan_saksi1 = analogRead(sensor1); //sensör 1 okundu ve saksı 1 değerine atandı
while((okunan_saksi1<esik_deger)&&(millis()-pompa_acma_suresi<3000)) // millis e göre yazdım, çalışma süresi 3 saniyeden küçükse
{ digitalWrite(pompa_1,HIGH);
delay(sure);
okunan_saksi1 = analogRead(sensor1); //sensör kıyas için tekrar okundu
}
digitalWrite(pompa_1,LOW); //NEM DEĞERİ İSTENEN DEĞERE ULAŞINCA DÖNGÜDEN ÇIKILDI VE POMPA KAPATILDI
Bir de okunaklı olması için kodunuzu < / > (kod) içine alınız.
Bir de okunaklı olması için kodunuzu < / > (kod) içine alınız. Bu kısmı da anlayamadım...
 

Ekli dosyalar

  • IMG_20240501_215417.jpg
    IMG_20240501_215417.jpg
    259.6 KB · Görüntüleme: 2

Forum istatistikleri

Konular
129,475
Mesajlar
927,272
Kullanıcılar
452,046
Son üye
87K

Yeni konular

Geri
Üst