Digitala Projekt(EITF40) - Larm



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

Digitala Projekt(EITF40) - Larm

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

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

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

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

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

DIGITALA PROJEKT (EITF40) Fartmätare

The Phenomenal Doorbell Bilaga 2. Källkod

Växtviskaren EITF11 Digitala projekt VT15, I12

Digitala Projekt (EITF11) Hemlarm

Digitala projekt, EDI021 Rapport Handledare: Bertil Lindvall

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

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

The Intelligent Timer

Pulsmätare Digitala Projekt EITF11

Digitala Projekt (EITF11)

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

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

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

DIGITALA PROJEKT Väderstation

Digitala System Projekt - EITA15 VT *SUPER DUPER KLOCKAN*

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

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

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

DIGITALA PROJEKT - EITF11

Lunds Tekniska Högskola EITF11 Digitala projekt. Bandspelaren

Digitala Projekt (EITF11) Larmanläggning

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

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

Effektpedal för elgitarr

Projektrapport Målgång

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

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

TEMPERATURMÄTARE MED GRAFRITARE

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

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

Pulsmätare med varningsindikatorer

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

Helena Harrysson och Linnéa Wickberg

Bilen som inte kan krocka

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

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

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

Projekt Digitala system. Rörelsekänsligt Larmsystem

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

Digital Projekt EDI 021 Konstruktion av talande nummerpresentatör VT1 2004

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

High Core Remote Car X8000 Cool

Projektrapport - Roterande digital LED-klocka

TETRIS. LTH, Campus Helsingborg EITA15 Digitala System

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

Digitala projekt - Radiostyrd bil

Thunder s Truck projektrapport

General Purpose registers ALU I T H S V N Z C SREG. Antag att vi behöver skriva in talet 25 till register R18

Projektrapport - Feststation

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

Digitala projekt Linjeföljande bil

Digitala projekt rapport

TEMPERATUR OCH VINDMÄTARE MED HÖGTALARFUNKTION

Rapportsammanfattning. Optima Sous Vide

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

EITF11: Bandkanon Grp 05

Gustaf Backman, Anton Nystedt, Nicholas Peebo Battleships. Lunds tekniska högskola. EITF11 Digitala projekt

Innehåll. 1 Inledning 3

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

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

Projektrapport i Digitala System

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

DEPARTMENT OF INFORMATION TECHNOLOGY. Digitala Projekt. Redovisning av Projekt - Grupp 14

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

Användarmanual 948 GSM-GPRS

Digitala Projekt VT13. PING-Pong

AVR 5. Styrning av trafikljus. Digitala system 15 p

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

Kontrollskrivning Mikrodatorteknik CDT S2-704

Source code. #undef F_CPU. #define F_CPU UL. #include <avr/io.h> #include <avr/delay.h> #include <string.h> #include <avr/eeprom.

Användarmenyn. S k r i v d i n k o d...

Installationsmanual. Installera systemet: För att installera systemet korrekt så krävs följande: Steg 1.1- Förbered systemet.

Avståndsmätare. Digitala System EITA Grupp 7. Abdelsalem Yabrag, Abdulhadi kikar, Fredrik Peterson, Jesper Annefors

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

Projektrapport i Digitala projekt EITF11. Institutionen för Elektro- och informationsteknik, Lunds tekniska högskola

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

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

Programmera i teknik - kreativa projekt med Arduino

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

Blue Key Digitala projekt VT

Ansvarig lärare: Olof Andersson, Telefon (besöker skrivsalen)

SIMON SAYS Projekt i EITF11 Digitala Projekt

DANCING ROBOT. EITF11, Grupp 10. Kajsa Salomonsson, Hugo Hedin och Petter Mårtensson

Konstruktion av en radiostyrd legobil. Digitala projekt av Arbon Vata Leonardo Vukmanovic Amid Bhatia

Datorprojekt, del 1. Digitala system 15 p

Provmoment: Ladokkod: Tentamen ges för: Tentamen TE111B El3. Namn: Personnummer: Tentamensdatum: Tid: 14:00-18:00.

Datorteknik 1 (AVR 1)

Digitala Projekt Konstruktion av Tamagocchi. Av: Oskar Andersson D05 & Danial Rehman D05

WALL E. WALL EVADER EDI021 DIGITALA PROJEKT

EITF11 - Digitala Projekt

PIC-projekt: Kodlås till dörr

Transkript:

Digitala Projekt(EITF40) - Larm Handledare: Bertil Lindvall Erik Oredsson, I-09 Sara Sellin, I-09 2012-05-08

1. SAMMANFATTNING I denna rapport presenteras vårt projekt att bygga ett huslarm från grunden bestående av två IR-sensorer som inte bara utlöser larmet när de ger utslag, utan även håller koll på hur många som är i lokalen. Vi använder oss av en AVR-processor till vilken vi kopplar på olika komponenter. Genom programmet AVR Studio programmerar vi processorn i programspråket C.

INNEHÅLL 1. Sammanfattning... 2 2. Inledning... 4 3. Kravspecifikation... 4 4. Blockschema... 4 5. Hårdvara... 5 5.1 Processor... 5 5.2 Knappsats... 5 5.3 LCD-display... 5 5.4 Lysdioder... 5 5.5 Sensorer... 5 6. Mjukvara... 6 7. Konstruktionsprocess... 6 8. Slutsats... 8 9. C-kod... 9

2. INLEDNING Projektets uppgift är att designa en fungerande prototyp och programmera en mjukvara som integrerar på ett korrekt sätt. Syftet är att få en ökad förståelse i programspråket C och hur en kretskonstruktion fungerar. Vi valde att konstruera en larmanläggning som tar hänsyn till om lokalen är tom eller inte. Idén var att man inte skulle kunna aktivera larmet då det är personer inne i lokalen. Detta för att underlätta för användare så att enbart sista man ut ur lokalen har möjlighet att sätta igång larmet. 3. KRAVSPECIFIKATION Larmsystemet ska kunna övervaka exempelvis en arbetsplats eller ett hem. Kraven som ställs på prototypen och dess funktioner är: Larmet ska kunna hantera 1-2 analoga IR-sensorer för övervakning rörelser. Larmet ska kunna hantera en LCD-display. Systemet ska kunna aktiveras/avaktiveras av en 4-siffrig PIN-kod PIN-koden ska kunna läsas av från en numerisk knappsats. Systemet ska kunna räkna antalet personer inne i lokalen. Är lokalen inte tom ska en gul lysdiod lysa och antalet personer ska visas på displayen. Är larmet aktiverat ska en röd lysdiod lysa och ACTIVATED ska visas på displayen. Är larmet inaktiverat ska en grön lysdiod lysa och INACTIVATED ska visas på displayen. Larmet ska enbart kunna aktiveras när lokalen är tom. När larmet är aktiverat och sensorerna detekterar rörelse ska larmet utlösas, det vill säga, en röd lysdiod blinka. 4. BLOCKSCHEMA Figur 1: Blockschema för larmsystemet

5. HÅRDVARA 5.1 PROCESSOR Som processor till vårt larmsystem använde vi oss av en AVR ATMega16. Denna processor har en inbyggd intern klocka på 8 MHz. Det finns 4 portar (A, B, C och D) där de 32 programmerbara I/O pinnarna är uppdelade på. Port A har en inbyggd A/D för att omvandla analoga signaler. Processorn har ett inbyggt flashminne på 16KB och ett internt minne på 1KB. För att vi ska kunna kommunicera med processorn kopplar vi på en JTAGenhet på protypen och använder programmet AVR Studio 4. 5.2 KNAPPSATS Vi använde oss av en knappsats med 16 knappar från 0-9 och A-F, uppdelade på fyra rader och fyra kolumner. Dessa kopplade vi direkt till processorn på port C. 5.3 LCD-DISPLAY För att larmet ska kunna skriva ut önskat meddelande har vi använt oss av en SHARP Dot-Matrix LCD Units som är en alfanumerisk display med möjlighet att skriva 2x16 tecken. LCDn använder sig av ASCII standard för inmatning av tecken. 5.4 LYSDIODER För att visa om larmet är aktiverat/aktiverat och om lokalen är tom eller inte använder vi tre färgade lysdioder: gul, grön och röd. 5.5 SENSORER Vi använder oss av två sensorer PT-204-6b som svarar mot två IR-lysdioder. När strålen bryts, då bryts även signalen in till processen och beroende på i vilken ordning dessa sensorer ger utslag får vi information om det är någon som går in i lokalen eller ut. På detta sätt vet vi om det finns personer i lokalen eller ej. Är larmet aktiverat kommer utslag av någon av sensorerna utlösa larmet.

