(Drink)Waterniveau meten met elektroden en arduino

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • SuperKris
  • Registratie: Juni 2010
  • Laatst online: 02-07 16:14
Voor een project waar ik mee bezig ben wil ik met een arduino het niveau in een drinkwater tank van een camper uitlezen. Deze tank is voorzien van 5 elektroden waarvan er 1 bijna op de bodem zit, en 4 andere op 25,50,75 en 100% van de tank. De eeuwen oude niveaumeting die er nu in zit werkt met een knopje en een analoge meter waarbij het systeem alleen werkt als de knop ingedrukt is.

Op zich is het benodigde schema kinderlijk simpel. Spanning op de onderste elektrode zetten, en alle andere elektrodes via een kleine weerstand aansluiten op de basis van een transistor. Dat betekend echter wel dat er stroom door het water gaat lopen, en de elektroden het metaal in het water gaan oplossen.

Ik kan heel weinig info vinden over de schadelijkheid hiervan. Eigenlijk wil ik constant uitlezen dus zou er een constante stroom lopen die het water mogelijk vervuild (los van eventuele schade aan de elektroden). Hoeveel metaal in het water komt durf ik allemaal echt niet te zeggen. Misschien is dit allemaal compleet verwaarloosbaar. Iemand die hier iets van af weet? Ik kan heel weinig bruikbare info vinden online.

Ik heb ook wel wat ideeën over hoe ik dit proces kan beperken:
- De "common" elektrode elke 1 a 2 seconden voor 100ms bekrachtigen en dan pas meten
- De spanning op de common elektrode beperken. Misschien is 1V al voldoende ipv bijv. 5V?
- In plaats van transistoren FET's gebruiken omdat deze nauwelijks stroom op de basis nodig hebben (of werkt het hele principe niet zonder een bepaalde stroom?)

Bij voorkeur hou ik het wel eenvoudig zonder al te veel componenten. De aansturing vanuit de arduino gaat wel goed komen.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 13:47
Gezien het drinkwater is zou ik je aanraden een systeem op basis van een vlotter te overwegen.

Acties:
  • 0 Henk 'm!

  • Cheezus
  • Registratie: Februari 2001
  • Nu online

Cheezus

Luiaard

Ik durf niet te zeggen hoe snel het metaal in het water oplost (hangt ook van het metaal af natuurlijk), en of dit uberhaupt schadelijk voor de gezondheid is.
Maar aangezien je een erg ruwe meting doet (5 meetpunten) en het proces langzaam (je drinkwater zal niet binnen een paar seconden van vol naar leeg raken toch?) lijkt het me zinvol om je sampletijd vééél trager te zetten. Als je 1x per minuut, of zelf per uur meet weet je toch ook voldoende? Als je dan de de meting binnen 100 ms uitvoert denk ik dat het hele oplossen van de elektrodes een non-issue is.

Acties:
  • 0 Henk 'm!

  • baviaan
  • Registratie: Januari 2000
  • Niet online

baviaan

Hehe. Aap!

RVS laselectroden werken prima.

Acties:
  • 0 Henk 'm!

  • SuperKris
  • Registratie: Juni 2010
  • Laatst online: 02-07 16:14
frickY schreef op zondag 10 maart 2019 @ 21:08:
Gezien het drinkwater is zou ik je aanraden een systeem op basis van een vlotter te overwegen.
Een nieuwe tank, of eventueel een andere meetmethode in de huidige bouwen is helaas geen optie. Ik wil echt met de huidige elektroden werken.
Cheezus schreef op zondag 10 maart 2019 @ 21:15:

Maar aangezien je een erg ruwe meting doet (5 meetpunten) en het proces langzaam (je drinkwater zal niet binnen een paar seconden van vol naar leeg raken toch?) lijkt het me zinvol om je sampletijd vééél trager te zetten. Als je 1x per minuut, of zelf per uur meet weet je toch ook voldoende? Als je dan de de meting binnen 100 ms uitvoert denk ik dat het hele oplossen van de elektrodes een non-issue is.
ik zou natuurlijk een veel langere sampletijd kunnen overwegen. In principe werkt dat ook aardig, maar tijdens het vullen bijvoorbeeld is 1 seconde toch wel fijn. Natuurlijk kan ik hier een speciale vulstand voor maken, maar het zou mooier en makkelijker zijn om sneller te meten.
baviaan schreef op zondag 10 maart 2019 @ 21:17:
RVS laselectroden werken prima.
Ik durf niet te zeggen van welk materiaal de huidige elektroden zijn, maar RVS lijkt mij aannemelijk. Heb je hier ervaring mee dat je zegt dat dit met RVS geen probleem is?

