Senzorul de ploaie pe care îl vom folosi arată astfel:
După cum se vede , senzorul este o plăcuță cu trasee din cupru sau nichel, iar aceste trasee împreună se vor comporta ca un rezistor variabil ( potențiometru ) la contactul cu apa. Rezistența va varia în funcție de cantitatea de apă depusă pe plăcuță:
Concluzia : Rezistența senzorului este invers proporțională cu cantitatea de apă.
Senzorul vine și cu un modul electronic care are rolul de a produce o tensiune la ieșirea analogică în funcție de rezistența senzorului de ploaie. Tot acest modul scoate un semnal digital la ieșire.
Modulul electronic are în componență un rezistor semireglabil cu care reglăm senzitivitatea ieșirii digitale. Cu alte cuvinte prin acest rezistor semireglabil reglăm la câtă cantitate de apă ( pe plăcuță ) ieșirea digitală va fi LOW ( 0 logic ) sau HIGH ( 1 logic ).
OBS!!!! Rotiți semireglabilul spre dreapta pentru a mări senzitivitatea și spre stânga pentru a o micșora.
În afară de acest semireglabil, pe modulul electronic găsim și două leduri :
Configurația pinilor pentru modulul electronic și senzor :
AO : pin de ieșire analogică. Ieșirea este un semnal analogic între 0V și tensiunea de alimentare ( 5V sau 3.3V )
DO : pin de ieșire digitală. LOW ( 0 logic ) dacă umiditatea sau apa depășește valoarea setată cu ajutorul semireglabilului este depășită și HIGH ( 1 logic ) dacă apa sau umiditatea nu depășește valoarea setată cu ajutorul semireglabilului.
Vcc : tensiunea de alimentare ( 5V sau 3,3V )
GND : masă.
OBS!!! Din cauza apei apare coroziunea pe placa cu trasee și de aceea este recomandat ca senzorul să fie alimentat doar când se face citirea lui, prelungindu-i viața.
Senzorul + modulul electronic consumă în jur de 8mA de aceea tensiunea de alimentare ( 5V sau 3.3V ) o putem lua de pe placa Arduino.
Aplicație : Detectarea ploii
Dorim să creăm o aplicație cu care să detectăm cănd plouă.
Varianta 1 – Folosirea pinului DO, ieșirea digitală, a senzorului :
Codul de program:
#define senzorPin 8
void setup() {
Serial.begin(9600);
}
void loop() {
int val = digitalRead(senzorPin);
if (val) {
Serial.println("Nu Ploua!!");
} else {
Serial.println("Ploua!!!!");
}
delay(1000); // Citim ieșirea digitală la fiecare 1000ms
Serial.println();
}
Varianta 2 – folosirea pinului DO și conectarea pinului Vcc la un pin digital al plăcii arduino.
Cod de program:
#define alimentareSenzor 7 //declaram unde este conectat pinul Vcc
#define senzorPin 8 // declaram unde este conectat pinul D0 al senzorului
void setup() {
pinMode(alimentareSenzor, OUTPUT); // initializam pinul digital 8 al placii arduino ca fiind de iesire
// Initial tinem senzorul nealimentat
digitalWrite(alimentareSenzor, LOW);
Serial.begin(9600); // initializam comunicarea seriala
}
void loop() {
//variabilei "val" ii atribuim valoarea citita de la pinul //8.Citirea se face cu ajutorul functiei "citireSenzor"
int val = citireSenzor();
// // daca valoarea este HIGH atunci scriem la portul srial mesajul //"Nu ploua", daca valoarea este LOW scriem la portul serial "Ploua"
if (val) {
Serial.println("Nu ploua!!");
} else {
Serial.println("Ploua!!");
}
delay(1000); // Astepta 100ms
Serial.println();
}
// Aceasta functie are rolul de a citi valoarea pinului D0 si apoi // intrerupe alimentarea senzorului.
int citireSenzor() {
digitalWrite(alimentareSenzor, HIGH); // Alimentam senzorul
delay(100); // Asteptam 100ms ca alimentarea sa isi faca treaba
int val = digitalRead(senzorPin); // Citim valoarea senzorului
digitalWrite(alimentareSenzor, LOW); // Intrerupem alimentarea
return val; // Returnam valoarea citita.
}
Avantajul acestei scheme este că nu trebuie să ținem alimentat senzorul mereu, îl alimentăm doar când facem citirea lui astfel prelungim viața senzorului de ploaie.
Varianta 3. – Utilizarea pinului analogic AO ,de ieșire
Un avantaj al utilizării pinului analogic ( AO ), față de cel digital DO, este că putem controla mai bine detectarea ploii.
De exemplu, dacă dorim să realizăm un proiect care să ne spună daca plouă torențial, picură sau nu plouă folosim ieșirea analogică ( AO ).
Știm că valoarea pinului AO este cuprinsă între 0 – 5V ( 3.3V ) iar valoarea analogică citită de la pinul AO va fi : 0 – 1024. Tot despre acest senzor știm că :
Cunoscând aceste lucruri tragem următoarele concluzii :
1024:3 = 341, și vom avea :
Cod program :
const int ploaieMin=0;
const int ploaieMax=1024;
void setup() {
Serial.begin(9600);
}
void loop() {
int citireSenzor=analogRead(A0);
int range=map(citireSenzor, ploaieMin, ploaieMax, 0, 3);
switch(range)
{
case 0:
Serial.println("ploua");
Serial.println(citireSenzor);
Serial.println(range);
break;
case 1:
Serial.println("picura");
Serial.println(citireSenzor);
Serial.println(range);
break;
case 2:
Serial.println("Nu ploua");
Serial.println(citireSenzor);
Serial.println(range);
break;
}
delay(1000);
}
xx