6. MJUKVARA Programmet skrevs i programspråket C i AVR Studio 4, där systemet konstant går genom en while-loop. I varje loop kontrollerar mjukvaran om någon av sensorerna eller knappsatsen har gett utslag. På så vis har vi hela tiden koll på vad som händer med hårdvaran. Det som kollas vid varje loop är följande: Om larmet är inaktiverat kollar sensorerna om det har gått in någon i lokalen, och i så fall uppdateras antalet, dvs vår variabel count. Finns det folk i lokalen tänder vi den gula lampan. Om larmet är inaktiverat och lokalen är tom kontrollerar larmsystemet om knappsatsen används och sparar undan eventuell inmatning i en vektor. När rätt PIN-kod är inmatad aktiveras larmet. Om larmet är aktiverat, kontrolleras om någon av sensorerna ger utslag och i så fall utlöses larmet. Även här kontrolleras om knappsatsen registrerar något knapptryck. När rätt PIN-kod är inskriven inaktiveras larmet. För att avgöra om en person går in i lokalen eller ut ur lokalen använder vi kombinationen av utslagen från sensorerna. Ger sensor1 utslag först (samtidigt som sensor2 inte ger utslag) beror det på att någon är på väg in i lokalen. Följs de sedan av nedanstående kombination kan vi räkna upp antalet personer i lokalen. På liknande sätt kan vi minska antalet personer i lokalen. While-loopen hjälper oss sedan att uppdatera antalet personer och skriva ut antalet på skärmen. Person går in i lokal Tid Sensor1 Sensor2 Person går ut lokal Tid Sensor1 Sensor2 Se programkoden för att få utförligare information om hur programmet är uppbyggt.

7. KONSTRUKTIONS PROCESS Inledningsvis ritade vi upp ett kopplingsschema enligt diverse datablad och byggde en prototyp efter denna. När vi löddat och virat färdigt hårdvaran kopplades processorn in i datorn med hjälp av en JTAG-enhet. För att underlätta att felsöka i programkoden valde vi att implementerades varje komponent för sig under processens gång. Först programmerades LCD-displayen för att testa att skriva ut ett givet kommando. När vi fick detta att fungera skrev vi även en funktion för att skriva ut om larmet är aktiverat eller inaktiverat samt antalet personer i lokalen. För att inte systemet skulle vara för snabbt och skriva över text var vi tvungna att lägga till delays. Knappsatsen kopplades till samtliga pinnar på PORTB och programmerades så de lyssnade på rätt PIN-kod. För att lyckas få rätt knapp att registrera rätt siffra lät vi först systemet läsa den av raden i 4x4-matrisen, där första raden returnerade 10, andra returnerade 20 och så vidare. Därefter avgjordes vilken kolumn knappen befann sig på. Fanns den på första kolumnen adderades 1 till det returnerade talet, andra kolumnen adderade 2, och så vidare. Det resulterade talet översättas sedan till rätt siffra, exempelvis ger 11 (första raden och första kolumnen) en nolla. För att få lysdioderna att lysa lät vi pinne 0, 1 respektive 2 på PORTA lyssna på kommandon. Dessa funktioner användes bland annat för att visa när systemet är aktiverat eller inaktiverat och om lokalen inte är tom. Det som var mest tids krävande var att få funktioner som lyssnade på vilken ordning sensorerna registrerade rörelse för att avgöra om personen var på väg in eller ut ur lokalen, och dessutom att skriva en programkod för att räkna upp/ner antalet personer i lokalen.

