; 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_ON '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 Gemiddelde[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 'Gemiddelde[]' 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 / Fosc/2 ANSEL = %00000110 ;Analoog input alleen PORTA.2 en A.1 (de rest DIGITAL INPUT) CMCON = %00000111 ;Comparator uit (Bits 0,1 en 2 hoog = 7) 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 Gemiddelde[Index] = ADIN 2 ;Lees huidige stroomopname in op GPIO.2 (=ANS2) IF Index < 14 THEN ;'Index' telt in een lus van 0 ... 14 (15 metingen) INC Index ;Verhoog de indexvariabele voor arrayvariabele 'Gemiddelde[]' ELSE CLEAR Index ;Reset indexvariabele van de array CLEAR MeetGemiddelde ;Wis eerst de metingswaarde van de vorige keer FOR BD1 = 0 TO 14 ;Bereken gemiddelde van de 15 metingen (meting 0 t/m 14) MeetGemiddelde = MeetGemiddelde + Gemiddelde[BD1] ;Tel waarden van laatste 15 metingen 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