Digitala Projekt (EITF11) Larmanläggning

Relevanta dokument
LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

EIT. Digitala projekt EITF11. Larmanläggning. Handledare Bertil Lindvall Anna Lindberg I-11 Caroline Vitasp I-11 Eric Eliason I-10

Digitala Projekt(EITF40) - Larm

Digitala Projekt(EITF40) - Larm

The Phenomenal Doorbell Bilaga 2. Källkod

Växtviskaren EITF11 Digitala projekt VT15, I12

Digitala Projekt (EITF11) Hemlarm

Larmcentral. Digitala Projekt. Cecilia Olsson & Erika Björck Handledare: Bertil Lindvall LUNDS TEKNISKA HÖGSKOLA

Lunds Tekniska Högskola Elektro- och informationsteknik Digitala projekt (EITF11)

#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char num;

DIGITALA PROJEKT (EITF40) Fartmätare

1 Bakgrund 4. 2 Kravspecifikation Definitioner Grundläggande krav Användarfall 5

Källkod. #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define green_diode PD5. #define RS PD4

DIGITALA PROJEKT - EITF11

Effektpedal för elgitarr

Feeding Daisy. EITF11 Lunds Tekniska Högskola. Grupp 12: Pontus Akervall Louise Landare Anton Schölin. En automatisk blomvattnare

EITF11 - Digitala Projekt

Rapport. Fyra i rad-spel. Rapport Digitala Projekt EITF11 Grupp 9 Emma Rasmusson & Louise Ragnarsson Handledare: Bertil Lindvall

LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

EITF11 - Digitala projekt. Hastighetsmätare. Hugo Backmyr Mattias Karlsson

Väderstation. Digitala Projekt EITF11 Institutionen för Elektro- och Informationsteknik Lunds Tekniska Högskola

Digitala Projekt (EITF11)

Projektrapport - Roterande digital LED-klocka

Rafiki Wa Kupanda. EITF11, Digitala projekt VT18. Linnea Håkansson, Anton Gunneberg, Ruben Schultz

Rörelse- och temperaturkänsligt larmsystem

Thunder s Truck projektrapport

Projektrapport Målgång

TEMPERATURMÄTARE MED GRAFRITARE

Laboration 4: Knappstuds Drivrutiner för att eliminera störningar.

PlantPuppy Räddaren för den som inte kan hålla växterna vid liv

Digitala Projekt EITF11 Grupp 9 Projektarbete Hanna Bondesson Marcus Skog. Reaktionsspel EITF11

EITF40 - RFID-terminal. Joakim Marculescu (dt08jm6), Eric Johansson (dt08ej6)

Digitala Projekt: Digitala Projekt, EITF11 - VT17 Oscar Ahlgren, Patrik Lorentsson och Sten Hellberg Handledare: Bertil Lindvall

Projektrapport - RoboWalter

Digitala System Projekt - EITA15 VT *SUPER DUPER KLOCKAN*

Digitala projekt, EDI021 Rapport Handledare: Bertil Lindvall

The Secure Light. Digitala Projekt EITF11. Hanna Tinglöf, I-12 Anna Horvath, I-12 Filippa Österlin, I-12. Handledare: Bertil Lindvall

Bilen som inte kan krocka

Projektrapport - Feststation

High Core Remote Car X8000 Cool

Lunds Tekniska Högskola. I-10 Grupp 11: David Sundström Max Schulz Albert Lundberg Handledare: Bertil Lindvall

EITF11: Bandkanon Grp 05

ETSA01 Digitala Projekt (I) VT- 13. Projektarbete AC Handledare Bertil Lindvall

Innehållsförteckning. Figur- och tabellförteckning. Figure 1 Blockschema över hårdvaran...4 Figure 2 Blockschema över programet...

EITF11. WormFight. Axel Eriksson, Felix Geuken Handledare: Bertil Lindvall EITF11

/* * dancing3.c * * Created: :53:20 * Author: digpi10 */ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.

Rapportsammanfattning. Optima Sous Vide

THE VISUAL EGGTIMER. Skola: Lunds Tekniska Högskola Institution: Elektro- och informationsteknik Kurs: Digitala projekt (EITF11)

JOFEN-Prototypes. Målsökande pansarvagn. Projektarbete i Kursen EITA15. Jonatan Claesson, Olle Jonasson, Felix Rödén, Edvin Rossi & Nils Olén

