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)

 


Profitec netadapter
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 forum:
- De afscherming als stroomvoerende GND heeft z'n voor- en nadelen, op het forum een discussie.
- Nog een discussie
Gebruik de zoekfunctie aldaar, er zijn nog wel meer discussies over dit onderwerp op het C.O. forum.

Ikzelf gebruik een redelijk goedkope 2 × 0,5mm² kabel met afscherming.
Een betere maar ook duurdere kabel is de 75 10 04 van Conrad.


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 en display)
- Uitlezen buitentemperatuur (met een DS1820)
- Uitlezen kamertemperatuur (met een DS1820)
- Uitlezen keukentemperatuur (met een DS1820)
- Motorbesturingen van ramen keuken en slaapkamer (PWM regeling)
- Temperatuurinstelling Nefit thermostaat (300 Baud)
- 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)
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)
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
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)
- 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 / storing)
- 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.

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 30 en 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.
 


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 ramen 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).

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 stapt.

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

 
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 eenmalig over te laten gaan (ding-dong) en de PIC in de slaapkamer reageert op dezelfde opdracht door een ringtone over de luidspreker te geven die snel in volume aanzwelt.
Zodra uit bed gestapt wordt, stopt de ringtone.
 


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


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
 


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 de 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
 



Philips Pronto Neo.
   
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.
Voor het openen of sluiten van het keukenraam druk je dus op de virtuele toets waarop staat 'Keukenraam'.

Meer info Pronto Neo
 


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
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
XTAL          = 20            ;Gebruik een kristal van 20MHz
HSERIAL_BAUD  = 2400          ;Transmissiesnelheid van de data over de bus
HSERIAL_RCSTA = %10010000     ;Bit7:Enable serial port / Bit4:Continu ontvangen
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

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 Proton 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
ALL_DIGITAL TRUE              ;Alle ingangen digitaal
XTAL          = 20            ;Gebruik een kristal van 20MHz
HSERIAL_BAUD  = 2400          ;Transmissiesnelheid van de data over de bus
HSERIAL_RCSTA = %10010000     ;Bit7:Enable serial port / Bit4:Continu ontvangen
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
;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

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)

ON_INTERRUPT GOTO InterruptAfhandeling ;Spring naar label als data is ontvangen door de USART
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
  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 registers, ga terug naar plek waar 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 worden uitgevoerd.
Als er geen timeout was opgegeven, dan zou het programma de PIC kunnen ophangen en maar blijven wachten op data.


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 (thermostaat, bad vullen op bepaalde dagen en tijd, ramen openen/sluiten, 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.
 


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.
 


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