Domotica: Huisautomatisering

Ideeën en tips

Ik heb m'n huis nu voor zover klaar dat de zeven besturingsprinten met PIC's die her en der door het huis liggen allen met elkaar kunnen communiceren.
Door het huis loopt een 2-aderig (0,5mm²) afgeschermd snoer, voor zowel de seriële communicatie, als ook de voeding voor de zeven PIC printen en daarbij de diverse 12V motoren in huis (handdoekrek, ramen, poster, servomotoren, enz.).
De 12VDC voeding komt van een 12V netadapter en wordt via één ader (+12V) en de afscherming (GND) naar de diverse printen geleid.
De tweede ader in het afgeschermde snoer is de signaal draad voor de data, een soort bus met een eigen protocol, waarover alle PIC's met elkaar kunnen communiceren.
In rust heeft deze signaaldraad een spanning van +12V.

Er wordt gebruik gemaakt van de relatief langzame communicatiesnelheid van 2400 Baud, maar voor deze situatie snel genoeg want er wordt telkens maar één WORD (16-bits) verzonden om één van de 254 huisbesturingscommando's te versturen, ruim voldoende voorlopig (code 0 en 255 zijn gereserveerd voor een eventueel echt protocol en doen (nog) niet mee).
Dus een opdracht is in een kleine 6,7mSec verzonden.

Een echt protocol heb ik nog niet gemaakt, dat komt later als ik meer tijd heb (bijvoorbeeld een vakantie).
Het is nu een simpel FAF (= fire-and-forget) protocol, een PIC stuurt een code over de kabel maar controleert verder niet of het goed ontvangen is door de andere PIC's.
In de praktijk blijkt dat hier bij me thuis geen problemen op te leveren, ik heb nog geen "vreemde" storingen gehad, de boodschap komt blijkbaar altijd goed aan.
Ook de gebruikte hardware is de simpelste in zijn soort, geen RS232/RS485, maar gewoon een draad met 12V pull-up, and that's it.
Onthoud dat dit om te beginnen een hobby project is, voor professionele en commerciële projecten kan beter een officieel bestaand protocol worden gekozen.


(Ga met de muis op bovenstaande print staan voor high-light)

 


Netadapter (bouwmarkt).
12V/1A gestabiliseerd.

 


Een eenvoudige manier van onderlinge communicatie tussen meerdere PIC's door maar 1 signaallijn (bus).
In rust heeft de lijn een spanning van +12V door de 4k7 pull-up weerstand op het punt waar de 12V voeding wordt aangeboden.
De totale lengte van de afgeschermde kabel van begin tot eind is rond de 25 meter.

 

De aangeboden voedingsspanning is +12V voor de diverse motoren in huis en mede hierom heeft elke print een eigen 7805 stabilisator om de spanning terug te brengen naar een mooie +5V voor de diverse componenten (waaronder de PIC) op elke print.
Van elke PIC zijn de USART in- en uitgangen gecombineerd en met behulp van een BC547 en een BAT85 Schottky-diode zodanig verbonden dat er maar één signaaldraad nodig is, dus zowel voor verzenden als ontvangen van data wordt van dezelfde draad gebruik gemaakt.
De 100k weerstand die bij elke PIC zit zorgt voor een extra pull-up van de signaaldraad naar +12V.
Denk eraan dat de Schottky-diode er goed om in zit, anders loopt de spanning op PORTB.1 op tot 12V en is je PIC defect!

Voor ontvangst van data wordt hier gebruik gemaakt van de USART met behulp van PIC Basic functie HSERIN.
Maar voor verzending van data is in dit geval de USART (en instructie HSEROUT) niet bruikbaar, omdat de BC547 transistor de data inverteert.
Daarom wordt hier gebruik gemaakt van de softwarematige variant, PIC Basic instructie SEROUT, waarmee data ook geïnverteerd is te verzenden.
De BC547 transistor inverteert de waarde weer terug waardoor het signaal op de datalijn weer oorspronkelijk is.
Met HSEROUT is het niet mogelijk om data geïnverteerd te verzenden, met SEROUT wel.

Het is van belang dat bij communicatie de PIC's op een nauwkeurige (kristal) oscillator draaien en dus niet op de minder nauwkeurige interne oscillator.
De oscillatorsnelheid van het kristal maakt daarbij niet zoveel uit, ikzelf gebruik 16MHz, maar met een 4MHz kristal werkt de communicatie net zo goed (natuurlijk wel achter XTAL de juiste waarde instellen, zie cursus deel 3).
Toch is hier het advies om bij seriële communicatie een kristal met een hogere frequentie (16MHz of hoger) te nemen, vooral als je straks sneller wilt communiceren dan 2400Baud.
De reden dat ik voor 16MHz heb gekozen is dat volgens de datasheet de 16F628A op maximaal 20MHz mag draaien.
Door er wat onder te gaan zitten loopt de PIC ruim binnen zijn specificaties en toch lekker snel.


De BAT85 zorgt ervoor dat de hogere 12V spanning de PIC niet bereikt.
Elke PIC moet op een nauwkeurige oscillator (zoals kristal of resonator) lopen.

 

Soms werkt het toch met gebruik van de interne oscillator, maar aan te raden is het zeker niet.
De snelheid van de interne oscillator van de PIC verandert als de voedingsspanning of temperatuur varieert.
En als de kloksnelheid van de PIC verandert, dan verandert ook de communicatiesnelheid waardoor de communicatie soms mislukt.
Dus... altijd een nauwkeurige externe oscillator zoals een kristal (of resonator) gebruiken als je een verbinding met iets anders maakt.

Lees discussies op het Circuits Online forum:
- De afscherming als stroomvoerende GND heeft z'n voor- en nadelen, op het Circuits Online forum een discussie.
- Nog een discussie
Gebruik de zoekfunctie aldaar, er zijn nog wel meer discussies over dit onderwerp op het Circuits Online forum.

Ikzelf gebruik een redelijk goedkope 2 × 0,5mm² kabel met afscherming.


Alles kan met alles communiceren via de bus.
Een onzinnig voorbeeld:
Het is bijvoorbeeld mogelijk om met de belknop bij de voordeur de ramen te openen, maar dat dit alleen werkt tussen 14:03 en 16:15 uur DCF77 tijd, als de dag een woensdag is, er een persoon in bed ligt, de datum een even getal is, het buiten warmer is dan 20°C, de wind niet harder waait dan windkracht 3, het buiten niet schemerig is, de kastdeur in de hal gesloten is en er mag ook geen water in het ligbad staan (van een onzinnig voorbeeld gesproken!).
Als een wens zo mocht zijn (ik denk het niet) dan is dit wél te realiseren!

Tot nu toe aangesloten functies op de bus die door het huis loopt:

Plaats Pos PIC type   Functies
Keuken 1 18F452 - Toekomstig master functie (nú hoofdfuncties als tijd, temperatuur, Bluetooth master en display)
- FSK nummermelder van telefoon
- Uitlezen buitentemperatuur (met een DS1820)
- Uitlezen kamertemperatuur (met een DS1820)
- Uitlezen keukentemperatuur (met een DS1820)
- Motorbesturingen van ramen keuken en slaapkamer (PWM regeling)
- Motorbesturing van keukendeur
- Temperatuurinstelling Nefit thermostaat (300 Baud)
- Bluetooth communicatie met Roomba iRobot stofzuiger (HC-05 modules)
- DCF77 tijd ontvangst voor dagelijkse gelijkzetting van PCF8583 klok-IC
- PCF8583 klok-IC met SAE0800 gong (met variabel volume afh. van LDR)
- Voeding voor automatisch handdoekrek en DCF77 ontvanger
- Waterlekkage sensor van de keuken (wasmachine)
- Elektrische vloerverwarming in de keuken
Keuken 1 16F628A - Telefoonprint (communicatie met de buitenwereld)
Woonkamer 2 16F648A - Infrarood RC5 ontvanger (voor Pronto Neo afstandsbediening)
- AM zender voor draadloos bussignaal
- Twee verlichtingsgroepen met PIC dimmers
- Motorbesturing voor aandrijving poster (PWM regeling)
- Motorbesturingen van ramen woonkamer en werkkamer (PWM regeling)
- Stroommeting of er een lamp brandt in schuur en/of garage (alarm signaaltje)
- Besturing waterpompje voor watervalletje in plantenbak
- Bediening kleurencamera in vogelnestkastje buiten (koolmezen)
- In- en uitschakelen Philips F9638 MFB luidsprekerboxen op de werkkamer
Woonkamer 3 16F676 - Motorbesturing Luxaflex (4 motoren)
- LDR lichtmeting buiten op het zuiden
- Transistorradio voor tamme parkiet (aan op tijd, uit op LDR)
- Windrichting- en snelheidsmeter op het dak
- Reedcontact balkondeur
- Zonnescherm buiten (screens)
Woonkamer 7 16F628A - AM ontvanger van draadloos bussignaal
- Beamer aanstuurcommando's (omgezet naar infrarood RC6 protocol)
- Ventilator voor beamer
- Spiegel met servomotor
- Luchtpompje voor bubbels in schemerlamp
- Kleurenschijf AC motor in (dezelfde) schemerlamp
- Dimbare 230V/300W halogeenlamp met PIC dimmer
Hal 4 16LF73 - IR sensor in hal
- IR sensor in woonkamer
- LDR lichtmeting in hal
- LDR lichtmeting in woonkamer
- Lamp van de hal (dimbaar)
- Lamp boven achtertafel woonkamer (dimbaar)
- Potmeteringang voor dimmen lamp achtertafel
- LDR lichtmeting buiten op het noorden
- Belknop voordeur
- Deurbel (ding-dong)
- Reedcontact kastdeur van bergkast in hal
- Reedcontact voordeur
- Motorbesturing voor dichtdraaien hoofdwaterkraan (bij lekkage)
- Meting hoorn van W65 wandtelefoon in hal is opgenomen
Slaapkamer 5 16F628A - Auping bed sensor in matras (detecteert of er iemand in bed ligt)
- Complete Auping bedbesturing (4-motoren, bedclimat / verwarming)
- Kastje met toetsbediening voor bad vullen, verwarming, slaapkamerraam
- Aansturing 230V airconditioning slaapkamer
- Automatisch nachtlampje (groene 10mm LED)
- Waterlekkage sensor van de (naastgelegen) badkamer
- Luidsprekergong als wekker en indicatie dat telefoon in hal gaat
Badkamer 6 BS2e - Waterventielen 12V (bad vullen)
- Motorbesturing voor automatisch openen/sluiten badstop
- Ventilatorafzuiging
- Elektrische verwarming
- Spiegelverwarming
- Vijf verlichtingsgroepen met PIC dimmers
- Aansturen frequentieregelaar voor bubbelbad (traploos regelbaar)
- Volumeregeling plafondluidsprekers badkamer
- Temperatuurmeting badwater met een DS1620
- Waterniveau meting badwater met een QT114
- Aansturing buzzer in woonkamer (bad vol / water te heet / dutwekker / enz.)
- Melding luidsprekergong slaapkamer dat bad gereed is (bad vol dus)

 

In huis ligt in bijna elke hoek wel een print met een PIC, zodat een nieuw op de bus aan te sluiten apparaat of component op de dichtstbijzijnde print kan worden aangesloten.
 


De kabel loopt onzichtbaar door het huis (door plinten en drempels).
Te zien is dat het geen echte ring of ster leiding is.

 

Op positie 1 zit naast de 18F452 master en DCF77 PIC, ook de telefoonprint op de bus.
Ook is hier de voeding van het geheel geplaatst (de eerder vermeldde 12V netadapter dus).
Positie 6 (geplaatst in de werkkamer) is een Basic Stamp die de badkamer bestuurt.
Zowel positie 1 als 2 hebben een TSOP1736 infrarood ontvanger voor instructies voor het hele huis met de afstandsbediening.
Positie 7 zit niet op de bus, maar krijgt z'n businstructies draadloos toegezonden vanuit positie 2 (via AM zender / ontvanger).
 


Dimmers
Diverse lichtdimmers in huis zijn gebouwd met de schakeling van het dimmerproject met een 12F629.
Deze PIC schakeling is een stand-alone project en zit rechtstreeks met de netspanning verbonden en moet daarom via een optocoupler worden aangestuurd.
Houdt daar dus rekening mee als je zelf iets gaat bouwen met een bus en deze dimmerschakeling!
In het dimmerproject zelf staat in het schema hoe een optocoupler hierop is aan te sluiten.

De lampen zijn aan/uit of te dimmen rechtstreeks door aanraakbediening (zie foto) en door één van de PIC's die op de bus is aangesloten.
Hierdoor zijn de lampen ook te bedienen met de Pronto Neo afstandsbediening en is het ook afhankelijk te maken van tijd, telefoonafstandsbediening, temperatuur, windsnelheid, belknop, enz.
Ik heb het al een tijdje zo gehad dat als er heel kort op de belknop werd gedrukt, dat dan de verlichting in de hal voor 1 minuut aan ging.
Zo kon ik buiten de verlichting binnen in de hal al aanzetten.

De dimmers van achtertafel en hal werken met behulp van een andere schakeling.
Deze maken gebruik van een S202S01 solid state relais (het type zonder nuldoorgangsdetector), hiervan verschijnt nog wel eens een keer een project op picbasic.nl.
 


DCF77 en PCF8583 klok-IC met gong
Elk heel uur klinkt er een 3-tonige gong en op de halve uren een 2-tonige gong uit een luidspreker.
Om de gong te laten klinken is een SAE800 gong-IC verbonden met twee uitgangen van één van de twee 74HC595 IC's.
Beide uitgangen geven elk heel uur een kort pulsje en één uitgang ook op de halve uren, waardoor het verschil ontstaat tussen 2 of 3 tonen.
Als het donker is, wordt het volume van de gong automatisch zachter gezet, voor de nachtrust van met name de huisdieren.
Ook dit verschil wordt geregeld door een uitgang van een 74HC595 schuifregister.