Acties:
  • 0 Henk 'm!

  • baviaan
  • Registratie: Januari 2000
  • Niet online

baviaan

Hehe. Aap!

Ik durf niet te zeggen van welk materiaal de huidige elektroden zijn, maar RVS lijkt mij aannemelijk. Heb je hier ervaring mee dat je zegt dat dit met RVS geen probleem is?
Ja. Heb in de watertank van de sleurhut van mijn ouders ooit een systeem met ledjes gemaakt. Verschillende lengtes RVS electrodes, verbonden met ledjes. Er zit een knop naast, als je daar op drukt wordt er stroom door gestuurd en gaan de ledjes branden waarvan de electrodes nog in het water zit. Werkt uitstekend, al een jaar of acht denk ik.

Acties:
  • +1 Henk 'm!

  • SA007
  • Registratie: Oktober 2002
  • Laatst online: 11:21

SA007

Moderator Tweaking
Elektrolyse van je drinkwater is een nogal slecht idee, dus ik zou een paar punten veranderen:
- Veel lagere stroom, begin eens met bijv. 10M in serie te zetten met elke elektrode (ook de voeding), sowieso al om de kans op elektrocuties te verminderen.
- Veel korter meten (waarom 100ms, waarom niet 0.1ms)
- Als je elektrodes met AC uitleest is de hoeveelheid elektrolyse ook stukken minder, al is daarvoor de elektronica wel flink moeilijker.

Andere meettechnieken die me zo te binnen schieten:
- Capacitieve sensoren aan de buitenkant van de tank. (zit je helemaal niet met je drinkwater te klooien)
- Ultrasone afstandssensor bovenin en de afstand naar het wateroppervlak meten.
- Vlotter
- Gewicht (weegschaal eronder, water is best zwaar)

Acties:
  • 0 Henk 'm!

  • Springuin
  • Registratie: Juli 2002
  • Laatst online: 16:40
AC meting kan wel, en hoeft niet moeilijk te zijn. Je zet eerst de referentie elektrode aan de +, doet een meting, en dan de geactiveerde electroden aan de + en meet terug via de referentie. Dan heb je de ene keer de stroom de ene kant op en de andere keer de andere kant op. Netto is het 0.

Een andere meettechniek die nog niet genoemd is, is een differentiele druksensor. Je hebt er een nodig met kleine range want 1 meter waterkolom komt overeen met 0.098 bar: Wikipedia: Meter waterkolom

Acties:
  • 0 Henk 'm!

  • SuperKris
  • Registratie: Juni 2010
  • Laatst online: 02-07 16:14
baviaan schreef op zondag 10 maart 2019 @ 23:12:
[...]


Ja. Heb in de watertank van de sleurhut van mijn ouders ooit een systeem met ledjes gemaakt. Verschillende lengtes RVS electrodes, verbonden met ledjes. Er zit een knop naast, als je daar op drukt wordt er stroom door gestuurd en gaan de ledjes branden waarvan de electrodes nog in het water zit. Werkt uitstekend, al een jaar of acht denk ik.
Thanks :) Ik maak mij ook geen zorgen dat de elektrodes kapot gaan, maar meer dat de kwaliteit van het water enorm achteruit gaat. Veel water zal ik er niet uit drinken hoor en ik zal er hooguit 4 weken per jaar gebruik van maken, maar toch...
SA007 schreef op maandag 11 maart 2019 @ 00:24:
Elektrolyse van je drinkwater is een nogal slecht idee, dus ik zou een paar punten veranderen:
- Veel lagere stroom, begin eens met bijv. 10M in serie te zetten met elke elektrode (ook de voeding), sowieso al om de kans op elektrocuties te verminderen.
- Veel korter meten (waarom 100ms, waarom niet 0.1ms)
- Als je elektrodes met AC uitleest is de hoeveelheid elektrolyse ook stukken minder, al is daarvoor de elektronica wel flink moeilijker.

Andere meettechnieken die me zo te binnen schieten:
- Capacitieve sensoren aan de buitenkant van de tank. (zit je helemaal niet met je drinkwater te klooien)
- Ultrasone afstandssensor bovenin en de afstand naar het wateroppervlak meten.
- Vlotter
- Gewicht (weegschaal eronder, water is best zwaar)
Elektrocuties maak ik mij met 5V niet zoveel zorgen over hoor :) 10M zorgt er natuurlijk voor dat er eigenlijk nauwelijks meer stroom loopt dus er weinig elektrolyse plaats vind. Ik heb echter het idee dat een transistor niet meet aan te sturen is met een dergelijk lage stroom maar een FET kan dit misschien wel.. Aan de andere kant, een FET neem sowieso nauwelijks stroom op door de gate toch? Dus misschien zier hier ook wel een deel van de oplossing.

Ik ben bang dat ik niet veel veel korter dan 100ms kan meten omdat de de auduino vrij veel moet doen in een enkele loop waaronder het aansturen van een 265x64 pixel OLED. Voor het aansturen van het scherm kunnen zo 60-70ms nodig zijn voor zover ik gezien heb.

AC kan natuurlijk ook maar dat wordt wel vrij ingewikkeld in mijn opstelling. Misschien zou ik wel iets kunnen doen met het wisselen in polariteit.

Een andere sensor wordt er lastig in de huidige opstelling en daarnaast zit deze er al in inclusief alle bekabeling. Dit aanpassen heeft niet de voorkeur!

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 02-07 20:01

Matis

Rubber Rocket

Persoonlijk zou ik gaan voor een "Ultrasone afstandssensor". Immers, hoe minder (direct) contact met het drinkwater, hoe beter.
Wat je misschien ook nog zou kunnen doen is een watermeter / pulsteller bij de uitgang van de watertank plaatsen. Dan weet je hoeveel liter er uit de tank verwijderd is. Nadeel is wel dat je bij moet houden hoeveel en wanneer er getankt is en zodoende de teller "resetten".
Ook kun je dan niet echt lekker overweg met een halve tank vullen. Maar het is maar out-of-the-box denken.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Tadango
  • Registratie: April 2000
  • Laatst online: 12:23
Uiteraard kan je prima veeeeeeeel korter meten en daarna de data verwerken en afbeelden. Alleen voor het meten hoef je de elektroden maar van spanning te voorzien. De onderste elektrode dus schakelen vanuit de Arduino.

Ik snap alleen nog niet wat je precies met die transistor wil? Kan je de elektroden niet rechtstreeks op de inputs van de Arduino gebruiken? Als de spanning te laag is, wellicht een FET gebruiken ipv een Transistor, dan is er een veel lagere gate stroom nodig.

Acties:
  • 0 Henk 'm!

  • SuperKris
  • Registratie: Juni 2010
  • Laatst online: 02-07 16:14
Matis schreef op maandag 11 maart 2019 @ 10:04:
Persoonlijk zou ik gaan voor een "Ultrasone afstandssensor". Immers, hoe minder (direct) contact met het drinkwater, hoe beter.
Wat je misschien ook nog zou kunnen doen is een watermeter / pulsteller bij de uitgang van de watertank plaatsen. Dan weet je hoeveel liter er uit de tank verwijderd is. Nadeel is wel dat je bij moet houden hoeveel en wanneer er getankt is en zodoende de teller "resetten".
Ook kun je dan niet echt lekker overweg met een halve tank vullen. Maar het is maar out-of-the-box denken.
Allemaal prima ideeën :) maar ik wil echt werken met de elektroden zoals die nu in de tank zitten en waarvoor alle kabels al liggen.

Volgens mij is het werken met elektroden ook wel een beetje de standaard voor dit soort tanken/toepassingen. Ik weet alleen niet zo goed hoe ik dit het beste kan implementeren ivm elektrolyse en de drinkbaarheid van het water.
Tadango schreef op maandag 11 maart 2019 @ 10:51:
Uiteraard kan je prima veeeeeeeel korter meten en daarna de data verwerken en afbeelden. Alleen voor het meten hoef je de elektroden maar van spanning te voorzien. De onderste elektrode dus schakelen vanuit de Arduino.

Ik snap alleen nog niet wat je precies met die transistor wil? Kan je de elektroden niet rechtstreeks op de inputs van de Arduino gebruiken? Als de spanning te laag is, wellicht een FET gebruiken ipv een Transistor, dan is er een veel lagere gate stroom nodig.
Ik weet niet of veel korter meten zo makkelijk is. De arduino moet straks best wel wat code afwerken waaronder het wegschrijven naar de display. Zo duurt alles best wel lang, en ik weet niet of ik in dezelfde loop de uitgang onder stroom kan zetten en meteen kan meten. Ik gok dat er echt wel enkele ms nodig zullen zijn om via een FET de common electrode te bekrachtigen en vervolgens (totaal) 8 digitale pinnen uit te lezen. Dan moet ik denk ik wel een bepaalde delay toepassen en dat doe ik liever niet. Een timer zonder delay gaat dan niet werken want dan zit hij al in zijn display code en is het tientallen ms later.

De transistor is gewoon de meest typische oplossing hiervoor. Uiteraard is een fet handiger of eventueel zelfs de GPIO direct.

Acties:
  • 0 Henk 'm!

  • Tadango
  • Registratie: April 2000
  • Laatst online: 12:23
Transistor heeft meer stroom door de elektroden nodig, en dat is juist wat we willen beperken toch?

Daarnaast kost het schakelen van een gate een fractie van een ms, dus die delay is verwaarloosbaar.

Ik zou het zo doen:
- Onderste elektrode op een output van Arduino. Standaard Laag
- Dan output op hoog en de 8 meet punten opslaan in een variabele (DigitalRead functie 8 kaar aanroepen en opslaan in variabelen)
- Output weer op Laag zetten.
- Dit alles zonder delays.

Op deze manier heb je echt maar een enkele microseconde oid een stroom door het water lopen. Combineer dat met fet's die een erg lage gate stroom nodig hebben en je hebt een verwaarloosbare elektrolyse wat je prima elke 5 seconden moet kunnen uitvoeren. Ik zou het eerst testen zonder fet's, anders met.

Acties:
  • 0 Henk 'm!

  • SuperKris
  • Registratie: Juni 2010
  • Laatst online: 02-07 16:14
Ik heb even wat uitgetekend...

Er vanuit gaande dat snel spanning wil schakelen met fet heb ik volgens mij een P channel MOSFET nodig. Omdat ik die liever met een "hoog" signaal bekrachtig, heb ik nog een N channel MOSFET nodig op de P-FET te schakelen. Voor de pullup en pulldown heb ik een 10K weerstand gebruikt. Een gate weerstand lijkt mij niet nodig omdat de spanning toch nergens boven de 5V komt. Ik denk dat het nodig is de P-FET naar ground te laten schakelen. Is 10K een geschikte waarde voor deze situatie?

Afbeeldingslocatie: https://tweakers.net/ext/f/HiQ24XQVD8rpFK9W8BXmUVyM/full.png

Om het signaal weer op te vangen is een gate weerstand denk ik niet nodig wegens de lage spanningen, of is het toch aan te raden deze te gebruiken?

Natuurlijk heb ik ook een pulldown weerstand nodig aan de ingang (Rin) zou 100K hier een goede waarde zijn?

De vraag is dan hoeveel tijd nodig is de elektrode te bekrachtigen en het signaal uitleesbaar te maken op de ingang. Na even googelen blijkt een digital write een stukje sneller te gaan dan ik verwacht had. Slechts enkele microseconden. Voor een digital read is vergelijkbaar.

Een BS170 N-FET schakeld in max.10nS ook ongelovelijk snel dus. Een BS250 P-FET is ongeveer even snel.

De vraag is alleen of de capacitieve werking van de gate roet in het eten gaat gooien om deze tijden daadwerkelijk te behalen.

Dan zou ik de volgende code kunnen gebruiken:

code:
1
2
3
4
5
6
7
8
9
10
digitalwrite (uitgang, HIGH)
WaterLevel25 = digitalRead(25%elektrode)
WaterLevel50 = digitalRead(50%elektrode)
WaterLevel75 = digitalRead(75%elektrode)
WaterLevel100 = digitalRead(100%elektrode)
Water2Level25 = digitalRead(25%elektrode2)
Water2Level50 = digitalRead(50%elektrode2)
Water2Level75 = digitalRead(75%elektrode2)
Water2Level100 = digitalRead(100%elektrode2)
digitalwrite (uitgang, LOW)

Dit kan ik dan mooi in een functie gooien en deze elke 2 seconde aanroepen.

