Kod pronađite na linku: https://github.com/VidiLAB-com/Vidi-X/tree/master/APDS-9960_color_senzor_kiselosti
Lakmus papir se koristi kao kiselo-bazni indikator koji se u kiselome mediju oboji crveno, a u lužnatome tamno plavo.
U ovoj radionici senzor će očitavati boju te će na osnovu pročitane vrijednosti javiti radi li se o kiselome ili lužnatom mediju.
Za ovu radionicu biti će nam potrebno:
VIDI X mikroračunalo – Više informacija o Vidi X mikroračunalu pronađite na linku https://vidi-x.org/
APDS-9960 senzor – senzor pokreta i boja koji koristi I2C komunikaciju za spajanje na VIDI X
https://e-radionica.com/hr/senzor-gesti-blizine-i-rgb-boja-apds-9960-breakout-made-by-e-radionica.html
Bijela LED dioda – kao izvor svijetlosti
https://e-radionica.com/hr/paket-5mm-led-dioda-13-komada.html
330 ohm otpornik – za limitiranje napona koji dolazi do LED diode
https://e-radionica.com/hr/25x-330ohm-otpornik-za-ledice.html
Kućište – u koje ćemo smjestiti senzor i LED diodu kako bi eliminirali vanjski utjecaj svijetlosti na senzor. Napravili smo ga od papirnate kutijice za kapi za oči te oblijepili izolirbandom kako bi dobili na njegovoj čvrstini
Indikator-papir – lakmus-papir je jednostavnije koristiti, no kako ga nismo uspjeli nabaviti, koristili smo univerzalni indikator-papir za pH vrijednosti od 0 do 14
Nešto spojnih žica – koristili smo žensko-ženske kabliće jer i na VIDI X-u i na senzoru imamo muške pinove
https://e-radionica.com/hr/set-kablica-zenko-zenski.html
APDS-9960 je mali senzor koji mjeri četiri stvari odjednom. Sposoban je prepoznati pokrete koje napravite ispred njega, a to su pokret prema gore, dolje, lijevo i desno, a može prepoznati i blizinu objekta, pa tako mjeri još dva pokreta, prema senzoru i od njega. Pokret se mjeri uz pomoć promijene u boji, no u ovoj radionici nećemo se baviti pokretom nego njegovim RGB senzorom boje i ambijentalnim senzorom osvjetljenja.
Senzor će putem I2C komunikacije očitati vrijednosti svake od boja iz RGB spektra kao i razinu ambijentalnog osvjetljenja te će vratiti 16 bitnu vrijednost svake od njih.
Benefit tako velike rezolucije je taj što će senzor raditi i kada se nalazi u uvjetima smanjenog osvjetljenja.
Naš cilj je senzor zaštititi od vanjskog utjecaja svijetlosti jer se zrake svjetlosti i razne refleksije odbijaju od raznih predmeta. Zatim je potrebno osvijetliti predmet tj. u našem slučaju papir za očitavanje pH vrijednosti kako bi senzor što točnije očitao boju, jer u nedostatku svijetlosti sve boje budu crne.
Shema spajanja
Senzor spajamo, kao i u ostalim radionicama koje su koristile I2C komunikaciju, na pinove GPIO32 i GPIO33 koje na VIDI X-u koristimo kao tipke A i B, pa je stoga potrebno prebaciti mikroprekidače oznaka BTN_A i BTN_B u poziciju USE EXP: Bijelu LED diodu spojili smo direktno na izvor napajanja od tri volte tj. na pinove označene oznakom 3V3. Između LED i GND pina spojili smo otpornik od 330 ohma. Svejedno je spojimo li otpornik na anodu ili katodu LED diode, dobiti ćemo isti efekt, tj. ograničiti ćemo jakost struje koja dolazi do diode.
Shema spajanja APDS 9960 senzora. Bijelu LE diodu spojili smo da svijetli trajno
Nikako ne smijemo zaboraviti postaviti switcheve u poziciju za korištenje expansion slota, kao na slici lijevo
Kada je senzor spojen potrebno ga je zaštititi od utjecaja vanjske svjetlosti
Mi smo senzor zašarafili na kut VIDI X-a, no vaše rješenje može se razlikovati od ovoga. Na ovaj način nam je bilo lakše pokriti senzor kutijicom napravljenom od kutije za kapi za oči koju smo izolirbandom fiksirali za VIDI X. Na jednoj stranici kućišta nalazi se maleni otvor u koji možemo ugurati indikator-papir.
Programski kod:
Za I2C komunikaciju koristiti ćemo biblioteku #include "Wire.h".
Sada definiramo pinove na koje je spojen senzor, narednim linijama koda:
#define I2C_SDA 32
#define I2C_SCL 33
Unutar setup petlje ne smijemo zaboraviti definirati pri kojoj brzini komunikacije koristimo koje pinove linijom koda:
Wire.begin(I2C_SDA, I2C_SCL, 100000);
Putem uvjeta gledamo može li senzor očitati iznose svjetline prostora, te iznose crvene, zelene i plave boje:
if ( !apds.readAmbientLight(kolcinaSvjetlosti) ||
!apds.readRedLight(crvenaBoja) ||
!apds.readGreenLight(zelenaBoja) ||
!apds.readBlueLight(plavaBoja) )
Očitane iznose pospremili smo u varijable navedene unutar uvjeta. Radi lakšeg prikaza dobivene boje, a kako se radi o 16-bitnim vrijednostima, pretvorit ćemo ih u 8-Bitne vrijednosti interpolacijom. Kao maksimum uzeti ćemo varijablu kolcinaSvjetlosti te boje interpolirati funkcijom map ovim linijama koda:
int c = map(crvenaBoja, 0, kolcinaSvjetlosti, 0, 255);
int z = map(zelenaBoja, 0, kolcinaSvjetlosti, 0, 255);
int p = map(plavaBoja, 0, kolcinaSvjetlosti, 0, 255);
Sada možemo pozadinu ekrana obojati u dobivene interpolirane vrijednosti linijom koda:
TFT.fillScreen(TFT.color565(c, z, p));
Kada imamo senzor u kućištu s osvjetljenjem, očitat ćemo nekoliko indikator-papira (tj. lakmus-papira) kako bi dobili referentne vrijednosti senzora za kiselu, odnosno lužnatu tekućinu.
Vrijednosti boja ispisali smo na serijsku konzolu.
Tako ispisanim vrijednostima utvrdili smo da najveću razliku kada stavimo papir u kućište te ga izvadimo dobivamo u zelenoj boji. Stoga smo postavili uvjet ukoliko je zelena boja veća od 25, utoliko pročitaj crvenu boju, a ukoliko je manja ili jednaka 25, utoliko javi da je kućište prazno.
Nastavljamo sa testiranjem indikator-papira. Jedan indikator-papir umočili smo u otopinu vode i sode bikarbone kako bismo dobili vrijednosti kod lužine, a drugi u ocat kako bismo dobili vrijednosti kod kiseline. Indikator-papir je poplavio u doticaju s otopinom sode bikarbone dok je u doticaju s octom postao zelenkasto žuti.
Očitavanjem vrijednosti boja na serijskoj konzoli s ta dva papira, utvrdili smo najveću razliku u očitavanju crvene boje pa smo programski provjeravali vrijednost crvene boje koja nam kaže da je otopina kisela ako vrijednost prelazi broj 30. U suprotnom javlja da je otopina lužnata.
Dokumentaciju senzora proučite na linku: https://docs.broadcom.com/doc/AV02-4191EN
Kod izgleda ovako:
if ( zelenaBoja > 25 ) {
if ( crvenaBoja > 30 ) { //ako JE
TFT.setTextColor(ILI9341_RED); // postavljamo boju teksta
TFT.setCursor(90, 20);
TFT.print("KISELO");
} else { //ako NIJE
TFT.setTextColor(ILI9341_YELLOW); // postavljamo boju teksta
TFT.setCursor(80, 20);
TFT.print("LUZNATO");
}
} else { //ako NIJE
TFT.setTextColor(ILI9341_WHITE); // postavljamo boju teksta
TFT.setCursor(90, 20);
TFT.print("PRAZNO");
}
Zelenu i crvenu boju uzeli smo kao one koje uspoređujemo jer nam dokumentacija senzora govori kako su baš te dvije boje osjetljivije spram plave, pa je vjerojatnije da ćemo koristeći ih dobiti točnije rezultate.
Lijevo imamo ocat i indikator-papir koji pokazuje kiselo, a desno otopinu sode bikarbone koja je lužnata kako pokazuje indikator-papir
Kada biste napravili kompaktnije kućište od ovoga našeg kartonskog, mogli biste uz pomoć referentnih boja indikator-papira pročitati točne pH vrijednosti otopina te ih programski definirati, a onda interpolacijom mjeriti i pH vrijednosti između tih referentnih koje smo dobili mjerenjem.
Pogledajte video, kako radi detektor: