LAKI PINGVINI Hemija na Arduino način
Da li ste razmišljali o tome koliko je kvalitetna voda koju pijete sa česme ili iz flaše? Da li ste je nekada nosili na analizu? U prodaji se mogu kupiti portabl uređaji za merenje nekoliko parametara. Međutim, ako imate osnovno predznanje (a možete ga steći na ovim stranicama - prim. aut.), neku razvojnu ploču i par sondi i aktuatora, do vrlo zanimljivih podataka možete doći i sami, za tili čas. I to bez laboratorije i hemijskog fakulteta. pH - potencijal vodonika ![]() Bez obzira da li proveravamo kvalitet vode za piće ili, recimo, vode u bazenu ili akvarijumu, mi, zapravo, proveravamo nekoliko parametara. Jedan od najvažnijih parametara je odnos kiselosti i baznosti vode. Meri se u rasponu od nula do 14, gde je 7 neutralno. Sve ispod neutralnog je kiselo, dok je sve iznad bazno. Skala je logaritamska, tako da svaki broj levo i desno predstavlja uvećanje od po deset puta u odnosu na prethodni, pa je tako pH=8 deset puta više alkalna od pH=7, dok je pH=9 sto puta više od pH=7, dok je pH=11 deset hiljada puta više od pH=7. Isto važi i za kiselost, ali u suprotnom smeru. Sok od limuna će se bez problema spustiti do pH=2, dok je prašak za pecivo oko pH=9,5. Voda za piće se obično kreće oko pH=7, ali ne i nužno. „Prolom” voda sa ponosom ističe da je njena pH vrednost 8,8, zarad korigovanja ravnoteže u organizmu. Ovu vodu ćemo i koristiti za naše testove, mada se mogu nabaviti i kalibracioni rastvori (ali i prah). Nisu isti nivoi pH vode za piće ili vode u bazenima, ali dublje ulaženje u analizu prevazilazi namenu ove rubrike. Po onlajn prodavnicama mogu se nabaviti moduli sa staklenom sondom za merenje pH vrednosti. Mi smo nabavili kit od DIY More, kao jedan od povoljnijih. Sonda dolazi sa malom ampulom rastvora i ne bi trebalo da ostaje suva. Sama sonda sastoji se iz referentne i pH žice razdvojene pH osetljivom membranom u okviru staklene cevi. Sa modulom se povezuje preko BNC priključka. Modul ima priličan broj komponenata. Imamo dva OP AMP LM358p o kojima smo pisali u prošlom broju, ali i jedan 4502AC precizni pojačivač. Za kompenzovanje temperature, na modulu je 103 termistor, uz dva potenciometra od po 10 kilooma. Između dva potenciometra je programabilni regulator TL341A. Preko potenciometra bliže BNC-u kalibrišemo modul, dok se sa drugim postavlja prag na digitalnom izlazu. Modul napajamo sa pet volti preko V+ i G(ND). Na modulu postoje dva G i oba spajamo. Razlog razdvojenih G je mogućnost da modul ima zasebno napajanje. Mi radimo samo sa Unom. Pin obeležen sa „Po” je analogni pin modula, „Do” je digitalni i na njemu imamo interapt prethodno podešen preko potenciometra, a koji na pin šalje HIGH. To je temperaturni pin termistora, radi kompenzacije temperature. U našem primeru ćemo koristiti samo „Po”, povezan sa analognim pinom Arduina. ![]() Da bismo uopšte dobili ispravne vrednosti, modul je potrebno kalibrisati. Ovo radimo tako što prespojimo BNC konektor običnom žicom. Dok se modul bez sonde napaja sa 5V, a merimo napon između „Po” i „G”. Potenciometrom podešavamo dok ne dobijemo 2,5 volti. Ugrubo, ovo znači da je modul preko sonde očitao pH=7. Uz skeč koji sledi i sondu potopljenu u pH=7 rastvor, trebalo bi da to i dobijemo. float calibration = 19.95; //change this value to calibrate constint analogInPin = A0; int sensorValue = 0; unsigned long int avgValue; float b; int buf[10],temp; void setup() { Serial.begin(9600); } void loop() { for(int i=0;i<10;i++) { buf[i]=analogRead(analogInPin); delay(30); } for(int i=0;i<9;i++){ for(int j=i+1;j<10;j++){ if(buf[i]>buf[j]){ temp=buf[i]; buf[i]=buf[j]; buf[j]=temp; } } } avgValue=0; for(int i=2;i<8;i++) avgValue+=buf[i]; float pHVol=(float)avgValue * 5.0/1024/6; float phValue = -5.70 * pHVol + calibration; Serial.print(„avgValue = „); Serial.println(avgValue); Serial.print(„pHVol = „); Serial.println(pHVol); Serial.print(„sensor = „); Serial.println(phValue); delay(500); } Ideja je da prikupimo deset uzoraka, sortiramo ih od najmanjeg ka najvećem i od šest srednjih vrednosti u sortiranom nizu odredimo srednju vrednost. To i radimo u okviru skeča, a dodali smo i kalibraciju unutar njega. Prema više izvora na mreži, sonda i modul kalibrisani na, recimo, pH=8,8 „Prolom” vode, neće biti toliko precizni u limunovom soku bez ponovne kalibracije, a to možemo korigovati našom kalibracionom konstantom. ORP - oxidation-reduction potential ![]() ORP ili redox je merenje čistoće vode i njena sposobnost da razbije zagađivače. Ovde govorimo o hemijskim reakcijama u kojima se stanja atoma menjaju. Ako je elektron je uklonjen iz atoma, taj atom je oksidovan. Ako je elektron dodat atomu, kažemo da je atom redukovan. Zašto uopšte dolazi do potrebe za redox-om vode? Kiseonik (oxygen) kao deo vode je veoma dobar u prikupljanju „tuđih” elektrona, a setimo se samo šta se dešava sa gvožđem: rđa, tj. oksidira. ORP je mera sposobnosti vode da se sama harmonizuje. Određeni elementi su jaki oksidansi, kao što su hlor, ozon i natrijum hipohlorit, dok su joni sulfata jaki redoktansi. Iz tog razloga se hlor najčešće i koristi za čišćenje, kako vode za piće, tako i vode u bazenima. ORP se izražava u milivoltima (mV), gde se voda za piće kreće od 200 do 600, a najčešće je to sama sredina. Za bazene je minimalna redox vrednost 650 milivolti, pa i više. Ove redox vrednosti potencijala ubiće mikroorganizme u vodi bazena. Ako je ORP vrednost velika, to znači da je visok procenat kiseonika u vodi. Vrednosti idu u plus i minus u odnosu na nulu u milivatima. ORP i pH vrednosti su u strogoj korelaciji, gde ako pH krene da raste, za očekivati je da će ORP da pada. Možemo reći da pH sonda meri aktivnost jona vodonika, dok ORP sonda meri aktivnost elektrona. Za potrebe ovog teksta na kratko smo nabavili ORP EZO kit od Atlas Scientifica, nimalo jeftin. Postoje i povoljniji u našim omiljenim online prodavnicama, ali princip je isti. Sonda je na prvi pogled identična onoj za pH sa BNC konektorom, ali, naravno, ne mogu se menjati. Atlas je za celu seriju senzora za vodu izdao EZO drajver pločice, zalivene epoksijem. Za nas su te pločice black box. Mogu se koristiti uz sondu takve kakve jesu, ali je svakako mnogo bolje uz dodatnu ploču-nosač koja, osim BNC konektora, ima mogućnost povezivanja sa Arduinom, izuzev preko serijskog interfejsa i preko I2C. Mi smo ih koristili putem serijskog interfejsa, uz napajanje od pet volti. S obzirom na to da je u pitanju serijski interfejs, koristili smo Megu i njen Serial3, da bi preko Seriala mogli da pratimo očitavanja. String inputstring = „”; String sensorstring = „”; boolean input_string_complete = false; boolean sensor_string_complete = false; float ORP; void setup() { Serial.begin(9600); Serial3.begin(9600); //orp inputstring.reserve(10); sensorstring.reserve(30); } void loop() { if (input_string_complete == true) { Serial3.print(inputstring); Serial3.print(’ ’); inputstring = „”; input_string_complete = false; } if (sensor_string_complete == true) { Serial.print(„orp = „); Serial.println(sensorstring); if (isdigit(sensorstring[0])) { ORP = sensorstring.toFloat(); if (ORP >= 500.0) { Serial.println(„orp is high”); } if (ORP <= 499.9) { Serial.println(„orp is low”); } } } sensorstring = „”; sensor_string_complete = false; } void serialEvent() { inputstring = Serial.readStringUntil(13); input_string_complete = true; } void serialEvent3() { sensorstring = Serial3.readStringUntil(13); sensor_string_complete = true; } ![]() Primer je preuzet sa Atlas Scientifica i preneli smo ga u celosti. Za nove EZO proizvođač je pripremio biblioteke, što pozdravljamo. Možemo preuzeti pinout, primere, biblioteke, ali ne i električnu šemu. U primeru šaljemo inputstring, a ako smo od EZO pločice dobili povratni sensorstring, konvertujemo ga u decimalni oblik i u zavisnosti od toga koja je vrednost, tako ga i prikazujemo. Turbidity - zamućenost Voda koju pijemo je skoro uvek veoma bistra, što će reći da ima veoma mali stepen zamućenosti. Pritom ne mislimo na mutnu, tek hlorisanu vodu iz česme (a i ona se brzo razbistri). Zamućenost vode mogu prouzrokovati obilne kiše, ako govorimo o reci, ali i prisustvo algi. Ovo je prilično bitno ako imamo bazen. Zamućenost vode se meri u NTU (nephelometric turbidity units), a postoje i druge jedinice. Mi ćemo koristiti Nefelometar metodu, gde se meri intenzitet svetla koje se odbija pod uglom od 90 stepeni, ukoliko naiđe na prepreku. Jedan NTU (kao jedinica mere) predstavlja jedan miligram po litru (mg/L) ![]() Kit od DFRobota koji smo nabavili sastoji se iz sonde i modula (opet). Sonda je, zapravo, plastična zaštita oko fotoprijemnika i emitora. Samo kućište nije vodootporno sa gornje strane, a pritom ga treba skoro u potpunosti potopiti u vodu. Takođe, na providnu plastiku se vremenom lepe čestice, pa se stvara prividno veća zamućenost nego što jeste. Prostor između dva kraka treba često čistiti. Modul na sebi ima prekidač gde biramo između digitalnog i analognog izlaza. Prag za digitalni izlaz se bira potenciometrom. U našem primeru, „S” ide na analogni pin Arduina, uz napajanje od pet volti. int sensorPin = A1; float volt; float ntu; float NTUconst = 4352.9; //kalibracija void setup() { Serial.begin(9600); } void loop() { volt = 0; for(int i=0; i<800; i++){ int sensorvalue = analogRead(sensorPin); volt += sensorvalue * (5.0 / 1024.0); } volt = volt / 800; volt = round_to_dp(volt,1); if(volt < 2.5){ ntu = 3000; }else{ ntu = -1120.4 * square(volt) + 5742.3 * volt - NTUconst; } if(ntu <0){ ntu = 0; } Serial.println(„Turbidity (zamucenost)”); Serial.print(„ Voltaza : „); Serial.print(volt); Serial.print(„ V”); Serial.print(„ ”); Serial.print(„ Vrednost: „); Serial.print(ntu); Serial.print(„ NTU”); Serial.print(„ ”); } float round_to_dp( float in_value, int decimal_place ){ float multiplier = powf( 10.0f, decimal_place ); in_value = roundf( in_value * multiplier ) / multiplier; return in_value; } U primeru prikupljamo čak 800 uzoraka, zato što je dobijeni napon prepun šuma. Kalkulacijama dobijamo srednju vrednost napona, a zatim je konvertujemo u NTU. Kolika je normalna čistoća vode? Svetska zdravstvena organizacija preporučuje da to ne sme biti preko pet NTU, a idealno je ispod jednog NTU. TDS (total dissolved solids) ![]() Ukupno rastvorene čvrste materije takođe mogu predstavljati problem u sveukupnoj čistoći vode. Govorimo o neorganskim solima, kao što su magnezijum, kalcijum, natrijum i kalijum. Veća količina ovih materija dovodi do taloženja naslaga koje mi popularno zovemo kamenac. Taj kamenac se može nataložiti u cevima, bojleru, ali i našim bubrezima. Vodu zasićenu ovim rastvorenim česticama drugačije zovemo i tvrdom vodom. Jedinica za merenje TDS vode izražava se u mg/L ili u ppm (parts per milion). Keyestudio u ponudi ima TDS meter, koji uz pomoć sonde sa dve elektrode daje podatke o količini TDS u vodi. Sonda je vodootporna, ne dolazi sa staklenom ampulom kao ove iznad, ali zato dolazi sa prilično kratkim kablom (60 centimetara). Modul je prenatrpan sitnim komponentama uz po jedan OP AMP i binarni brojač. Sa mikrokontrolerom se povezuje preko analognog pina, a možemo ga napajati sa 3,3 ili pet volti. Na „A” pinu (output) napon ide od 0 do 2,3 volta. U skeču ispod, koji je preuzet od proizvođača, dobijene vrednosti kalkulacijama dovodimo do razumljivijih vrednosti TDS-a. Kit je sposoban za merni raspon od 0 do 1000 ppm. #define TdsSensorPin A1 #define VREF 5.0 #define SCOUNT 30 int analogBuffer[SCOUNT]; int analogBufferTemp[SCOUNT]; int analogBufferIndex = 0, copyIndex = 0; float averageVoltage = 0, tdsValue = 0, temperature = 25; void setup(){ Serial.begin(9600); pinMode(TdsSensorPin,INPUT); } void loop(){ static unsigned long analogSampleTimepoint = millis(); if(millis()-analogSampleTimepoint > 40U){ analogSampleTimepoint = millis(); analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin); analogBufferIndex++; if(analogBufferIndex == SCOUNT) analogBufferIndex = 0; } static unsigned long printTimepoint = millis(); if(millis()-printTimepoint > 800U){ printTimepoint = millis(); for(copyIndex=0; copyIndex<SCOUNT; copyIndex++) analogBufferTemp[copyIndex]= analogBuffer[copyIndex]; averageVoltage = getMedianNum (analogBufferTemp,SCOUNT) * (float)VREF / 1024.0; float compensationCoefficient = 1.0 + 0.02 * (temperature - 25.0); float compensationVolatge = averageVoltage / compensationCoefficient; tdsValue = (133.42 * compensationVolatge * compensationVolatge * compensationVolatge - 255.86 * compensationVolatge * compensationVolatge + 857.39 * compensationVolatge) * 0.5; Serial.print(„TDS Value:”); Serial.print(tdsValue,0); Serial.println(„ppm”); } } int getMedianNum(int bArray[], int iFilterLen){ int bTab[iFilterLen]; for (byte i = 0; i<iFilterLen; i++) bTab[i] = bArray[i]; int i, j, bTemp; for (j = 0; j < iFilterLen - 1; j++){ for (i = 0; i < iFilterLen - j - 1; i++){ if (bTab[i] > bTab[i + 1]){ bTemp = bTab[i]; bTab[i] = bTab[i + 1]; bTab[i + 1] = bTemp; } } } if ((iFilterLen & 1) > 0) bTemp = bTab[(iFilterLen - 1) / 2]; else bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2; return bTemp; } ![]() Skeč je relativno kompleksan i nećemo ga posebno pojašnjavati, samo ćemo reći da je wiki stranica Keyestudia odlično dokumentovana. Sonda u čaši vode sa česme, koja je blago zamućena (moguće skoro hlorisanje), je na serijal monitoru pokazala da je TDS čak 443 ppm. Prema tabeli, idealna voda za piće je do 50 ppm, pa čak i do 170 ppm, odakle počinje tvrda voda. Maksimalan nivo rastvorenih čvrstih materija u vodi za piće je do 500 ppm, što voda iz naše česme nije prešla, ali je opasno blizu. Pritom, ovaj pokazatelj nema veze sa zamućenošću, jer TDS je u vodi, bila ona mutna ili ne. Nadamo se da smo vam ovim tekstom malo skrenuli pažnju na to da ponekad treba analizirati vodu. To je ono najbitnije za nas. Voda u gradskom vodovodu je takva kakva je. Flaširane su dostupne i o razlici u kvalitetu nećemo govoriti. Ako se odlučite možda za kakav sistem koji će on-the-fly meriti parametre vode, imajte na umu da su sve sonde i njihove očitane vrednosti direktno vezane za temperaturu vode. U mnogim firmiranim sistemima, pored ovakvih sondi, skoro uvek je i jedna koja će meriti temperaturu, bili to Dalas ili termistor. O njima smo pisali, pa se nećemo ponavljati.
|
||||||||||
Najčitanije
Igre
Telefoni
Hardver
Softver
Nauka
Doom: The Dark Ages Doom iz mračnog doba drugačiji je od svih drugih Doomova, jer je Slayer koncipiran kao tenk sa štitom... Clair Obscur: Expedition 33 Estetika Belle Époquea, gameplay u skladu sa kanonima JRPG-a, vrhunsko pripovedanje i ljubav prema igrama... Computex 2025, Tajpej, Tajvan AI NEXT Ovaj, nekada ultra-PC-specifični sajam, odavno se proširio na srodne tehnologije, biznis rešenja i digitalne usluge, postavši varijanta azijskog C... Gigabyte GeForce RTX 5070 Gaming OC 12G Višak samopouzdanja Kartica je sa hardverske strane vrlo kvalitetna, ali ništa ne može da nadomesti nedostatak snage „pod haubom”... Asus ProArt P16 (H7606WP) Pronalazak neverovatnog Novi ProArt P16 donosi moderna rešenja, u dobro usaglašenom odnosu gabarita i performansi – alatka koju ćete sa ponosom nosati sa sobom... Logitech ProX Superlight 2 Sve udvostručeno Ovaj miš predstavlja jasnu indikaciju da najveći proizvođač ne želi da napusti nijedan segment tržišta... Winhance 25.05 Popravka Prozora U pitanju je alatka koja omogućava da se brzo rešite (većine) bloatwarea, ali i da obavite optimizaciju rada Windowsa... .rs: Beogradski prevoz na Yandexu • Srbija u SEPA • Loši primeri digitalizacije Unapređeno e Zakazivanje Beogradski prevoz na Yandexu • Srbija u SEPA • Loši primeri digitalizacije Google Mariner, Google Astra i AI autonomni agenti Uspon tihog softvera Umesto kliktanja stručnog lica, softver će, već ove godine, u tihom, gotovo nečujnom načinu rada - završavati posao... Fatal Fury: City of the Wolves Fatal Fury je oduvek bio čudna cvećka u svetu borilačkih igara; takav je i ostao... Arc Raiders Novi extraction shooter iz pera autora dobrih delova franšize Battlefield (i potcenjenog The Finals)... |
||||||||||