Ik wil ook de vuilwater tank uitlezen dus vandaar 8x de digital read. Er vanuit gaande dat het circuit snel genoeg is om de spanning bij door alle fets en op de eerste ingang te krijgen lijkt bovenstaande code in minder dan 0,1ms te kunnen draaien.

Met een sample rate van bijvoorbeeld 2 seconden is het systeem snel zat en worden de elektroden effectief ca. 8 seconden per 24 uur bekrachtigd. Met een lage spanning en stroom moet de elektrolyse dan echt wel beperkt blijven.

Ik heb echter geen enkel idee of dit inderdaad compleet onschadelijk is voor drinkwater.

Any thoughts?

Acties:
  • 0 Henk 'm!

  • Btje
  • Registratie: November 2002
  • Laatst online: 14:44
Ik denk dat je die sample rate best kunt verlagen naar 30 seconde of een minuut. Het is immers maar een indicatie. Als je hem gebruikt bij het bijvullen om op tijd te stoppen is het wat anders.

Xiaomi 13T Pro


Acties:
  • +1 Henk 'm!

  • Tom-Z
  • Registratie: Augustus 2010
  • Laatst online: 11:10
Die MOSFETs voegen helemaal niks toe. De common direct aan een digital output en de andere elektroden direct aan de inputs (met een Rin pulldown) zou even goed werken en is een stuk simpeler.

Wat je je moet bedenken is dat de weerstand van water heel erg varieert. Wikipedia noemt waarden van 0.2Ωm voor zeewater tot 180000Ωm voor demiwater. Als we uitgaan van de 200Ωm voor drinkwater (maar ook dit kan flink fluctueren) kom je uit op 2kΩ voor een kubus van 10x10x10cm (=1L) als je de weerstand van het bovenste vlak naar het onderste vlak meet.

Als je dan 100k pakt voor Rin en de weerstand van het water naar de elektrode is 10k, ziet de MOSFET (c.q. digital input) 4.5V op zijn gate, wat genoeg is. Als je echter heel puur water hebt met een weerstand van maar 100k, dan heb je nog maar 2.5V op de gate.

De BS170 die je hebt uitgezocht heeft een threshold voltage van min 0.8V, typ. 2V en max. 3V -- omdat de stroom die je schakelt heel laag is zou ik verwachten dat de threshold eerder lager dan hoger zou liggen, dus (zeg) 1.5V. Dan mag het water maximaal een weerstand hebben van 250k. Merk op dat het mes aan twee kanten snijdt: als er bijvoorbeeld geleidende aanslag zit op de wanden van de tank zit je al heel snel aan die 250k, ook als de tank eigenlijk leeg is.
Om zekerheid te hebben over de toestand van de MOSFET is het nodig dat het voltage flink hoger of lager is dan de threshold. Met meer dan 0.8V kun je niet garanderen dat de MOSFET uit is, en met minder dan 3V kun je niet garanderen dat hij aan is.

Een digitale input van een AtMega328 detecteert (bij 5V VCC) alles lager dan 1.0V als "LOW" en alles hoger dan 3.5V als "HIGH". Dit geeft je dus ongeveer dezelfde range van schakelen als de oplossing met MOSFET.

Ik zou het volgende doen:
- Hang alle electrodes direct aan digital pins
- Om te bepalen of er bij elektrode i water is, zet je elektrode i-1 als output op LOW, en zet je elektrode i als INPUT_PULLUP (dit is ongeveer 50k)
- Doe een digitalread van pin i
- Keer de boel nu om (elektrode i-1 als INPUT_PULLUP, elektrode i als LOW)
- Doe weer een digitalread, nu van i-1
- Zet beide pins weer op INPUT

Dit heeft de volgende voordelen:
- Geen externe componenten nodig
- Minder elektrolyse door gebruik van AC
- Minder afhankelijk van de weerstand van het water omdat je meet over een kortere lengte van de tank
- Lagere stroom (dus minder elektrolyse) dan bij jouw aanpak er altijd maar 2 elektroden actief zijn (en dus de weerstand hoger is)

Acties:
  • 0 Henk 'm!

  • SuperKris
  • Registratie: Juni 2010
  • Laatst online: 02-07 16:14
Tom-Z schreef op dinsdag 12 maart 2019 @ 10:27:
Die MOSFETs voegen helemaal niks toe. De common direct aan een digital output en de andere elektroden direct aan de inputs (met een Rin pulldown) zou even goed werken en is een stuk simpeler.

Wat je je moet bedenken is dat de weerstand van water heel erg varieert. Wikipedia noemt waarden van 0.2Ωm voor zeewater tot 180000Ωm voor demiwater. Als we uitgaan van de 200Ωm voor drinkwater (maar ook dit kan flink fluctueren) kom je uit op 2kΩ voor een kubus van 10x10x10cm (=1L) als je de weerstand van het bovenste vlak naar het onderste vlak meet.

Als je dan 100k pakt voor Rin en de weerstand van het water naar de elektrode is 10k, ziet de MOSFET (c.q. digital input) 4.5V op zijn gate, wat genoeg is. Als je echter heel puur water hebt met een weerstand van maar 100k, dan heb je nog maar 2.5V op de gate.

De BS170 die je hebt uitgezocht heeft een threshold voltage van min 0.8V, typ. 2V en max. 3V -- omdat de stroom die je schakelt heel laag is zou ik verwachten dat de threshold eerder lager dan hoger zou liggen, dus (zeg) 1.5V. Dan mag het water maximaal een weerstand hebben van 250k. Merk op dat het mes aan twee kanten snijdt: als er bijvoorbeeld geleidende aanslag zit op de wanden van de tank zit je al heel snel aan die 250k, ook als de tank eigenlijk leeg is.
Om zekerheid te hebben over de toestand van de MOSFET is het nodig dat het voltage flink hoger of lager is dan de threshold. Met meer dan 0.8V kun je niet garanderen dat de MOSFET uit is, en met minder dan 3V kun je niet garanderen dat hij aan is.

Een digitale input van een AtMega328 detecteert (bij 5V VCC) alles lager dan 1.0V als "LOW" en alles hoger dan 3.5V als "HIGH". Dit geeft je dus ongeveer dezelfde range van schakelen als de oplossing met MOSFET.

Ik zou het volgende doen:
- Hang alle electrodes direct aan digital pins
- Om te bepalen of er bij elektrode i water is, zet je elektrode i-1 als output op LOW, en zet je elektrode i als INPUT_PULLUP (dit is ongeveer 50k)
- Doe een digitalread van pin i
- Keer de boel nu om (elektrode i-1 als INPUT_PULLUP, elektrode i als LOW)
- Doe weer een digitalread, nu van i-1
- Zet beide pins weer op INPUT

Dit heeft de volgende voordelen:
- Geen externe componenten nodig
- Minder elektrolyse door gebruik van AC
- Minder afhankelijk van de weerstand van het water omdat je meet over een kortere lengte van de tank
- Lagere stroom (dus minder elektrolyse) dan bij jouw aanpak er altijd maar 2 elektroden actief zijn (en dus de weerstand hoger is)
Bedankt voor het meedenken! _/-\o_

Ik denk dat de "geleiding" van het water ook ene beetje afhankelijk is van het formaat van de electrode, hoeveel contact deze met het water maken, en de samenstelling van het water. Zover is lees kan ik inderdaad een weestand in de orde van enkele tot maximaal tientallen Kohm verwachten.

Ik ben altijd geneigd om de nooit direct met de porten van de arduino te gebruiken omdat deze niet zo sterk zijn. Daarnaast geven externe componenten wat meer controle over spanningen en stromen, maar misschien is dat niet echt nodig in deze situatie en ben ik beter af met de poorten direct. Het staat mij iig wel toe de spanningen om te draaien, en dat is op zich wel een mooie functie :)

Als ik het goed begrijp stel je voor om een input via de interne pull-up omhoog te trekken, en vervolgens via het water met een andere elektrode naar beneden te trekken. Wordt de input met pull-up dus laag zou er water aanwezig zijn tussen de 2 elektroden. Blijft de input hoog is er geen water.

In de datasheet zie ik echter dat de pull up tussen de 20K en 60K zit. Hoe een uitgang die op 0 staat zich exact gedraagt weet ik niet, maar ik vermoed dat deze zeer lage weerstand naar GND krijgt.

Als ik de weerstand van de output pin op LOW verwaarloos loopt de stroom dus via de pullup weerstand in de INPUT pin, en de weerstand in het water naar de OUTPUT pin.

worst case van een 20K pull up, en een 20K weerstand van het water, komt er 2,5V op de ingang. Geen probleem dus. Dat wordt als laag gezien en er is dus water gedetecteerd.

