Project Embedded Linux Domaza
Elektronica-ICT
Dimitri Kozakiewiez Jonas Govaerts
Academiejaar 2014-2015 Campus Geel, Kleinhoefstraat 4, BE-2440 Geel
5
2
INHOUDSTAFEL INHOUDSTAFEL ...................................................................................... 2 1
DOMAZA ................................................................................... 3
1.1 1.1.1 1.1.2 1.1.3 1.1.4
Inleiding .................................................................................. 3 Wie zijn we? ............................................................................... 3 Wat doen we? ............................................................................. 3 Wat is domotica? ........................................................................ 3 Projecten ................................................................................... 3
2
BESCHRIJVING PROJECT DOMOTICA ....................................... 4
2.1 2.1.1 2.1.2
Inleiding .................................................................................. 4 Eisen ......................................................................................... 4 Specificaties ............................................................................... 4
2.1.2.1 2.1.2.2
Hardware ............................................................................................................ 4 Software ............................................................................................................. 4
3
LAY-OUT................................................................................... 5
3.1 3.2 3.3
Uitleg ....................................................................................... 5 Visuele opstelling ..................................................................... 5 Schematische opstelling .......................................................... 5
4
SOFTWARE ............................................................................... 6
4.1 4.2 4.3 4.3.1 4.3.2 4.3.3 4.3.4
Python ..................................................................................... 6 Crontab .................................................................................... 7 PHP .......................................................................................... 7 Uitlezen GPIO pins ...................................................................... 7 Layout ....................................................................................... 7 Index ........................................................................................ 8 Javascript .................................................................................. 8
5
SCHEMA ELEKTRONICA ............................................................ 9
5.1
Opstelling................................................................................. 9
BESLUIT…. ........................................................................................... 10 BIJLAGE ................................................................................................ 1 Lcd.py ................................................................................................ 1 Index.php............................................................................................... 5 Script.js ................................................................................................ 6
3
1
DOMAZA
1.1
Inleiding
Wij zijn Domaza, al een jaar maken wij domotica solutions alsof ze voor onszelf zijn. Degelijk en op maat gemaakt, nergens vindt je de kwaliteit en service van Domaza aan betere kwaliteit of aan een scherpere prijs. 1.1.1
Wie zijn we?
Domaza werd in 2014 opgericht door slechts 2 personen, Dimitri Kozakiewiez en Jonas Govaerts. Wij wisten toen dat er een grote toekomst zat in de domotica. Domaza sloot contracten af met Thomas More en later met de Domoticamaatschappij. Deze contracten waren van zeer groot belang voor het bestaan van Domaza. Anno 2014 is Domaza een van de wereldleiders in domotica solutions geworden. 1.1.2
Wat doen we?
Domaza heeft een uitgebreid aanbod van domotica solutions. De prijzen van deze industriële installaties varieert van de aard van de opdracht, alsook de plaats en materiaal hiervan. Zo kan een Domaza klant hun domotica solution zelf naar eigen wensen laten personaliseren. 1.1.3
Wat is domotica?
Domotica is de toepassing van diverse technieken in een woning met als bedoeling het leef- en wooncomfort te verhogen. De toegepaste technieken hebben betrekking op automatische regelingen op vijf verschillende domeinen: verlichting, klimatisatie, huishoudtoestellen, beveiliging en communicatie. 1.1.4
Projecten
Een van onze eerste projecten was om een domotica solution uit te bouwen voor een klant. Meer informatie vindt u hieronder.
4
2
BESCHRIJVING PROJECT DOMOTICA
2.1
Inleiding
De klant wou een domoticastructuur implementeren in zijn huis. Hiervoor moest het project uiteraard aan enkele eisen voldoen. 2.1.1
Eisen
Hieronder vindt u de vereisten waaraan ons project moest voldoen. De klant kan in alle kamers in het huis de lichten aan of uit doen De klant kan de verwarming hoger of lager zetten De klant moet de streeftemperatuur alsook de huidige tijd kunnen aflezen van het LCD scherm. 2.1.2
Specificaties
Hieronder vindt u de benodigdheden die we nodig hebben om ons project te kunnen realiseren. 2.1.2.1
Hardware
Raspberry Pi Model B+ 8 x LED 8 x Weerstand Solderless Bread Board
2.1.2.2
Software
WiringPi Appache Web Server
5
3
LAY-OUT
3.1
Uitleg
Op de modelweergave van de woning kan je de 8 lampen in de kamers zien. Deze led lampen kan je aan en uit zetten d.m.v. de web interface. Er is ook nog een LCD-scherm te zien bij de opstelling. Hierop kan de klant de huidige tijd en de temperatuur waarnemen. De temperatuur kan geregeld worden via de potentiometer. Als we de temperatuur regelen wordt ook een bijhorende LED zachtjes aangezet.
3.2
Visuele opstelling
3.3
Schematische opstelling
6
4
SOFTWARE
4.1
Python
Op de Raspberry Pi B+ maken we gebruik van de programmeertaal Python. We hebben op de Raspberry Pi B+ Wiring Pi geïnstalleerd. Dit stukje software zorgt ervoor dat we onze GPIO pins kunnen gebruiken. We hebben de belangrijkste code hieronder uitgelegd. De volledige code kan u terugvinden in de bijlage.
In bovenstaande code lezen we de potentiometer uit en bepalen we de temperatuur alsook de waarde van de bijhorende LED. Vervolgens bouwen we onze tekst op en geven deze weer op de LCD. De temperatuur en huidige tijd + datum worden afgebeeld op de LCD alsook onze namen.
7
4.2
Crontab
We hebben gebruikt gemaakt van een Crontab. Een crontab is een proces dat op bepaalde tijd start. We hebben ingesteld dat ons programma automatisch opstart bij het opstarten van de Raspberry Pi. Na een stroompanne moet de klant het programma niet meer manueel starten maar gebeurd dit automatisch.
4.3
PHP
Omdat onze klant de lichten in zijn woning wou beheren maken we gebruik van een webserver. Op de webserver draait een PHP-pagina waarmee we oproepen welke leds actief zijn en welke niet. 4.3.1
Uitlezen GPIO pins
Omdat we zeker willen zijn dat het licht in een bepaalde kamer al dan niet al aan staat hebben we een PHP-script geschreven dat gaat lezen welke GPIO-pins actief staan en welke niet.
4.3.2
Layout
We hebben een gebruiksvriendelijke interface gemaakt waarmee de lichten in huis makkelijk en overzichtelijk bestuurd kunnen worden.
8
4.3.3
Index
Om de layout op te bouwen hebben we gebruik gemaakt van onderstaande code. Hierin gaan we via PHP kijken welke lichten al aan staan en geven we de juiste afbeelding.
De volledige code en de bijhorende css kan u terugvinden in de bijlage. 4.3.4
Javascript
We maken gebruik van javascript om de GPIO pins uit te lezen en de juiste waarde door te geven met de bijhorende afbeelding. De volledige javascript code kan u terugvinden in de bijlage.
9
5
SCHEMA ELEKTRONICA
5.1
Opstelling
Hieronder vindt u de schematische opstelling van het elektronica schema.
10
BESLUIT…. Dit was een uitdagend maar leuk project. We hebben bepaalde technieken leren combineren en samenbrengen naar 1 geheel. We zijn wel enkele obstakels tegengekomen maar we hebben deze op een goede manier kunnen oplossen. Het project was een leuke herhaling van de verschillende methodes die we in de les hebben gezien.
1
BIJLAGE Lcd.py import RPi.GPIO as GPIO import time import datetime GPIO.setmode(GPIO.BCM) # use GPIO numbers GPIO.setwarnings(False) LCD_RS = 7 LCD_E = 8 LCD_D4 = 25 LCD_D5 = 24 LCD_D6 = 23 LCD_D7 = 18 LED_ON = 15 LCD_WIDTH = 16 LCD_CHR = True LCD_CMD = False LCD_LINE_1 = 0x80 LCD_LINE_2 = 0xC0 E_PULSE = 0.00005 E_DELAY = 0.00005 def readadc(adc, clk, Din, Dout, cs): if ((adc > 7) or (adc < 0)): return -1 GPIO.output(cs, True) GPIO.output(clk, False) GPIO.output(cs, False) commandout = adc commandout |= 0x18 commandout <<= 3 for i in range(5): if (commandout & 0x80): GPIO.output(Din, True) else: GPIO.output(Din, False) commandout <<= 1 GPIO.output(clk, True) GPIO.output(clk, False) adcout = 0 for i in range(12): GPIO.output(clk, True) GPIO.output(clk, False) adcout <<= 1 if (GPIO.input(Dout)): adcout |= 0x1 GPIO.output(cs, True) adcout >>= 1 return adcout clk = 11 Dout = 9
2
Din = 10 cs = 22 GPIO.setup(Din, GPIO.OUT) GPIO.setup(Dout, GPIO.IN) GPIO.setup(clk, GPIO.OUT) GPIO.setup(cs, GPIO.OUT) GPIO.setup(5,GPIO.OUT) p=GPIO.PWM(5,50) p.start(0) adc = 0 graden = 0 def main(): GPIO.setup(LCD_E, GPIO.OUT) GPIO.setup(LCD_RS, GPIO.OUT) GPIO.setup(LCD_D4, GPIO.OUT) GPIO.setup(LCD_D5, GPIO.OUT) GPIO.setup(LCD_D6, GPIO.OUT) GPIO.setup(LCD_D7, GPIO.OUT) GPIO.setup(LED_ON, GPIO.OUT) lcd_init() while True: trim_pot = readadc(adc, clk, Din, Dout, cs) if trim_pot < 100: graden = 15 led=10 elif trim_pot > 100 and trim_pot < 200: graden = 16 led=20 elif trim_pot > 200 and trim_pot < 300: graden = 17 led=30 elif trim_pot > 300 and trim_pot < 400: graden = 18 led=40 elif trim_pot > 400 and trim_pot < 500: graden = 19 led=50 elif trim_pot > 500 and trim_pot < 600: graden = 20 led=60 elif trim_pot > 600 and trim_pot < 700: graden = 21 led=70 elif trim_pot > 700 and trim_pot < 800: graden = 22 led=80 elif trim_pot > 800 and trim_pot < 900: graden = 23 led=90 elif trim_pot > 900: graden = 24 led=100 time.sleep(0.1) now = datetime.datetime.now()
3
tijd = now.strftime('%H:%M') datum = str(now.day) + "/" + str(now.month) + "/" + str(now.year) tijddatum = str(tijd) + " " + str(datum) temperatuur = "Temp: " + str(graden) + "C" p.ChangeDutyCycle(led) GPIO.output(LED_ON, True) time.sleep(2) lcd_byte(LCD_LINE_1, LCD_CMD) lcd_string("Project Embedded Linux") lcd_byte(LCD_LINE_2, LCD_CMD) lcd_string("Jonas / Dimitri") time.sleep(2) lcd_byte(LCD_LINE_1, LCD_CMD) lcd_string(temperatuur) lcd_byte(LCD_LINE_2, LCD_CMD) lcd_string(tijddatum) def lcd_init(): lcd_byte(0x33,LCD_CMD) lcd_byte(0x32,LCD_CMD) lcd_byte(0x28,LCD_CMD) lcd_byte(0x0C,LCD_CMD) lcd_byte(0x06,LCD_CMD) lcd_byte(0x01,LCD_CMD) def lcd_string(message): message = message.ljust(LCD_WIDTH," ") for i in range(LCD_WIDTH): lcd_byte(ord(message[i]),LCD_CHR) def lcd_byte(bits, mode): GPIO.output(LCD_RS, mode) GPIO.output(LCD_D4, False) GPIO.output(LCD_D5, False) GPIO.output(LCD_D6, False) GPIO.output(LCD_D7, False) if bits&0x10==0x10: GPIO.output(LCD_D4, True) if bits&0x20==0x20: GPIO.output(LCD_D5, True) if bits&0x40==0x40: GPIO.output(LCD_D6, True) if bits&0x80==0x80: GPIO.output(LCD_D7, True) time.sleep(E_DELAY) GPIO.output(LCD_E, True) time.sleep(E_PULSE) GPIO.output(LCD_E, False) time.sleep(E_DELAY) GPIO.output(LCD_D4, False)
4
GPIO.output(LCD_D5, False) GPIO.output(LCD_D6, False) GPIO.output(LCD_D7, False) if bits&0x01==0x01: GPIO.output(LCD_D4, True) if bits&0x02==0x02: GPIO.output(LCD_D5, True) if bits&0x04==0x04: GPIO.output(LCD_D6, True) if bits&0x08==0x08: GPIO.output(LCD_D7, True) time.sleep(E_DELAY) GPIO.output(LCD_E, True) time.sleep(E_PULSE) GPIO.output(LCD_E, False) time.sleep(E_DELAY) main()
5
Index.php <meta charset="utf-8" />
Raspberry Pi Gpio <style> img{ margin: 15px 15px 5px 15px; } ul { list-style: none; margin-left: 0px; } li { float: left; width: 100px; text-align: center; } li p { color: white; margin-top: 0px; } "; for ($i = 0; $i < count($status); $i++) { //set the pin's mode to output and read them system("gpio mode ".$i." out"); exec ("gpio read ".$i, $status[$i], $return ); echo "
"; //if off if ($status[$i][0] == 0 ) { echo (""); } //if on if ($status[$i][0] == 1 ) { echo (""); } echo "" . $naam[$i] . "
"; echo ""; } echo ""; ?> <script src="script.js">
6
Script.js var button_0 = document.getElementById("button_0"); var button_1 = document.getElementById("button_1"); var button_2 = document.getElementById("button_2"); var button_3 = document.getElementById("button_3"); var button_4 = document.getElementById("button_4"); var button_5 = document.getElementById("button_5"); var button_6 = document.getElementById("button_6"); var button_7 = document.getElementById("button_7"); function change_pin (pin, status) { var request = new XMLHttpRequest(); request.open( "GET" , "gpio.php?pin=" + pin + "&status=" + status ); request.send(null); request.onreadystatechange = function () { if (request.readyState == 4 && request.status == 200) { return (parseInt(request.responseText)); } else if (request.readyState == 4 && request.status == 500) { alert ("server error"); return ("fail"); } else { return ("fail"); } } } button_0.addEventListener("click", function () { //if red if ( button_0.alt === "off" ) { //use the function var new_status = change_pin ( 22, 0); if (new_status !== "fail") { button_0.alt = "on" button_0.src = "data/img/green/green.jpg"; return 0; } } //if green if ( button_0.alt === "on" ) { //use the function var new_status = change_pin ( 22, 1); if (new_status !== "fail") { button_0.alt = "off" button_0.src = "data/img/red/red.jpg"; return 0; } } } ); button_1.addEventListener("click", function () { //if red if ( button_1.alt === "off" ) { //use the function var new_status = change_pin ( 23, 0); if (new_status !== "fail") { button_1.alt = "on" button_1.src = "data/img/green/green.jpg";
7
return 0; } } //if green if ( button_1.alt === "on" ) { //use the function var new_status = change_pin ( 23, 1); if (new_status !== "fail") { button_1.alt = "off" button_1.src = "data/img/red/red.jpg"; return 0; } } } ); button_2.addEventListener("click", function () { //if red if ( button_2.alt === "off" ) { //use the function var new_status = change_pin ( 24, 0); if (new_status !== "fail") { button_2.alt = "on" button_2.src = "data/img/green/green.jpg"; return 0; } } //if green if ( button_2.alt === "on" ) { //use the function var new_status = change_pin ( 24, 1); if (new_status !== "fail") { button_2.alt = "off" button_2.src = "data/img/red/red.jpg"; return 0; } } } ); button_3.addEventListener("click", function () { //if red if ( button_3.alt === "off" ) { //use the function var new_status = change_pin ( 25, 0); if (new_status !== "fail") { button_3.alt = "on" button_3.src = "data/img/green/green.jpg"; return 0; } } //if green if ( button_3.alt === "on" ) { //use the function var new_status = change_pin ( 25, 1); if (new_status !== "fail") { button_3.alt = "off" button_3.src = "data/img/red/red.jpg"; return 0;
8
} } } ); button_4.addEventListener("click", function () { //if red if ( button_4.alt === "off" ) { //use the function var new_status = change_pin ( 26, 0); if (new_status !== "fail") { button_4.alt = "on" button_4.src = "data/img/green/green.jpg"; return 0; } } //if green if ( button_4.alt === "on" ) { //use the function var new_status = change_pin ( 26, 1); if (new_status !== "fail") { button_4.alt = "off" button_4.src = "data/img/red/red.jpg"; return 0; } } } ); button_5.addEventListener("click", function () { //if red if ( button_5.alt === "off" ) { //use the function var new_status = change_pin ( 27, 0); if (new_status !== "fail") { button_5.alt = "on" button_5.src = "data/img/green/green.jpg"; return 0; } } //if green if ( button_5.alt === "on" ) { //use the function var new_status = change_pin ( 27, 1); if (new_status !== "fail") { button_5.alt = "off" button_5.src = "data/img/red/red.jpg"; return 0; } } } ); button_6.addEventListener("click", function () { //if red if ( button_6.alt === "off" ) { //use the function var new_status = change_pin ( 28, 0); if (new_status !== "fail") { button_6.alt = "on"
9
button_6.src = "data/img/green/green.jpg"; return 0; } } //if green if ( button_6.alt === "on" ) { //use the function var new_status = change_pin ( 28, 1); if (new_status !== "fail") { button_6.alt = "off" button_6.src = "data/img/red/red.jpg"; return 0; } } } ); button_7.addEventListener("click", function () { //if red if ( button_7.alt === "off" ) { //use the function var new_status = change_pin ( 29, 0); if (new_status !== "fail") { button_7.alt = "on" button_7.src = "data/img/green/green.jpg"; return 0; } } //if green if ( button_7.alt === "on" ) { //use the function var new_status = change_pin ( 29, 1); if (new_status !== "fail") { button_7.alt = "off" button_7.src = "data/img/red/red.jpg"; return 0; } } } );