Watersensor

Geeft alarm bij waterlekkage

Bij een waterlekkage is het leed niet te overzien, vooral niet als je buren onder je hebt wonen.
Een wasmachineslang die knapt is een bekend voorbeeld.
Water geleid stroom, dus daar moet een eenvoudige sensor voor te maken zijn.
Met een kleine PIC een schakeling bouwen die voor een alarm zorgt, een mobiel telefoonnummer opbelt of een motor aandrijft die de hoofdwaterkraan dicht draait, zijn mogelijke oplossingen.


De voeler zelf is niet meer dan een vertind printje met twee printbanen.
Deze wordt tegen de vloer geplaatst en met dubbelzijdig plakband aan de muur geplakt (zie foto's).


De voeler geplaatst achter de wasmachine in de keuken.
Gemaakt van vertind experimenteer print.

 


Deze voeler zit in de badkamer onder het wastafelkastje bij de waterventielen.
Bij een klein laagje water zal het alarm al af gaan.

 

Zorg er wel voor dat de print vertind is, koper gaat op den duur groen uitslaan.
Koperen print behandelen met een (plastic) spray kan natuurlijk niet, want dan meet hij geen water.

Het is mogelijk om meerdere voelers parallel aan te sluiten.


Schema


Het grijze is de eigenlijke vertinde watervoeler (zoals de foto's hierboven).
Er mag gerust een kabel van een paar meter tussen schakeling en voeler zitten.
Bij me thuis heb ik er 5 meter luidsprekerdraad tussen zitten, zonder problemen.

 


Piëzo-zoemer 1,5V.
Conrad 71 00 09

 

Een BC547 transistor versterkt het signaal dat van de voeler(s) komt.
Ingang GPIO.0 van de 12F629 wordt laag gemaakt door de transistor als de voeler nattigheid voelt.
Denk er hierbij aan dat de inwendige PORTB pullups aan moeten staan om GPIO.0 hoog te houden als de situatie droog is en de transistor niet in geleiding is.
Uitgang GPIO.1 is continu hoog zolang de voeler in het water staat en laag als de voeler droog is.
Uitgang GPIO.2 heeft bij een alarm een minuut lang een hoog niveau waarmee een 1,5V piëzo-zoemer een pieptoon kan geven.
De overige drie GPIO poorten zijn vrij voor eigen gebruik.
Het is overigens vrije keus wat met de signalen te doen, de LED hoeft niet te worden aangesloten als er geen belang bij is en de poort kan ook gebruikt worden om een andere schakeling aan te sturen.

Het PIC Basic programma is ook geschikt voor de LITE versie van Positron PIC Basic, alleen dan DEVICE 12F675 opgeven.


Aangezien er buren onder mij wonen en er bij lekkage onmiddellijk moet worden ingegrepen (ook als er niemand thuis is), zorgt een signaal van één van beide waterlekkage sensoren ervoor dat de PIC in de hal een 12V RB35 motor (1 : 200) de hoofdwaterkraan dicht laat draaien en mijn mobiele telefoon automatisch opbelt, die bij aanname een sirene door de telefoon zal laten klinken.


Aangezien de as van de kraan naar binnen draait bij het sluiten van de kraan,
mag de motor niet vast aan de wand bevestigd worden, maar moet deze vrij op en neer kunnen bewegen.
Het metalen plaatje voorkomt dat de motor zelf verdraait tijdens het verstellen van de kraan.

 


Het bovenste gedeelte van de waterkraan (de handgreep) is er afgezaagd.
Een stuk doorboort zeskant staal verzorgt de koppeling.
Let op, dit is een extra tweede hoofdwaterkraan, die de originele hoofdwaterkraan is geplaatst.
Ga dus niet aan de originele hoofdwaterkraan van je huis zitten prutsen.

 

Voor een boormal van de bevestigingsgaten zie overzicht RB35 motoren


PIC Basic programma

;  PIC12F629:                 +--v--+                                         
;                        +5V >[     ]< GND                                    
;                       vrij<>[     ]< Transistor signaal van de voeler 
;                       vrij<>[     ]> Continu hoog als PIC actief is (voor b.v. LED)
;                   Vpp/vrij >[     ]> Piezo-zoemer
;                             +-----+                                         

DEVICE 12F629                 ;Gebruik een 12F629 of 12F675 type
CONFIG INTRC_OSC_NOCLKOUT,_   ;INTerne RC OSCillator van de PIC gebruiken
       WDT_OFF,_              ;Watch Dog Timer uitgeschakeld
       PWRTE_ON,_             ;PoWeR up Timer Enable ingeschakeld
       BODEN_OFF,_            ;Brown Out Detection ENable uitgeschakeld
       MCLRE_OFF              ;Master CLeaR Enable uitgeschakeld (resetpin GPIO.3 op OFF)
ALL_DIGITAL TRUE              ;Alle ingangen digitaal (voor de toetsen)
'SET_OSCCAL                   ;Plaats calibratie (fabrieks)waarde in het OSCCAL register

;Logische constanten
SYMBOL DROOG        = 1       ;Als voeler droog is, is de poort HOOG (= 1)
SYMBOL NAT          = 0       ;Als voeler  nat  is, is de poort LAAG (= 0)
SYMBOL LAAG         = 0       ; 
SYMBOL HOOG         = 1       ;

;Registernamen (zie voor info hierover de datasheet van de 12F629 / 675, kijk bij INTCON)
SYMBOL GPIF         = INTCON.0;Bit 0 van INTerrupt CONtrol register heet: GP Interrupt Flag
SYMBOL GPIE         = INTCON.3;Bit 3 van INTCON register heet: Port Change Interrupt Enable
SYMBOL GIE          = INTCON.7;Bit 7 van INTCON register heet: Global Interrupt Enable

;Poortnamen
SYMBOL Voeler       = GPIO.0  ;Ingang voor de transistor van de voeler 
SYMBOL LED          = GPIO.1  ;Controlesignaal, continu HOOG zolang PIC actief is 
SYMBOL Piezo        = GPIO.2  ;Piezo-zoemer dat een alarmtoon geeft 

;Variabele declareren
DIM BD1             AS BYTE   ;Byte Dummy 1

;         76543210
GPIO   = %00000000            ;Alle uitgangen bij opstart een laag niveau
TRISIO = %11111001            ;GPIO.2 en GPIO.1 zijn uitgangen voor LED en piezo-zoemer
IOC    = %00000001            ;Interrupt On Change voor GPIO.0 inschakelen
GIE    = 0                    ;Global Interrupt uitschakelen(!)
GPIE   = 1                    ;GP port change Interrupt Enable inschakelen
 
PORTB_PULLUPS ON              ;Pullup weerstanden actief (voor de transistor en open poorten)
CLEAR                         ;Wis alle RAM geheugen 


;Hoofdprogramma
WHILE 1 = 1                   ;Oneindige lus 
  DELAYMS 300                 ;Signaal stabilisatie

  LED  = LAAG                 ;LED uitzetten (controle dat PIC slaapt)
  BD1  = GPIO                 ;Lees "This wil end the mismatch condition" in de datasheet
  GPIF = 0                    ;Dit bit moet steeds door het programma zelf op 0 worden gezet
  SLEEP                       ;Breng de PIC in slaap (low power mode)
  LED  = HOOG                 ;LED aanzetten (controle dat PIC in actie is)

  DELAYMS 10                  ;Na ontwaken even wachten om opnieuw te meten (2e controle)
  IF Voeler = NAT THEN        ;Tweede controle na de 10mSec
    DELAYMS 150               ;Na de tweede controle even wachten voor nog een 3e controle
    IF Voeler = NAT THEN      ;Derde controle na 150mSec. Meet nog steeds nat? Dan alarm!
      Piezo = HOOG            ;Piezo-zoemer aanzetten
      FOR BD1 = 0 TO 59       ;Een minuut is 60 seconden (0...59)
        DELAYMS 1000          ;Elke seconde meten
        IF  Voeler = DROOG THEN BREAK ;Uit de lus springen als voeler binnen minuut droog is
      NEXT
      Piezo = LAAG            ;Piezo-zoemer uitzetten
      WHILE Voeler = NAT : WEND ;Zolang de voeler nat is, hier blijven wachten
    ENDIF
  ENDIF
WEND                          ;Terug naar WHILE waar de PIC weer in slaap wordt gebracht

Bij de 12Fxxx PIC's heet het poortregister niet PORT, maar GPIO.
Dat staat voor General Purpose In Out port (maar er mag in PIC Basic ook PORTB voor worden opgegeven).
 

SLEEP
Als de voeler droog is, slaapt de PIC en neemt deze maar een stroom op van enkele µA, zodat een batterij enkele jaren mee kan gaan (mede afhankelijk van het type batterij).
De PIC is met instructie SLEEP in slaap gebracht (low power mode).
Tijdens de slaap staat de interne oscillator stil, er is geen actie, maar het geheugen blijft intact zodat variabelen, poortniveaus en registers hun waarden en instellingen blijven behouden.
 

PIC wakker maken bij nattigheid
Met het Interrupt On Change interrupt, is het mogelijk om bij een verandering van niveau van een GPIO poort, de PIC weer uit zijn slaap te halen.
Wélke poort(en) dat zijn, is in te stellen met het IOC register.
Bij de watersensor is het alleen nodig als er een verandering van niveau (laag naar hoog of hoog naar laag) op GPIO.0 gebeurt, in het programma: IOC = %00000001.

Wanneer de PIC door een interrupt op GPIO.0 uit zijn slaap is gehaald, wordt poort GPIO.1 hoog (LED controle dat PIC geactiveerd is) en wacht dan 10mSec om daarna te meten of de voeler echt nat is.
Het is namelijk mogelijk dat de PIC is gewekt door een korte stoorpuls op de voeler lijn.
Als nu bij de tweede controle blijkt dat de voeler níet nat is, dan valt de PIC meteen weer in slaap.
Blijkt de voeler wél nat te meten, dan volgt na 150mSec nog een derde meting en als ook die nat meet, wordt het alarmsignaal gegeven.

Daarna wordt in een FOR ... NEXT lus 60 keer elke seconde gemeten of de voeler alweer droog is.
Hierdoor zal het alarm al worden uitgezet, als de voeler binnen de minuut al weer droog is.
Is de minuut voorbij en de voeler nog steeds nat, dan wordt de piëzo-zoemer alsnog het zwijgen opgelegd.
Alleen de uitgang op GPIO.1 zal hoog blijven zolang de voeler nat is.

Wordt de voeler weer hoog-ohmig (= toestand weer droog), dan zal de PIC weer in slaap worden gebracht.

Meer info over Interrupt On Change


Batterij voeding
De PIC neemt met het hier weergegeven PIC Basic programma in rust weinig stroom op (slaapt normaal), zodat het als losstaand project met vier oplaadbare 1,2V batterijen, een 4,5V platte batterij of een paar knoopcellen is te voeden (zie voor batterijvoeding ook het schema van de automatische theezetter).
Het wordt niet aangeraden om een 9V blokbatterij in combinatie met een 7805 stabilisator te gebruiken, omdat de stabilisator in verhouding veel stroom opneemt en de batterij sneller leeg zal raken.


Fragment uit de datasheet van de 12F629/12F675.
Een 4,5V batterij mag aardig leeg raken voordat de PIC ermee kapt.
Voor dit project is dat 2,0V (zie Parameter no.D001, Osc. = 4MHz, geen A/D).
Bij de testopstelling thuis kon ik tot 1,7V gaan.

 

Zorg er ook voor dat in CONFIG, BODEN op OFF staat, hierdoor neemt de PIC minder stroom op en zal de batterij langer meegaan.

Bij mezelf thuis zit de watersensor verwerkt in een PIC die ook nog andere functies heeft.
De PIC valt hierbij nooit in slaapmode, maar blijft altijd actief.
De voeding voor de schakeling komt bij mij thuis dan ook niet uit een batterij, maar uit de voeding van de bus die door het huis loopt.


En nu maar hopen dat het project in de praktijk nooit zijn nut hoeft te bewijzen.
 

Download WATERLEK.HEX, V-1 bestand om in een PIC 12F629 te programmeren
Download schema als PDF bestand
Bestel geprogrammeerde PIC