Betreffende een "lekstroom" bij een lege tank heb je echter ook een punt. Bij een worse case van 60Kvoor de pullup, en een weerstand van een lege tank van 160 ohm, komt de spanning al op 3,5 en wordt de tank toch als vol gezien. Waarschijnlijk valt dit probleem in de praktijk wel mee.

Eventueel zou ik het zelfde truckje kunnen doen met met een fysieke 100k pulldown. Dan wordt weerstand in het water tot 40K gezien als dat het water aanwezig is, en ook dan kan ik ompolen.

Daarnaast is de stroom door het water met de interne pull-up weerstand in een worst case situatie(20K) tegen de 0,25mA en met een externe pulldown is dit slechts 0,05 (5x minder electrolyse)

Acties:
  • 0 Henk 'm!

  • Sine
  • Registratie: Juni 2001
  • Laatst online: 15:04
SuperKris schreef op maandag 11 maart 2019 @ 13:06:
[...]

Allemaal prima ideeën :) maar ik wil echt werken met de elektroden zoals die nu in de tank zitten en waarvoor alle kabels al liggen.

Volgens mij is het werken met elektroden ook wel een beetje de standaard voor dit soort tanken/toepassingen.
Nee, dat is de standaard "mag niks kosten" oplossing.

Als je dat goed wilt doen doe je het zonder elektrodes, elektrodes en DC in drinkwater krijg ik sowieso de kriebels van.
Je hebt een aantal mogelijke oplossingen (van goed naar bagger)

A. Een radar / ultrasoon of andere afstands meting.
B. Een statische waterdruk meting.
C. Een capacitieve niveau meting (met een sonde)
D. Vlotter.
E. Electrodes (AC !!!)

Tussen A en E zit vast nog wat spul wat ik zo even vergeet.

[ Voor 4% gewijzigd door Sine op 14-03-2019 10:10 ]

Repareren doe je zo.


Acties:
  • 0 Henk 'm!

  • mrcitroen
  • Registratie: Januari 2009
  • Laatst online: 26-05 22:01
Zelf goede ervaringen met ultrasoon type : JSN-SR04T

Acties:
  • 0 Henk 'm!

  • SuperKris
  • Registratie: Juni 2010
  • Laatst online: 02-07 16:14
Inmiddels wat experimenten gedaan met de elektrode meting zoals eerder beschreven.

- 5 pinnen per tank waarvan 1 common
- Alle pinnen met een 100K weerstand naar ground
- geen andere componenten. Pinnen direct op electrode

Het systeem lijkt goed te werken. De theoretische maximale stroom die door het water loopt zou ca. 50uA moeten zijn.

Volgens mijn debug dode verloopt de meting tussen de 24us voor een volle tank en 44us bij een volle tank.

De sample rate ga ik denk ik op 2 seconden houden. Met een gemiddelde uitleestijd van 34us kom ik dan op ca. 1,5 seconde 50uA per dag als ik dat zo goed uitreken. Dat moet toch redelijk onschadelijk zijn.

Toch ga ik ook op mijn PCB een analoge input bouwen zodat er in de toekomst eventueel voor een andere sensor gekozen kan worden.

Voor de liefhebber bij deze de code. Deze is misschien uitgebreider dan nodig, maar dat komt omdat het later in een veel uitgebreide programma komt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Pin setup for water tank electrodes
#define CrlWtr25 3      // Pin to 25% electrode of clear water tank
#define CrlWtr50 5      // Pin to 50% electrode of clear water tank
#define CrlWtr75 7      // Pin to 75% electrode of clear water tank
#define CrlWtr100 9     // Pin to 100% electrode of clear water tank
#define ClrWtrCom 11    // Pin to common electrode of clear water tank

// Variables for water rank reading
int ClrWtrRefresh = 500;            // Sample rate for tank meassurement. Eneter value in ms
unsigned long CurrentMillis;        // main timer for every loop
int ClrWtrStatus = 101;             // Actual value of tank in %. (101 means no value has been readed) 
int ClrWtrStatOld = 0;              // Variable needed for dynamic refresh (old tank value)
bool Refresh = LOW;                 // Variable needed for dynamic refresh (HIGH means a new value was detected))
unsigned long ClrWtrLast = 0;       // Variable needed for sample rate timer (Last time rhere was a meassurement)
unsigned long PwrElectrodeTime;     // Time the common electrode was activated (no mandatory data)