The Intelligent Timer

DIGITALA PROJEKT Väderstation

Rapport Digitala Projekt EITF Grupp 12 Elin Blomstergren, Victor Sundgren Handledare: Bertil Lindvall. Fyra i rad

EITF11 Digitala Projekt TIC TAC TOE. Lukas Ljungblom & Johan Lyckenvik I-13 Handledare: Bertil Lindvall

Jan Babor och Oscar Ågren Handledare: Bertil Lindvall 5/16/2011

Linjeföljare Digitala projekt Johan Engström e02je Henrik Persson e02hp

Väderstation. Datum: Projektarbete vid elektro och informationstekniks institution

Projektlaboration 4, synkronisering av klockan

Liftmaestro. Lunds Tekniska Högskola Elektro- och informationsteknik. Olle Gemfors, I13 Dayanand Sagar, I13 Mattias Wendler, I13

Kla ggvisarskylt. -med en underton av rassel. av Jonathan So nnerup & Gabriel Jo nsson

Pulsmätare Digitala Projekt EITF11

Projekt Digitala system. Rörelsekänsligt Larmsystem

LOOKY LUKE. Caroline Hellström och Ville Orlander Arvola Industriell ekonomi I10. - Att välja en lyckosam väg EITF11 Digitala projekt

Pulsmätare. EITF11 Digitala Projekt VT15. Grupp 9: Emma Albertz, Mathilde Hagander & Alexandra Mansner Handledare: Andreas Johansson & Bertil Lindvall

Laboration 5 C-programmering på AVR TSEA57 Datorteknik I

Rapport i Digitala Projekt (EDI021)

RAPPORT: DIGITALA PROJEKT

LTH Ingenjörhögskolan vid Campus Helsingborg. Mastermindspel

Snake. Digitala Projekt (EITF11) Fredrik Jansson, I-12 Lunds Tekniska Högskola,

Temperaturmätare med lagringsfunktion DIGITALA PROJEKT EITF11 GRUPP 14, ERIK ENFORS, LUDWIG ROSENDAL, CARL MIKAEL WIDMAN

Lunds Tekniska Högskola EITF11 Digitala projekt. Bandspelaren

Väderstation. EITF11, Digitala projekt RAPPORT. Isabella Bergvik, Emma Sandén & Hanna Åberg

Rapport Digitala Projekt EITF11 Grupp 4 Axel Sundberg, Jakob Wennerström Gille Handledare: Bertil Lindvall

Pulsmätare med varningsindikatorer

LTH. EITF11- Digitalaprojekt. Projektrapport WEB

Guitar Tuner EITF11 Digitala Projekt, Projektrapport Elektro- och informationsteknik

Digitala projekt, EITF11 - Rapport Handledare: Bertil Lindvall. Fredrik Nylund (ine12fny) Johan Ekman (ine11jek) Olof Wikman (ine11owi)

Projektrapport i Digitala System

Digitala Projekt VT13. PING-Pong

Guitar tuner Digitala Projekt (EITF40)

EDI021 Digitala projekt. Rapport LARMSYSTEM. Utförd av: Niklas Eklund E03 David Olsson E04. Inlämnad:

Aml Abbas, Ali Darwish, Ehsanolah Hafezi, Fatima Zahra Doussi Grupp 15

SIMON SAYS Projekt i EITF11 Digitala Projekt

AVR 3 - datorteknik. Avbrott. Digitala system 15 hp. Förberedelser

Microprocessor / Microcontroller. Industrial Electrical Engineering and Automation

Projekt EITA15. Väckarklocka. LTH Ingenjörshögskolan vid Campus Helsingborg Datateknik

Rapport: Väderstation

Digitala projekt Linjeföljande bil

Studera databladen för LCD på sid 4, 5, 7, 8, 14, 18, 19, 20 och 23. Datablad finns på kurshemsidan.

TEMPERATUR OCH VINDMÄTARE MED HÖGTALARFUNKTION

Digitala projekt VT Myran

Tidsstyrd persiennöppnare

WALL E. WALL EVADER EDI021 DIGITALA PROJEKT

RemoteBud. Inlämnas: Patrik Johnsson, e01pjo Viktor Karlsson, e01vk

Blue Key Digitala projekt VT

LUNDS TEKNISKA HÖGSKOLA. Väderstation. Digitala Projekt, EITF11. Martin Olofsson, I08 & Fredrik Oher, I08 Vt 2012

