Automatiseer je huis met Arduino en Klik Aan Klik Uit

Automatiseer je huis met Arduino en Klik Aan Klik Uit

Gepubliceerd op: 26-10-2013 16:41 - Read this in English

Domotica, smart homes en home automation zijn hot-topics deze dagen. Misschien ken je het ‘Huis van de Toekomst’ van Chriet Titulaer nog? Dit zijn geen toekomstdromen meer, dergelijke producten zijn overal verkrijgbaar, maar Engineer at Home maakt het graag zelf!

2006: de parallelle poort

Een van mijn eerste pogingen tot het aansturen van verlichting deed ik jaren geleden. Ik had toen een interface gebouwd om via de parallelle poort relais aan te sturen, die op hun beurt weer 220 Volt konden schakelen. Na een tijdje bleek zo’n centrale aansturing toch niet echt handig, overal liepen 220 volt kabels door mijn kamer, terwijl uiteindelijk het hele schakelbord vanuit één stopcontact gevoed werd…

Poging 2: Klik Aan Klik Uit

Jaren later vond ik de oplossing in Klik Aan Klik Uit modules. Het zogeheten KAKU systeem maakt gebruik van een relais en een 433 MHz ontvanger die je in het stopcontact steekt, en een draadloze afstandsbediening om ze te schakelen. Dankzij de voortreffelijke 433 MHz library van Fuzzillogic is het relatief eenvoudig om de stekkerdozen op een intelligente manier aan te sturen.

Arduino home automation

Arduino KAKU home automation systeem

Wat heb je nodig om ook zo’n intelligente KAKU-unit te bouwen? Allereerst een Arduino als kloppend hart van het systeem. Wil je, net als ik, de boel zonder computer laten werken, maar wel kunnen bijsturen met je telefoon of tablet, dan heb je ook een Ethernetshield nodig. En de belangrijkste componenten zijn natuurlijk de 433 MHz-zender en -ontvanger die het mogelijk maken met de KAKU-stekkerdozen te praten. Je bestelt ze bijvoorbeeld bij Conrad of AliExpress.

Bekijk de datasheet van jouw zender en ontvanger voor de juiste aansluiting. Beide hebben in ieder geval +5V en ground nodig, de Tx van de zender kan je met een willekeurige poort van de Arduino aansturen. De Rx van de ontvanger moet op een poort met interrupt worden aangesloten, dat zijn pin 2 en 3 bij een Arduino Uno / Duemilanove. Als antenne gebruik je gewoon een stukje draad van ongeveer 13 cm.

Schema van het Arduino KAKU home automation systeem

Naast deze zender en ontvanger heb ik op mijn home automation systeem ook een temperatuursensor (NTC) en een lichtsensor (LDR) aangesloten. Zo kan ik automatisch het licht aan laten gaan als het donker wordt, en de afzuiging wat harder laten draaien als het te warm wordt. Verder is het van belang dat je Arduino weet hoe laat het is, hiervoor gebruik ik de Time library. Nu kan je home automation systeem ’s nachts de tuinverlichting uit doen, en ’s ochtends je bedlampje aan.

Goedkope PIR bewegingsmelder

Een andere nuttige toevoeging zijn bewegingssensors. Ik wilde eerst gebruik maken van standaard PIR detectors, maar de draadloze versies van Klik Aan Klik Uit zijn natuurlijk veel te duur. Uiteindelijk stuitte ik op een aanbieding van 230 Volt bewegingsmelders voor € 1,50! Ik besloot er op te gokken dat hier gebruik was gemaakt van een goedkoop OEM product, en dat de kans dus groot was dat hier een standaard printje in zat.

Na demontage trof ik inderdaad twee keurig gescheiden printjes: een PIR module werkend op +- 5V tot 24V en een 230V relaismodule met spannings-omvormer naar 8V. Na verwijderen van het 230 Volt deel en enig experimenteren heb ik de pin-out vastgesteld op Vcc, GND en output, v.l.n.r. op de foto.

Pinout van een OEM PIR sensor

Programmeren van de Arduino

Omdat elke situatie en elk huis anders is zal ik hier niet mijn volledige code plaatsen. Wel zal ik in hoofdlijnen beschrijven hoe de code is opgebouwd.

