Merenje vlažnosti zemljišta

Lekcija 8 od 13 · Arduino i ESP32

Merenje vlažnosti zemljišta je česta i korisna praktična vežba u kojoj se uči kako se senzori povezuju sa mikrokontrolerima i kako se analogni signal pretvara u smislenu fizičku veličinu. Dva najčešća načina su kapacitivni i otpornički (zasnovan na otpornosti). Obe vrste senzora daju električni signal koji mikrokontroler čita preko AD konvertora (analogno-digitalnog pretvarača), ali rade na različitim fizičkim principima i imaju različite prednosti i mane u praksi.

Kapacitivni senzor vlažnosti zemljišta – princip rada

Kapacitivni senzor vlažnosti zemljišta je, u suštini, kondenzator napravljen na štampanoj ploči (PCB), čija se kapacitivnost menja sa električnim (dielektričnim) osobinama zemljišta oko njega. „Elektrode“ su bakarne staze na ploči koje se prepliću i čine dve ploče kondenzatora, razdvojene materijalom ploče i zemljištem oko nje.

Kada se vlažnost zemljišta poveća, raste dielektrična konstanta materijala između i oko staza (voda ima mnogo veću dielektričnu konstantu od suvog zemljišta ili vazduha). Zbog toga raste i kapacitivnost. Modul senzora ima jednostavnu elektroniku (oscilator, RC kolo ili pretvarač kapacitivnosti u napon) koja malu promenu kapacitivnosti pretvara u merljiv analogni napon (AOUT), koji čitamo AD konvertorom.

Važno u praksi: kapacitivni senzori ne provode struju kroz zemljište (staze su obično prekrivene zaštitnim slojem), pa ne korodiraju brzo. Obično su stabilniji i duže traju, a dobro rade sa mikrokontrolerima na 3,3 V ili 5 V.

Otpornički senzor vlažnosti zemljišta – princip rada

Otpornički senzor vlažnosti meri električnu otpornost (odnosno provodljivost) između dve gole metalne elektrode zabodene u zemlju. Kada zemljište sadrži više vode i rastvorenih jona, bolje provodi struju i otpornost između elektroda se smanjuje; kada je zemljište suvo, otpornost raste.

Otpornička sonda se obično koristi u naponskom delitelju: sonda je jedan deo delitelja, a poznati otpornik drugi. Napon u srednjoj tački delitelja menja se sa otpornošću sonde i mikrokontroler ga čita na analognom ulazu. Mnogi gotovi kompleti imaju malu pločicu sa operacionim pojačavačem ili komparatorom, koja daje i analogni izlaz (A0) i digitalni izlaz sa podesivim pragom (D0).

Važno u praksi: otporničke sonde su jednostavne i jeftine, a digitalni izlaz je zgodan za jednostavno upravljanje po pragu (npr. uključivanje pumpe). Ali pošto kroz elektrode teče jednosmerna struja, one vremenom korodiraju i propadaju; dugoročno daju i manje stabilna očitavanja od kapacitivnih senzora.

U vežbi koja sledi pokazaćemo kako se obe vrste senzora povezuju sa Arduinom (ili ESP32), kako se čita i tumači analogni signal i kako se očitavanja podešavaju za tvoje zemljište. Vežba sadrži šeme povezivanja, primer koda i grafički prikaz izmerenih vrednosti.

Kapacitivni senzor vlažnosti zemljišta – merenje vlažnosti
Slika 1: Kapacitivni senzor vlažnosti zemljišta – merenje vlažnosti

Otpornički senzor vlažnosti zemljišta

Ovaj deo nastavlja lekciju o merenju vlažnosti i bavi se otporničkom sondom. Otpornička sonda je jednostavan i jeftin senzor koji meri koliko dobro zemljište provodi struju – praktičan način da se proceni vlažnost. U nastavku objašnjavamo šta sonda meri, za šta se obično koristi i kako se povezuje – u pojednostavljenoj šemi u Tinkercad-u i u stvarnom kolu sa malom pločicom drajvera (modul LM393).

Kako otpornička sonda meri vlažnost

Sonda ima dve gole metalne elektrode koje se zabadaju u zemlju. Zemljište između elektroda ponaša se kao otpornik: kada ima više vode i rastvorenih jona, otpornost se smanjuje; kada je suvo, otpornost raste. Sama sonda nije aktivna komponenta – mora biti deo jednostavnog kola (najčešće naponskog delitelja), da bi mikrokontroler mogao da očita napon koji zavisi od otpornosti zemljišta.

