Stroomsensor

Geeft alarm of signaal als stroom boven ingestelde waarde komt

Met deze stroomsensor is een redelijk goede indicatie te verkrijgen hoeveel stroom er door een draad vloeit bij een spanning van 230V AC.
De print is voor diverse zaken te gebruiken, afhankelijk van hoe het PIC Basic programma is opgebouwd.


De 150711 print.
 

Ikzelf woon op een appartement met onderin een kelderbox en een garage.
Om nu in de woning boven te kunnen controleren of de verlichting in één van deze twee ruimtes niet is blijven branden, controleert deze print de stroomopname van beide ruimtes.
De bedrading van deze ruimtes loopt achter een wandcontactdoos (= stopcontact) in de werkkamer naar beneden, dus is de stroomsensor bij deze wandcontactdoos in de werkkamer geplaatst.
De 230V fasedraad van beide ruimtes loopt nu dóór de dikke rode draad die een paar maal door een ontstoringsspoel is gewikkeld, die hierdoor als een soort trafo werkt en tevens de galvanische scheiding garandeert (de schakeling zelf is dus niet met het 230V net verbonden).

Opamp LM358 versterkt het zwakke signaal uit de spoel dat grotendeels evenredig is met de stroom die door de 230V leiding loopt.
Het versterkte signaal van de opamp wordt aangeboden aan een analoge ingang van een 12F675 of (als er een display nodig is) een 16F676.
Op een andere analoge ingang van de PIC zit de loper van een 5k potmeter aangesloten waarmee een spanning is in te stellen tussen 0 en 5V.
De PIC vergelijkt beide spanningen (dus die van de opamp en de instelling van de potmeter) en zal als de spanning van de opamp langer dan 1 seconde boven die van de instelpotmeter uitkomt een korte piep door een piëzo-zoemer in de woonkamer laten klinken en continu een buzzer in de slaapkamer af laten gaan.
 

Alarm
De buzzer is geplaatst in de slaapkamer omdat de stroomsensor tevens een alarm functie heeft.
Als namelijk beneden een deur van kelderbox of garage wordt geopend dan gaat de verlichting aldaar automatisch aan, wat de stroomsensor weer opmerkt en onmiddellijk de buzzer in de slaapkamer een akoestisch signaal zal laten geven, iemand opent een deur beneden!
In de woonkamer klinkt ook direct eenmalig heel kort een piep uit een piëzo-zoemer.
Als de grotere stroom door de 230V draad langer dan zo'n 5 minuten aanhoudt, dan zal de piëzo-zoemer in de woonkamer elke minuut een korte piep laten klinken, ten teken dat de verlichting in kelderbox of garage nog steeds aanstaat.

Aangezien de garagedeur automatisch (natuurlijk ) open gaat, en er dus in rust een stand-by stroom voor de draadloze ontvanger van de garagedeur door de 230V leiding loopt, is met de potmeter in te stellen hoeveel stroom er mag lopen, zonder dat het alarm zal afgaan (ook makkelijk als er een diepvrieskist in de kelderbox zou worden geplaatst).

Het is al eens voorgekomen dat ik in de woning per ongeluk op de draadloze afstandsbediening van de garagedeur drukte en de garagedeur zonder mijn weten open stond.
Nu, dankzij deze stroomsensor, krijg ik meteen een seintje door de eerste piep van de piëzo-zoemer in de woonkamer.
 


Bij gebruik van een (tijdelijk) display i.p.v. 12F675 een 16F676 plaatsen.
 


Geprepareerde spoel.
Conrad 53 43 40

 

Spoel
De maximale stroom door de spoel is afhankelijk van de dikte van de draad door de spoel en het maximum vermogen dat door de gebruikte printkroonsteen mag.
Ikzelf heb soepel 1,5mm² gebruikt en deze vier keer door de spoel gehaald (zie foto rechts).
 