De LDR die de lichtsterkte in de kamer meet, zit aangesloten op de PIC in de hal, de DCF77 klok met gong zit aan de PIC in de keuken.
Elk half uur, vlak voordat de gong moet gaan, zendt de PIC in de keuken een opdrachtcode over de bus die de betekenis "request waarde LDR kamer" heeft.
Alle PIC's ontvangen via de bus de code "request waarde LDR kamer", maar alleen de PIC in de hal doet er wat mee, namelijk de actuele waarde van de LDR die in de kamer zit terugzenden over de bus.
De PIC in de keuken weet nu of het de gong zachtjes of met luid volume moet laten klinken.
Wanneer de LDR in de kamer meet dat het donker is in de woonkamer (dus ook geen schemerlampen aan), zal de gong 's avonds automatisch zachter klinken als de mensen naar bed zijn gegaan.

Lees verderop waarom er naast een klok IC ook nog een DCF77 PIC zit.
 


Modulerende kamerthermostaat

DCF77 antenne en DS1820 temperatuursensor buiten op het kozijn.
 
De buitentemperatuur wordt elke seconde gemeten met een DS1820 die naast de DCF77 ontvanger in een kunststofkastje buiten op het kozijn is gemonteerd (zie foto).
Deze temperatuur is drie van de vier seconden af te lezen op het display.
Elke vierde seconde wordt op deze plek de ingestelde temperatuur van de Nefit kamerthermostaat getoond.

Een goedkope modulerende kamerthermostaat van Nefit (iets aangepast, zie dit project) van de verwarming kan worden bedient door elke PIC.
Dat betekent dat alle sensoren, tijden en afstandsbedieningen invloed kunnen hebben op de thermostaatinstelling.
Allereerst is de thermostaat in te stellen op elke DCF77 tijd, dag en datum, met een daarbij behorende temperatuur.
De thermostaat is ook met de Pronto Neo TV afstandsbediening in te stellen op een temperatuur van 15°C (verwarming laag) en tussen 18,5°C t/m 22,5°C (dit is naar wens nog hoger of lager te maken, maar voor mijzelf afdoende).
Ook via telefoon is de verwarming in te stellen of te annuleren zodat de verwarming die dag juist niet aangaat op een vooraf ingestelde tijd (een collega vraagt je op het werk of je nog een pilsje komt drinken, dus je kunt naar het huis bellen dat de verwarming die dag niet aan hoeft te gaan).

Met een toets in de slaapkamer naast het bed is de kamerthermostaat te togglen tussen 15°C en 19°C.
Zodoende is de verwarming in de woonkamer vanuit bed aan- of uit te zetten.
Als de Nefit thermostaat 19°C of hoger staat ingesteld, gaat er een LED branden boven deze toets.
Bovendien wordt de verwarming automatisch lager (15°C) gezet als er een persoon in bed stapt, dit om te voorkomen dat 's avonds wordt vergeten de verwarming lager te zetten (het matras moet dan minimaal 20 seconden een persoon opmerken).
 


Infrarood bewegingssensoren
Als de bewegingssensor in de hal een persoon opmerkt, dan moet even later de bewegingssensor in de kamer ook een persoon opmerken (de situatie is zo bij me thuis).
Gebeurt dat niet, dan wordt er van uitgegaan dat de persoon de voordeur is uitgelopen (als extra controle krijgt de voordeur nog een reedcontact die aan de PIC in de hal doorgeeft of de voordeur open is).
Wordt nu binnen een kwartier geen persoon waargenomen door de bewegingssensor in huis, dan wordt de kamerthermostaat automatisch lager (15°C) gezet (ik heb geen achterdeur, alleen de voordeur is toegang tot het huis).