Användarmanual 948 GSM-GPRS

TETRIS. LTH, Campus Helsingborg EITA15 Digitala System

EDI022. Digitala Projekt. Rapport. Björn Åkesson 5/20/2011

PROJEKTTYP: Rapportsammanfattning STUDENTER: Larsson, J. ( ) och Oredsson, J. ( ) DATUM: 26 april, 2015

Från idé till skapelse av en äkta RoomBot

Transkript:

Digitala Projekt (EITF11) Larmanläggning Handledare: Bertil Lindvall 2013-05-20 Caroline Brandt, Jonathan Bratel, Angelika Jansson,

Sammanfattning Kursen Digitala Projekt (I) har som syfte att skapa förståelse för hur konstruktionsarbete går till. För att uppnå detta skulle alla kursdeltagare planera och genomföra ett projekt där en fungerande prototyp med tillhörande dokumentation skulle tas fram. Denna rapport beskriver arbetsprocessen i samband med framtagningen av en larmanläggning. Rapporten beskriver dels larmets olika komponenter men även den mjukvara som tagits fram samt hur arbetsprocessen har fortlöpt. Slutligen presenteras även resultatet av detta projekt samt reflektioner över de problem som uppstått och hur prototypen skulle kunna utvecklas i framtiden.

Innehållsförteckning 1 Inledning... 4 2 Kravspecifikation... 5 3 Hårdvara... 6 3.1 Kopplingsschema... 6 3.2 Processor... 6 3.3 Knappsats... 6 3.4 LCD-skärm... 6 3.5 Magnetkontakt... 6 3.6 Lysdioder... 7 3.7 IR-sensor... 7 3.8 COM-port... 7 3.9 Kristall... 7 4 Mjukvara... 7 5 Arbetsprocessen... 8 6 Slutsats... 8 7 Kod... 9 8 Referenser... 21

1 Inledning Detta projekt ska resultera i ett larmsystem som känner av om dörrar eller fönster öppnas då larmet är aktiverat. Som en extra säkerhet ska larmet även känna av om personer rör sig i rummet då larmet är aktiverat. Insignaler till larmet ges av en knappsats samt en digital och en analog sensor. Knappsatsen kan användas till att aktivera eller inaktivera larmet samt till att byta kod för larmet. Utsignal till larmet består av en röd LED, en gul LED, en grön LED och en display. Ut- och insignaler till larmet kan även skickas från en dator via en COM-port som finns inkopplad på larmet. Exempelvis kan larmet avaktiverats från datorn när larmet har gått. På datorn kan även alla kommandon som utförs på larmet följas. Bild 1: Larmsystemet då larmet gått 4

2 Kravspecifikation Larmet ska kunna hantera insignaler från en digital och en analog sensor. Anläggningen ska innehålla en knappsats för val av olika operationer samt inläsning av numerisk kod. Larmet ska kunna kopplas till en dator. Larmet ska kunna aktiveras och avaktiveras med en numerisk kod på fyra siffror. Efter att larmet har aktiverats tar det 10 sekunder innan larmet går på. Om en sensor registrerar rörelse ska koden matas in inom 10 sekunden, annars går larmet. Om larmet går ska larmets röda, gula och gröna LED lysa och signaler ska skickas till eventuell larmcentral. Om larmet går ska tiden för detta registreras och visas i displayen. Om larmet är aktiverat lyser larmets röda LED och texten AlarmON visas på displayen. Om larmet avaktiveras släcks larmets alla LED och texten AlarmOFF visas på displayen. Larmets gröna LED blinkar även till. Koden för aktivering och inaktivering ska kunna ändras. 5

3 Hårdvara 3.1 Kopplingsschema Bild 2: Kopplingsschema 3.2 Processor En ATmega16 High-performance AVR 8-bit Microcontroller utgör grunden till hela vårt larm. Med hjälp av en JTAG har den mjukvara vi skrivit laddats över till processorn. 3.3 Knappsats En 16-bitars knappsats som kopplats till en kodare (MM54C922/MM74C922 16-Key Encoder). Med hjälp av kodaren får varje knapp en viss kod som underlättar programmeringen av mjukvaran. Knappsatsen har en knapp för aktivering, en knapp för avaktivering samt en knapp för byte av kod. Dessutom finns knappar för siffrorna 0 9 vilka används för att mata in koden. Övriga knappar används ej. 3.4 LCD-skärm En LCD-skärm (SHARP Dot-Matrix, LCD Units Alfanumerisk teckendisplay) som används för kommunikation mellan larmet och användaren. Här skrivs status för larmet och uppmaningar till användaren ut då input efterfrågas. 3.5 Magnetkontakt En switch används för att symbolisera ingångsdörren till rummet. Ett tryck på knappen motsvarar att dörren öppnas. 6