Display
Door (tijdelijk) een HD44780 display op de (witte) connector aan te sluiten is af te lezen hoe groot de gemeten waarden zijn van de stand-by stroom van de automatische garagedeur en bij inschakeling van de lampen.
Hierop is het PIC Basic programma weer aan te passen.
Normaal heb ik er dus geen display aan zitten (eigenlijk is de voeding van deze print hiervoor ook te klein).
Als je helemaal geen display hebt kan het onderste deel van de print sowieso vervallen en kan er een 8-pins 12F675 PIC worden geplaatst in plaats van een 14-pins 16F676.
Bij gebruik van een tijdelijk display het backlight zo mogelijk uit laten om de stroom te beperken.
Moet er continu een display (mét eventueel backlight) op aangesloten worden, dan zelf een print ontwerpen met een grotere voeding, de trafo van de 150711 print is van een zeer klein formaat om de stand-by stroom van de print zo laag mogelijk te houden.


Wees voorzichtig met dit project omdat een deel hiervan met de 230V netspanning zit verbonden!

Onderdelenlijst print 150711:

Print 150711 Zelf etsen of door iemand laten maken (70 × 40mm of 70 × 50mm)
IC1 PIC12F675 of 16F676 - Download het HEX bestand onderaan deze pagina
IC2 LM358 (dual opamp)
VR1 78L05 spanningsstabilisator 5V / 100mA / TO-92
B1 B80C800 (Conrad 50 11 74 of 50 12 04) of Voti
LED1 Rode LED, 3mm, low current type
T1 BC547 NPN transistor
D1 BAT85 Schottky diode
R1 560Ω
R2 1k
R3,4,5 10k
R6 100k
R7 33k (mag weggelaten worden als MCLR op OFF staat)
P1 Mini-instelpotmeter (6mm) 5k ... 25k, liggend
C1,C2 10µF / 25V (radiaal)
C3 1µF
C4 100n (axiaal)
C5 220n
Trafo1 Transformator 12V / 0,35VA (bijvoorbeeld Display 02.10.12003)
Spoel1 Dimmer ontstoorspoel 1,8mH (Conrad 53 43 40) + eigen wikkeling (zie tekst)
Conn1 4-polig printkroonsteen voor 230V aansluiting
Conn2 4-polig Stocko connector
Conn3 8-polig connector (2,54mm raster, eigen keus) voor display
IC-voet 8 of 14-pins, eigen keus
Draad Soepel, dikte afhankelijk van door te laten stroom

Op de foto's zit een 33k weerstand van pin 4 naar de +5V, deze mag weggelaten worden als MCLR uitgeschakeld is.

 


De geprepareerde spoel, geplaatst op de 150711 print.


PIC Basic programma

De programma's inkorten als je deze met de LITE versie wilt compileren.

;           PIC16F676:                  +--v--+
;                                   +5V [     ]  GND
;                               Buzzer <[     ]> LED
;                                Piezo <[     ]< Potmeter
;               33k pull-up! Vpp/Reset >[     ]< Stroomsensor
;               (Optioneel) display EN <[     ]> D4 display (Optioneel)
;               (Optioneel) display RS <[     ]> D5 display (Optioneel)
;               (Optioneel) display D7 <[     ]> D6 display (Optioneel)
;                                       +-----+
;www.picbasic.nl / Frits Kieftenbelt, Raalte, Netherlands (Frizie)
;
;Opstarten gebeurt na programmering van de PIC soms niet automatisch
;Dan even opnieuw de spanning inschakelen
;Programmeren met de potmeter in middenstand, anders heb je kans dat programmeren niet wil

DEVICE 16F676                 ;Gebruik een 16F676 type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, BODEN_OFF, PWRTE_ON, MCLRE_OFF
'ALL_DIGITAL TRUE             ;ALL_DIGITAL TRUE mag weggelaten worden
'SET_OSCCAL                   ;Fabrieks kalibratiewaarde in OSCCAL register plaatsen

;Constanten
SYMBOL Tijd         = 3500    ;700 = 1 minuut, na deze tijd gaat piezo zoemer piepen
SYMBOL TijdPiezo    = 450     ;Piezo "af en toe piep" tijd, deze moet kleiner dan 'Tijd' zijn

;Logische constanten
SYMBOL OFF          = 0       ;UIT
SYMBOL ON           = 1       ;AAN

;Poortnamen
SYMBOL LED          = PORTA.0 ;LED brandt onmiddellijk als stroom boven instelling komt
SYMBOL Potmeter     = PORTA.1 ;Instelpotmeter 5k ... 25k op print
SYMBOL Spoel        = PORTA.2 ;Hierop zit de stroomsensor aangesloten (spoel)
SYMBOL Piezo        = PORTA.4 ;Piezo-zoemer (piep in kamer)
SYMBOL Buzzer       = PORTA.5 ;Buzzer (bzzzz in slaapkamer)
LCD_DTPIN           = PORTC.0 ;Optionele HD44780 display
LCD_RSPIN           = PORTC.4
LCD_ENPIN           = PORTC.5

;Variabelen declareren
;WORD-ARRAY
DIM Meting[15]      AS WORD   ;Sla laatste 15 metingen op in een array
;WORD
DIM MeetGemiddelde  AS WORD   ;Bevat het totaal van de laatste 15 stroommetingen
DIM PotmeterInst    AS WORD   ;Bevat de potmeter instelling
DIM Timer           AS WORD   ;Lopende timer voor piezo-zoemer
DIM WD1             AS WORD   ;Word Dummy 1
;BYTE
DIM Index           AS BYTE   ;Indexvariabele voor array 'Meting[]'
DIM BD1             AS BYTE   ;Byte Dummy 1
;BIT
DIM ID1             AS BIT    ;bIt Dummy 1

;Register 76543210
PORTA  = %00000000
PORTC  = %00000000
TRISA  = %11001110            ;Uitgangen voor Buzzer, Piezo-zoemer en LED
TRISC  = %11111111            ;PORTC kan gebruikt worden voor een HD44780 display
ADCON0 = %10000000            ;Analoog right justified / Vdd als referentie spanning
ADCON1 = %00010000            ;Fosc/8
ANSEL  = %00000110            ;Analoog input alleen PORTA.2 en A.1 (de rest DIGITAL INPUT)
CMCON  = %00000111            ;Comparator uit (Bits 2, 1 en 0 op '1' zetten)

CLEAR                         ;Wis alle RAM geheugen
DELAYMS 500                   ;Signaal en display stabilisering


;Hoofdprogramma
CLS                           ;Wis LCD scherm
PRINT AT 1, 2, "Analoog:"     ;Plaats vaste tekst op LCD
PRINT AT 2, 1, "Potmeter:"

FOR BD1 = 1 TO 4              ;Laat LED een paar keer knipperen (indicatie dat PIC opstart)
  LED = ~LED                  ;Toggle de LED
  DELAYMS 300                 ;Knippersnelheid van de LED
NEXT

WHILE 1 = 1
  Meting[Index] = ADIN 2      ;Lees huidige stroomopname in op PORTA.2(=AN2)

  IF Index < 14 THEN          ;'Index' telt in een lus van 0 ... 14 (15 metingen)
    INC Index                 ;Verhoog de indexvariabele voor arrayvariabele 'Meting[]'
  ELSE  
    CLEAR Index               ;Reset indexvariabele van de array

    CLEAR MeetGemiddelde      ;Wis eerst de metingswaarde van de vorige keer
    FOR BD1 = 0 TO 14         ;Bereken het gemiddelde van de 15 metingen (meting 0 t/m 14)
      MeetGemiddelde = MeetGemiddelde + Meting[BD1] ;Tel waarden van laatste 15 metingen op
    NEXT      
    MeetGemiddelde = MeetGemiddelde / 15 ;Deel het totaal van de 15 metingen door 15

    WHILE 1 = 1
      PotmeterInst = ADIN 1   ;Lees instelling van 5k ... 25k instelpotmeter op PORTA.1
      PRINT AT 2, 11, DEC4 PotmeterInst
      IF PotmeterInst < 450 THEN BREAK ;Potmeter < bijna maximaal, dan is alarm ingeschakeld
      Buzzer = OFF            ;Bij potmeter (bijna) maximaal 'Buzzer' en 'Piezo' uit
      Piezo  = OFF
      CLEAR Timer             ;Timer resetten omdat de buzzer anders niet meer aan zou gaan
      DELAYMS 250             ;Rustig kijken naar potmeterstand
    WEND
    PRINT AT 1, 11, DEC4 MeetGemiddelde
    
    IF MeetGemiddelde > PotmeterInst THEN ;Stroomopname groter dan potmeterinstelling, dan...
      INC Timer               ;Verhoog 'Timer'
      IF Timer > Tijd THEN    ;Tijd voorbij? Dan...
        Piezo  = ON           ;Piezo-zoemer aan (kamer)
        Timer  = Tijd - TijdPiezo ;Timer iets terugzetten waardoor piezo opnieuw zal afgaan
      ELSE                    ;...anders... (is Tijd voorbij)
        Piezo  = OFF          ;Piezo-zoemer uit (kamer)
      ENDIF
      
      LED      = ON           ;LED reageert zonder vertraging (direct aanzetten)
      
      IF Timer = 20 THEN      ;Hysteresis zodat buzzer niet piept bij een korte stroompuls
        Buzzer = ON           ;Buzzer slaapkamer aan
        Piezo  = ON           ;Eerste piep piezo (kamer) direct bij hoge stroommeting
        DELAYMS 200           ;Deze eerste piep duurt ook wat langer
        Piezo  = OFF          ;Gaat elders korte piepen geven als stroommeting te lang duurt
      ENDIF
    ELSE                      ;...anders... (is stroomopname lager dan potmeterinstelling)
      CLEAR Timer             ;Tijd resetten
      Buzzer   = OFF          ;Buzzer (slaapkamer) uitzetten
      LED      = OFF          ;LED uitzetten
      Piezo    = OFF          ;Piezo-zoemer (kamer) uitzetten
    ENDIF
    
  ENDIF      
  
  DELAYMS 5                   ;Vertraging voor o.a. piezo-zoemer timer
WEND

 

Het programma voor de 12F675 (zonder display dus)

;           PIC12F675:                  +--v--+
;                                   +5V [     ]  GND
;                               Buzzer <[     ]> LED
;                                Piezo <[     ]< Potmeter
;               33k pull-up! Vpp/Reset >[     ]< Stroomsensor
;                                       +-----+
;www.picbasic.nl / Frits Kieftenbelt, Raalte, Netherlands (Frizie)
;
;Opstarten gebeurt na programmering van de PIC soms niet automatisch
;Dan even opnieuw de spanning inschakelen
;Programmeren met de potmeter in middenstand, anders heb je kans dat programmeren niet wil

DEVICE 12F675                 ;Gebruik een 12F675 type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, BODEN_OFF, PWRTE_ON, MCLRE_OFF
'ALL_DIGITAL TRUE             ;ALL_DIGITAL TRUE mag weggelaten worden
'SET_OSCCAL                   ;Fabrieks kalibratiewaarde in OSCCAL register plaatsen

;Constanten
SYMBOL Tijd         = 3500    ;700 = 1 minuut, na deze tijd gaat piezo zoemer piepen
SYMBOL TijdPiezo    = 450     ;Piezo "af en toe piep" tijd, deze moet kleiner dan 'Tijd' zijn

;Logische constanten
SYMBOL OFF          = 0       ;UIT
SYMBOL ON           = 1       ;AAN

;Poortnamen
SYMBOL LED          = GPIO.0  ;LED brandt onmiddellijk als stroom boven instelling komt
SYMBOL Potmeter     = GPIO.1  ;Instelpotmeter 5k ... 25k op print
SYMBOL Spoel        = GPIO.2  ;Hierop zit de stroomsensor aangesloten (spoel)
SYMBOL Piezo        = GPIO.4  ;Piezo-zoemer (piep in kamer)
SYMBOL Buzzer       = GPIO.5  ;Buzzer (bzzzz in slaapkamer)

