» »

Merjenje prevodnosti vode?

Merjenje prevodnosti vode?

poweroff ::

Torej, lotil sem se izdelave merilnika prevodnosti vode. Prevodnost vode je namreč odvisna od tega kakšna je koncentracija ionov v vodi, oziroma koliko elektrolitov (baze, kisline, soli) se je raztopilo v vodi. Zato se jo da uporabiti za oceno onesnaženosti vode. Poleg tega je prevodnost vode seveda odvisna tudi od površine in oddaljenosti elektrod. Zato bom uporabil dve "standardizirani" elektrodi (več o tem spodaj).

Zadeva naj bi temeljila na Arduino Nano, rad pa bi izpisoval enote v mikro Siemensih na cm (uS/cm) ter v PPM.

Ideja je naslednja. Vzamem dve pokromani elektrodi (zlate ali platinaste so predrage), recimo vtikač za elektriko (moški del). V izogib težavam bom verjetno na koncu vzel ameriški vtikač, ki ga ni mogoče pomotoma vtakniti v naše štekarje... 8-)

Potem zadevo vežem takole:
- med Arduino pina A0 in A4 dam 1kOhm upor
- elektrodi priključim na Arduino pina A0 in A1

V programski kodi potem rečem:
int dataPin = A0;  // na tem pinu bomo prebrali podatke (analogno vrednost)
int myGround = A1;  // ta pin bo služil kot GND 
int myPower = A4;  // ta pin bo služil kot 5V

float rawData = 0;  // analogna vrednost prevodnosti vode (v rangu od 0 do 1023)


Nato v void setup() določim:

pinMode(dataPin,INPUT);
pinMode(myPower,OUTPUT);  // ta pin bo dajal 5V napetosti
pinMode(myGround,OUTPUT);  // ta pin bo "pozrl" 5V napetosti
digitalWrite(myGround,LOW); // myGround pin je stalno na low, torej je stalno "na minus"


Potem pa v void loop() delam tole:

digitalWrite(myPower,HIGH);  // v elektrodo dam 5V napetosti
rawData = analogRead(dataPin);
rawData = analogRead(dataPin);  // dvakrat preberem zato, ker prva vrednost ni zanesljiva če je kondenzator v Arduinu napolnjen
digitalWrite(myPower,LOW);    // zadevo "ugasnem"


(Te meritve lahko periodično ponavljam, vendar z zamikom kakšnih 5 ali več sekund, saj sicer delam elektrolizo vode.)

Sedaj lahko izračunam padec napetosti:
(5 * rawData) / 1024.0

Torej, do tukaj so mi zadeve približno jasne. Ker uporabljam dve "standardizirani" elektrodi (pa tudi notranja upornost Arduina je konstantna), je izmerjena vrednost rawData odvisna zgolj od količine raztopljenih elektrolitov v vodi.

Torej, zadevo potopim v vodo in dobim ven neko vrednost. Potem v vodo primešam sol in vrednost se spremeni.

No, sedaj pa bi rad ta instrument umeril. Najprej v toliko, da iz rawData dobim uS/cm, nato pa še PPM.

Zasledil sem, da za umerjanje teh instrumentov uporabljajo vodno raztopino KCl različnih molalnosti (0.01 mol/kg, 0.1 mol/kg in 1.0 mol/kg). NIST je pripravil lepo tabelo: http://sites.chem.colostate.edu/diverdi...

Prevodnost vode se po nekem standardu sicer meri pri 25 stopinjah Celzija, ampak pri NIST so naredili lepo tabelo uS/cm pri različnih temperaturah. Podatke sem vrgel v LibreOffice in PSPP ter izračunal regresijsko krivuljo. Izkaže se, da so razlike med temperaturami (znotraj ene koncentracije) zelo linearni (korelacija je nad 0,998).

Zadeva izgleda takole:


Skratka, moja prva ideja je bila, da si zamešam 0.01 mol/kg raztopino KCl in potem ob dveh različnih temperaturah (npr. 0 in 50 stopinj C) izmerim rawData. Nato rawData s pomočjo funkcije map pretvorim v uS/cm, oziroma izračunam regresijsko funkcjo, ki mi ob dani temperaturi in rawData vrne uS/cm.

No, potem pa mi je prišlo na misel, da so podatki seveda linearni samo v eno smer. Ob posamezni molalnosti je prevodnost linearno odvisna od temperature.

Če pa zadevo obrneš in se vprašaš kakšna je prevodnost različnih koncentracij ob dani temperaturi, pa zadeve niso več tako enostavne.