3.6 Lysdioder Tre stycken lysdioder (en röd, en gul och en grön) används som komplement till LCDskärmen, för att kommunicera i vilket läge larmet befinner sig. 3.7 IR-sensor En IR-detektor (Siemens PID 11T) används för att registrera rörelser i rummet. Uppfattad rörelse leder till en ändring i spänningen som skickas till processorn. 3.8 COM-port Via en COM-port kan larmet kommunicera med en extern dator som skulle kunna fungera som en larmcentral. COM-porten kopplas via en MAX233 till processorn eftersom COM-porten har en spänning på -12V till +12V medan processorn endast har en spänning på 0V till +5V. 3.9 Kristall En CMACKD 8MHz kristall används för att få en mer exakt klocka hos processorn. Detta är nödvändigt när processorn ska synkroniseras till en dator via COM-porten. Utan kristallen kan data förvrängas vid överföringen. 4 Mjukvara Programmet är uppbyggt så att det är en huvudloop som körs kontinuerligt fram till dess att någon typ av avbrott sker. I denna loop läses sensorerna av och härifrån styrs även larmets LED-lampor utifrån vilket tillstånd larmet befinner sig i. Vissa utskrifter på LCD-displayen initieras även från huvudloopen. Avbrott sker då någon av knappsatsens tangenter trycks ner. När detta inträffar går programmet in i en metod som tar reda på vilken knapp som har tryckts ner och skickar sedan denna information vidare till en metod som initierar det kommando som ska göras. En annan typ av avbrott som använts vid programmeringen är ett tidsavbrott. Detta används för att tiden ska räknas upp under hela den period som larmet är aktiverat. Uppräkning av tiden är nödvändigt dels eftersom tiden då larmet går ska registreras och eftersom larmet ska gå först 10 sek efter att någon av sensorerna reagerat. 7

5 Arbetsprocessen Arbetet inleddes med att en kravspecifikation för den färdiga produkten togs fram. Utefter denna skrevs en specifikation över vilken hårdvara som skulle komma att behövas och i samband med detta ritades även en första grov skiss på ett kopplingsschema upp. När detta var gjort utvecklades kopplingsschemat så att det tydligt beskrev hur alla komponenter skulle kopplas till processorn samt till varandra. Detta låg sedan till grund för all koppling som skedde vid framtagningen av vår prototyp. När prototypen var klar påbörjades testningen av de olika komponenterna för att säkerställa att allt fungerade som det skulle. Denna testning gjordes med hjälp av programmet AVR Studio vilket även användes vid framtagningen av mjukvaran. I detta skede upptäcktes missar som gjorts under den inledande kopplingen och detta fick då åtgärdas. Själva kodningen gjordes i språket C. Under kodningens gång hämtades information om språkets uppbyggnad främst från boken The C Programming Language (Kernighan & Ritchie) men även från olika hjälpsajter på internet. 6 Slutsats Projektet resulterade i ett larm som dels känner av ifall dörren till ett rum öppnas och dels känner av rörelser i rummet. Om någon av larmets sensorer triggas kommer larmet att gå efter 10 sekunder om inte rätt kod matas in. Funktioner för att byta kod samt att kunna kommunicera med en annan dator har även lagts till. Alla krav som ställdes på produkten i det inledande skedet av arbetsprocessen har uppnåtts och ytterligare funktioner har även lagts till. Svårigheter som uppkommit längs arbetets gång har främst berott på en ovana och okunskap inom ämnet elektronik. Förståelsen för hur arbetsprocessen inom området elektronik går till har ökats och den förkärlek för datablad som tidigare var helt obefintlig blomstrar nu mer än någonsin. Skulle ytterligare förbättringar till produkten genomföras kan det vara lämpligt att uppgradera kopplingen mellan larmet och den externa datorn så att denna kan göras trådlös vilket gör larmet mer effektivt och verklighetstroget. Ytterligare en implementeringsförbättring som skulle göra larmet mer effektivt och säkert är att byta ut den knapp som inbrottstjuven i nuläget behöver trycka på för att utlösa larmet mot en magnetkontakt som kan monteras i dörröppningen. 8