Als de LDR buiten donker meet, en de bewegingssensor in de hal merkt een persoon op, dan wordt de lamp in de hal langzaam (in zo'n 4 seconden) van 0% naar 100% omhoog gedimd.
Loopt de persoon door, de woonkamer binnen, en de LDR in de woonkamer meet dat er geen schemerlampen branden (het is donker in de kamer), dan zal de lamp boven de achtertafel ook automatisch langzaam omhoog dimmen tot zo'n 65% helderheid en na zo'n 30 seconden heel langzaam weer doven.
De lamp in de hal dooft ook langzaam als de bewegingssensor geen persoon meer opmerkt in de hal.
Brandt de lamp in de hal echter niet, dan zal de lamp boven de achtertafel ook niet automatisch aan gaan.
Als er 's nachts stiekem naar de koelkast wordt gelopen voor een versnapering, dan blijft het donker, ook al neemt de bewegingssensor een persoon waar en ook al meet de LDR dat het donker in de kamer is.

Dit stukje programmacode zorgt er overigens ook voor dat er een gong klinkt als er nieuwe telefoonnummers op de nummermelder staan.
Zodoende zal er eenmalig een gong gaan bij thuiskomst als teken dat iemand naar de huistelefoon heeft gebeld en het telefoonnummer bekeken kan worden.

Onafhankelijk van de bewegingssensor en LDR in de hal, gaat de lamp in de hal ook branden als de kastdeur van de bergkast in de hal wordt geopend.
Ook dit gebeurt weer vloeiend; kastdeur open = lamp dimt omhoog in 2 seconden naar 100%, kastdeur weer dicht  = lamp dimt omlaag in zo'n 4 seconden naar uit.
Is de kastdeur niet (goed) gesloten dan zal de 230V lamp door de PIC na zo'n 5 minuten alsnog uit worden gezet.
Verder is de lamp in de hal vanuit de kamer met de TV afstandsbediening op een gewenste dimstand in te stellen (sfeerlicht).
Het zit nog in de planning dat als de ouderwetse W65 wandtelefoon in de hal is opgenomen, dat het licht dan automatisch aan gaat als de LDR in de hal meet dat het donker is.

De zojuist beschreven automatische lamp boven de achtertafel heeft ook nog iets extra's.
In de kamer bij de achtertafel in de buurt zit een potmeter die door de PIC in de hal continu gemeten wordt.
Meet de PIC dat er aan de potmeter gedraaid wordt dan zal de lamp meteen gaan branden op de instelling van de potmeter.
Met de afstandsbediening is de lamp echter óók te dimmen.
Zodra de PIC een dimopdracht via de afstandsbediening (over de bus) binnen krijgt, kijkt het niet meer naar de stand van de potmeter maar dimt up/down op commando van de afstandsbediening.
Een korte druk op de dimtoets 'Achtertafel' van de Pronto Neo afstandsbediening zal de lamp uitzetten, opnieuw kort drukken zal de lamp weer doen branden op het laatste dimniveau.
Lang ingedrukt houden zal om en om omhoog en omlaag dimmen.
Bij een draai aan de potmeter zal de lamp weer onmiddellijk het niveau van de potmeter aannemen.
De lamp gaat uit als de potmeter helemaal linksom of helemaal rechtsom in de hoek wordt gedraaid, bediening per afstandsbediening blijft ook daarna gewoon mogelijk.
 


Automatische klapramen

Gemotoriseerde klapraam.
 
Er zijn vier gemotoriseerde klapramen in huis, te weten woonkamer, keuken, slaapkamer en werkkamer.
Als 's avonds automatisch de klapramen in kamer en keuken moeten sluiten, dan wordt dit alleen gedaan als het buiten om 19:00 koeler is dan 18°C (dit zal later nog verfijnd worden in combinatie met de binnentemperatuur).
's Morgens gaan de ramen van woonkamer en keuken automatisch weer open, behalve op 31 december (i.v.m. vuurwerk).
Is het buiten behoorlijk koud (vriezen), dan worden de ramen na een half uur alweer automatisch gesloten.
Wordt de Nefit verwarmingsthermostaat hoger gezet (automatisch of door handbediening), dan sluiten kamer- en keukenraam zich ook automatisch.
Andersom geldt, als het raam van de woonkamer wordt geopend, dan zal de Nefit verwarmingsthermostaat automatisch lager (15°C) worden gezet.

Alle ramen zijn afzonderlijk te bedienen met de Pronto Neo afstandsbediening.
Via telefoon zijn op afstand met één opdracht alle ramen in één keer te sluiten, alle automatische opdrachten voor het openen van ramen zijn dan voor die dag geannuleerd (annulering wordt automatisch om 04:00 's nachts opgeheven, annuleringen zijn op zich ook weer met één enkele opdracht op te heffen).
Als de windsnelheidsmeter op het dak een te harde windkracht meet, dan wordt het raam van de woonkamer automatisch gesloten, omdat kamer en keukenraam tegen elkaar open staan, zou het gaan waaien in huis.
Het slaapkamerraam heeft ook nog een extra (zie hieronder bij Auping matras).
 


Sensor in Auping matras
De PIC in de slaapkamer weet of er iemand in bed ligt omdat er met behulp van een optocoupler een signaal is afgetapt van een sensor dat al in het Auping matras aanwezig is (climat control, matras met verwarming).
Donderdags komt de vuilnisophaler tussen 8:00 en 10:00 met veel kabaal de straat in om de ondergrondse containers te legen.
Als er nu iemand in bed ligt, dan wordt (alleen donderdags dus) tussen 8:00 en 10:00 het slaapkamerraam automatisch gesloten i.v.m. het lawaai.
Meet de PIC geen persoon, dan blijft het slaapkamerraam gewoon open.
De raam in de slaapkamer is ook met een toets op een kastje naast het bed te bedienen (toggle tussen openen en sluiten).

Een nachtlampje in de vorm van een groene 10mm LED gaat meteen branden als een persoon uit bed stapt.
Zodra er weer in bed wordt gestapt gaat het nachtlampje na zo'n 20 seconden automatisch weer uit.
Als de persoon na een half uur niet terugkeert in bed, zal het nachtlampje alsnog doven.

Op het display in huis is af te lezen hoe laat er in bed is gestapt en hoe laat uit bed.
Aan de hand van deze gegevens kan weer worden afgeleid of de persoon een vroege of late dienst moet werken (persoon vóór 06:00 uur uit bed, dan kan de PIC aannemen dat de persoon ochtenddienst heeft) en aan de hand daarvan een ander dagprogramma afdraaien dan als de persoon avonddienst heeft.
Zo is het mogelijk om bijvoorbeeld de klapramen pas te openen als de persoon niet thuis is en de verwarming 's middags of 's avonds, afhankelijk van de werkdienst die de persoon heeft, automatisch aan te zetten, afhankelijk van hoe laat die ochtend uit bed is gestapt.
De tijd van in bed stappen wordt doorgegeven als een persoon minimaal 20 seconden in bed ligt.
Het uit bed stappen wordt pas doorgegeven als de persoon minimaal een half uur uit bed is, in verband met een eventuele nachtelijke boodschap aan het toilet.

Zodra in bed wordt gestapt wordt ook de verwarming automatisch lager gezet, als dat nog niet was gebeurd door DCF77 tijd of afstandsbediening (zie het deel over de Nefit thermostaat).
 


Wekkers
De PIC van de slaapkamer stuurt op een ingestelde tijd een luidspreker met gonggeluid aan (zie cursus deel 7) als het tijd is om op te staan.
Er is geen "alarm uit" toets.
De PIC laat het gonggeluid 3 maal afgaan met een zacht volume.
Meet de sensor na 5 minuten nog steeds een persoon in bed, dan gaat het wekkeralarm opnieuw af, maar nu van geluidloos naar gongs met een steeds luider volume en gaat pas uit als de persoon uit bed is gestapt.
Als de persoon tóch blijft liggen, dan gaat het gonggeluid na 60 gongs uit en blijft uit.
De tijd is natuurlijk DCF77, deze laat de gong niet afgaan op zaterdag en zondag.

Een snipperdag of overwerk op zaterdag moet via de Pronto Neo even gemeld worden aan het huis.
Als de master PIC 18F452 vanuit de slaapkamer doorkrijgt dat er een persoon in bed stapt, dan zal het kijken of 'Snipperdag' geactiveerd is en is dat het geval, dan wordt opdracht 'SnipperAlarm' over de bus teruggestuurd waardoor de PIC in de slaapkamer een seconde lang een pieptoon laat horen om de persoon in bed eraan te herinneren dat 'Snipperdag' (nog steeds) geactiveerd is en dus morgenvroeg de wekker niet af zal gaan.
Het instellen van de wektijd(en) gebeurt met een virtueel numeriek toetsenbord op de Pronto Neo afstandsbediening.

De luidspreker in de slaapkamer heeft nog meer functies.
Hij laat namelijk ook een piep horen als het bad vol is (het bad is ook te vullen vanuit de slaapkamer) en er komt ook een ringtoontje als de oude W65 telefoon in de hal rinkelt (de bel van deze telefoon is in de slaapkamer niet te horen).
Overigens gaat ook de ding-dong deurbel in de woonkamer als deze telefoon in de hal overgaat.
Het telefoonbelsignaal hiervoor komt niet van de W65, maar van de telefoonprint.
Zodra deze opmerkt dat er een belsignaal binnenkomt, stuurt deze de opdracht "TelefoonGaat" over de bus.
Hierop reageert de PIC in de hal door de deurbel over te laten gaan en de PIC in de slaapkamer reageert op dezelfde opdracht door een ringtone over de luidspreker te geven die snel in volume aanzwelt (als het telefoonnummer tenminste van een familielid is, zie verderop).
Zodra uit bed gestapt wordt, stopt de ringtone.

Naast de normale wekkers is er een dutwekker, een wekker die je wekt na een dutje en die je instelt met de afstandsbediening met 5 toetsen: +1 min, +5 min, +15 min, +30 min en +60 min.
Zo kan heel snel een tijd ingesteld worden.
Tijdens het instellen wordt op het huisdisplay het totaal aantal dutminuten getoond, maar ook meteen de eindtijd berekend dat de dutwekker af zal gaan.
De dutwekker kan tot maximaal 20 uur ingesteld worden en telt per minuut terug.
Te zien op het huisdisplay is hoeveel minuten er nog moeten voor de wekker gaat, als ware het een eierwekker.
Voor als het dutje op de bank in de woonkamer wordt gedaan, zal de buzzer in de woonkamer 5 maal een pieptoon laten horen als de duttijd voorbij is.
Over de bus wordt tevens de opdracht "Wekker" gestuurd, waardoor de PIC in de slaapkamer de wekker aldaar af laat gaan volgens zijn standaard procedure, zoals hierboven beschreven bij "sensor in Auping matras".
Zolang de dutwekker loopt, is de gong die op de hele- en halve uren klinkt, op zacht volume gezet.
 


Deurbelknop
Zelfs de deurbelknop zit op de bus aangesloten.
Opdringerig bellen kan nu niet meer.
Zodra de PIC een signaal van de deurbelknop krijgt zal het de deurbel zelf tweemaal rustig na elkaar aansturen (ding-dong...ding-dong), ondertussen laat de PIC een timer lopen die ervoor zorgt dat de komende 15 seconden de belknop niet werkt.
De persoon kan zo veel op de knop drukken als ie wil, de deurbel zwijgt de eerste 15 seconden.

Om aan bezoekers te kunnen tonen dat gekke combinaties mogelijk zijn, kan ik de bus in demonstratie modus zetten (op het display verschijnt ==DEMO MODE== ).
Een onderdeel hiervan is dat door een druk op de belknop het keukenraam opent of sluit, nogmaals drukken zal het slaapkamerraam openen of sluiten, daarna weer het keukenraam sluiten of openen, enzovoort.
De demo-mode schakelt zichzelf na een halfuur weer uit, zodat dit niet vergeten wordt.
 


Luxaflex
Normaal staat de luxaflex op automatisch, wat betekent dat de luxaflex open en dicht gaat afhankelijk met of het buiten licht of donker is (meting met LDR).
Met behulp van een 2-kleuren LED kan ik zien of de luxaflex op automatisch (groen) of op handbediening (rood) staat.
In de zomerstand gaat de luxaflex dicht als het buiten extreem licht is (veel zon dus) en open bij bewolkt weer en 's nachts.
In de winterstand gaat de luxaflex dicht als het donker begint te worden en open als het buiten weer licht wordt.
Mocht het echter grauw weer zijn dan kon het nog wel eens tot zo'n 10:30 duren voordat de luxaflex een keer open gingen.
De PIC houdt daarom sinds kort ook de tijd in de gaten, mocht de luxaflex nu na 9:00 's ochtends nog steeds gesloten zijn, dan stuurt de PIC de luxaflex alsnog open, ongeacht de lichtsterkte die de LDR meet.
Dat gaat simpel door om 9:00 uur te checken of de luxaflex al open is, zoniet, dan opdracht luxaflex openen.
's Avonds sluit de luxaflex automatisch als het donker is.

Als er nu op de gereserveerde toets van de Pronto Neo afstandsbediening wordt gedrukt dan schakelt de luxaflex naar handbediening.
Door de toets van de afstandsbediening ingedrukt te houden gaat de luxaflex steeds verder open en stopt als de toets wordt losgelaten.
Steeds als er weer op de toets wordt gedrukt gaat de luxaflex verder open, zodoende kan de luxaflex ook "half" worden open gezet.
Van helemaal dicht naar helemaal open heeft een bepaalde tijd.
De tijd dat de toets van de afstandsbediening is ingedrukt wordt gemeten en zorgt ervoor dat als de luxaflex helemaal geopend is, dat de motor stopt, ook al is de toets nog steeds ingedrukt.
Wordt de toets dan losgelaten en opnieuw weer ingedrukt dan schakelt de luxaflex weer naar automatische mode en gaat de luxaflex met volle kracht (6VDC) dicht als de LDR het aan geeft.
 


Luxaflex opent en sluit automatisch.
 

Overigens zit er een hysteresis van zowel helderheid als tijd (een kwartier) in de LDR zodat niet bij lichtbewolkt weer de luxaflex de hele dag open en dicht gaat.

Meer info hierover zie het luxaflex project
 


Screens

De bij de screen meegeleverde knop, die bij mij niet gemonteerd is.
 
De ramen van de woonkamer zijn voorzien van een elektrisch buitenzonnescherm, meestal screens genoemd.
Er wordt daar een schakelaar bijgeleverd (zie foto rechts) zodat de screen met de hand omhoog of omlaag kan worden bewogen, maar deze heb ik natuurlijk niet gemonteerd.
De screen krijgt bij mij zijn opdrachten van de bus, zodat alles invloed kan hebben op de screen.
Zo kan de screen bijvoorbeeld automatisch omlaag gaan als de PIC via de LDR meet dat de zonneschijn zeer groot is, en automatisch omhoog bij regen of veel wind.
En door commando's van de Pronto Neo TV afstandsbediening of via telefoon.

De screen kan niet langs het klapraam als deze open staat en ook komt de screen tegen de buitendeur als deze open staat.
Maar nu de screen op de bus zit aangesloten, is dit niet zo'n probleem meer.

Als via de telefoon of met de Pronto Neo afstandsbediening op "Screen omlaag" wordt gedrukt, dan kijkt de bus eerst of het klapraam open staat en zo ja, dan zal de bus eerst het klapraam sluiten en dan pas de screen laten zakken.
Mocht nu ook de buitendeur open staan dan zakt de screen tot nét boven de buitendeur.
Dit wordt bereikt doordat de PIC inwendig een teller mee laat lopen die optelt als de screen naar beneden gaat en terugtelt als de screen naar boven beweegt.
Zo is de positie van de screen verdeelt in 2200 stukjes (tellerstanden).
Als de teller nu groter dan tellerstand 275 is, dan controleert de bus of de buitendeur gesloten is, zo niet, dan stoppen met screen zakken.
En zolang de tellerstand groter is dan 275 wil de screen niet omhoog of omlaag, de buitendeur zal dus eerst gesloten moeten worden.
Mocht de screen al voorbij dit punt zijn en wordt de buitendeur dán pas geopend, dan zal de screen onmiddellijk stoppen.

Dezelfde tellerstand wordt ook gebruikt voor het klapraam.
Zolang de teller groter is dan 0 bevindt de screen zich dus niet bovenin en kan het klapraam niet geopend worden, niet handmatig en niet via automatische opdrachten.


De screen kan niet langs een geopend klapraam.

De screen stopt nét boven de deur als deze open staat.
 

Wordt via de bus de opdracht "Beamer aan" verzonden, dan doet de betreffende PIC via de bus een lichtmeting met de LDR die op het zuiden staat.
Is het nog niet echt donker buiten, dan wordt automatisch het commando "Screen omlaag" over de bus verzonden (die op zijn beurt dus weer het klapraam kan sluiten en gaat kijken of de buitendeur gesloten is).
Verder beweegt op het "beamer aan" commando de poster naar de zijkant van de muur zodat een witte muur ontstaat, gaat de spiegel open (voor reflectie van het beamerbeeld) en wordt natuurlijk de beamer zelf aangezet (afijn, zie hier meer info).
 


Huisbediening per telefoon
Alles wat op de bus in het huis is aangesloten is te bedienen op afstand met een (mobiele) telefoon.
Dit wordt gedaan met behulp van de telefoonprint, die de driecijferige opdrachtcodes rechtstreeks kan doorsturen naar de bus.
Hiervoor moet na een pincode, op de # toets worden gedrukt.
Een korte pieptoon zal door de bellende telefoon klinken en de telefoonprint zal nu het intoetsen van de opdrachtcode verwachten.
Op deze manier is alles te bedienen, van verlichting tot ramen afzonderlijk, van luxaflex tot transistorradio, van een bepaalde temperatuursinstelling voor de Nefit thermostaat tot inschakelen van de slaapkamer airconditioning.
De drie meest gebruikte telefoon functies hebben een enkele toets (0 en 1, voor het bad vullen of annuleren, 2 en 3 voor verwarming hoog of laag, en toets 4 om de ramen te sluiten) zie tabel hieronder:

Toets Functie
0 Annuleer automatisch badvullen voor deze dag, stop eventuele bezig zijnde vullen
1 Bad vullen
2 Annuleer automatisch verwarming hoger voor deze dag, zet verwarming op 15°C
3 Verwarming op 19°C
4 Annuleer automatisch ramen openen voor deze dag, sluit openstaande ramen
... 9 Vrij voor toekomstig gebruik
# Toets om hierna rechtstreeks een driecijferig huis opdrachtcode in te toetsen
* Verbreek verbinding (de telefoonprint zal de verbinding verbreken)

Het huis zal (via de telefoonprint) zelf een vooraf opgegeven (mobiel) nummer opbellen als een waterlekkage sensor (in badkamer of keuken) nattigheid voelt en een alarmsignaal laten klinken aan het gebelde nummer (en tevens de hoofdwaterkraan dichtdraaien).
Eventueel is er in combinatie met de bewegingssensoren ook een stil alarm te maken die het mobiele nummer belt bij onraad.
Door een ander soort sirene naar de mobiele telefoon te zenden is uit te maken of het een inbraak- of waterlekkage alarm is.

Pincode
Om via de telefoon het huis te kunnen bedienen moet eerst een pincode op het toetsenbord van de telefoon worden ingevoerd.
De 4-cijferige pincode is mede afhankelijk van de DCF77 tijd en datum, dus deze veranderd steeds.
Als er iemand opbelt, dan vraagt de telefoonprint de datum en tijd op via de bus en rekent uit wat de pincode voor dat moment moet zijn.

Zo is het bijvoorbeeld te maken dat de eerste twee cijfers van de pincode gelijk is aan het hele uur van dat moment, maal 2, plus 3, en de tweede twee cijfers de dagdatum, min 1.
Stel dat het 31 augustus 20:15 uur is.
De pincode is dan 4330, een uur later is ie veranderd in 4530, enzovoort.
Een dag later is de pincode rond dezelfde tijd 4300.
Niet té ingewikkeld maken, want dat werkt lastig (dit voorbeeld vraagt al enig denkwerk).
Is de pincode driemaal fout, dan verbreekt de telefoonprint de verbinding.

Meer info hierover zie het universele telefoonprint project
 


FSK nummermelder
Ook de losse nummermelder is in de afvalemmer beland.
Een eigen gebouwde FSK nummermelder is sinds kort toegevoegd aan het huis waardoor diverse mogelijkheden weer te bedenken zijn.

Zodra de telefoon gaat, wordt het telefoonnummer direct op het huisdisplay getoond, op de plaats van waar normaal wisselend de temperatuur van de kamer en de keuken staan.
Na 100 seconden wordt de temperatuur weer getoond en zal een knipperend telefoon-symbool aangeven dat er één of meerdere nieuwe telefoonnummer(s) in het nummermelder geheugen aanwezig zijn.
Met de Pronto Neo afstandsbediening is nu door de aanwezige telefoonnummers van de nummermelder te "bladeren" en kan hiermee desgewenst het telefoonnummer ook weer uit het geheugen gewist worden.
Op het display is in het nummermelder-menu te zien hoeveel telefoonnummers er aanwezig zijn, bij welk telefoonnummer je op dat moment bent, of het een nieuw telefoonnummer is en - als het bekend is in de 24C512 EEPROM - de naam die bij het telefoonnummer hoort.


Heerlijk lelijk, zo'n oude W65.
In schril contrast met het automatische huis.
Zie dit project

 

Maar nu het mooie.
Omdat de nummermelder nu is geïntegreerd in het huis, kunnen er met de telefoonnummers allerlei acties worden gedaan.
Als ik bijvoorbeeld met mijn eigen mobiel naar huis bel, ziet het huis meteen aan het telefoonnummer dat ik het ben en hoeft er bijvoorbeeld geen pincode te worden ingetoetst, of misschien alleen een simpele, het is maar hoe je het maakt.

En afhankelijk van het telefoonnummer laat ik de deurbel meebellen op diverse ding-dong manieren.
Bij familie laat ik de deurbel heel snel ding-dong-ding-dong-ding-dong bellen, bij een telefoonnummer van het werk 1x langzaam ding...dong en een snelle ding-dong er meteen achteraan.
Zo weet ik al, nog voordat ik op het huisdisplay heb gekeken, of er een familielid belt, iemand van het werk of totaal iemand anders.
Om het verschil te kunnen weten dat óf de telefoon gaat, óf dat er iemand aan de deur staat te bellen, zal in het geval van de deurbel door de PIC in de hal 2x een rustige ding-dong worden gegeven.

Alleen bij een telefoonnummer van familie of het werk gaat ook een ringtoon in de slaapkamer (opgewekt met PWM door de PIC die ook de gong van de wekker door dezelfde luidspreker laat klinken).
En ook dát kan weer uitgesplitst worden.
Bij telefoon van familie mag deze ringtoon altijd gaan, bij telefoon van het werk alleen overdag na 07:00 (verslapen?, al kan dat haast niet in dit automatisch huis, zie Auping sensor).
En bij alle andere telefoonnummers gaat de ringtoon gewoon niet (laat maar bellen, de W65 telefoon zelf is niet hoorbaar in de slaapkamer).

Krijg ik een Privé nummer of nummer onbekend, dan wil ik niet eens wéten wie er belt.
Vaak lastige vragen van enquêtes en dergelijke.
Wat kunnen we hiermee doen?
Allereerst hoef ik zelf niet te weten dat de telefoon gaat, dus de deurbel blijft uit.
De telefoon wordt echter wel aangenomen, niet door mij, maar door het huis zelf.
Dit gebeurt doordat de universele telefoonprint van de master PIC de opdracht krijgt de telefoon meteen op te nemen en hierna een hinderlijke pieptoon naar de onbekende beller te sturen, net zo lang tot deze ophangt.
Dat zal ze leren!

Wat is nog meer mogelijk met de nu geïntegreerde nummermelder?
Bij thuiskomst merken de infrarood sensoren me op.
Als er nu gebeld is terwijl ik niet thuis was, laat het huis dit weten door een kort buzzerpiepje bij binnenkomen van de woonkamer.
Hierdoor weet ik dat er voor me gebeld is en er even in het nummermelder-menu moet worden gekeken wie er gebeld heeft.

De FSK nummermelder zal hier als los project verschijnen zodra ik tijd heb om het te documenteren en uit te werken.
 


Badkamer
De automatische badkamer is al meer dan 10 jaar geautomatiseerd en was mijn allereerste microcontroller project, uitgevoerd met een BS2e Basic Stamp.
De Basic Stamp regelt het volgende in de badkamer:

- Het bad is te vullen resp. te stoppen door de Pronto Neo TV afstandsbediening vanuit woonkamer of keuken, door DCF77 ingestelde dag/datum/tijd, telefonisch op afstand, vanuit de slaapkamer en in de badkamer zelf natuurlijk (zie foto waterdicht paneel).
- Het automatisch bad vullen door een ingestelde (DCF77) tijd is telefonisch te annuleren.
- De badstop afvoer sluit zichzelf automatisch na een paar seconden als het bad zich vult met water.
Wordt er binnen die tijd (dus vóór dat de badstop afvoer zich sluit) op toets 'legen' gedrukt, dan sluit de badstop zich niet (het bad kan afgespoeld worden).
In dit geval stopt de kraan automatisch na 30 seconden.
Het openen/sluiten van de badstop wordt gedaan door een 12VDC RB35 motor welke ook is te bedienen met de toets 'legen'.
- Als het bad vullen minimaal 5 minuten bezig is, dan gaat het mechanische ventilatiesysteem van de woning op maximale ventilatie draaien.
Maar eventjes de badkraan gebruiken heeft dus geen invloed op het ventilatiesysteem in huis.
Na het leeg lopen van het bad draait het ventilatiesysteem nog zo'n 20 minuten door op maximale snelheid, daarna weer op normale snelheid.
Tevens schakelt het hele Basic Stamp systeem zichzelf dan uit (spanningsloos).
- Het ventilatiesysteem is niet handmatig uit te schakelen tijdens vullen of als er water in het bad aanwezig is, behalve als de elektrische badkamer verwarming wordt ingeschakeld.
In dat geval wordt na 10 seconden de luchtverversing stopgezet, anders zou de warmte meteen worden afgevoerd.
- De elektrische badkamerverwarming schakelt zichzelf na 5 minuten uit, als dit niet eerder handmatig is gedaan.
Nadat de elektrische verwarming is uitgezet, schakelt het ventilatiesysteem zich na 10 minuten weer in (maar is handmatig eventueel eerder in te schakelen).
- Het bad vullen stopt automatisch op een vooraf ingesteld niveau door een QT114 sensor, die het waterniveau meet.
In de woonkamer klinkt 3× een lange pieptoon, ten teken dat het bad gereed is.
Komt dit signaal van de QT114 sensor niet binnen een bepaalde tijd, dan zal het bad vullen alsnog worden gestopt.
In de woonkamer zal dan 5× een korte pieptoon klinken, ten teken dat er tijdens het bad vullen iets niet goed verloopt.
- Als de water temperatuur te hoog is (gemeten met een 8-pins DS1620, geplakt aan de buitenkant van het bad), dan wordt het bad vullen ook gestopt en klinkt in de woonkamer 10× een korte pieptoon .
Waarschijnlijk staat de thermostaatkraan op een te hoge temperatuur ingesteld.
De temperatuur aan de buitenkant van het bad is natuurlijk lager dan het water zelf.
Het Basic programma rekent het echter weer terug tot de werkelijke watertemperatuur (geijkt).
Wel belangrijk bleek om de DS1620 sensor te omhullen met glaswol (= isolatie materiaal), anders wijkt de temperatuur 's winters af, omdat dan de omgevingstemperatuur in de badkamer lager is.
- Op het bedieningspaneel wordt de watertemperatuur weergegeven in de vorm van een LED dotbar.
De schaal naast de zeven LED's is <36°C, 36°C, 37°C, 38°C, 39°C, 40°C, >40°C.
Als de watertemperatuur warmer is dan 40°C, dan knippert de bovenste >40°C LED en stopt het automatische vullen.
In de woonkamer gaat dan 10× een korte pieptoon, ten teken dat het badwater te heet is.
De kraan is hierna wél weer opnieuw in te schakelen, anders zou je geen koud water kunnen bijvullen.
- Water bijvullen kan, ook als de QT114 sensor meet dat het bad vol is.
Echter wordt in dat geval na 2,5 minuut het vullen automatisch gestopt (als al niet eerder met de hand wordt uitgeschakeld).
Dit is gedaan omdat meestal heet water wordt bijgevuld om de temperatuur van het water weer wat hoger te maken.
Mocht je nu in slaap vallen, dan zou je het risico lopen om door kokend heet water "bedwelmd" te raken.
Nu niet, omdat het bijvullen na 2,5 minuut automatisch stopt.
- De whirlpool (hydro), het bubbelbad (aëro) en de twee (dimbare) halogeen onderwaterspots in het ligbad, zijn alleen in te schakelen als de QT114 sensor meet dat het bad gevuld is met water en gaan automatisch uit als het water in het bad zakt onder een bepaald niveau.
De hydro motor mag namelijk niet draaien als er geen water door de pomp loopt en de 12V/50W spots moeten door het badwater gekoeld worden.
- De 230V motor van de whirlpool is traploos in snelheid te regelen.
Via een DAC geeft de Basic Stamp een spanning van 0 ... 10 volt aan een kleine frequentieregelaar door.
Een deel van het programma van deze besturing wordt beschreven in cursus deel 7.
- Op de TL verlichting (onder het bad) na, is alle verlichting in de badkamer te dimmen (4 dimmer groepen).
Als default worden bij lichtschakelaar aan, alleen de halogeenspots boven ligbad en wastafel opgestart.
Zit er geen water in het ligbad, dan wordt de verlichting al na 10 minuten automatisch uitgezet (bij vergeten uit te doen) en klinkt er een kort piepje in de woonkamer.
Zit er wél water in het bad, dan is deze tijd maarliefst 5 uur.
Deze tijden worden steeds weer op maximaal gezet als er op een willekeurige toets van het waterdichte paneel wordt gedrukt.
- Mocht de badstop dicht zitten dan opent deze automatisch als de lichtschakelaar van de badkamer wordt aangezet, maar doet dat niet als het bad bezig is met vullen of als het bad vol is.
- Als de lichtschakelaar wordt aangezet én er zit water in het bad of het bad is bezig met vullen, dan worden automatisch de luidsprekers ingeschakeld aan de versterker in de woonkamer.
Wordt de lichtschakelaar uitgezet, dan worden de luidsprekers weer afgeschakeld.
Met toets 'Audio' is het in- en uitschakelen van de luidsprekers handmatig te doen.
Audio is niet in te schakelen als de lichtschakelaar uit is.
- De volume wordt geregeld door een groot formaat stereo potmeter die met een motor verbonden is.
Telkens als er op de 'volume' toets wordt gedrukt zal de motor een andere kant opdraaien.
Zo is er te "togglen" tussen volume harder en zachter met maar één toets, zie ook cursus deel 8.
- De 'audio' toets is tevens testknop.
Bij gelijktijdig indrukken met de ligbaddimmer-toets, is de halogeen onderwater verlichting aan te zetten, ook als er geen water in het bad zit.
Bij gelijktijdig indrukken met de hydro-toets, zal de 230V motor van de bubbeljets langzaam gaan draaien, ook als er geen water in het bad zit.
- Achter de spiegel zit een verwarmingsspiraal die voorkomt dat de spiegel met damp beslaat.
Deze spiegelverwarming gaat pas aan als het bad leeg loopt (klaar met bad nemen).
Het bad moet dus eerst vol zijn geweest, daarna zowel de QT114 sensor meten dat het bad niet vol meer is én moet de badstopafvoer geopend zijn.
De spiegelverwarming gaat weer uit zodra de lichtschakelaar van de badkamer uit wordt gezet.
Bij normaal gebruik van de badkamer zonder een bad te nemen blijft de spiegelverwarming dus uit.
- De besturing van de badkamer neemt in stand-by stand 0 Watt op (energie zuinig).

De Basic Stamp taal is vrijwel identiek aan die van PIC Basic, alleen is PIC Basic veel en veel uitgebreider.

Het waterdichte bedieningspaneel is de bodem van een kunststof bimbox.
Hierin zijn gaten geboord voor de folietoetsen en LED's.
Elke folietoets steekt zo'n 0,2mm boven het oppervlak uit.
Daaroverheen is wit, bedrukt stickerpapier opgeplakt, met daar weer overheen transparantfolie voor de watervastheid.
De rode LED's schijnen door het witte stickerpapier heen.
Het zit er al meer dan 10 jaar en nog steeds geen slijtageplekken.
 


Ventielen en leidingen onder de wastafel.
Normaal niet zichtbaar.
Op de vloer zit een watersensor, die bij lekkage een melding op de bus geeft waardoor de PIC in de hal de hoofdwaterkraan zal dichtdraaien.

 

De thermostaatkraan staat altijd open en is ingesteld op een aangename temperatuur rond 37°C.
Vóór de thermostaatkraan zitten twee wasmachine ventielen (voor warm en koud water) met 12VDC spoelen (zie foto) die door de besturing worden aangestuurd.
 

De schakeling neemt stand-by 0 Watt op.
Met behulp van een korte hulpspanningspuls van de databus, wordt het systeem ingeschakeld.
Een solid state relais, aangestuurd door de Basic Stamp zelf, fungeert hier als overneemcontact, die de voeding van de Basic Stamp zelf inschakelt na de korte puls.
De Basic Stamp schakelt zijn eigen voeding weer uit als de lichtknop (buiten de badkamer) van aan naar uit wordt gezet, behalve als de kraan loopt of als er water in het bad aanwezig is.
Maar ook als er 5 uur lang geen toetsindruk op het bedieningspaneel is vernomen, schakelt de Basic Stamp zichzelf uit, ongeacht of er wel of geen water in bad zit.
 


Als het badwater aan de andere zijde van de opgeplakte printstrook dezelfde hoogte bereikt, stopt het vullen.
(Slangen zijn van het bubbelbad).

 
Zowel de DS1620 watertemperatuurmeter, als de voeler voor de QT114 (waterniveau meting) zitten aan de buitenkant van het bad geplakt, onzichtbaar van buitenaf.
De waterniveauvoeler voor de QT114 is niets anders dan een strook ongeëtste printplaat (100 × 5mm) met daaraan een dun soepel draadje gesoldeerd die naar pin 7 van de QT114 loopt.
Deze printstrook is eerst met een föhn goed warm gemaakt, meteen daarna aan de ongeëtste koperzijde vol met hotmelt gesmeerd en daarna direct tegen de buitenkant van het ligbad geplakt (even 1 minuut vast houden).
Zodra het waterniveau in bad tijdens vullen op gelijke hoogte komt als de opgeplakte print aan de buitenkant van het bad (contactloos dus), geeft de QT114 een signaal aan de Basic Stamp, die op zijn beurt de ventielen uit zet en een seintje in woon- en slaapkamer geeft.

De werking berust op verandering van capaciteit door het badwater aan de andere kant van de voeler en heeft veel overeenkomsten met de houten aanraaksensor van het automatisch handdoekrek en de automatische theezetter, welke gebaseerd zijn op een QT110.
 

Download datasheet QT114
 


Vloerverwarming

8

  In de keuken bevindt zich onder het laminaat een elektrische (230V) verwarming dat via een solid state relais op de bus is aangesloten.
Hierdoor heeft ook de vloerverwarming beschikking over alle sensoren, afstandsbedieningen, data en tijd van het huis.

Zo kan bijvoorbeeld via infrarood, Bluetooth of Wifi afstandsbedieningen de vloerverwarming worden ingeschakeld, waarna het na een aantal uur weer automatisch uitschakelt.

Ander voorbeeld, een vast ritueel is om zaterdag 's morgens af te wassen?
De vloer kan "kijken" hoe laat en welke dag het is, of het koud is (zomers graag géén vloerverwarming) en, als de persoon nog in bed ligt (Auping sensor), het verwarmen uitstellen.

 


Philips Pronto Neo afstandsbediening
Omdat alles in huis dat met de bus is verbonden met elkaar gegevens kan uitwisselen, is ook alles met een afstandsbediening te bedienen.
Hiervoor maak ik gebruik van een Pronto Neo afstandsbediening van Philips.
Niet alleen de TV, beamer, audiotoren, harddiskrecorder en DVD recorder is hiermee te bedienen, maar ook het hele huis.
Bij mij ligt de tafel dus niet vol verschillende afstandsbedieningen, maar alleen de Pronto Neo.
Het voordeel van de Pronto Neo is ondermeer dat je zelf het aanraakscherm kan ontwerpen op de PC.

 
Ontwerpprogramma NEOedit voor de RU930 Pronto Neo afstandsbediening.
  
Philips Pronto Neo RU930.

 
Voor het openen of sluiten van het keukenraam druk je dus op de virtuele toets waarop staat 'Keukenraam'.
Het bladeren door het nummermelder menu, het instellen van de wekkers, al dit soort zaken gaan allemaal via deze afstandsbediening.
Nu is de RU930 al een vrij oude Pronto Neo, destijds geleverd bij mijn beamer.
De nieuwste Philips Pronto Neo's hebben een aanraakkleurenscherm met veel hogere resolutie.

Meer info Pronto Neo
 


Philips MFB 9638 luidsprekerboxen
In de woonkamer en de werkkamer staan bij elkaar vier actieve MFB luidsprekerboxen.
De luidsprekerboxen op de werkkamer zijn normaal spanningsloos om stroom te besparen, geschakeld via een solid state relais en de bus van het huis.
Als er op de werkkamer gewerkt gaat worden moeten deze luidsprekerboxen worden ingeschakeld met de Pronto Neo afstandsbediening.
Ook het uitschakelen kan via deze afstandsbediening worden gedaan.
Wordt dit echter vergeten, dan zal het huis 's avonds om 22:00 uur alsnog de 230V van deze luidsprekerboxen uitschakelen.


Het PIC Basic gedeelte

Hier in het kort zowel het PIC Basic zend als het ontvanggedeelte dat in elke PIC bij me thuis is geprogrammeerd en dat werkt met de simpele verbinding dat in het schema bovenaan deze pagina staat.
Het voorbeeld hieronder is gemaakt voor de 16F628A, maar werkt op de andere PIC types op precies dezelfde manier.
Alleen de 16F676 heeft geen USART, daar wordt de ontvangst dan ook niet gedaan met HSERIN, maar met de softwarematige variant SERIN.
Elke data overdracht over de bus bestaat (bij mij) uit 16 bits, 8-bits (= BYTE) voor de opdrachtcode (bijvoorbeeld waarde '60' betekent "kamerraam openen", waarde '61' betekent "kamerraam sluiten"), en 8-bits voor een eventuele extra waarde (meestal zijn deze 8-bits dus '0').
De extra waarde kan bijvoorbeeld nodig zijn als de ene PIC de temperatuur wil weten van een sensor die op een andere PIC aangesloten zit.
De eerste PIC zend dan de code van opdracht "Request buitentemperatuur" over de bus.
De PIC die deze functie heeft stuurt de code terug met nu in de tweede BYTE de gemeten waarde (in dit geval de temperatuur dus).

Oja, de LITE versie van Proton PIC Basic ondersteunt geen 16MHz kristal, hier dus een 20MHz kristal (of resonator) bij elke PIC plaatsen.
En als je het geheel bouwt op een breadboard met de PIC's dus kort naast elkaar, dan mag i.p.v. de +12V ook +5V, oftewel de voedingsspanning van de PIC's worden gebruikt.
Als je echter meerdere meters kabel tussen de PIC's onderling hebt, adviseer ik een hogere spanning (12V is de spanning die ik gebruik in huis, zie het schema bovenaan deze pagina).

DEVICE 16F628A                ;We gebruiken een 16F628A type
CONFIG HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, BODEN_OFF, MCLRE_OFF

DECLARE ALL_DIGITAL   = TRUE  ;Alle ingangen digitaal
DECLARE XTAL          = 20    ;Gebruik een kristal van 20MHz
DECLARE HSERIAL_BAUD  = 2400  ;Transmissiesnelheid van de data over de bus
DECLARE HSERIAL_RCSTA = %10010000 ;Bit7:Enable serial port / Bit4:Continu ontvangen
DECLARE HSERIAL_TXSTA = %00000000 ;Bit5:Transmitpin uitgeschakeld (TXEN (Transmit ENable) = 0)

INCLUDE "c:\PIC programmas\Woning_opdrachtnamen.inc"

;Logische constanten
SYMBOL HOOG         = 1       ;Hoog niveau
SYMBOL LAAG         = 0       ;Laag niveau

;Algemene constanten
SYMBOL Baud2400I    = 16780   ;2400 Baud Inverted (baudrate voor SEROUT)

;Poortnamen
SYMBOL LED          = PORTA.0 ;Hierop een LED met serieweerstand aansluiten
SYMBOL Toets        = PORTB.0 ;Toets voor verzenden van een waarde over de bus
SYMBOL SerieelIn    = PORTB.1 ;Ontvangt via HSERIN data van de bus (B.1 = USART ingang, RX)
SYMBOL SerieelUit   = PORTB.2 ;Stuurt via SEROUT data naar de bus  (B.2 = USART uitgang, TX)

;Variabelen declareren
;BYTE
DIM Opdracht        AS BYTE   ;Bevat de laatst ontvangen opdrachtcode
DIM Waarde          AS BYTE   ;Eventueel retour gezonden waarde (zoals gemeten LDR waarde)

;        76543210
PORTA = %00000001             ;LED voor dit voorbeeld aanzetten (PIC opstart controle)
PORTB = %00000000             ;PORTB poorten laag
TRISA = %11111110             ;A.0 is uitgang voor de LED (in dit voorbeeld)
TRISB = %11111111             ;USART uitgang B.2 moet in rust hoog-ohmig zijn

DECLARE PORTB_PULLUPS ON      ;PORTB pull-ups geactiveerd voor de toets
CLEAR                         ;Wis alle RAM geheugen
DELAYMS 500                   ;Stabilisatie signalen en voorbeeld LED opstart tijd

LED = LAAG                    ;Zet LED van PIC opstart controle uit (poort LAAG maken)

GOTO HoofdLus                 ;Spring over subroutine(s)



;SUBROUTINE(S)
ZendBus:                      ;De bus die door het huis loopt
  RCSTA = %00000000           ;Zet USART uit, anders ontvangt deze zijn eigen verzonden data
  SEROUT SerieelUit, Baud2400I, [Opdracht, Waarde] ;Geinverteerd verzenden (vanwege BC547)
  RCSTA = %10010000           ;Schakel USART weer in, zodat de PIC weer data kan ontvangen
  INPUT SerieelUit            ;Maak TX poort hoog-ohmig door er een ingang van te maken
RETURN



;HOOFDPROGRAMMA
HoofdLus:
  CLEAR Opdracht              ;Opdracht (na uitvoering) wissen
  CLEAR Waarde                ;Idem voor 'Waarde'
  
  HSERIN 7, Verder, [Opdracht, Waarde] ;Time out staat op 7mSec
  GOTO OpdrachtUitvoeren      ;Voer opdracht uit
Verder:                       ;In het geval van een time-out van HSERIN, hier verder gaan


;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  ;Voorbeeld voor de picbasic.nl site (om te experimenteren, zelf uitbreiden)
  ;Onderstaand stukje staat dus niet in het programma bij mij thuis
  IF Toets = LAAG THEN        ;Als toets wordt ingedrukt, dan...
    Opdracht = 26             ;Verzendt waarde 26 over de bus
    GOSUB ZendBus
    DELAYMS 20                ;Antidender voor indrukken van de toets
    WHILE Toets = LAAG : WEND ;Wacht tot toets wordt losgelaten, anders blijft hij zenden
    DELAYMS 20                ;Antidender voor loslaten van de toets
  ENDIF
;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW


  ;Op deze plek staat bij mij in de 18F452 "semi-master PIC", een oneindige lus, 
  ;waarin continu DCF77 tijd en temperatuur wordt bijgehouden en op display wordt weergegeven
  ;alsook de twee 74HC165 schuifregisters continu worden ingelezen (= 16 extra ingangen)
  ;alsook of er een IR opdracht van de afstandsbediening binnenkomt in keuken TSOP1736
  ;Komt er een opdracht binnen via 1 van deze inlezingen, dan GOTO OpdrachtUitvoeren, alwaar
  ;de opdracht (door een SELECT...CASE lijst) wordt afgehandeld
  ;Na OpdrachtUitvoeren springt het programma weer terug naar HoofdLus


  ;Op deze plek (buiten bovenste lus) staan timerfuncties, die 1x per minuut wordt doorlopen
  ;Dit gaat simpel met een SELECT...CASE lijst waarin alle tijden staan
  ;Als de tijd overeenkomt met een timerinstelling, wordt de bijbehorende opdracht uitgevoerd
  ;Daarna meteen weer terug naar HoofdLus, waar het programma weer wacht op een opdracht
GOTO HoofdLus


OpdrachtUitvoeren:
  SELECT Opdracht             ;Deze SELECT lijst bepaalt wat een ontvangen opdracht gaat doen
    CASE 26                   ;Als de waarde '26' is ontvangen van de bus, dan...
      LED = ~LED              ;... de LED aan of uitzetten (togglen)

'   CASE 120                  ;Als waarde '120' is ontvangen, dan...
'     LED = HOOG              ;... de LED aanzetten (poort een HOOG niveau geven)

'   CASE 121                  ;Als waarde '121' is ontvangen, dan...
'     LED = LAAG              ;... de LED uitzetten (poort een LAAG niveau geven)

  END SELECT
GOTO HoofdLus                 ;Ga weer naar de oneindige hoofdlus

Bovenstaand PIC Basic programma bevat dus zowel het zend- als het ontvanggedeelte.
Als je dit voorbeeld wilt testen (samen met het schema bovenaan deze pagina), dan moet dit programma dus in alle PIC's worden geprogrammeerd.

Let even op, als je dit gaat compileren krijg je een foutmelding vanwege het INCLUDE bestand, dat natuurlijk niet op je PC aanwezig is.
Deze kun je dan gewoon weghalen uit dit programma.
Meer info over wat INCLUDE hier doet

Het programma hierboven is ingesteld voor een 20MHz kristal (de LITE versie ondersteunt geen 16MHz), dit aanpassen als je een ander type kristal (of resonator) gebruikt.
Nogmaals de melding dat gebruik van de interne oscillator resulteert in een onbetrouwbaar werkend geheel, gebruik dus altijd een kristal als je een verbinding met iets anders (of PIC's onderling) maakt.
De snelheid voor de bus is ingesteld op 2400Baud door HSERIAL_BAUD = 2400 (voor de USART en dus de hardwarematige instructie HSERIN) en door SYMBOL 'Baud2400i' op 16780 (= 2400 Baud geïnverteerd) voor de softwarematige instructie SEROUT.

Een opdrachtcode (0 ... 255) over de bus verzenden gaat hier als volgt:

Opdracht = 63                 ;Eerst aan variabele 'Opdracht' de te verzenden waarde geven
GOSUB ZendBus                 ;En dan met subroutine 'ZendBus' waarde over de bus verzenden 

In het INCLUDE bestand "Woning_opdrachtnamen.bas" staat een lijst met waarden (1 ... 254) die met SYMBOL een naam hebben gekregen zodat ik in plaats van het getal '63', nu gewoon in kan vullen Opdracht = RaamKeukenSluiten, en daarna door GOSUB ZendBus de opdracht over de bus te laten verzenden.
Onderstaand stukje code is dus precies hetzelfde als bovenstaand stukje code.

Opdracht = RaamKeukenSluiten  ;Geef variabele 'Opdracht' om het keukenraam te sluiten        
GOSUB ZendBus                 ;Subroutine 'ZendBus' verzendt de opdracht over de bus

Als in elk PIC programma de lijst met opdrachtnamen in het programma zelf wordt opgesomd, loop je de kans dat je per ongeluk verschillen in de lijsten in de PIC's onderling maakt.
Bovendien moet je bij een wijziging in de opdrachtennamenlijst van elke PIC die op de bus zit aangesloten de PIC Basic programma's nalopen, terwijl met gebruik van INCLUDE dit alleen in het INCLUDE bestand zelf hoeft te gebeuren.
De lijst in het INCLUDE bestand wordt door alle PIC's die op de bus zijn aangesloten gebruikt, waardoor er geen verschillen kunnen ontstaan.
Deze lijst neemt geen bit extra geheugen in van de PIC, omdat de lijst alleen door de compiler wordt gebruikt.
Opmerking: INCLUDE werkt niet in de LITE versie van Positron PIC Basic.
 

De subroutine 'ZendBus'
Omdat zowel zenden als ontvangen bij de bus over dezelfde draad gaat, schakelt subroutine 'ZendBus' de USART eerst uit, voordat de data met SEROUT over de bus wordt verzonden.
Als ie dat niet zou doen, dan zou de USART zijn eigen verzonden data (terug) ontvangen.
Meteen hierna schakelt instructie SEROUT TX zendpoort (PORTB.2) met de naam 'SerieelUit' om van ingang naar uitgang en verzendt eerst bytevariabele 'Opdracht' en daarna bytevariabele 'Waarde' over de bus (in totaal 16 bits dus).
Meteen na SEROUT wordt de USART weer ingeschakeld voor ontvangst.
Daarna wordt TX zendpoort (PORTB.2) hoog-ohmig gemaakt met instructie INPUT.
Als INPUT SerieelUit er niet stond dan zou de poort de bus blokkeren omdat de poort als uitgang zijnde een continu hoog of laag niveau heeft en daarmee de bus continu hoog of laag houden.
By the way, omdat hier geen gebruik wordt gemaakt van de USART om data te verzenden (alleen voor ontvangen), is TXSTA hier uitgeschakeld (HSERIAL_TXSTA = 0).
 

Voorbeeld om zelf te experimenteren
Verbind voor dit voorbeeld twee PIC's aan elkaar volgens het eerste schema bovenaan deze pagina.
Sluit bij beide PIC's een LED aan met 1k serieweerstand tussen PORTA.0 en GND.
Programmeer bovenstaand programma in beide PIC's.

Dit voorbeeld moet als volgt werken, ervan uitgaand dat er twee PIC's zijn aangesloten (dit kun je later na de test met meer PIC's uitbreiden).
Door ingang PORTB.0 (met naam 'Toets') van de eerste PIC een lage puls te geven moet de LED van de tweede PIC aan (of uit) gaan.
Andersom moet dit ook werken, dus bij de tweede PIC een lage puls op PORTB.0 geven, zal de eerste PIC zijn LED aan (of uit) zetten.
Dit werkt zo omdat bij een lage puls op poort 'Toets' van een PIC, deze PIC opdrachtcode '26' over de bus zal zenden.
De andere PIC zal '26' ontvangen via de bus en in de opdrachtlijst staat dat ie met opdrachtcode '26' de LED moet togglen.
Aangezien beide PIC's hetzelfde programma hebben werkt dit dus in beide richtingen.
Experimenteer door andere waarden over de bus te zenden en in de SELECT CASE lijst andere opdrachten bij te verzinnen.
Als voorbeeld staan al voor opdrachtcode '120' dat de LED aan moet worden gezet (en dus aanblijven als ie al aan staat) en voor opdrachtcode '121' de LED uitzetten (en uit laten als ie al uit is).
Deze regels zijn in het voorbeeld tijdelijk uitgeschakeld omdat het programma anders te groot is voor de LITE versie, als je de volledige versie hebt kun je de beide CASE 120 en CASE 121 activeren en/of zelf opdrachtcodes toevoegen.

Tussen de PIC's onderling mag verscheidene meters afgeschermde kabel zitten (bij mij 25 meter, zie voor info het verhaal bovenaan deze pagina).
 

Werkt het niet?
Controleer het volgende:

- Blinken de LED's van de aangesloten PIC's op PORTA.0 een halve seconde als de voedingsspanning wordt ingeschakeld?
De LED moet even blinken als controle dat de PIC opstart (in dit voorbeeld).

- Heeft de bus een hoog (+12V) of laag (0V) niveau? De bus moet in rust ongeveer +12V zijn.
Als de bus (bijna) 0V is dan is één (of meer) van de BC547 transistoren in geleiding.
PIC uitgang PORTB.2 (aansturing van de BC547) moet in rust een laag niveau hebben.

- Sluit voor controle een LED met serieweerstand van 2k2 ... 3k9 tussen de bus en +12V.
Steeds als er data over de bus gaat (door PORTB.0 van één van de PIC's laag te maken) moet de LED heel kort opblinken.
De LED mag sowieso niet continu branden want dan is er dus een transistor continu in geleiding (zie vorige aanwijzing).
 

'Opdracht' en 'Waarde' (in totaal 16 bits) worden bij 2400Baud in een kleine 6,7mSec verzonden.
De timeout van HSERIN is daarom op 7mSec ingesteld.
 


 
USART met interrupt en extra softwarematige buffer
Sommige opdrachten kunnen wat langer duren (bijvoorbeeld raam sluiten met PWM regeling).
Door het plaatsen van een softwarebuffer kan de PIC (in onderstaand voorbeeld) tot vier opdrachtcodes onthouden, terwijl de PIC bezig is met het uitvoeren van een andere (tijdrovende) opdracht.
Na het uitvoeren van die opdracht wordt gekeken of er nog meer opdrachten in de buffer staan door
IF Buffer[0] > 0 THEN...
en als dat het geval is deze gaan uitvoeren.

De meeste opdrachten zijn overigens geen tijdrovende opdrachten, ik heb het huis het eerste half jaar zonder deze buffer laten werken zonder problemen.
Toen stuurde ik echter nog geen WORD (16-bits) maar een BYTE (8-bits) over de bus, waardoor de USART als buffer diende.
De (hardwarematige) buffer van de USART is een buffer die 16 bits (dus destijds twee BYTE opdrachten) kan opslaan.

DEVICE 16F628A                ;We gebruiken een 16F628A type
CONFIG HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, BODEN_OFF, MCLRE_OFF

DECLARE ALL_DIGITAL   = TRUE  ;Alle ingangen digitaal
DECLARE XTAL          = 20    ;Gebruik een kristal van 20MHz
DECLARE HSERIAL_BAUD  = 2400  ;Transmissiesnelheid van de data over de bus
DECLARE HSERIAL_RCSTA = %10010000 ;Bit7:Enable serial port / Bit4:Continu ontvangen
DECLARE HSERIAL_TXSTA = %00000000 ;Bit5:Transmitpin uitgeschakeld (TXEN (Transmit ENable) = 0)

ON_INTERRUPT GOTO InterruptAfhandeling ;Spring naar label als data is ontvangen door de USART

INCLUDE "c:\PIC programmas\Woning_opdrachtnamen.inc"

;Logische constanten
SYMBOL HOOG         = 1       ;Hoog niveau
SYMBOL LAAG         = 0       ;Laag niveau

;Algemene constanten
SYMBOL Baud2400I    = 16780   ;2400 Baud Inverted (baudrate voor SEROUT)

;Poortnamen
SYMBOL LED          = PORTA.0 ;Hierop een LED met serieweerstand aansluiten
SYMBOL Toets        = PORTB.0 ;Toets voor verzenden van een waarde over de bus
SYMBOL SerieelIn    = PORTB.1 ;Ontvangt via HSERIN data van de bus (B.1 = USART ingang, RX)
SYMBOL SerieelUit   = PORTB.2 ;Stuurt via SEROUT data naar de bus  (B.2 = USART uitgang, TX)

;Variabelen declareren
;WORD-ARRAY
DIM Buffer[4]       AS WORD   ;Ontvangst buffer van de USART (een array)
;WORD
DIM OntvangenData   AS WORD   ;Bevat de ontvangen 16-bits data vanuit USART
;BYTE
DIM Opdracht        AS BYTE   ;Bevat de laatst ontvangen opdrachtcode
DIM Waarde          AS BYTE   ;Eventueel retour gezonden waarde (zoals gemeten LDR waarde)
DIM BD1             AS BYTE   ;Byte Dummy 1

;        76543210
PORTA = %00000001             ;LED voor dit voorbeeld aanzetten (PIC opstart controle)
PORTB = %00000000             ;PORTB poorten laag
TRISA = %11111110             ;A.0 is uitgang voor de LED (in dit voorbeeld)
TRISB = %11111111             ;USART uitgang B.2 moet in rust hoog-ohmig zijn

DECLARE PORTB_PULLUPS ON      ;PORTB pull-ups geactiveerd voor de toets
CLEAR                         ;Wis alle RAM geheugen
DELAYMS 500                   ;Stabilisatie signalen en voorbeeld LED opstart tijd

LED = LAAG                    ;Zet LED van PIC opstart controle uit (poort LAAG maken)

INTCON.7 = 1                  ;GIE  (Global Interrupt Enable) activeren
INTCON.6 = 1                  ;PEIE (PEripheral Interrupt Enable) activeren
PIE1.5   = 1                  ;RCIE (USART ReCeive Interrupt Enable) activeren

GOTO HoofdLus                 ;Spring over subroutine(s)



;SUBROUTINE(S)
ZendBus:                      ;De bus die door het huis loopt
  RCSTA = %00000000           ;Zet USART uit, anders ontvangt deze zijn eigen verzonden data
  SEROUT SerieelUit, Baud2400I, [Opdracht, Waarde] ;Geinverteerd verzenden (vanwege BC547)
  RCSTA = %10010000           ;Schakel USART weer in, zodat de PIC weer data kan ontvangen
  INPUT SerieelUit            ;Maak TX poort (PORTB.2) hoog-ohmig door er een ingang te maken
RETURN



;HOOFDPROGRAMMA
HoofdLus:
  CLEAR Opdracht              ;Opdracht (na uitvoering) wissen
  CLEAR Waarde                ;Idem voor 'Waarde'
  
  IF Buffer[0] > 0 THEN       ;Zolang er zich een opdracht in de buffer bevindt, dan...
    Opdracht  = Buffer[0] & 255 ;De laagste 8 bits bevatten de Opdrachtbyte
    Waarde    = Buffer[0] >> 8  ;De hoogste 8 bits bevatten een eventueel meegezonden waarde
    Buffer[0] = Buffer[1]     ;Schuif de waarden die in de buffer zitten 1 verder door
    Buffer[1] = Buffer[2]
    Buffer[2] = Buffer[3]
    Buffer[3] = 0             ;Maak laatste bufferplaats leeg (opdracht en waarde wissen)
    GOTO OpdrachtUitvoeren    ;Voer opdracht uit
  ENDIF


;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  ;Voorbeeld voor de picbasic.nl site (om te experimenteren, zelf uitbreiden)
  ;Onderstaand stukje staat dus niet in het programma bij mij thuis
  IF Toets = LAAG THEN        ;Als toets wordt ingedrukt, dan...
    Opdracht = 26             ;Verzendt waarde 26 over de bus
    GOSUB ZendBus
    DELAYMS 20                ;Antidender voor indrukken van de toets
    WHILE Toets = LAAG : WEND ;Wacht tot toets wordt losgelaten, anders blijft hij zenden
    DELAYMS 20                ;Antidender voor loslaten van de toets
  ENDIF

;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
  ;Op deze plek staat bij mij de oneindige lus met voorwaarden (zie vorig voorbeeld)
GOTO HoofdLus


OpdrachtUitvoeren:
  SELECT Opdracht             ;Deze SELECT lijst bepaalt wat een ontvangen opdracht gaat doen 
    CASE 26                   ;Als de waarde '26' is ontvangen van de bus, dan...
      LED = ~LED              ;... de LED aan of uitzetten (togglen)

    CASE 120                  ;Als waarde '120' is ontvangen, dan...
      LED = HOOG              ;... de LED aanzetten (poort een HOOG niveau geven)

    CASE 121                  ;Als waarde '121' is ontvangen, dan...
      LED = LAAG              ;... de LED uitzetten (poort een LAAG niveau geven)

  END SELECT
GOTO HoofdLus                 ;Ga weer naar de oneindige hoofdlus


InterruptAfhandeling:         ;Uitlezen en leegschuiven van buffer gebeurt in hoofdprogramma
  CONTEXT SAVE                ;CONTEXT SAVE weglaten bij gebruik van Proton LITE-1
  HSERIN 7, Verder, [OntvangenData] ;Time out staat op 7mSec ingesteld
  FOR BD1 = 0 TO 3            ;Buffer met plaats voor maximaal 4 WORD arrays (0...3)
    IF Buffer[BD1] = 0 THEN   ;Bufferplaats nog leeg? Dan...
      Buffer[BD1]  = OntvangenData ;...hierin de ontvangen data plaatsen, en...
      BREAK                   ;...uit de FOR...NEXT lus springen
    ENDIF
  NEXT
Verder:                       ;In het geval van een time-out, hier verder gaan
  CONTEXT RESTORE             ;Restore en ga terug naar de plek waar de interrupt ontstond
GOTO HoofdLus                 ;Zekerheid, eigenlijk staat dit er overbodig

Ook hier kun je INCLUDE weghalen als je dit voorbeeldprogramma wilt gebruiken (te groot voor de LITE versie).

Het programma hierboven is uitgebreid met een extra software buffer voor maximaal vier WORD variabelen.
Meteen als de USART data ontvangt zal het een interrupt genereren en naar label 'InterruptAfhandeling' springen.
Daar wordt de USART uitgelezen en de waarde in de array met de naam 'Buffer' geplaatst.
Meteen hierna springt het programma terug naar de plek waar het vandaan kwam door CONTEXT RESTORE.

Er is hier een timeout opgegeven.
De data moet dus binnen 7mSec binnen zijn anders springt het naar label 'Verder' en zal alsnog CONTEXT RESTORE.
Als er geen timeout was opgegeven, dan zou het programma de PIC kunnen ophangen en maar blijven wachten op data.

Denk er overigens aan dat je de instructies ON INTERRUPT GOTO,  ON_INTERRUPT GOTO,  ON_LOW_INTERRUPT GOTO en/of ON_HARDWARE_INTERRUPT GOTO altijd als één van de eerste, zoniet, eerste actieve programmaregel in je programma opstelt!
Zet je deze regel(s) lager in je programma, dan kun je onverwachte en onbedoelde, vreemde reacties van je PIC verwachten!
Misschien niet in eerste instantie, maar naar mate je programma groeit, begint de PIC zich "ineens" steeds vreemder te gedragen als je je hier niet aan houdt.
Het in- en uitschakelen van de interrupts zelf mag natuurlijk wel verder in het PIC Basic programma gebeuren.


AM zender / ontvanger
Het gebruik van een AM zender en ontvanger werkt op zichzelf eenvoudig, het is alleen de signaaldraad van de bus die "door de lucht" gaat per AM.
De signalen GND en +12V gaan dus (logisch) niet mee.
De bruine kast waarin de AM ontvanger zich bevindt heeft zijn eigen voeding.
In het PICBasic programma bevinden zich onder andere de volgende programmaregels:

;Algemene constanten
SYMBOL Baud1000I    = 17364   ;1000 Baud Inverted (baudrate voor SERIN)

;Poortnamen
SYMBOL Ontvanger    = PORTA.1 ;Hierop zit de uitgang van de 433,92MHz AM ontvanger aangesloten

;Variabelen declareren
DIM Opdracht        AS BYTE   ;Bevat steeds de laatste via de AM-ontvanger ontvangen opdracht


;Hoofdprogramma
WHILE 1 = 1
  SERIN Ontvanger, Baud1000I, [WAIT("IRkast"), Opdracht]

  SELECT Opdracht
    CASE 74                   ;Spiegel openen
      ;Hier staan SERVO instructies voor het openen van de spiegel voor de beamer

    CASE 75                   ;Spiegel sluiten
      ;Hier staan SERVO instructies voor het sluiten van de spiegel voor de beamer

    CASE BeamerAan
      ;Hier staat de instructie om de beamer aan te zetten

    CASE BeamerUit
      ;Hier staat de instructie om de beamer uit te zetten

    CASE Enzovoort
    .
    .
    .
  ENDSELECT

WEND

De PIC wacht nu net zolang in de SERIN regel totdat het woordje 'IRkast' via PORTA.1 ontvangen wordt, waarna de BYTE waarde die meteen daarna ontvangen wordt, bestemd is voor de opdracht, en dus in de variabele 'Opdracht' komt.
Het programma loopt nu verder waarna het meteen daaronder in SELECT CASE (zie cursus deel 6) gaat kijken welke opdracht de PIC moet uitvoeren.
Bijvoorbeeld als 'Opdracht' de waarde 74 bevat (als de AM-ontvanger deze meteen na de karakters 'IRkast' heeft ontvangen), dan de spiegel van de beamer openen.

Het gebruik van de AM zender en ontvanger werkt bij mij overigens minder goed als er veel visite in huis is.
Dan is het soms lastig de bruine kast te bedienen waarin bij mij o.a. de beamer en spiegel met servo motor zich bevinden.
De ontvangst wordt dan blijkbaar verstoort door de vele mensen in huis.
Dus denk goed na, een AM zender kan nogal last hebben van storing (normaal heb ik er nooit last van hoor).
Maar achteraf gezien zou ik nú denk ik voor een FM zender / ontvanger hebben gekozen.

Lees over SERIN met de optie WAIT ook even het project van de thermostaat door.


Wat vooraf ging...


Het automatische huis in de experimentele fase, hier nog op breadboard op tafel.
 


Voor de masterschakeling op het breadboard is inmiddels een print ontworpen (zie foto's hieronder), en is deze verplaatst van de kamertafel naar de keuken op de plek waar de print in een kunststof kast komt te zitten.
De PIC Basic programma's in de zeven PIC's werken uitstekend samen, tot nog toe heb ik het zonder (delen) assembler kunnen redden.
Alleen de print met de master PIC (die in de keuken komt) moet dus nog ontworpen worden, de print van de hal, op de foto's hieronder nog op breadboard, is inmiddels ook gereed.


Proefopstelling in de beginperiode.
 

Het grote breadboard op de foto hierboven bevat de hoofdbesturing van het huis (master), zie verderop.
Het breadboard in het midden bevat de PIC 16LF73 besturing die in de hal komt voor ondermeer belknop, reedcontact kastdeur, deurbel, infrarood bewegingssensor in hal, aansturing lamp van hal (met dimfunctie), LDR voor licht-intensiteit buiten, reedcontact voordeur, infrarood bewegingssensor achtertafel, LDR voor licht-intensiteit woonkamer, lamp achtertafel (met dimfunctie), PWM motoraansturing voor dichtdraaien van de hoofdwaterkraan en een seriële verbinding met master PIC in de keuken.
Het linker breadboard bevat twee maal een S202S01 solid state relais voor aansturing van de 230V lampen in hal en achterkamer.
Bovenaan de groene universele telefoonprint waarmee via de master PIC alle met de PIC's in huis verbonden componenten, apparaten, motoren, lampen, bad, verwarming, enzovoort via telefoon te regelen zijn.
Links bovenaan natuurlijk de bekende Galva-Wisp in circuit PIC programmer (met als extra SMD LED's op de printbaanzijde).
 

Het meeste gebeurt via de master PIC in de keuken, maar niet alles.
Als bijvoorbeeld in de hal de infrarood bewegingssensor een persoon opmerkt, dan zal de PIC in de hal dit doorgeven aan de master PIC in de keuken, die er eventueel wat mee kan doen.
De PIC in de hal zorgt er echter zelf voor dat de verlichting in de hal in twee seconden langzaam omhoog dimt tot maximaal, daar bemoeit de master PIC zich niet mee.
De master PIC kán echter wél de lamp in de hal aanzetten (of dimmen) als dat nodig mocht zijn.
Hij kan dit bijvoorbeeld weer doen in opdracht van de telefoonprint of de Pronto Neo afstandsbediening.
Als er een halve minuut geen persoon meer is gedetecteerd in de hal dan zal de verlichting in de halve minuut daarna langzaam doven, tenzij er weer een persoon wordt opgemerkt, waardoor er weer snel omhoog wordt gedimd en de tijd weer opnieuw begint te lopen.

De PIC in de hal zet overigens niet zomaar de lamp in de hal aan als deze een persoon opmerkt met de bewegingssensor van de hal, maar meet eerst via zijn LDR of het buiten ook donker (schemerig) is.
Als het licht genoeg is dan blijft de lamp uit.
Wordt echter de kastdeur in de hal geopend, dan zal de lamp wél aan gaan, ongeacht de gemeten lichtsterkte buiten en als de kastdeur weer wordt gesloten dan zal de lamp in zo'n twee seconden uit dimmen.
Is de kastdeur niet (goed) gesloten dan zal de 230V lamp door de PIC na zo'n 5 minuten alsnog uit worden gezet.
 


De PIC 18F452 in de keuken:
 


Hier nog op breadboard; de masterschakeling.
 

De masterschakeling nog op breadboard, op de foto hierboven van links naar rechts:
Simpele 7805 5V voeding, TSOP1736 infrarood (RC5) ontvanger, PIC 18F452 master van het huis, twee maal 74HC165 (= 16 ingangen extra) met diverse pull-up of pull-down weerstanden, twee maal 74HC595 (= 16 uitgangen extra) met daarop o.a. 10 LED's en een (Conrad) buzzer, de 74HC165's en 74HC595's gebruiken gecombineerd dezelfde klok- en datapoorten van de 18F452.
Daaronder dataverbinding naar onder andere Nefit thermostaat, twee maal L293D voor aansturing ramen in slaapkamer en keuken (met PWM) en voeding voor badkamer, daarnaast (wit) een losliggende optocoupler (niet meer nodig), dan de USART verbinding via een BAT85 voor ontvangst data van andere PIC's in huis en een BC547 voor verzending naar de andere PIC's in huis.
Dan daarnaast een 8-pins DS1302 klok IC met 0,22mF goldcap (deze wordt straks vervangen door een 8-pins PCF8583 klok IC).
Stijf tegen de klok een 8-pins SAE800 gong IC voor de klok (gestuurd door twee uitgangen van de 74HC595) en als laatste een PIC 16F628A met daarin de DCF77 ontvanger.
 

Waarom naast een klok IC ook nog een DCF77 PIC?
Aangezien de klok diverse timerfuncties regelt in huis (wekkerfunctie, thermostaat, bad vullen op bepaalde dagen en tijd, ramen openen/sluiten, pincode berekenen (voor toegang tot bus per telefoon), enz.) is het belangrijk dat de klok altijd de goede tijd heeft.
Elke nacht om 03:02 wordt het klok IC weer precies gelijk gezet met de DCF77 tijd, althans, alleen als uren en datum overeenkomen met elkaar, waardoor het klok IC de tijd en datum niet overneemt als de DCF77 onzinnige tijden bevat door bijvoorbeeld slechte ontvangst.
Voordelen zijn ondermeer dat de klok altijd precies gelijkloopt (inclusief eventuele schrikkelseconde) en dat de zomertijd ook volautomatisch wordt aangepast.
Omgekeerd geldt dat als de DCF77 zender in Duitsland wegvalt of de ontvanger een slechte ontvangst heeft, het klok IC gewoon doorloopt zonder gelijkzetting, het wijkt zonder gelijkzetting ongeveer 2 seconden in de week af, dus het kan lang zonder hulp van DCF77 draaien.
Als de toets die rechts onderaan het breadboard zit is ingedrukt tijdens seconde 00 (dus elke minuut) dan wordt het klok IC ook gelijk met de DCF77 tijd gezet, maar nu onvoorwaardelijk, dus zónder vergelijking van de tijd en datum met elkaar.
Dit is nodig om het klok-IC dat om een bepaalde reden de tijd helemaal kwijt is, toch opnieuw in te kunnen stellen.

Bij uitvallen van de spanning loopt het klok IC door op de opgeslagen spanning in de goldcap, bij inschakelen van de netspanning wordt meteen het klok IC weer ingelezen en staat de tijd binnen de seconde weer op het HD44780 display.
 

In het PICBasic programma van de DCF77 ontvanger bevinden zich onder andere de volgende extra programmaregels:

;*** Verzend actuele datum en tijd naar de master PIC (in de keuken)
  TijdZenden = FALSE         ;Hulpbit omdat combinatie van AND en OR niet wil

  ;Om 3:02 uur 's nachts de PCF8583 weer 100% gelijkzetten (niet om 3:00, kans op toevallige fout is dan groter) 
  IF Uur = 3 AND Minuut = 02 THEN TijdZenden = TRUE 

  IF TijdZenden = TRUE OR Toets = LAAG THEN
    CLEAR BD1
    BD1.0 = Toets
    BD1.1 = Zomertijd
    LOW    SerPin            ;Geef uitgang een lage puls van...
    DELAYMS 1000             ;...1 sec, zodat de ontvanger weet dat er code aankomt
    HIGH   SerPin            
    DELAYMS 1                ;1 mSec na de lage puls gaan zenden
    SEROUT SerPin, 396, ["D", DCF77Update] ;396 = 2400 Baud true, D = wachtwoord (van DCF77)
    HIGH   SerPin            ;Pin moet hoog zijn om SEROUT goed te laten starten
    DELAYMS 1                ;Na 1 mSec de datum + tijd verzenden
     
    ;BD1 bit 0, bij toets indruk neemt de PCF8583 de tijd over ZONDER controle of DCF77 zelf goed loopt
    SEROUT SerPin, 396, [BD1, Jaar, Maand, Dag, WeekDag, Uur, Minuut]
    INPUT  SerPin            ;Als hoog-ohmige poort achterlaten
  ENDIF

Voor meer info, download het complete PIC Basic programma voor de PIC in de DCF77:

Download DCF77_Domotica.bas, de broncode voor PIC Basic

Op de PIC van de DCF77 zit een toets aangesloten.
Als deze is ingedrukt als DCF77 bij seconde 00 is, zal de PIC zijn huidige datum/tijd gaan verzenden naar de master PIC, of de ontvangen DCF77 tijd nu klopt of niet.
Dit is nodig om de PCF8583 RTC overdag met de DCF77 tijd in te kunnen stellen als deze nog op 0:00:00 staat, of als de PCF8583 tijd om wat voor reden dan ook niet klopt en deze weer gelijk gezet dient te worden.
De master PIC wordt met behulp van een bit van de meegezonden dummy-variabele 'BD1' op de hoogte gebracht dat de toets is ingedrukt, zodat de master PIC de DCF77 tijd niet gaat vergelijken met de tijd van de (niet goed lopende) PCF8583.


Hieronder de routine 'KlokGelijkZetten' van de master PIC voor wat betreft het ontvangen van de DCF77 tijd en daarmee het gelijkzetten van de PCF8583 RTC (Real Time Clock):

KlokGelijkZetten:
  ;Eerst de DCF77 tijd ontvangen, binnen 20mSec moet hele opdracht zijn ontvangen, anders (terug) naar 'HoofdLus' springen
  SERIN SerieelIn, Baud2400T, 20, HoofdLus, [BD1, DCF_Jaar, DCF_Maand, DCF_Datum, DCF_Dag, DCF_Uur, DCF_Minuut] 
  DEC DCF_Dag                 ;DCF77 heeft dagnummer ma...zo = 1...7, PCF8583 heeft dagnummer 0...6, verlaag DCF_Dag met 1

  DCF_Toets = BD1.0           ;Bij indrukken van toets van DCF PIC wordt DCF77 ongecontroleerd overgenomen  
    
  ;Controle of DCF77 zelf wel goed loopt (bij indrukken van toets van DCF PIC wordt DCF77 ongecontroleerd overgenomen)
  IF DCF_Toets = HOOG THEN    ;Als NIET op de toets "gelijkzetten" van de DCF77 PIC is gedrukt, dan de controle uitvoeren
    IF Maand > 1 OR Datum > 1 THEN ;Jaar niet controleren op 1 januari, de PCF8583 valt eens in de 4 jaar terug naar 00
      IF DCF_Jaar <> Jaar THEN HoofdLus ;\
    ENDIF                               ;\
    IF DCF_Maand <> Maand THEN HoofdLus ;- Bij 1 van deze 4 ongelijk, dan PCF8583 klok NIET gelijkmaken aan de DCF77 tijd
    IF DCF_Datum <> Datum THEN HoofdLus ;/
    IF Dag < Snipperdag   THEN IF DCF_Dag <> Dag THEN HoofdLus ;Alleen vergelijken als 'Snipperdag' NIET is ingeschakeld
  ENDIF


  BD1 = (DCF_Jaar / 4) * 4    ;Zet 'DCF_Jaar' om naar viertal (06 als 04, 07 als 04, 08 als 08, 09 als 08, 10 als 08, enz)
  HBUSOUT EE24C512w, EE_Jaartal, [BD1] ;Het viertal (04, 08, 12, 16, enz.) van het jaar opslaan in externe 24C512 EEPROM
                              ;De modulus (restwaarde) van 'DCF_Jaar' (0-3) wordt in Year locatie van de PCF8583 geplaatst

  ;DCF77 data overzetten naar een array. Dit niet met LOOKDOWNL doen, dat neemt namelijk veeeel meer geheugen in gebruik
  RTC_Data[0] = ((DCF_Minuut / 10) << 4) + (DCF_Minuut // 10)
  RTC_Data[1] = ((DCF_Uur    / 10) << 4) + (DCF_Uur    // 10)
  RTC_Data[2] = ((DCF_Jaar  //  4) << 6) + ((DCF_Datum  / 10) << 4) + (DCF_Datum  // 10)
  RTC_Data[3] = ((DCF_Dag)         << 5) + ((DCF_Maand  / 10) << 4) + (DCF_Maand  // 10)

  ;                        v=stop count  v=0,1sec
  HBUSOUT PCF8583w, $00, [%10000000, %00010000, 00, RTC_Data[0], RTC_Data[1], RTC_Data[2], RTC_Data[3]]
  DELAYMS 100                 ;PCF8583 ingesteld op uur:min:00,1  , dus klok na 0,1 sec starten
  HBUSOUT PCF8583w, $00, [%00000000] ;Start counting (bit 7 op '0' gezet)

GOTO HoofdLus                 ;Terugkeren naar de hoofdlus

In rust bevindt het programma zich altijd in een hoofdlus (deze is hierboven niet weergegeven).
Daar wacht het op commando's van infrarood afstandsbediening, telefoon, sensoren, timerfuncties, slave PIC's die via de bus commando's kunnen geven en ook of de DCF77 PIC zich meldt (normaal dus om 03:02 uur 's nachts).
De DCF77 meldt zich door een eigen DCF ingangspin op de master PIC gedurende 1 seconde LAAG te maken (die tijd mag korter) zodat de master PIC weet dat de DCF77 PIC een update wil doorgeven.
De master PIC wacht hierna tot zijn DCF ingangspin weer HOOG wordt en verwacht daarna na 1 mSec de data van de DCF77 PIC.
In de hoofdlus wordt dan eerst gecontroleerd of het eerste karakter een "D" (van DCF77) is, en zo ja, dan springt het programma naar de routine 'KlokGelijkZetten'.

Na weer 1 mSec begint de DCF77 PIC met het verzenden van de datum en de tijd met de instructie SEROUT.
De master PIC haalt de datum en tijd binnen met de instructie SERIN.
Meteen hierna wordt de waarde van DCF_Dag met 1 verlaagd (zie info REM-regel in het programma hierboven).

De master PIC heeft van de DCF77 PIC ook doorgekregen of de toets aan de DCF77 PIC was ingedrukt.
Is deze toets niet ingedrukt, dan wordt de PCF8583 automatisch gelijkgezet (normaal 03:02 uur 's nachts).
Hierbij wordt gecontroleerd of jaartal (00...99), maand (1...12), datum (1...31) en dag (0...6) van DCF77 en PCF8583 gelijk zijn aan elkaar.
Alleen als al deze 4 gelijk zijn, wordt de DCF77 tijd naar de PCF8583 toegeschreven, is er één van deze ongelijk, dan wordt terug naar de hoofdlus gesprongen zonder dat de PCF8583 gelijk wordt gezet.
De PCF8583 verloopt maar weinig in tijd en kan dus gerust enkele dagen/weken zonder DCF77.

Is de toets wel ingedrukt, dan wordt de PCF8583 handmatig gelijkgezet (de DCF77 tijd wordt ongecontroleerd door de PCF8583 overgenomen).
Ongecontroleerd betekent dat de DCF77 tijd niet wordt vergeleken met de tijd van de PCF8583.
Dit moet ook niet, want als de PCF8583 bijvoorbeeld 0:00:00 aan zou geven, dan zou de vergelijking steeds op ongelijk uitkomen en daarmee de PCF8583 niet op de DCF77 tijd worden gezet.
 

Uitzonderingen:
Er zijn een paar uitzonderingen voor wat betreft het vergelijken.

In mijn huis bestaat een achtste dag, en wel voor de snipperdag (of vakantie).
De variabele 'Dag' krijgt dan de waarde 7 (de andere 7 dagen hebben de waarden 0...6).
Als de variabele 'Dag' de waarde 7 heeft, "weet" het huis dat het een ander programma moet volgen (het hoeft de wekker niet af te laten gaan, moet klapramen op andere tijden laten luchten, enz.)
Maar als 'Dag' de waarde 7 heeft, mag deze niet worden vergeleken met de DCF77 tijd, dus dat betekent IF Dag < Snipperdag THEN zodat 'Dag' alleen gecontroleerd wordt als deze een waarde kleiner dan 7 heeft.

Een andere uitzondering is het jaartal.
De PCF8583 heeft een 4-jaars kalender (i.v.m. het schrikkeljaar) en geen volledige jaarteller (00...99, zoals bijvoorbeeld de DS1302 en de DS1307 wél hebben).
Dat hoeft op zich geen probleem te zijn, maar we moeten dan wel zelf het jaartal bijhouden.
Ik onthoud dit in een externe 8-pins EEPROM (type 24C512, dit EEPROM houdt ook de stand van de ramen, wektijden en dergelijke bij).
Eens in de vier jaar (2007 naar 2008, 2011 naar 2012, 2015 naar 2016, enz.) springt het jaartal van de PCF8583 terug van 3 naar 0.
Dat betekent dat ook op 1 januari niet het jaartal vergeleken mag worden.


Uitlezen van de PCF8583:

RTC_Read:                     ;PCF8583 uitlezen
  HBUSIN PCF8583r, $02, [Seconde, Minuut, Uur, Datum, Maand] ;Datum bevat datum + jaar / Maand bevat dag + maand
  Jaar  = HBUSIN EE24C512r, EE_Jaarta       ;Lees uit 24C512 EEPROM het viertal van het jaar (04, 08, 12, 16, enz.)
  Jaar  = Jaar + ((Datum & %11000000) >> 6) ;Filter 'Jaar' (0-3) uit 'Datum' en tel dat bij het zojuist uitgelezen jaartal
  Datum =  Datum & %00111111                ;Verwijder het jaar (0-3) uit 'Datum'
  Dag   = (Maand & %11100000) >> 5          ;Filter (maskeer) 'Dag' (0-6) uit 'Maand'
  Maand =  Maand & %00011111                ;Verwijder het weekdag (0-6) uit 'Maand'
  
  ;De ontvangen tijdsdata meteen omzetten van BCD naar decimaal
  Seconde = ((Seconde >> 4) * 10) + (Seconde & 15)
  Minuut  = ((Minuut  >> 4) * 10) + (Minuut  & 15)
  Uur     = ((Uur     >> 4) * 10) + (Uur     & 15) 
  Datum   = ((Datum   >> 4) * 10) + (Datum   & 15)
  Maand   = ((Maand   >> 4) * 10) + (Maand   & 15) 
; Dag     = ((Dag     >> 4) * 10) + (Dag     & 15) ;Dag telt maar t/m 7, 7dec = 7hex = 7bcd, geen omzetting nodig dus
; Jaar    = ((Jaar    >> 4) * 10) + (Jaar    & 15) ;PCF8583 heeft geen echt jaartal, alleen 0-3 waarbij 0 schrikkeljaar is
                                                   ;(februari telt dan door tot 29) 

  IF HBUSIN EE24C512r, EE_Snipperdag > 0 THEN Dag = Snipperdag  ;Snipperdag (of vakantie)
RETURN

De externe 24C512 EEPROM bevat altijd een 4-tallig waarde (00, 04, 08, 12, 16, 20, enz.) wat berekent is tijdens het wegschrijven naar de EEPROM met behulp van de berekening BD1 = (DCF_Jaar / 4) * 4.
De restwaarde van het jaartal wordt uit de PCF8583 klok gelezen (0...3) en bij het jaartal dat aanwezig is in de EEPROM opgeteld waardoor het juiste jaartal ontstaat.
Voor het jaar 2013 zal in de EEPROM de waarde 12 staan en in de PCF8583 de waarde 1, bij elkaar opgeteld 12 + 1 = 13.
Om het volledige jaartal (in dit voorbeeld 2013) op een display te tonen wordt dat dus PRINT "20", DEC2 Jaar

Bij de PCF8583 bevat 'Datum' zowel de datum (1...31) als het jaartal (0...3).
Het jaartal hebben we inmiddels, dus moet deze uit 'Datum' verwijderd worden door de bits 7 en 6 van 'Datum' te maskeren met Datum = Datum & %00111111

En 'Maand' bevat zowel de dag (0...6) als de maand (1...12), deze moeten dus van elkaar gescheiden worden.
De dag staat in de bits 7, 6 en 5 en filteren we er uit door de overige 5 bits (die van de maand zijn) als het ware af te dekken met Maand & %11100000
Nu staan de 3 bits met de dagwaarde nog op de bit-posities 7, 6 en 5, maar moeten op posities 2, 1 en 0 komen, dus moeten 5 plaatsen naar rechts opschuiven met >> 5.


Declaraties gebruikt bij de PCF8583 klok:

SYMBOL PCF8583r   = %10100011 ;Adres om PCF8583 uit te lezen (r = read)
SYMBOL PCF8583w   = %10100010 ;Adres om naar PCF8583 te schrijven (w = write) 
SYMBOL EE24C512r  = %10100001 ;Adres om 24C512 uit te lezen (r = read)
SYMBOL EE24C512w  = %10100000 ;Adres om naar 24C512 te schrijven (w = write)
SYMBOL Snipperdag = 7         ;Geeft 'Dag' deze waarde als snipperdag is geactiveerd 

DIM RTC_Data[4]     AS BYTE   ;Wordt gebruikt bij overdracht DCF-tijd naar PCF8583 RTC IC 

Alle andere variabelen zijn normale BYTE variabelen.

De PCF8583 lijkt op het eerste oog lastiger dan het is.
Als je zelf iets dergelijks gaat bouwen, ga beetje voor beetje aan het werk.
Schrijf eerst de tijden vanuit de PIC rechtstreeks naar de PCF8583 (dus nog niet via DCF77) en kijk of de klok loopt.
Bouw zo het geheel langzaam maar zeker uit.


 


Kabels van ondermeer signaal van de DCF77 ontvanger, DS1820 thermometer voor buitentemperatuur, motoren van de ramen van de keuken en slaapkamer, seriële verbinding naar de Nefit thermostaat, Basic Stamp (BS2e) van de badkamerbesturing, 12V voeding en busverbinding die door het huis loopt.
De kabels lopen via de tafelpoot naar de plek in de keuken waar de hoofdprint straks komt te zitten.

 


De masterprint
De masterschakeling is inmiddels op zijn definieve print werkzaam.
Veel wijzigingen in vergelijking met de schakeling op het breadboard zijn er niet gemaakt.
De print heeft er een 12-bits DAC (MCP4921) bijgekregen (nog geen functie voor, maar er was nog ruimte op de print).
Er is nog een extra 74HC595 bijgekomen zodat er nu 24 extra uitgangen op de PIC zitten, waarvan 7 stuks gebufferd door een ULN2003.
De 16 extra 74HC165 ingangen hebben ieder een 3-standen dipswitch voor instelling pull-up, pull-down of geen van beide.
Ook zit er nu een externe 24Cxx EEPROM op, uit te breiden tot (tot nu toe) 1 Megabyte aan geheugen, mocht dit voor een nieuw idee nodig zijn.  


Componentenzijde met de vele aansluitingen middels 1mm pinnen (Conrad) waaroverheen een schuifstekertje past.
Hierop zit nog een 24C01 EEPROM, deze is inmiddels vervangen door een 24C512, die een veel groter geheugen heeft.
Dit was nodig voor opslag van telefoonnummers van de geïntegreerde nummermelder.
De aansluitingen van beide 8-pins EEPROM types zijn identiek, zodat dit verder geen probleem was.

 


Print met componentenopdruk die aangeeft welk type component, waar moet zitten.
 


Soldeerzijde masterprint met diverse SMD componenten.
 

8

8 De masterprint zit nu ingebouwd in een kunststof kast in de keuken, dit is zo'n beetje de enige plek waar de kabels zichtbaar zijn.
Verder toetsen om handmatig opdracht te geven om het PCF8583 klok-kalender IC met de DCF77 tijd te updaten, handmatig keukenraam openen/sluiten en een reserve toets.
Deze toetsen worden alleen voor uitzonderlijke situaties gebruikt, omdat DCF77 updating en openen/sluiten van de ramen normaal volledig automatisch gaan op basis van tijd, dag, datum en binnen/buiten temperatuur.
Bovendien zijn de ramen ook met de Pronto Neo afstandsbediening te bedienen.
(Ga met de muis op de foto staan voor een extra foto)

 


Voor een wijziging in het PIC programma hoeft de kast niet open.
De Galva-Wisp PIC programmer kan opzij in de kast worden gestoken om verbinding te maken met de master PIC (middels ICSP).

 


Later meer!

Nog niet alles is klaar (het is natuurlijk ook nooit af, er komt altijd weer wat bij).
Bovenstaand fluorescent display moet nog netjes ingedeeld worden met eventuele rotary encoder om door een menu heen te wandelen, hoewel eigenlijk alles al met de Pronto Neo afstandsbediening is in te stellen.
Plannen zijn er om naast de voordeur in de hal een kleine display te plaatsen waarop bijvoorbeeld staat hoe laat het bad gereed is vanavond en daarbij de vraag "Annuleren?" om het eventueel meteen te laten annuleren.
Ingewikkelde wensen moeten straks met een PC in te stellen zijn zonder een PIC te herprogrammeren, maar dat is nog verre toekomst (heeft bij mij geen prioriteit).

Frits Kieftenbelt.


Enkele interessante links met betrekking tot huisautomatisering:

Bwired.nl, een Nederlands geautomatiseerd huis online, zeer uitgebreid (Engelstalig)
Nederlands domotica forum