8. SLUTSATS När vi byggt larmsystemet efter det första kretsschemat var det en komponent som vi inte lyckades få kontakt med. Efter många om och men, insåg vi att detta berodde på kallödning. Detta löste vi genom att lödda om komponenten. Ett annat problem vi stötte på under processens gång var att vi hade för högt motstånd till sensorerna, så vi bytte från 10K till 3,7K. Ett problem som tog oss väldigt lång tid att upptäcka var att vi hade kopplat LCD-displayen på pinne 2 på PORTC. Denna port fick vi inte använda då den redan var upptagen av JTAG-enheten. Därför satte vi istället vårat E på pinn 6. I slutskedet av programmeringen upptäckte vi att när vi försökte skriva ut meddelande på LCD-display lyckades den skriva över bokstäverna och enbart varannan bokstav syntes. När vi satte in delays i programkoden rättade timingen till sig och larmsystemet var färdigt. Trots dessa problem gick projektet relativt smärtfritt trots att allt var nytt för oss. Vi har dels lärt oss att bygga en prototyp av givna komponenter även att programmera med programspråket C.

9. C-KOD #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char num; int count = 0; // antal i lokalen char larmtriggered = 0; //om larmet är utlöst char larmactivated = 0; //om larmet är aktiverat int sensor1 = 0; int sensor2 = 0; int in[3] = { 1, 2, 3; int ut[3] = { 3, 2, 1; int temp[3] = {0, 0, 0; int var; int temp2[3] = {0, 0, 0; int vectorcount = 0; int code[4] = {1,2,3,4; int vectorcount2 = 0; int tempcode[4] = {0, 0, 0, 0; int temp3 = 10; char val; int main(){ DDRA = 0xE7; PORTA = 0x00; DDRC = 0xFF; DDRD = 0xFF; DDRB = 0x0F; PORTB = 0xF0; disp_init(); disp_home(); writeinactivated(); disp_secondline(); writepeoplecount(); while(1) { countpeople(); if (larmactivated == 0) { light_green(); nolight_red(); if (count!= 0) { light_yellow();