7 Kod #include <avr/io.h> #define F_CPU 8000000UL #include <avr/interrupt.h> #include <util/delay.h> #include<util/delay.h> #define USART_BAUDRATE 9600 #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) #define red #define yellow #define green PA7 PA5 PA6 unsigned int activated = 0; unsigned int alarmtrigged = 0; unsigned int deactivated = 1; unsigned int alarmready = 0; unsigned int alarmreadysec = 0; unsigned int actbypin = 0; unsigned int timer = 0; unsigned int expectpin = 0; unsigned int sek = 0, min = 0, h = 0; unsigned int changingcode = 0; unsigned char pincode[4] = {'1', '2', '3', '4'; unsigned char pincodetry[4]; unsigned int charnbr = 0; unsigned int newcharnbr = 0; unsigned int pincounter = 0; unsigned int irtimer = 0; int timevect[8]; volatile uint8_t count; void insertcode(char letter); unsigned short int compare(); void printwrongpin(); void printactivated(); void printexpectpin(); void printalarm(); char getbutton(unsigned short code); void void void printscreen(char ch); void setscreen(char com); void setpin(char port, char pin, char state); void enablekeypadinterrupt(); void enabletimeinterrupt(); void setled(char led, char state); void checkswitch(); void void printalarmoff(); void readsensor(); void showtime(int hour, int minute, int second); void displaynum(int nu); void printon(); void readsensors(); 9