Torej, kako zadevo umeriti na način, da bi ob dani temperaturi izmerjeno vrednost rawData pretvoril v uS/cm?
sudo poweroff
  • zavarovalo slike: poweroff ()

Unilseptij ::

Torej, tukaj nisem ravno domač, ampak se mi zdi zanimivo, kako si se lotil, in tudi mislim, da je pristop OK.

Če prav razumem, si vse izračune do sedaj delal iz referenčnih tabel "pravih" vrednosti. Jaz bi najprej določil območje, kjer sploh lahko meriš. Ker meriš napetost na uporu med A0 in A4, bo zadeva najbolj natančna, ko bo padec napetosti nekje 2,5V, kar ustreza uporu 1kOhma med (in na) elektrodama. Iz tega dobiš prevodnost, ki ti pove približno območje, kjer lahko meriš. Potem bi ocenil, kakšna je sploh pričakovana natančnost detektorja... če ni preveč stroga, potem lahko privzameš linearno zvezo med koncentracijo in prevodnostjo ter narediš enako regresijsko analizo kot za odvisnost od temperature. Potem moraš samo še namešati referenčno raztopino pri referenčni temperaturi in izmeriti izhodiščno vrednost.

Če pa hočeš več, ne vidim druge možnosti kot opraviti serijo referenčnih meritev za različne koncentracije in različne temperature in potem z neko pametno ekstrapolacijo narediti umeritveno tabelo.

Zgodovina sprememb…

Highlag ::

Mislim, da tako preprosto ne bo šlo. Merilniki prevodnosti uporabljajo v dolčenih območjih napetost 100V, ker je toka premalo, da bi kar direktno odčitali padec napetosti, če je napetost samo 5V recimo. (imamo nekaj merilnikov v službi)
Never trust a computer you can't throw out a window

poweroff ::

Ja, ampak imaš pa tudi neke "survival" variante za par EUR, ki jih nosiš s seboj in ko jih pomočiš v vodo, ti na zaslončku izpišejo PPM. Tisto dela na par voltih. Razumem pa seveda, da za vodarno rabiš čisto drug instrument.
sudo poweroff

TheBlueOne ::

Ti hoces "profi" meritev ali pokazat ortokom kaksen je princip. Za slednje bi jaz se zaupal samo arduinotovim analognim vhodom.

Jaz naprimer ze temperature ne merim preko razlike upora, ampak uporabim DS18b20, ki je kalibriran in ne vraca analogne vrednosti ampak tocno digitalno vrednost. Tega bi lahko kupil, da bos lahko racunal tudi temperaturo.

Morda bi te zanimalo:

https://www.aliexpress.com/item/DFRobot...

Bo verjetno zate bolj natancen v danem obsegu.

poweroff ::

Ja, to imam za demo za otroke.

DS18B20 tako ali tako mislim uporabit, ampak ti niso preveč natančni... če jih daš en šop v kozarec vode, vrednosti variirajo za več kot stopinjo. Čeprav naj bi imel natančnost +/- 5 stopinj in bil umerjen...

Ja, to od DFRobota poznam, nekaj podobnega bi rad naredil, seveda za ceno nekaj EUR... 8-)
sudo poweroff

TheBlueOne ::

Vse jasno. Meni so tile senzorcki kazali na 0.01 stopinje natancno, ne vem pa ce tocno. :) Sem imel tri v istem kozarcu. Jih pa lahko kar nekaj vezes skupaj na en vhod, samo potem ne dodajat premocnega upornika.

Zgodovina sprememb…

Magic1 ::

Ni ravno problem konkretno boostat napetost tudi iz AA baterije, da izvedeš meritev pri visoki napetosti.
Magic

TheBlueOne ::

Magic1 je izjavil:

Ni ravno problem konkretno boostat napetost tudi iz AA baterije, da izvedeš meritev pri visoki napetosti.


Arduino ima omejen range. Ce bos sel cez bos ali vedno dobival maksimalno vrednost ali pa skuril vhod, morda se kaj vec. Analogni inputi zmorejo do 5V, kar je tudi napetost napajanja.

Ce bi zelel meriti z do recimo 100V pri neki normalni amperazi, bi zadeve v prvi fazi lahko naredil nevarne za otroke, za katere je to misljeno, nato pa moral s sekundarno elektroniko pretvarjati linearno iz 0-100V na 0-5V, kjer je 100V 5V, da bi lahko bral z Arduinom.

Magic1 ::