In de mainloop van het programma worden de tijdskritische processen uitgevoerd, dat is in dit geval alleen het uitlezen van de sensoren. Voor het bijhouden van de tijd en het decoderen van de radiofrequente signalen maken de library’s gebruik van interrupt routines, hier hoef ik me dus geen zorgen over te maken.

void loop() {
  sensorTemp = analogRead(PsensorTemp) - 238;
  sensorTemp = pgm_read_word(&temps[sensorTemp]);
  // temperatuur bij voltage opzoeken in lookup-table
  if (sensorTemp > maxTemp) {maxTemp = sensorTemp;};
  if (sensorTemp < minTemp) {minTemp = sensorTemp;};

  sensorBuitenTemp = analogRead(PsensorTempBuiten) - 238;
  sensorBuitenTemp = pgm_read_word(&temps[sensorBuitenTemp]);
  // temperatuur bij voltage opzoeken in lookup-table
  if (sensorBuitenTemp > maxBuitenTemp) {maxBuitenTemp = sensorBuitenTemp;};
  if (sensorBuitenTemp < minBuitenTemp) {minBuitenTemp = sensorBuitenTemp;};

  sensorLicht = analogRead(PsensorLicht) / 10.23;
  if (sensorLicht > maxLicht) {maxLicht = sensorLicht;}
  if (sensorLicht < minLicht) {minLicht = sensorLicht;}

  Automation_Events();
  // Events loop

  WebServer();
  // Check voor inkomende verbindingen en laat webserver draaien

  if ((hour() != prevHour) && timeOK) {
    // Elk uur data loggen naar SD
    prevHour = hour();
    Log_Data();
  }

  if ((weekday() != prevDay) && timeOK) {
    // 0.00u alles resetten
    prevDay = weekday();
    maxTemp = sensorTemp;
    minTemp = sensorTemp;
    maxBuitenTemp = sensorBuitenTemp;
    minBuitenTemp = sensorBuitenTemp;
    maxLicht = sensorLicht;
    minLicht = sensorLicht;
    resetServer();
  }
}

Vanuit de mainloop worden eens in de zoveel tijd de andere functies aangeroepen, zoals het loggen naar de SD-kaart, het draaiend houden van de webserver, en het bijhouden en uitvoeren van tijd- en/of sensor gestuurde events. Verder kent het systeem een actief (thuis) en een standby (weg/slapen) status, waar de verschillende events weer rekening mee houden. Zo gaat het licht aan als het donker wordt als het systeem actief is, maar niet als het standby is.

Natuurlijk willen we de controle houden, dus ondanks dat alles automatisch gaat moet er een mogelijkheid zijn om de lichten zelf ook aan en uit te doen. Doordat ik ook een RF ontvanger heb aangesloten op mijn Arduino kan ik signalen van de originele afstandsbediening opvangen. Wanneer je hiermee een KAKU-module uitschakelt veranderd de status van de module in het geheugen van de Arduino mee.

Grafische interface

Het neusje van de zalm van dit project is de grafische interface die door de Arduino vanaf SD-kaart wordt geserveerd, zonder tussenkomst van computer!

grafische interface van het Arduino KAKU home automation systeem

De interface is gebouwd in html en css en is volledig responsive, dat wil zeggen dat de 'widgets' automatisch worden gerangschikt zover de schermafmetingen dat toelaten. Op een groot breedbeeldscherm komen er dus veel widgets naast elkaar, en op mobiel komt alles onder elkaar.

De Arduino webserver stelt de pagina samen met behulp van de html-pagina die op de SD-kaart is opgeslagen, en vult deze live in met de juiste sensorgegevens en schakelstatussen. De Arduino server draait niet alleen in het lokale netwerk maar is ook (beveiligd) van buitenaf te benaderen. Op deze manier kan ik dus overal vandaan mijn huis in de gaten houden, en bijsturen indien nodig.

Heb jij ook een home automation oplossing gebouwd naar aanleiding van dit artikel? Laat het me weten in de reacties hieronder!

31-05-2015: Hier vind je het volledige code-pakket van de domotica controller.

47 reacties op dit artikel »

Aanbevolen artikelen