; 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_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 = 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 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 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 ADCON1 = %00000000 ;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 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 Gemiddelde[Index] = ADIN 2 ;Lees huidige stroomopname in op PORTA.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 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