Najčešće se koristi za:

  • jednostavno praćenje vlažnosti za zalivanje biljaka,
  • prepoznavanje praga (da li je zemljište suvo ili vlažno) u sistemima za automatsko zalivanje,
  • školske projekte i prototipove gde je važna niska cena.

Povezivanje – osnovna ideja

Uobičajeno električno kolo je naponski delitelj. Jedan deo delitelja je sonda (promenljiva otpornost Rsoil), a drugi poznati otpornik R1. Napon u srednjoj tački čita AD konvertor mikrokontrolera:

VCC --- R1 ---+--- A0 (ulaz AD konvertora)
              |
           Rsoil (sonda)
              |
             GND

Kada se Rsoil menja, menja se i napon u srednjoj tački, pa analogRead() vraća drugu vrednost. Za pouzdane rezultate:

  • izaberi R1 tako da se napon u srednjoj tački menja u korisnom opsegu AD konvertora (najčešće 10 kΩ),
  • napajaj sondu samo kratko, za vreme merenja, da bi se elektrode manje trošile,
  • koristi zajedničku masu za modul senzora i mikrokontroler.
Šema povezivanja otporničkog senzora vlažnosti zemljišta sa Arduino UNO pločom u Tinkercad-u
Slika 2: Šema povezivanja otporničkog senzora vlažnosti zemljišta sa Arduino UNO pločom, simulacija u Tinkercad-u

Senzor vlažnosti zemljišta meri količinu vode u zemljištu na osnovu promene njegove električne otpornosti. Kada je zemljište suvo, otpornost je velika, a u vlažnom zemljištu se smanjuje. Senzor tu otpornost pretvara u napon koji Arduino ploča može da očita.

Na Slici 2 je osnovna šema povezivanja senzora vlažnosti direktno sa Arduino UNO pločom. Šema, napravljena u Tinkercad-u, prikazuje jednostavno povezivanje pinova senzora VCC, GND i Signal sa odgovarajućim pinovima Arduina.

U ovoj vežbi se analogni pin A0 koristi za čitanje izlaznog napona senzora. Taj napon zavisi od otpornosti zemljišta između dve elektrode sonde. Arduino pretvara analogni napon u digitalnu vrednost od 0 do 1023, koja pokazuje relativnu vlažnost.


Korišćenje modula sa komparatorom LM393

Na Slici 3 je prikazano stvarno povezivanje senzora preko modula sa komparatorom LM393. Ovaj modul omogućava da senzor radi i u analognom i u digitalnom režimu.

  • Analogni izlaz (A0) – daje napon koji se neprekidno menja sa vlažnošću zemljišta.
  • Digitalni izlaz (D0) – daje signal 0 ili 1, u zavisnosti od podešenog praga.

Pločica sa komparatorom ima mali potenciometar kojim se podešava naponski prag. Kada izmereni napon senzora padne ispod tog praga, digitalni izlaz (D0) postaje LOW (0); u suprotnom ostaje HIGH (1). Tako se mogu pokretati jednostavne radnje, na primer uključivanje pumpe za vodu ili LED indikatora.


Raspored pinova

Modul LM393 ima 4 + 2 pina:

  • na strani sa dva pina povezuju se metalne elektrode senzora;
  • na strani sa četiri pina (izlaz modula):
    • VCC → na 5V Arduina
    • GND → na GND Arduina
    • A0 → na analogni ulaz A0
    • D0 → digitalni izlaz po želji, za prepoznavanje praga

Ovakvo povezivanje olakšava merenje vlažnosti i dobro pokazuje princip merenja preko otpornosti pomoću Arduina.