void showtime(int hour, int minute, int second); void alternatives(); void threestrikes(); void printalreadyoff(); void printalreadyon(); uint16_t adcresult = 0; void USARTInit() { UBRRL = 0xCF; //Set Baud rate UBRRH = 0x00; UCSRC = (1<<UCSZ1) (1 << UCSZ0) (1<<URSEL); //Set frame format (char size 8) UCSRB = UCSRB (1<<RXEN) (1<<TXEN); //Enable receiver and transmitter char usartread() { while(!(ucsra & (1<<RXC))); //Wait until data is available return UDR; void usartwrite(char data) { while(!(ucsra & (1<<UDRE))); //Wait until the buffer is empty UCSRA = UCSRA (1<<UDRE); // Set UDRE = 1 UDR = data; UCSRA = UCSRA & ~(1<<UDRE); //Set UDRE = 0 void main(void){ DDRD = 0xFF; DDRB = 0xFF; DDRA = 0xEF; setscreen(0b00001111); // Screen ON setscreen(0b00111000); // Set function enablekeypadinterrupt(); enabletimeinterrupt(); USARTInit(); while(1) { DDRD = 0x00; DDRD = 0xEF; ADCSRA = (1 << ADEN); if(activated &&!changingcode) { if (actbypin && timer < 2) { setled(yellow, 1); printactivated(); if (timer >= 10){ setled(yellow, 0); timer = 0; actbypin = 0; 10

setled(red, 1); printon(); else if(alarmtrigged) { setled(red, 1); setled(yellow,1); setled(green, 1); _delay_ms(200); printalarm(); _delay_ms(200); showtime(h, min, sek); h, min, sek = 0; _delay_ms(2000); alarmtrigged = 0; readsensors(); else if (deactivated &&!changingcode) { deactivated = 0; alarmtrigged = 0; activated = 0; alarmreadysec = 0; timer = 0; _delay_ms(200); printalarmoff(); setled(red, 0); setled(yellow, 0); setled(green, 1); _delay_ms(1000); setled(green, 0); _delay_ms(100); ISR(INT0_vect) { // Interrupts when there is data available from the keypad cli(); DDRC = 0x00; PORTC = 0x00; unsigned short int code = PINC; char letter = getbutton(code); _delay_ms(200); if(letter == 'q') { // change code printold(); printexpectpin(); changingcode = 1; else if(letter == 'r') { // deactivate if(activated) { printexpectpin(); 11

else { printalreadyoff(); else if(letter == 's') { // activate if(!activated) { printexpectpin(); else { printalreadyon(); else { insertcode(letter); // any of the numbers 0 to 9 if(charnbr == 4) { charnbr = 0; if(changingcode == 2) { changepin(); changingcode = 0; _delay_ms(100); printchanged(); else { alternatives(); sei(); void changepin() { for(unsigned int i = 0; i<=3; i++) { pincode[i] = pincodetry[i]; void insertcode(char letter) { pincodetry[charnbr] = letter; printscreen(letter); charnbr++; void alternatives() { // Investigates if the alarm should be activated or deactivated if(changingcode == 1) { if(compare()) { _delay_ms(50); printnew(); printexpectpin(); changingcode = 2; else { printwrongpin(); changingcode = 0; _delay_ms(1000); _delay_ms(50); else { 12

activated -> Deactivate activated -> Activate if(compare() && activated) { //If the PIN is correct and the alarm is deactivated = 1; activated = 0; alarmready = 0; else if(compare() &&!activated) { // If the PIN is correct and the alarm isn't else { activated = 1; actbypin = 1; printwrongpin(); _delay_ms(2000); threestrikes(); void threestrikes() { // Wrong PIN-code three times triggers the alarm if (activated) { pincounter++; if (pincounter == 3) { alarmtrigged = 1; pincounter = 0; unsigned short int compare() { for(unsigned short int k = 0; k < 4; k++) { if(pincode[k]!= pincodetry[k]) { return 0; return 1; void printchanged() { printscreen('c'); printscreen('h'); printscreen('a'); printscreen('n'); printscreen('g'); printscreen('e'); printscreen('d'); printscreen('p'); printscreen('i'); printscreen('n'); printscreen(' '); _delay_ms(1500); printscreen(' '); printscreen('o'); printscreen('k'); _delay_ms(1000); 13

void printalreadyoff() { _delay_ms(50); printscreen('a'); printscreen('l'); printscreen('r'); printscreen('e'); printscreen('a'); printscreen('d'); printscreen('y'); printscreen('o'); printscreen('f'); printscreen('f'); _delay_ms(1000); _delay_ms(50); void printalreadyon() { _delay_ms(50); printscreen('a'); printscreen('l'); printscreen('r'); printscreen('e'); printscreen('a'); printscreen('d'); printscreen('y'); printscreen('o'); printscreen('n'); _delay_ms(1000); _delay_ms(50); void printold() { printscreen('o'); printscreen('l'); printscreen('d'); void printnew() { printscreen('n'); printscreen('e'); printscreen('w'); void printwrongpin() { printscreen('w'); printscreen('r'); printscreen('o'); printscreen('n'); printscreen('g'); printscreen('p'); printscreen('i'); 14

printscreen('n'); void printon() { _delay_ms(200); printscreen('a'); printscreen('l'); printscreen('a'); printscreen('r'); printscreen('m'); printscreen('o'); printscreen('n'); _delay_ms(2000); void printexpectpin() { printscreen('p'); printscreen('i'); printscreen('n'); printscreen(':'); void printalarm() { _delay_ms(100); printscreen('*'); printscreen('a'); printscreen('l'); printscreen('a'); printscreen('r'); printscreen('m'); printscreen('!'); printscreen('*'); _delay_ms(2000); _delay_ms(50); void printalarmoff(){ printscreen('a'); printscreen('l'); printscreen('a'); printscreen('r'); printscreen('m'); printscreen('o'); printscreen('f'); printscreen('f'); _delay_ms(2000); void printactivated() { printscreen('a'); printscreen('c'); printscreen('t'); printscreen('i'); 15

printscreen('v'); printscreen('a'); printscreen('t'); printscreen('e'); _delay_ms(2000); uint16_t readadc() { ADMUX = (1 << MUX2); // Set ADC Channel to 4 (Used by the IR Detector) ADCSRA = (1 << ADSC); // Starts a single conversion while(!(adcsra & (1 << ADIF))); // Wait until the conversion is finished ADCSRA = (1 << ADIF); return (ADC); ISR(TIMER0_OVF_vect) { // Interrupts every 1/33 second count ++; if(count == 33) { // Enters this loop once every second if(activated) { if(sek == 60) { sek++; min++; sek = 0; if(min == 60) { h++; min = 0; if(h == 24) { h = 0; if(adcresult > 35000) { // When voltage > 3,5V the timer starts counting up irtimer++; else { irtimer = 0; if(irtimer >= 1) { // When the timer exceeds 1 second the alarm is triggerd alarmready = 1; irtimer = 0; if(alarmready) { setled(yellow, 1); alarmreadysec++; if(alarmreadysec < 2) { printactivated(); printexpectpin(); if(ucsra & (1 << RXC)) { char data = usartread(); insertcode(data); if(charnbr == 4) { charnbr = 0; alternatives(); if(alarmreadysec >= 10) { alarmready = 0; alarmtrigged = 1; 16

if(actbypin) { count = 0; char getbutton(unsigned short code) { switch(code) { timer++; alarmreadysec = 0; expectpin = 0; case 0: case 128: case 64: case 2: case 130: case 66: case 1: case 129: case 65: case 131: case 194: return '1'; return '2'; return '3'; return '4'; return '5'; return '6'; return '7'; return '8'; return '9'; return '0'; return 'q'; //change code case 193: 17

case 195: return '-'; return 'r'; // deactivate return 's'; // activate void clearscreen() { setscreen(0b00000001); void cursorhome() { setscreen(0b00000010); void nextline() { setscreen(0b11000000); usartwrite(0b00001010); usartwrite(0b00001101); void printscreen(char ch) { / usartwrite(ch); setpin('d', PD5, 0); // R/W = 0 setpin('d', PD6, 1); // RS = 1 setpin('d', PD7, 1); // E = 1 PORTB = ch; setpin('d', PD7, 0); // E = 0 setpin('d', PD7, 1); // E = 1 void setscreen(char com) { setpin('d', PD5, 0); // R/W = 0 setpin('d', PD6, 0); // RS = 0 setpin('d', PD7, 1); // E = 1 PORTB = com; setpin('d', PD7, 0); // E = 0 setpin('d', PD7, 1); // E = 1 // Sets the data void setpin(char port, char pin, char state){ char set = 1 << pin; if(port == 'A'){ set &= PORTA; if(set &&!state){ // Set PIN PORTA ^= set; if(set == 0 && state){ // Clear PIN set = 1 << pin; PORTA ^= set; else if(port == 'B'){ set &= PORTB; if(set &&!state){ //Set PIN PORTB ^= set; if(set == 0 && state){ //Clear PIN // Sets the data 18

set = 1 << pin; PORTB ^= set; else if(port == 'C'){ set &= PORTC; if(set &&!state){ //Set PIN PORTC ^= set; if(set == 0 && state){ //Clear PIN set = 1 << pin; PORTC ^= set; else if(port == 'D'){ set &= PORTD; if(set &&!state){ //Set PIN PORTD ^= set; if(set == 0 && state){ //Clear PIN set = 1 << pin; PORTD ^= set; void enablekeypadinterrupt() { MCUCR = (1 << ISC01) (1 << ISC00); SREG = 0x82; GICR = (1 << INT0); sei(); void enabletimeinterrupt() { TCCR0 = (1 << CS02) (1 << CS00); // Prescaler factor 1024 TIMSK = (1 << TOIE0); // Enable overflow interrupt TCNT0 = 0; count = 0; ADMUX = (1 << ADLAR) (1 << REFS0) (1 << MUX2); ADCSRA = (1 << ADEN) (1 << ADPS2) (1 << ADPS1) (1 << ADPS0); GICR = 1 << INT0; // Enable INT0 MCUCR = 1 << ISC01 1 << ISC00; // Trigger INT0 on rising edge sei(); void setled(char led, char state) { setpin('a', led, state); void readsensors(){ char sensor1; adcresult = readadc(); // reads the voltage from the IR detector sensor1 = PIND; sensor1 &= 0x10; if(sensor1 == 0) { alarmready = 1; void showtime(int hour, int minute, int second){ displaynum(hour); printscreen(':'); displaynum(minute); 19

printscreen(':'); displaynum(second); void displaynum(int nu){ int num1=nu/10; itoa(num1,timevect,10); printscreen(timevect[0]); int num2=nu%10; num1=itoa(num2,timevect,10); printscreen(timevect[0]); 20

8 Referenser Kernighan & Ritchie. The C Programming Language. Bell Telephone Laboratories, Incorporated. New Jersey, 1988. Datablad LCD-display: http://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/display/lcd.pdf Datablad ATmega16: http://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/processors/atm ega16.pdf Datablad Keypad Encoder: http://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/periphery/other /MM54C922.pdf Datablad Max233: http://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/periphery/comm unication/max232-233.pdf Datablad IR-sensor. Passive IR Detector (PID11), Siemens. (Från Bertil Lindvall) 21