else { nolight_yellow(); checkpincode(); if (larmactivated == 1) { checklarm(); light_red(); nolight_green(); checkpincode(); if (larmtriggered == 1) { _delay_ms(500); nolight_red(); _delay_ms(500); void set_pin(char port, char pin, char state){ char set = 1 << pin; if(port == 'A'){ set &= PORTA; if(set &&!state){ //ändra från 1 -> 0 PORTA ^= set; if(set == 0 && state){ //ändra från 0 -> 1 set = 1 << pin; PORTA ^= set; else if(port == 'B'){ set &= PORTB; if(set &&!state){ //ändra från 1 -> 0 PORTB ^= set; if(set == 0 && state){ //ändra från 0 -> 1 set = 1 << pin; PORTB ^= set; else if(port == 'C'){ set &= PORTC; if(set &&!state){ //ändra från 1 -> 0 PORTC ^= set; if(set == 0 && state){ //ändra från 0 -> 1 set = 1 << pin; PORTC ^= set; else if(port == 'D'){ set &= PORTD;

if(set &&!state){ //ändra från 1 -> 0 PORTD ^= set; if(set == 0 && state){ //ändra från 0 -> 1 set = 1 << pin; PORTD ^= set; Lysdioder //Tänder grön lysdiod void light_green() { set_pin('a', PA0, 1); //Tänder gul lysdiod void light_yellow() { set_pin('a', PA1, 1); //Tänder röd lysdiod void light_red() { set_pin('a', PA2, 1); //Släcker grön lysdiod void nolight_green() { set_pin('a', PA0, 0); //Släcker gul lysdiod void nolight_yellow() { set_pin('a', PA1, 0); //Släcker röd lysdiod void nolight_red() { set_pin('a', PA2, 0); LCD-skärm //Skriver ut ACTIVATED på skärmen void writeactivated(){ disp_writech('a'); disp_writech('c');

disp_writech('t'); disp_writech('i'); disp_writech('v'); disp_writech('a'); disp_writech('t'); disp_writech('e'); disp_writech('d'); //Skriver ut INACTIVATED på skärmen void writeinactivated(){ disp_writech('i'); disp_writech('n'); disp_writech('a'); disp_writech('c'); disp_writech('t'); disp_writech('i'); disp_writech('v'); disp_writech('a'); disp_writech('t'); disp_writech('e'); disp_writech('d'); //Skriver ut COUNT: "antal personer i lokalen" på skärmen void writepeoplecount(){ disp_writech('c'); disp_writech('o'); disp_writech('u'); disp_writech('n'); disp_writech('t'); disp_writech(':'); disp_writech(' '); disp_writenum(count); //Tillkallas när vi vill skriva kommando void write_cmd(char val) { PORTD=val; _delay_ms(5); set_pin('c', PC1, 0); //RW set_pin('c', PC0, 0); //RS väntar på kommando _delay_ms(5); set_pin('c', PC6, 1); //E går till hög _delay_ms(5); set_pin('c', PC6, 0); //E går till låg //Tillkallas när vi vill skriva ut en bokstav/siffra/tecken void disp_writech(char val) {

PORTD=val; set_pin('c', PC1, 0); //RW set_pin('c', PC0, 1); //RS visar på skärm _delay_ms(5); set_pin('c', PC6, 1); //E går till hög _delay_ms(5); set_pin('c', PC6, 0); //E går till låg //Tillkallas när vi vill skriva nummer void disp_writenum(int number) { if (number < 10) { if (number == 0) { disp_writech('0'); if (number == 1) { disp_writech('1'); if (number == 2) { disp_writech('2'); if (number == 3) { disp_writech('3'); if (number == 4) { disp_writech('4'); if (number == 5) { disp_writech('5'); if (number == 6) { disp_writech('6'); if (number == 7) { disp_writech('7'); if (number == 8) { disp_writech('8'); if (number == 9) { disp_writech('9'); else { int num1 = number/10; disp_writenum(num1); int num2 = number%10; disp_writenum(num2);

void disp_clear() { write_cmd(0x01); // clear display _delay_ms(5); write_cmd(0x38); //functions set _delay_ms(5); void disp_init() { disp_clear(); write_cmd(0x0f); //display on _delay_ms(1); write_cmd(0x06); //Entry mode set _delay_ms(1); void disp_home(){ write_cmd(0x03); //flyttar markören hem _delay_ms(5); void disp_secondline() { write_cmd(0xc0); //Byter rad _delay_ms(5); Tangentbord //Läser av vilken rad som trycks in på PIN-kodsterminalen int checkrow() { DDRB = 0x0F; PORTB = 0xF0; val = PINB & 0xF0; if (val == 0xE0) { return checkcol(10); if (val == 0xD0) { return checkcol(20); if (val == 0xB0) { return checkcol(30); if (val == 0x70) { return checkcol(40); return 0; //Läser av vilken kolumn som trycks in på PIN-kodsterminalen int checkcol(int x) { set_pin('b', PB0, 0);

set_pin('b', PB1, 0); set_pin('b', PB2, 0); set_pin('b', PB3, 1); val = PINB & 0xF0; if (val == 0xF0) { return (x + 1); set_pin('b', PB0, 0); set_pin('b', PB1, 0); set_pin('b', PB2, 1); set_pin('b', PB3, 0); val = PINB & 0xF0; if (val == 0xF0) { return (x + 2); set_pin('b', PB0, 0); set_pin('b', PB1, 1); set_pin('b', PB2, 0); set_pin('b', PB3, 0); val = PINB & 0xF0; if (val == 0xF0) { return (x + 3); set_pin('b', PB0, 1); set_pin('b', PB1, 0); set_pin('b', PB2, 0); set_pin('b', PB3, 0); val = PINB & 0xF0; if (val == 0xF0) { return (x + 4); //Översätter vilken siffra som trycks in på PIN-kodsterminalen. OBS de "orelevanta" returnerar 9. Trycks ingen knapp ner returneras 10. int checkbutton() { int button = checkrow(); if (button == 11) { if (button == 12) { return 1; if (button == 13) { return 2; if (button == 14) { return 3; if (button == 21) {

return 4; if (button == 22) { if (button == 23) { if (button == 24) { if (button == 31) { if (button == 32) { if (button == 33) { if (button == 34) { if (button == 41) { if (button == 42) { if (button == 43) { if (button == 44) { return 10; PIN-Kod //Lyssnar på PIN-kodsterminalen och om rätt siffra i rätt ordning slås in, läggs de in i en vektor. Vid rätt PIN-kod aktiveras larmet/inaktiverats larmet. void checkpincode(){ _delay_ms(250); temp3 = checkbutton(); if (temp3 == 10) { return;

if (temp3 == 9) { vectorcount2 =0; if (temp3 == 1 && vectorcount2 == 0) { tempcode[0] = 1; vectorcount2 = 1; else if (temp3 == 2 && vectorcount2 == 1) { tempcode[1] = 2; vectorcount2 = 2; else if (temp3 == 3 && vectorcount2 == 2) { tempcode[2] = 3; vectorcount2 = 3; else if (temp3 == 4 && vectorcount2 == 3) { tempcode[3] = 4; vectorcount2 = 0; if (larmactivated == 1) { if (rightpincode() == 1) { //Returnerar 1 om rätt kod larmactivated = 0; larmtriggered = 0; disp_clear(); disp_home(); writeinactivated(); disp_secondline(); writepeoplecount(); else { if (rightpincode() == 1) { larmactivated = 1; larmtriggered = 0; disp_clear(); disp_home(); writeactivated(); disp_secondline(); writepeoplecount(); //Jämför om tempcode är rätt PIN-kod. Returnerar 1 om rätt PIN-kod. int rightpincode() { if (tempcode[0] == 1 && tempcode[1] == 2 && tempcode[2] == 3 && tempcode[3] == 4) { return 1;

else { return 0; Sensor //Kollar sensorerna om larmet är inaktiverat void checksensor(){ char sensor = PINA & 0x18; if (sensor == 0x10) { sensor1 = 1; //har ej brytits sensor2 = 0; if (sensor == 0x08) { sensor2 = 1; //har ej brytits sensor1 = 0; if (sensor == 0x18) { sensor1 = 1; //har ej brytits sensor2 = 1; //har ej brytits if (sensor == 0x00) { sensor1 = 0; sensor2 = 0; return; //Kollar sensorerna om larmet är aktiverat void checklarm() { char sensorlarm = PINA & 0x18; if (sensorlarm!= 0x18) { larmtriggered = 1; //Larmet utlöses //Räknar antal personer i lokalen void countpeople() { checksensor(); inorout(); //Sätter kombination av aktiva sensorer till en variabel och lägger variabler in i en vektor, detta för att sedan veta om personer går in i lokalen eller ut. void inorout(){ if (sensor1 == 1 && sensor2 == 1){ var = 0; if (sensor1 == 0 && sensor2 == 1){

var = 1; if (sensor1 == 0 && sensor2 == 0){ var = 2; if (sensor1 == 1 && sensor2 == 0){ var = 3; if (var == 0 && vectorcount == 3) { checkinorout(); if (var == 1 && vectorcount == 0) { temp[0] = 1; vectorcount++; if (var == 2 && vectorcount == 1) { temp[1] = 2; vectorcount++; if (var == 3 && vectorcount == 2) { temp[2] = 3; vectorcount = 3; if (var == 3 && vectorcount == 0) { temp[0] = 3; vectorcount++; if (var == 1 && vectorcount == 2) { temp[2] = 1; vectorcount = 3; //Kontrollerar om personen går in eller ut ur lokal genom att granska kombinationen i vektorn som skapades i föregående funktion. Obs accepterar ej negativt antal. void checkinorout(){ //Kollar om In if (temp[0] == 1 && temp[1] == 2 && temp[2] == 3) { count++; disp_clear(); disp_home(); writeinactivated(); disp_secondline(); writepeoplecount(); vectorcount = 0; temp[0] = 0; temp[1] = 0; temp[2] = 0;

//Kollar om Out if (temp[0] == 3 && temp[1] == 2 && temp[2] == 1) { count--; disp_clear(); disp_home(); writeinactivated(); disp_secondline(); writepeoplecount(); vectorcount = 0; temp[0] = 0; temp[1] = 0; temp[2] = 0; if (count == -1) { count = 0;