;Theezetter_V-2_NL ;V-2 t.o.v. V-1: PORTB.6 lage uitgang / PORTB.5 hoge uitgang (voor QT110 instelling i.c.m. 141201 print) DEVICE 16F628A ;Gebruik een 16F628A type CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, BODEN_OFF, MCLRE_OFF ALL_DIGITAL TRUE ;Alle ingangen digitaal ;Logische constanten SYMBOL AAN = 0 SYMBOL LAAG = 0 ;Laag signaal SYMBOL HOOG = 1 ;Hoog signaal SYMBOL Ingeklapt = 0 ;Arm ingeklapt SYMBOL OFF = 0 ;UIT SYMBOL ON = 1 ;AAN SYMBOL UIT = 1 SYMBOL Uitgeklapt = 1 ;Arm uitgeklapt ;Algemene constanten SYMBOL AantalGongs = 3 ;BYTE: Bepaalt aantal gongs SYMBOL BovenDeMok = 1000 ;uSec: Waarde bepaald hoogte dat theezakje boven de mok hangt SYMBOL BoveninMok = 1040 ;uSec: Waarde bepaald hoogte dat theezakje bovenin mok zit SYMBOL InBehuizing = 2000 ;uSec: Waarde bepaald hoever de arm in de behuizing gaat (uit stand) SYMBOL InstelTijd = 300 ;WORD: Tijd waarin gekozen kan worden tussen VeelDip en WeinigDip SYMBOL OnderinMok = 1300 ;uSec: Waarde bepaald hoogte dat theezakje onderin mok zit SYMBOL PulsPauzeTijd= 23 ;mSec: Om de 23mSec een puls (20 = 50Hz, bij 20 klapt hij niet mooi in) SYMBOL Snelheid = 5 ; Snelheid waarmee het zakje in de thee dipt (hoger = sneller) SYMBOL Snelheid2 = 2 ; Snelheid waarmee het zakje in de thee zakt en uit de thee wordt gehaald SYMBOL ToonHoogte = 2500 ;Hz : Toonhoogte van gong SYMBOL WachtSeconden= 10 ;Sec : Het aantal seconden dat servo wacht bij eerste dip SYMBOL WeinigDip = 20 ;BYTE: Aantal dat gedipt moet worden als voor weinig dippen is gekozen SYMBOL VeelDip = 200 ;BYTE: Aantal dat gedipt moet worden als voor veel dippen is gekozen ;Programmaconstanten SYMBOL INTE = INTCON.4 SYMBOL INTF = INTCON.1 ;Poortnamen SYMBOL Motor = PORTA.0 ;Poort waar de pulsjes voor de servo uitkomen SYMBOL ServoPower = PORTA.1 ;Hiermee kan de servo compleet worden uitgeschakeld om batterij te sparen SYMBOL LED = PORTA.7 ;Hierop kan (tijdelijk) een LED (naar GND) op worden aangesloten voor controle of de PIC in SLEEP mode is (= LED uit) SYMBOL QT110 = PORTB.0 ;Tiptoets voor bediening van het apparaat SYMBOL KwikSwitch = PORTB.1 ;Hierop zit de kwikschakelaar aangesloten SYMBOL Default = PORTB.2 ;Deze poort LAAG maken dan is 'WeinigDip' de default, deze poort open laten dan is 'VeelDip' de default ;Variabelen declareren ;WORD DIM Hertz AS WORD ;Geluidsfrequentie buzzer DIM ServoStand AS WORD ;Bevat de uSec SERVO waarde van de servomotor (tellers voor FOR...NEXT) DIM WD1 AS WORD ;Word Dummy 1 ;BYTE DIM AantalDip AS BYTE ;Bevat het gekozen dip aantal DIM DipTeller AS BYTE ;Teller die telt hoevaak er is gedipt tijdens thee dippen DIM Gongs AS BYTE ;Teller die telt hoevaak gongs gaan DIM Volume AS BYTE ;'Volume' is de variabele die de volume van de buzzer regelt DIM BD1 AS BYTE ;Byte Dummy 1 ;BIT DIM ArmSituatie AS BIT ;Houdt bij of arm is in- of uitgeklapt DIM Dip AS BIT ;0 dan wordt 'WeinigDip' gedaan, anders 'VeelDip' ; 76543210 PORTA = %00000000 ;PORTA poorten laag PORTB = %00100000 ;PORTB.6 LAAG en PORTB.5 HOOG = QT110 op zijn gevoeligst TRISA = %01111100 ;PORTA.0 is uitgang voor de servomotor, A.1 is voeding servo, A.7 voor controle LED TRISB = %10010111 ;PORTB.6 en PORTB.5 uitgang voor QT110 instelling, PORTB.3 is uitgang voor luidspreker (HPWM) PORTB_PULLUPS ON ;On-chip pull-up weerstanden actief (voor de kwikschakelaar) CLEAR ;Wis alle RAM geheugen GOTO SleepMode ;Spring over de subroutine ;Subroutine +-+-+-+-+-+-+-+-+- Piep: HPWM 1, 127, 1000 ;Geef korte piep van 1000Hz door aan de CCP/PWM module DELAYMS 120 ;Tijd van Piep HPWM 1, 0, 0 RETURN ;Hoofdprogramma +-+-+-+-+-+-+- ;Bij inschakelen voedingsspanning (batterij plaatsen) de PIC meteen in sleepmode brengen SleepMode: HPWM 1, 0, 0 ;PORTB.3 continue laag (luidspreker uitgang) ServoPower = UIT ;Spanning van servo uitschakelen LED = OFF ;SLEEP controle LED uit (Als LED brandt is PIC in SLEEP mode) DELAYMS 300 ;Stabilisering INTE = 1 ;Interrupt inschakelen (Datasheet 16F628A: 14.5.1) INTF = 0 ;Dit bit moet steeds door het programma zelf op 0 worden gezet (zie handleiding blz.371) SLEEP ;Breng PIC in slaapmode (hier wachten, met QT110 op PORTB.0 weer uit slaap te halen) INTE = 0 LED = ON ;SLEEP controle LED aan (Als LED brandt is PIC NIET in SLEEP mode) ServoPower = AAN ;Spanning op servo zetten IF KwikSwitch = AAN THEN ;Als het apparaat plat ligt... (kan de arm ingeklapt worden) IF ArmSituatie = Ingeklapt THEN SleepMode ;...en de arm is al ingeklapt dan kan het niet ingeschakeld worden FOR Hertz = 2000 TO 250 STEP -7 ;Snel (stappen van 7Hz) van 2000Hz naar 250Hz HPWM 1, 127, Hertz ;Geef de frequentie 'Hertz' door op maximale volume (127) IF QT110 = AAN THEN SleepMode ;Cancel inklappen NEXT HPWM 1, 0, 0 ;PORTB.3 continue laag (HPWM) ;Cancel mogelijkheid inklappen FOR BD1 = 1 TO 200 DELAYMS 5 ;Nog 1 seconde (5 x 200) wachten en dan inklappen IF QT110 = AAN THEN GOSUB Piep ;Geef een korte piep door het luidsprekertje GOTO SleepMode ;Na het alarm is het nog 1 seconde mogelijk om het inklappen te voorkomen door de QT110 sensor aan te tippen ENDIF NEXT ;Arm in behuizing klappen FOR WD1 = 1 TO 80 ;80 pulsjes de tijd om arm in de behuizing te klappen SERVO Motor, InBehuizing;Zet de hefboom in de stand die is opgegeven in 'BovenDeMok' DELAYMS PulsPauzeTijd ;'PulsPauzeTijd' is bovenin het programma opgegeven NEXT ArmSituatie = Ingeklapt GOTO SleepMode ENDIF IF ArmSituatie = Ingeklapt THEN ;Als arm is ingeklapt, dan uitklappen en daarna het apparaat weer in slaap brengen ArmSituatie = Uitgeklapt GOSUB Piep ;Geef een korte piep door het luidsprekertje ServoStand = BovenDeMok FOR WD1 = 1 TO 80 ;80 pulsjes de tijd om naar de bovenste stand te gaan SERVO Motor, ServoStand ;Zet de hefboom in de stand die is opgegeven in 'BovenDeMok' DELAYMS PulsPauzeTijd ;'PulsPauzeTijd' is bovenin het programma opgegeven NEXT GOTO SleepMode ;Bij SleepMode wordt ServoPower ook weer uitgezet ENDIF ;Hier start het thee zetten ---------------------------------------------------------------------------------------- Dip = Default ;Default tussen 'WeinigDip' en 'VeelDip' is afhankelijk van 'Default' (= PORTB.2) WHILE 1 = 1 FOR BD1 = 1 TO (Dip + 1) ;Aantal instelpiepjes afhankelijk van gekozen aantal dips GOSUB Piep ;Laat piep horen DELAYMS 120 ;Tijd tussen 2 piepjes NEXT FOR WD1 = 0 TO InstelTijd DELAYMS 10 ;Om de 10mSec meten IF QT110 = AAN THEN BREAK ;Als QT110 wordt aangeraakt dan FOR...NEXT lus eerder verlaten NEXT IF WD1 > InstelTijd THEN BREAK ;Is de FOR...NEXT lus helemaal doorlopen dan is niet (meer) binnen de tijd QT110 aangeraakt Dip = ~Dip ;Wissel tussen 'VeelDip' en 'WeinigDip' WEND IF Dip = 0 THEN ;Als is gekozen voor 'WeinigDip' dan... AantalDip = WeinigDip ;... 'AantalDip' gelijkmaken aan 'WeinigDip' ELSE ;... anders ... AantalDip = VeelDip ;... 'AantalDip' gelijkmaken aan 'VeelDip' ENDIF ;Theezakje in de mok plaatsen FOR ServoStand = ServoStand TO (BoveninMok + 100) STEP Snelheid2 ;Van boven de mok tot bovenin mok SERVO Motor, ServoStand ;Verdraai motor volgens waarde DELAYMS PulsPauzeTijd NEXT ;Theezakje dippen FOR DipTeller = 1 TO AantalDip ;Dip theezakje gekozen aantal keer IF DipTeller = 1 THEN ;Als het de eerste dip is, dan even wachten FOR WD1 = 1 TO WachtSeconden * 20 ;(20 x 50mSec = 1 seconde) DELAYMS 50 IF QT110 = AAN THEN VoortijdigStoppen NEXT ENDIF FOR ServoStand = servoStand TO OnderinMok STEP Snelheid ;Van bovenin mok tot bodem van mok SERVO Motor, ServoStand ;Verdraai motor volgens waarde DELAYMS PulsPauzeTijd IF QT110 = AAN THEN VoortijdigStoppen NEXT ;Bij de een na laatste dip een kort piepje laten horen IF DipTeller = AantalDip - 1 THEN HPWM 1, 127, 1000 ;Pieptoon van 1000Hz d.m.v. CCP/PWM module geven DELAYMS 180 ;Tijd van pieptoon HPWM 1, 0, 0 ;Pieptoon weer uitzetten ENDIF FOR WD1 = 1 TO 25 ;Tijd dat theezakje even onderin blijft na elke dip DELAYMS 50 IF QT110 = AAN THEN VoortijdigStoppen NEXT IF Dipteller < aantaldip THEN ServoStand = ServoStand - Snelheid FOR ServoStand = ServoStand TO BoveninMok STEP -Snelheid ;Van bodem van mok tot bovenin mok SERVO Motor, ServoStand ;Verdraai motor volgens waarde DELAYMS PulsPauzeTijd IF QT110 = AAN THEN VoortijdigStoppen NEXT ELSE ;Laatste hijs moet langzaam (Snelheid2) ServoStand = ServoStand - Snelheid2 FOR ServoStand = ServoStand TO BoveninMok STEP -Snelheid2;Van bodem van mok tot bovenin mok SERVO Motor, ServoStand ;Verdraai motor volgens waarde DELAYMS PulsPauzeTijd NEXT ENDIF NEXT ;Theezakje weer uit de mok halen FOR ServoStand = BovenInMok TO BovenDeMok STEP -Snelheid2 ;Van bovenin mok tot boven de mok SERVO Motor, ServoStand ;Verdraai motor volgens waarde DELAYMS PulsPauzeTijd NEXT FOR WD1 = 1 TO 10 ;10 pulsjes de tijd om goed naar de bovenste stand te gaan SERVO Motor, ServoStand ;Zet de hefboom in de stand die is opgegeven in 'BovenDeMok' DELAYMS PulsPauzeTijd ;'PulsPauzeTijd' is bovenin het programma opgegeven NEXT ServoPower = UIT ;Spanning van servo halen ;Gong, thee is klaar FOR BD1 = 1 TO Aantalgongs FOR Volume = 165 TO 0 STEP -1;Van 165 (=65% duty) naar constant laag (= buzzer uit) HPWM 1, Volume, ToonHoogte ;Geef de frequentie 'ToonHoogte' door aan de CCP/PWM module DELAYUS 60 * (~Volume / 2) ;Hoe zachter het volume, hoe langer de tijd duurt (nagalm) NEXT DELAYMS 200 ;Wachttijd tussen de gongs NEXT GOTO SleepMode VoortijdigStoppen: GOSUB Piep ;Geef een piep door de luidspreker ;Theezakje weer uit de mok halen op langzame snelheid (Snelheid2) FOR ServoStand = ServoStand TO BovenDeMok STEP -Snelheid2 ;Van huidige servo stand naar boven de mok SERVO Motor, ServoStand ;Verdraai motor volgens waarde DELAYMS PulsPauzeTijd NEXT GOTO SleepMode