Modul LM393 senzora vlažnosti zemljišta povezan sa Arduino Uno pločom: 5V, GND, analogni pin A0 i otpornička sonda sa dve elektrode
Slika 3: Šema povezivanja otporničkog senzora vlažnosti (modul LM393) sa Arduino Uno pločom – napajanje, analogni izlaz (A0) i povezivanje sonde
Ova šema pokazuje kako se otpornički senzor vlažnosti sa modulom LM393 povezuje sa Arduino Uno pločom radi analognog merenja vlažnosti. Dve metalne elektrode senzora se priključuju na dvopinski konektor modula. Pločica LM393 se napaja sa 5V i GND pinova Arduina, a njen analogni izlaz (A0) je povezan na ulaz A0 Arduina, za neprekidno merenje. Za razliku od same sonde, modul ima komparator i potenciometar i daje stabilan analogni napon koji zavisi od provodljivosti zemljišta. Veća vlažnost smanjuje otpornost sonde i daje manju analognu vrednost na A0, koja se zatim u programu pretvara u procenat. Ovako se vlažnost zemljišta pouzdano prati bez digitalnog izlaza (D0), koji je potreban samo za jednostavno prebacivanje suvo/vlažno.

Merenje vlažnosti zemljišta kapacitivnim senzorom

Kapacitivni senzor vlažnosti zemljišta je napredniji tip senzora vlažnosti. Za razliku od otporničkog, koji meri promenu električne otpornosti između dve elektrode, kapacitivni senzor meri promenu kapacitivnosti koja nastaje zbog dielektričnih osobina zemljišta. Kada zemljište postane vlažnije, njegova dielektrična konstanta raste, kapacitivnost se povećava i menja se analogni izlazni signal senzora.

Glavna prednost kapacitivnog senzora u odnosu na otpornički je što ne izaziva elektrolizu, jer kroz zemljište ne teče jednosmerna struja. Zato senzor mnogo duže traje i daje stabilnija i ponovljivija merenja.

Pregled

Na Slici 1 je stvarno povezivanje kapacitivnog senzora vlažnosti sa Arduino pločom, zabodenog u saksiju, a na Slici 2 je šema povezivanja senzora – pinovi za napajanje (Vcc i GND) i analogni izlaz (A0) povezan na analogni ulaz Arduina.

Rad senzora

Kapacitivni senzor ima analogni izlaz označen sa AO, koji daje napon srazmeran vlažnosti zemljišta. Arduino taj napon čita funkcijom analogRead(A0). Vrednost je obično od 0 do 1023 i može se linearno pretvoriti u procenat vlažnosti, da bi se lakše tumačila.

// Primer: čitanje kapacitivnog senzora vlažnosti zemljišta
int sensorPin = A0;        // analogni ulaz povezan na AO pin senzora
float moistureValue = 0;   // trenutna vlažnost

void setup() {
  Serial.begin(115200);    // komunikacija sa Processing-om
}

void loop() {
  int rawValue = analogRead(sensorPin);              // sirova vrednost sa senzora
  moistureValue = map(rawValue, 1023, 300, 0, 100);  // pretvaranje u procenat (granice podesi za svoj senzor)
  Serial.println(moistureValue);                     // slanje vlažnosti u Processing
  delay(3000);                                       // pauza od 3 sekunde između merenja
}

Serijska komunikacija i prikaz u Processing-u

Podaci se u Processing šalju na isti način kao kod otporničkog senzora. U oba slučaja Arduino šalje jedan broj – procenat vlažnosti zemljišta – preko serijskog porta brzinom od 115200 bauda.

Zato se isti Processing program iz prethodnog dela može koristiti i za ovaj senzor. On sam prima vrednosti vlažnosti preko funkcije serialEvent(), prikazuje ih na ekranu i promene prikazuje uživo, tekstom i obojenom trakom.

Jedina razlika između ova dva senzora je princip merenja – otpornički senzori mere provodljivost, a kapacitivni promenu dielektrične konstante. Povezivanje, komunikacija i prikaz su isti.

Arduino kod – merenje vlažnosti zemljišta

Sledeći Arduino program čita podatke sa otporničkog senzora vlažnosti preko analognog ulaza A0. Izmerena vrednost se pretvara u procenat vlažnosti i šalje preko serijskog porta na svake 3 sekunde. Podaci se mogu gledati direktno u Serial Monitor-u (u Arduino IDE) ili čitati u drugim programima, kao što je Processing, radi prikaza i dalje analize.

Arduino program

// analogni pin na koji je povezan senzor vlažnosti zemljišta
const int pin_A0 = A0;

// prag ispod kog se zemljište smatra suvim
const int dryThreshold = 200;

void setup() {
  // serijska veza brzinom 115200 bita u sekundi
  Serial.begin(115200);
}