;Variabelen declareren
;WORD-ARRAY
DIM Meting[15]      AS WORD   ;Sla laatste 15 metingen op in een array
;WORD
DIM MeetGemiddelde  AS WORD   ;Bevat het totaal van de laatste 15 stroommetingen
DIM PotmeterInst    AS WORD   ;Bevat de potmeter instelling
DIM Timer           AS WORD   ;Lopende timer voor piezo-zoemer
DIM WD1             AS WORD   ;Word Dummy 1
;BYTE
DIM Index           AS BYTE   ;Indexvariabele voor array 'Meting[]'
DIM BD1             AS BYTE   ;Byte Dummy 1
;BIT
DIM ID1             AS BIT    ;bIt Dummy 1

;Register 76543210
GPIO   = %00000000
TRISIO = %11001110            ;Uitgangen voor Buzzer, Piezo-zoemer en LED
ADCON0 = %10000000            ;Analoog right justified / Vdd als referentie spanning
ANSEL  = %00010110            ;Fosc/8 en analoog input alleen GPIO.2 en GPIO.1
CMCON  = %00000111            ;Comparator uit (Bits 2, 1 en 0 op '1' zetten)

CLEAR                         ;Wis alle RAM geheugen
DELAYMS 500                   ;Signaal stabilisering


;Hoofdprogramma
FOR BD1 = 1 TO 4              ;Laat LED een paar keer knipperen (indicatie dat PIC opstart)
  LED = ~LED                  ;Toggle de LED
  DELAYMS 300                 ;Knippersnelheid van de LED
NEXT

WHILE 1 = 1
  Meting[Index] = ADIN 2      ;Lees huidige stroomopname in op GPIO.2 (=AN2)

  IF Index < 14 THEN          ;'Index' telt in een lus van 0 ... 14 (15 metingen)
    INC Index                 ;Verhoog de indexvariabele voor arrayvariabele 'Meting[]'
  ELSE  
    CLEAR Index               ;Reset indexvariabele van de array

    CLEAR MeetGemiddelde      ;Wis eerst de metingswaarde van de vorige keer
    FOR BD1 = 0 TO 14         ;Bereken het gemiddelde van de 15 metingen (meting 0 t/m 14)
      MeetGemiddelde = MeetGemiddelde + Meting[BD1] ;Tel waarden van laatste 15 metingen op
    NEXT      
    MeetGemiddelde = MeetGemiddelde / 15 ;Deel het totaal van de 15 metingen door 15

    WHILE 1 = 1
      PotmeterInst = ADIN 1   ;Lees instelling van 5k ... 25k instelpotmeter op GPIO.1
      IF PotmeterInst < 450 THEN BREAK ;Potmeter < bijna maximaal, dan is alarm ingeschakeld
      Buzzer = OFF            ;Bij potmeter (bijna) maximaal 'Buzzer' en 'Piezo' uit
      Piezo  = OFF
      CLEAR Timer             ;Timer resetten omdat de buzzer anders niet meer aan zou gaan
      DELAYMS 250             ;Rustig kijken naar potmeterstand
    WEND
    
    IF MeetGemiddelde > PotmeterInst THEN ;Stroomopname groter dan potmeterinstelling, dan...
      INC Timer               ;Verhoog 'Timer'
      IF Timer > Tijd THEN    ;Tijd voorbij? Dan...
        Piezo  = ON           ;Piezo-zoemer aan (kamer)
        Timer  = Tijd - TijdPiezo ;Timer iets terugzetten waardoor piezo opnieuw zal afgaan
      ELSE                    ;...anders... (is Tijd voorbij)
        Piezo  = OFF          ;Piezo-zoemer uit (kamer)
      ENDIF
      
      LED      = ON           ;LED reageert zonder vertraging (direct aanzetten)
      
      IF Timer = 20 THEN      ;Hysteresis zodat buzzer niet piept bij een korte stroompuls
        Buzzer = ON           ;Buzzer slaapkamer aan
        Piezo  = ON           ;Eerste piep piezo (kamer) direct bij hoge stroommeting
        DELAYMS 200           ;Deze eerste piep duurt ook wat langer
        Piezo  = OFF          ;Gaat elders korte piepen geven als stroommeting te lang duurt
      ENDIF
    ELSE                      ;...anders... (is stroomopname lager dan potmeterinstelling)
      CLEAR Timer             ;Tijd resetten
      Buzzer   = OFF          ;Buzzer (slaapkamer) uitzetten
      LED      = OFF          ;LED uitzetten
      Piezo    = OFF          ;Piezo-zoemer (kamer) uitzetten
    ENDIF
    
  ENDIF      
  
  DELAYMS 5                   ;Vertraging voor o.a. piezo-zoemer timer