void setup() {
   pinMode(CrlWtr25, INPUT);        // Static pin setup
   pinMode(CrlWtr50, INPUT);        // Static pin setup
   pinMode(CrlWtr75, INPUT);        // Static pin setup
   pinMode(CrlWtr100, INPUT);       // Static pin setup
   pinMode(ClrWtrCom, OUTPUT);      // Static pin setup
   Serial.begin(9600);              // Use serial for debug porpose only
} 

void loop() {
// Code for reading the clear water tank
  CurrentMillis = millis();                           // Update main timer  
  if (CurrentMillis - ClrWtrLast >= ClrWtrRefresh) {  // Check is the set sample rate time has passed 
    ReadClrWtr();                                     // Run ReadClrWtr() program to sample the tank status
    ClrWtrLast = CurrentMillis;                       // Set a new last sample timestamp
  }

// Code for serial printing tank meassurements. Debug porposes only  
  if (Refresh == HIGH) {                             // Check if there is anything new to print
    Serial.print ("The tank is currently ");         // Print text
    Serial.print (ClrWtrStatus);                     // print the current tank status
    Serial.println (" % full");                      // Print text
    Serial.print ("Electrodes where powered for ");  // Print text
    Serial.print (PwrElectrodeTime);                 // Print time the common electode was powered
    Serial.println (" us");                          // Print text
    Refresh = LOW;                                   // Set refreh back to low because te last new value was printed
    }  
}

// Function for reading the clear water tank values
void ReadClrWtr() {                                  // Function name. The function does not return any data. It only stores into a global value
  unsigned long StartReadTime;                       // Debug code to read how long the electode was powered
  StartReadTime = micros();                          // Debug code to read how long the electode was powered
  digitalWrite(ClrWtrCom, HIGH);                     // Activate power to comnon electode 
  if (digitalRead(CrlWtr100) == HIGH){               // Read 100% electrode
    ClrWtrStatus = 100;                              // If a input was recieved there was water between the common and the 100% electrode. The tank must be 100% full
  }
  else if (digitalRead(CrlWtr75) == HIGH){           // If there was no reading for the previous line check the 75% electrode
    ClrWtrStatus = 75;                               // If a input was recieved there was water between the common and the 75% electrode. The tank must be 75% full
  }
  else if (digitalRead(CrlWtr50) == HIGH){           // If there was no reading for the previous line check the 50% electrode
    ClrWtrStatus = 50;                               // If a input was recieved there was water between the common and the 50% electrode. The tank must be 50% full
  }
  else if (digitalRead(CrlWtr25) == HIGH){           // If there was no reading for the previous line check the 25% electrode
    ClrWtrStatus = 25;                               // If a input was recieved there was water between the common and the 25% electrode. The tank must be 25% full
  }
  else {                                             // If no input was receved the tank must be empty
    ClrWtrStatus = 0; 
  }
  digitalWrite(ClrWtrCom, LOW);                      // Deactivate the common electrode. We want as little time as possible for the flow of current
  PwrElectrodeTime = micros() - StartReadTime;       // Check how many time has passed since the common electrode was powered
  if (ClrWtrStatus != ClrWtrStatOld) {               // Check if the value of the tank has changed 
    Refresh = HIGH;                                  // If so set refresh to high so the main program knows there are new values to print
    ClrWtrStatOld = ClrWtrStatus;                    // Update the old tank value with the current one 
  }
}

Acties:
  • 0 Henk 'm!

  • memphis
  • Registratie: Oktober 2000
  • Laatst online: 18:10

memphis

48k was toen meer dan genoeg.

Om electrolyse te voorkomen kan je beter periodiek meten waarbij je de toegevoegde spanning daar even voor inschakelt.

Er zijn mensen die mij een GOD vinden


Acties:
  • 0 Henk 'm!

  • SuperKris
  • Registratie: Juni 2010
  • Laatst online: 02-07 16:14
memphis schreef op zaterdag 23 maart 2019 @ 15:09:
Om electrolyse te voorkomen kan je beter periodiek meten waarbij je de toegevoegde spanning daar even voor inschakelt.
Dat doe ik nu ook dus :)
Volgens mijn berekening kom ik op 1,5 seconden met 50uA per dag. In de praktijk zal dat misschien meer of minder zijn. Moet ik gaan meten.
Pagina: 1