Bolg -Arduino – Senzor de ploaie

Arduino – Senzor de ploaie

Postat de pe data de 26 ianuarie 2021 in categoria Arduino

image_pdfimage_print

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ță:

  • senzorul va avea rezistență minimă când este acoperit cu apă.
  • senzorul va avea rezistență maximă când este uscat.
  • când sunt doar câteva picături de apă , rezistența va fi între maxim și minim.

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 :

  • led de power ( prezență tensiune ) – se aprinde când alimentăm modulul.
  • led de stare – se aprinde când ieșirea digitală ( DO ) este în starea LOW.

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ă :

  • valoarea maximă la pinul AO va fi 5V ( 3,3V ) dacă senzorul este uscat.
  • valoarea minimă la pinul AO va fi 0V dacă senzorul este complet ud ( acoperit de apă ).

Cunoscând aceste lucruri tragem următoarele concluzii :

  1. Dacă senzorul este uscat vom citi valoarea 1024
  2. Dacă senzorul este ud ( acoperit de apă ) vom citi valoarea 0.
  3. Dacă împărțim 1024 ( valoarea maximă ) la 3 ( avem trei stări: plouă torențial, picură, nu plouă ) obținem :

1024:3 = 341, și vom avea :

  • pt AO între 0 și 341 = plouă torențial
  • pt AO între 342 și 648 = picură
  • pt AO între 649 și 1024 = nu plouă.

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);
}

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Acest sit folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.



Insert math as
Block
Inline
Additional settings
Formula color
Text color
#333333
Type math using LaTeX
Preview
\({}\)
Nothing to preview
Insert