Sej narediš primerno prilagoditev z OpAmpom.

PS: si dodal rešitev v drugem delu posta ;)
Magic

Zgodovina sprememb…

  • spremenil: Magic1 ()

poweroff ::

Takole izgledajo krivulje za posamezne temperature:



Z malo domišljije bi se dalo zadevo videt kot čisto linearne podatke... :D

No, v bistvu sem za prvi stolpec izračunal regresijo in je celo statistično značilna (0,011), enako Pearsonov koeficient korelacije, ki je kar blizu 1. čeprav, problem je, da so samo tri meritve na temperaturo.

OK, zdaj bi moral narediti samo ustrezno formulo.

Najbolj butasta opcija je, da izračunam regresijsko krivuljo za vsako stopinjo temperature od 0 do 50, naredim matriko regresijskih koeficientov in konstant... oziroma mogoče celo naredim array uS/cm vrednosti pri 0 C in 50 C ter izmerjenih rawData ter potem mapiram rawData vrednosti na posamezno temperaturno krivuljo...

Verjetno se da pa še bolj poenostaviti vse skupaj?
sudo poweroff

Zgodovina sprememb…

  • zavarovalo slike: poweroff ()

TheBlueOne ::

Glede na to, da je vse linearno lahko irzacunas kvocient glede na temperaturo. Ce je kvocient pri 0 stopinjah 1, potem sem na hitro preracunal, da se ti kvocient za vsako stopinjo dvogne za ca. 0,052 (bo morda treba malo bolj natancno poracunat). :)

Preveri za sigurno ampak morda bi slo:
"Vrednost brez upostevane temp"*(1+(Temp*0,052))= Vrednost s temperaturo

Sem naredil na hitro s kalkularotjem in dalec ne garantiram za rezultate. :)

Unilseptij ::

Če privzameš linearno odvisnost prevodnosti od temperature (x) in koncentracije (y), potem je najbolj splošen zapis te odvisnosti nekaj takega:
prevodnost = A*x*y + B*x + C*y + D

Iz analize, ki si jo naredil, bi moralo biti možno določiti vrednosti A, B, C in D. Tako dobiš model obnašanja prevodnosti, ki te zanima, preko katerega potem enostavno določiš bodisi temperaturo bodisi koncentracijo pri neki izmerjeni prevodnosti. Zdaj moraš še premisliti, kako in kaj dejansko meriš. Ker meriš napetost na uporu, je treba ugotoviti, kako je ta odvisna od prevodnosti vode. Velja:

U = Uv + Ur + Ux, kjer je U napajalna napetost, Uv padec napetosti v vodi, Ur padec napetosti na uporu (ki ga direktno meriš) in Ux padec napetosti povsod drugod (kabli, elektrode, notranja upornost čipa, etc.). Padec napetosti v vodi Uv je obratno sorazmeren s prevodnostjo in je količina, ki te zanima. Ko dobiš še zvezo med merjeno količino (napetostjo) in količino, ki te zanima (prevodnostjo), potem lahko začneš z umerjanjem pri referenčnih koncentracijah in temperaturi, da določiš prosti parameter Ux (oziroma bolje Rx).

Zgodovina sprememb…

Peter18 ::

Bolj enostavno je, da vzameš Xiaomi Flora, ki ti poleg vlage, temperature in osvetlitve že meri tudi prevodnost v us/cm (fertility).
Lahko uporabiš priložen app ali pa preko bluetootha bereš vrednosti s pythonom.
 slikica

slikica


https://www.aliexpress.com/item/English...
https://wiki.hackerspace.pl/projects:xi...
https://github.com/marcelrv/miflora
https://github.com/open-homeautomation/...

Zgodovina sprememb…

  • spremenilo: Peter18 ()

blay44 ::