WEND

 
Werking hoofdprogramma
Het programma doet eerst 15 metingen met tussenpozen van 5mSec (met ADIN 2).
Elke meetwaarde wordt opgeslagen in de array met de naam 'Meting'.
Zijn de 15 metingen voorbij (de variabele 'Index' houdt dit bij), dan wordt 'Index' weer gereset (CLEAR Index) en worden de 15 metingen allen bij elkaar opgeteld en de uitkomst hiervan weer gedeeld door 15.
Door deze berekening is het gemiddelde van de stroommeting bekend en geplaatst in de variabele 'MeetGemiddelde'.
Meer over array's zie hier in PIC Basic cursus deel 6.

Hierna wordt de stroominstelling van de instelpotmeter gemeten (met ADIN 1).
Dit doet het programma door een WHILE ... WEND lus binnen te lopen, de stand van de potmeter te meten en meteen daarna te bekijken of deze een kleinere waarde heeft dan 450.
Is dat het geval, dan wordt de WHILE ... WEND lus meteen weer verlaten met BREAK waarna het programma verderop de eerder gemeten stroom gaat vergelijken met de zojuist gemeten instelling van de potmeter.
Als de potmeter helemaal in de hoek wordt gedraaid, dan is het alarm dus uitgeschakeld.
Het programma blijft dan in de WHILE ... WEND lus rondlopen die continu 4x per seconde de instelpotmeter blijft meten en zal deze lus pas weer verlaten (= alarm weer ingeschakeld) als de potmeter niet meer in de maximale stand staat ingesteld (= waarde < 450).

Zolang het meetgemiddelde groter is dan de instelling van de potmeter (IF Meetgemiddelde > PotmeterInst THEN...) wordt variabele 'Timer' verhoogd met 1.
Is variabele 'Timer' op een gegeven moment groter geworden dan de waarde van constante 'Tijd' (hier op 3500), dan wordt het alarm ingeschakeld.
Variabele 'Timer' zorgt ervoor dat het alarm niet meteen al af gaat als er alleen een stroompiek gemeten is.
Pas als blijkt dat alle 3500 meetgemiddelden aan elkaar (= ongeveer 1 seconde) boven de ingestelde waarde van de potmeter zijn, zal het programma het programmadeel met de piëzo-zoemer en buzzer uitvoeren.
De LED reageert overigens wél meteen op een stroompiek, aangezien deze zich buiten de timerlus bevindt.


Met een 16F676:


 

Met een 12F675 (zonder display) kan de onderkant van de print vervallen:

 

Download STROOM12.HEX, V-1 bestand om in een PIC 12F675 te programmeren
Download STROOM16.HEX, V-1 bestand om in een PIC 16F676 te programmeren
Download Stroomsensor_12F675_V-1_NL.bas, de broncode voor PIC Basic
Download Stroomsensor_16F676_V-1_NL.bas, de broncode voor PIC Basic
Download schema als PDF bestand
Printlayout 150711 + componentopstelling 70 × 40 mm of 70 × 50 mm >> Afdruk tips <<
Datasheet LM358.pdf
Bestel geprogrammeerde PIC