void loop() {
  // sirova analogna vrednost sa senzora (0 do 1023)
  int sensorValue = analogRead(pin_A0);

  // pretvaranje u procenat:
  // velika vrednost (npr. 1023) → suvo zemljište → mali procenat vlažnosti
  // mala vrednost (npr. 300) → vlažno zemljište → veliki procenat vlažnosti
  float moisturePercent = 100.0 * (1023 - sensorValue) / 1023;

  // slanje izračunatog procenta na serijski port
  Serial.println(moisturePercent);

  // pauza od 3 sekunde pre sledećeg merenja
  delay(3000);
}

Objašnjenje

  • analogRead(A0) čita napon sa senzora i pretvara ga u digitalnu vrednost od 0 do 1023.
  • Veće vrednosti znače suvlje zemljište (veća otpornost), a manje vrednosti vlažnije.
  • Procenat se računa linearno, da bi se lakše tumačio.
  • Serial.println() šalje izmereni procenat vlažnosti na serijski interfejs – može se pratiti u Serial Monitor-u ili u drugim programima koji čitaju serijske podatke, kao što su Processing, MATLAB ili Python skripte.

Ovaj jednostavan program može biti osnova za složenije primene, kao što su sistemi za automatsko zalivanje ili beleženje podataka o okolini.

Processing kod – prikaz podataka o vlažnosti zemljišta

Sledeći Processing program prima podatke o vlažnosti zemljišta sa Arduina preko serijskog porta i prikazuje ih na ekranu tekstom i grafički. Svaka vrednost koju Arduino pošalje je trenutni procenat vlažnosti i šalje se na svake 3 sekunde naredbom Serial.println().

Processing program

import processing.serial.*;

Serial myPort;
String val = "";
float moisture = 0;   // poslednja vrednost vlažnosti (0–100 %)

void setup() {
  size(400, 200);                                       // veličina prozora
  myPort = new Serial(this, Serial.list()[0], 115200);  // otvaranje prvog dostupnog serijskog porta
  myPort.bufferUntil('\n');                             // serialEvent() se poziva kada stigne ceo red
}

void draw() {
  background(255);                       // bela pozadina
  fill(0);                               // crna boja teksta
  textSize(20);
  text("Vlaznost zemljista: " + nf(moisture, 0, 2) + "%", 50, 60);  // ispis sa 2 decimale

  // traka koja prikazuje vlažnost
  fill(0, 100, 255);
  rect(50, 100, map(moisture, 0, 100.0, 0, 300), 30);  // plava traka srazmerna vlažnosti
}

void serialEvent(Serial p) {
  val = p.readStringUntil('\n');         // čitanje celog reda koji je poslao Arduino
  if (val != null) {
    val = trim(val);                     // uklanjanje razmaka i znaka za novi red
    try {
      moisture = float(val);             // pretvaranje teksta u broj
    } catch (Exception e) {
      println("Neuspelo citanje vrednosti: " + val);  // poruka ako pretvaranje ne uspe
    }
  }
}

Objašnjenje

  • Serijska komunikacija: program koristi biblioteku processing.serial za komunikaciju sa Arduino pločom preko USB-a.
  • Serial.list() vraća spisak dostupnih portova. Prvi ([0]) je obično Arduino – ako nije, probaj drugi indeks.
  • Funkcija serialEvent() se sama poziva kada stignu novi serijski podaci. Ona čita ceo red (koji se završava znakom '\n') koji je poslao Arduino. Da bi se pozivala tek kada stigne ceo red, u setup() se poziva myPort.bufferUntil('\n').
  • Tekst se zatim pretvara u float, da bi se mogao koristiti za računanje i crtanje.
  • U petlji draw() poslednja vrednost se prikazuje kao tekst i kao plava traka čija dužina odgovara procentu vlažnosti.

Ovakav prikaz omogućava da se promene vlažnosti prate uživo. Kada povežeš otpornički ili kapacitivni senzor sa Arduinom, možeš videti kako se izmerena vrednost menja u različitim uslovima (suvo, vlažno, mokro). Processing je jednostavan i zanimljiv način za grafički prikaz podataka sa senzora u Arduino projektima.

Proveri znanje

Otvori kviz

Kviz: vlažnost zemljišta

1. Šta se dešava sa otpornošću zemljišta kada je vlažnije?




2. Koja je glavna prednost kapacitivnog senzora?




3. Čemu služi izlaz D0 na modulu LM393?




4. Zašto se u Processing-u poziva myPort.bufferUntil('\n')?