Med iskanjem moje nevidne teme;((

Tista nelinearnost je napaka ADja, ko se pri meritvi približuješ pri 0V ali 5V
Pri polprevodnikih moraš kar paziti na to.

poweroff ::

Peter, hvala za link. Videti je zanimivo, vseeno pa bi rad naredil "svojo" napravo... 8-)

Unilseptij je izjavil:


Zdaj moraš še premisliti, kako in kaj dejansko meriš. Ker meriš napetost na uporu, je treba ugotoviti, kako je ta odvisna od prevodnosti vode. Velja:
U = Uv + Ur + Ux, kjer je U napajalna napetost, Uv padec napetosti v vodi, Ur padec napetosti na uporu (ki ga direktno meriš) in Ux padec napetosti povsod drugod (kabli, elektrode, notranja upornost čipa, etc.).
...
Padec napetosti v vodi Uv je obratno sorazmeren s prevodnostjo in je količina, ki te zanima. Ko dobiš še zvezo med merjeno količino (napetostjo) in količino, ki te zanima (prevodnostjo), potem lahko začneš z umerjanjem pri referenčnih koncentracijah in temperaturi, da določiš prosti parameter Ux (oziroma bolje Rx).

OK, vprašanje. Zakaj Ux (padec napetosti povsod drugod) preprosto ne zanemarim? Namreč, kaj ni ta parameter stalno enak (če vedno uporabljam enako elektrodo)?

Napajalna napetost (U) je stalno 5V, se pravi gre v bistvu samo za zvezo med izmerjenim padcem napetosti in uS/cm iz tabele (ob dani temperaturi in koncentraciji)?

Se pravi če bi vrednost rawData pomeril na dveh poljubnih točkah (točke so na dvodimenzionalni matriki temperatura-koncentracija) bi - če vem kako so točke med seboj povezane (s kakšno formulo) na podlagi teh dveh meritev izračunal rawData še za vse ostale točke?

Ali si malo preveč poenostavljeno predstavljam vse skupaj?

blay44 je izjavil:

Med iskanjem moje nevidne teme;((


Tista nelinearnost je napaka ADja, ko se pri meritvi približuješ pri 0V ali 5V
Pri polprevodnikih moraš kar paziti na to.

Kaj si mislil s tem? Nelinearnost v podatkih iz tiste NIST tabele?
sudo poweroff

Unilseptij ::

poweroff je izjavil:

Peter, hvala za link. Videti je zanimivo, vseeno pa bi rad naredil "svojo" napravo... 8-)

Unilseptij je izjavil:


Zdaj moraš še premisliti, kako in kaj dejansko meriš. Ker meriš napetost na uporu, je treba ugotoviti, kako je ta odvisna od prevodnosti vode. Velja:
U = Uv + Ur + Ux, kjer je U napajalna napetost, Uv padec napetosti v vodi, Ur padec napetosti na uporu (ki ga direktno meriš) in Ux padec napetosti povsod drugod (kabli, elektrode, notranja upornost čipa, etc.).
...
Padec napetosti v vodi Uv je obratno sorazmeren s prevodnostjo in je količina, ki te zanima. Ko dobiš še zvezo med merjeno količino (napetostjo) in količino, ki te zanima (prevodnostjo), potem lahko začneš z umerjanjem pri referenčnih koncentracijah in temperaturi, da določiš prosti parameter Ux (oziroma bolje Rx).

OK, vprašanje. Zakaj Ux (padec napetosti povsod drugod) preprosto ne zanemarim? Namreč, kaj ni ta parameter stalno enak (če vedno uporabljam enako elektrodo)?

Ux (oziroma bolje Rx) lahko vzameš za konstanto (čeprav je verjetno nekoliko odvisen vsaj od temperature), ne moreš pa ga zanemariti. Dejanska prevodnost, ki jo meriš, je odvisna od geometrije elektrod, itd. zato moraš to upoštevati. Kako velik je ta efekt, ne vem, lahko pa to potestiraš tako, da vzameš različne oblike elektrod in vidiš, kako se rezultati razlikujejo pri enaki koncentraciji in temperaturi.

poweroff je izjavil:


Napajalna napetost (U) je stalno 5V, se pravi gre v bistvu samo za zvezo med izmerjenim padcem napetosti in uS/cm iz tabele (ob dani temperaturi in koncentraciji)?

Ja, to je to. Če zanemariš Ux, potemje zveza preveč preprosta.... Ampak v neidealnem primeru bi jaz nastavil tako zvezo med izmerjenim padcem na uporu ter prevodnostjo. S tem že upoštevaš tudi geometrijo, itd.:

prevodnost = K1*Ur/(1-K2*Ur)+K3 (K1, K2 in K3 so približno konstante)

poweroff je izjavil:


Se pravi če bi vrednost rawData pomeril na dveh poljubnih točkah (točke so na dvodimenzionalni matriki temperatura-koncentracija) bi - če vem kako so točke med seboj povezane (s kakšno formulo) na podlagi teh dveh meritev izračunal rawData še za vse ostale točke?

Ali si malo preveč poenostavljeno predstavljam vse skupaj?


Ja, tako nekako... pomeriti moraš seveda pri znani koncentraciji in temperaturi, da lahko izmerjene vrednosti primerjaš s tistimi iz tabele in določiš konstanti K1 in K2. Potem si umeril napravo in za vsako izmerjeno vrednost Ur lahko določiš pripadajočo prevodnost. Po modelu, ki si ga preračunal glede na referenčne podatke, lahko iz prevodnosti določiš koncentracijo ali temperaturo (ja... ta naprava je lahko tudi termometer).

Zgodovina sprememb…

Ribič ::

Oh joj, oh joj, oh joj. Fantje, takole se pa prevodnost ne meri!

Pri merjenju ne uporabljaj enosmerne napetosti, ker ti bo na elektrodah začela potekati elektroliza in s časoma ti bo elektrode (anodo) požrlo. Poleg tega pa boš na površini elektrod fasal še koncentracijsko polarizacijo, ki ti bo popačila meritve. Zato se pri meritvah prevodnosti vedno uporablja izmenična napetost, ampak ne sinusna. Kolikor se spomnim, se uporablja oglato-valovna s frekvenco okoli 10 do 20 KHz. Meritve napetosti se potem izvajajo z enako frekvenco, vendar s faznim zamikom, tako, da se padec napetosti izmeri tik preden se polariteta elektrod obrne.

Poleg tega pa se pri natančnih merilcih uporabljajo tudi celice s štirimi elektrodami - to so paličaste celice s štirimi kovinskimi "prstani", kjer se zunanja dva uporabljata kot vir napetosti, notranja dva pa sta vezana direktno na ADC. S tem se izogneš nekaterim problemom npr. notranji elektrodi se nahajata povsem znotraj električnega polja, ki ga ustvarjata zunanji dve - to močno zmanjša zunanje vplive na celico. Poleg tega pa je pri tej izvedbi tudi padec napetosti na kablih zanemarljiv, ker uporabljaš ADC z visoko impedanco in tu praktično ni nobenega toka.

lp
Vse ribe so mi pobegnile!

poweroff ::

Ja, torej, problema elektrolize se zavedam, zato sem tudi rekel, da bi se prevodnost merila na 5 sekund. Poleg tega to ne bo stalno v vodi, pač pa se bo uporabljalo zgolj občasno za poskuse z otroci.

Sem pa razmišljal, da bi dejansko obračal polariteto (programsko z Arduinom). Verjetno bi oglato napetost lahko (vsaj približno) generiral z analognimi pini...?

(https://www.arduino.cc/en/Tutorial/DueS...

Za merjenje s štirimi elektrodami sem tudi že slišal, ampak kot rečeno zaenkrat je moj "instrument" bolj PoC in igrača za izvajanje eksperimentov (npr. kaj se zgodi, ko v vodo vmešamo sol) kot precizen detektor onesnaženja vode.
sudo poweroff

Ribič ::

Za oglato-valovno obliko napetosti mislim, da ni potrebe za analogne pine. Verjetno bi šlo že z dvema digitalnima... Oba nastaviš na output, potem pa ju krmiliš izmenično tako, da enega nastaviš na HIGH in drugega na LOW. Čez čas pa polariteti obrneš. Samo tule nisem čisto prepričan, če bi šlo direktno iz pinov na čipu npr. ali so tokovno dovolj sposobni, ali imajo kak pull-up oz. pull-down upor, kaj se zgodi, če pomotoma napraviš kratek stik, itd. Verjetno bi ju lahko uporabljal kot signala za krmiljenje kakšnega zunanjega vezja preko mosfetov samo tule spet pazi na kratek stik... predpostavi, da sta obe elektrodi vedno kratko sklenjeni, zato bi moral uporabiti kak predupor ali dva. Padec napetosti pa potem meriš na elektrodi (lahko tudi preko ojačevalca).

Na hitro iz glave, bi jaz zadevo vezal takole (predupora sta enaka):
POL1---predupor---elektroda---|raztopina|---elektroda---predupor---POL2
Vse ribe so mi pobegnile!


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Fizika - toplotni koeficient

Oddelek: Šola
162498 (2257) Yacked2
»

specifična upornost tal

Oddelek: Elektrotehnika in elektronika
387201 (6492) killa bee
»

DC Power Meter

Oddelek: Elektrotehnika in elektronika
263221 (2312) Pyr0Beast
»

Vroč upor

Oddelek: Elektrotehnika in elektronika
152486 (2154) TESKAn
»

Doma narejen EKG

Oddelek: Elektrotehnika in elektronika
284397 (3186) atasmrk

Več podobnih tem