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

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

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

Digitala Projekt(EITF40) - Larm

Växtviskaren EITF11 Digitala projekt VT15, I12

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

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

Digitala Projekt(EITF40) - Larm

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

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

TEMPERATURMÄTARE MED GRAFRITARE

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

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

Digitala Projekt (EITF11) Larmanläggning

DIGITALA PROJEKT (EITF40) Fartmätare

Effektpedal för elgitarr

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

Thunder s Truck projektrapport

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

Pulsmätare Digitala Projekt EITF11

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

DIGITALA PROJEKT Väderstation

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

Digitala Projekt (EITF11) Hemlarm

Bilen som inte kan krocka

Digitala System Projekt - EITA15 VT *SUPER DUPER KLOCKAN*

Rapport i Digitala Projekt (EDI021)

Digitala Projekt (EITF11)

The Phenomenal Doorbell Bilaga 2. Källkod

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

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

Projektrapport Målgång

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

Projektrapport - RoboWalter

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

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

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

Lunds Tekniska Högskola EITF11 Digitala projekt. Bandspelaren

LTH Ingenjörhögskolan vid Campus Helsingborg. Mastermindspel

Pulsmätare med varningsindikatorer

Projekt Digitala system. Rörelsekänsligt Larmsystem

The Intelligent Timer

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

Innehåll. 1 Inledning 3

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

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

Projektrapport - Roterande digital LED-klocka

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

Projektrapport - Feststation

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

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

LTH. EITF11- Digitalaprojekt. Projektrapport WEB

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

Projektlaboration 4, synkronisering av klockan

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

Digitala projekt, EDI021 Rapport Handledare: Bertil Lindvall

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

Rapportsammanfattning. Optima Sous Vide

EITF11 - Digitala Projekt

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

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

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

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

Rörelse- och temperaturkänsligt larmsystem

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

RAPPORT: DIGITALA PROJEKT

Guitar Tuner EITF11 Digitala Projekt, Projektrapport Elektro- och informationsteknik

Digitala projekt Linjeföljande bil

Laboration 5 C-programmering på AVR TSEA57 Datorteknik I

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

High Core Remote Car X8000 Cool

Tidsstyrd persiennöppnare

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

Digitala Projekt VT13. PING-Pong

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

TETRIS. LTH, Campus Helsingborg EITA15 Digitala System

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

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

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

Department of Information Technology Digitala Projekt Frysboxregulator. 10 december 2007

DIGITALA PROJEKT - EITF11

Linjeföljare. Digitala projekt

Självgående fordon Rapport i kursen digitala projekt, EDI021

Voltmeter EITF11 LUNDS TEKNISKA HÖGSKOLA Grupp 3 Timmy Andersson Jesper Tempel Christoffer Lundgren

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

Guitar tuner Digitala Projekt (EITF40)

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

TEMPERATUR OCH VINDMÄTARE MED HÖGTALARFUNKTION

Rapport: Väderstation

Projektrapport i Digitala System

Musen. Författare: Joel Guedj e02jg Erik Dahlbäck e02ed. Handledare: Bertil Lindvall. Digitala Projekt SK 2005

Digitala projekt VT Väderstationen. Av: Andreas Cremon E04 grupp 15 26/2-2007

Digitala Projekt. Chip Quiz. Projektmedlemmar: Olov Nordenstam och Linus Hägerbrand. Grupp 9

WALL E. WALL EVADER EDI021 DIGITALA PROJEKT

EITF11: Bandkanon Grp 05

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

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

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

Digitala projekt VT Myran

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

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

Transkript:

Datum: 2011-05-14 Väderstation Projektarbete vid elektro och informationstekniks institution Abstract: The goal for this project was to create a weather station from a programmable ATmega 16 processor and other components. The requirements for the weather station were for example to have a programmable alarm limit, two continuous temperature sensors and the ability to set the time. After the components were chosen a wiring diagram was constructed and the processor was wired or solded together with the components. The processor was programmed using the C language and an AVR studio environment. The weather station fulfills the entire requirements even if quite a few problems occurred during the project. Författare: Marcus Åkerberg, Joel Johansson, Daniel Persson

Innehållsförteckning Inledning... 2 Teori... 2 Genomförande (metod)... 3 Resultat... 4 Utvärderande diskussion... 4 Referenslista:... 4 Datablad... 4 Appendix:... 5 Kod (C)... 5 1

Inledning Projektets syfte var att öka kunskapen inom elektronik, digitalteknik, datorteknik och inbyggda system. Få ökad insikt i hur en prototyp för en produkt tas fram och sätta alla dessa ämnen i ett sammanhang till utvecklingsprocessen. Detta projekt gick ut på att bygga en väderstation genom att koppla ihop en mängd komponenter som styrs genom en ATMega16 processor vilken programmerades efter funktionsönskemål. Väderstationen består av två analoga temperaturgivare, en knappsats, en display, två dioder och en seriell anslutning. Väderstationen kan visa temperatur i realtid, tid, datum och larmgränser. Larmgränsen kan ställas in via knappsatsen till en av temperaturgivarna. Om denna överskrids larmar väderstationen genom att en röd lampa tänds. Även tid och datum går att ställa in via knappsatsen. Data om temperatur från de två givarna skickas kontinuerligt med tillhörande tidsstämpel genom den seriella anslutningen. Kravspecifikation - Sampla två temperaturer kontinuerligt - Presentera två temperaturer kontinuerligt - Ha koll på tiden - Ställa in tiden - Ha koll på min och max temperatur - Presentera min och max temperatur - Återställa min och max temperaturerna - Skicka data till dator - Presentera data på dator - Lagra data på dator - Välja larmgräns - Temperatursensorerna ska klara temperaturer mellan: - T1: -30 till 60 grader Celsius - T2: 0 till 30 grader Celsius - Larma när en vald temperatur överskrids Teori Teorin som användes var grundläggande teori i elektronik, digitalteknik, datorteknik och inbyggda system. 2

Genomförande (metod) Först valdes produkten som skulle utvecklas, vilket i det här fallet är en väderstation. Därefter skapades en kravspecifikation på vad väderstationen skulle ha för funktionalitet. Nästa steg var val av komponenter som skulle användas för att bygga produkten och uppnå önskad funktionalitet Komponenterna som valdes var enligt följande: Processor: ATmega16 High-performance AVR 8-bit Microcontroller RS-232 chip: MAX 233 RS-232 Driver Display: SHARP Dot-Matrix LCD Unit Temperaturgivare: LM335 Kelvin temperature sensor Knappsats: 16 knappar (4x4) Seriellport: 9 pins Extern kristall: 3,6864 MHz Kontakter till spänningsmatning Motstånd Kondensatorer Zenerdiod Trådar virades mellan olika pinnar enligt databladen för att koppla samman de olika komponenterna Då virning inte var lämpligt användes lödning. Efter att komponenterna var sammankopplade påbörjades programmering av processorn som utfördes i AVR Studio. Språket som koden skrevs i var C. Datablad och AVR forum på internet användes till hjälp för att till slut få en fungerande kod som uppfyllde kravspecifikationen. Vi använder oss av avbrottsrutiner för att hämta data från temperaturgivarna, skicka data till den seriella anslutningen och uppdatera displayens information t.ex. då en sekund på klockan räknas upp. Vid seriell överföring används processorns inbyggda USART som är kopplar via MAX233 kretsen till seriellporten. Vi använder oss av en extern kristall på 3,6864 MHz eftersom denna enligt databladet för processorn ska ge 0% fel vid användning av USARTen med vår baudrate på 9600bps. Med hjälp av en prescaler till den externa kristallens klockhastighet får vi en timer som räknar sekunder. Denna används till avbrottsrutinerna. Processorns inbyggda AD omvandlare används vid hämtning av temperaturdata från de analoga temperaturgivarna. För att få önskad noggrannhet på temperaturvärdena använde vi en zenerdiod för att få önskad spänning till AREF som bestämmer maxgränsen för temperaturvärdena och därigenom också noggrannheten. 3

Resultat Resultatet blev en väderstation som kan mäta två temperaturer och i övrigt uppfylla de krav som bestämdes i kravspecifikationen. Länkar till video på den färdiga produkten: http://youtu.be/5k3c0qms_bq http://youtu.be/r9afcky8hgu Utvärderande diskussion Eftersom vi hade väldigt små förkunskaper om denna typ av projekt stötte vi på en hel del problem under bygget och utvecklandets gång. Det var väldigt lärorikt att lösa dessa problem då vi hela tiden byggde på våra detaljkunskaper samtidigt som en klarare helhetsbild skapades. Ett av problemen vi hade var att vi inte fick ordning på den seriella anslutningen till en PC. Det visade sig efter mycket felsökning och grävande i hur t.ex. processorns inbyggda USART fungerar att felet låg i hur vi hade kopplat Maxim max233 kretsen. Lärdomen här blev att det aldrig skadar att undersöka kopplingsschemat i databladet extra noggrant innan koppling inleds. Vi är väldigt nöjda med vår slutprodukt, den blev precis som vi hade tänkt oss. Dessutom har det varit väldigt spännande att genomföra ett projekt från start till mål. Det har även varit väldigt lärorikt eftersom man nu har större förståelse för hur vardagliga apparater fungerar och hur mycket arbete som ligger bakom innan man har en fungerande enhet. Referenslista: Datablad - ATmega16 High-performance AVR 8-bit Microcontroller http://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/processors/atmega16.pdf - MAX 233 RS-232 Driver http://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/periphery/communication/m ax232-233.pdf - SHARP Dot-Matrix LCD Unit http://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/display/lcd.pdf - LM335 Kelvin temperature sensor http://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/sensors/lm335.pdf 4

Appendix: Kod (C) #include <avr/io.h> #include <avr/signal.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdlib.h> #include <string.h> #include <inttypes.h> #include <stdio.h> typedef struct { unsigned int bit0:1; unsigned int bit1:1; unsigned int bit2:1; unsigned int bit3:1; unsigned int bit4:1; unsigned int bit5:1; unsigned int bit6:1; unsigned int bit7:1; _io_reg; #define REGISTER_BIT(rg,bt) ((volatile _io_reg*)&rg)->bit##bt #define KEY_Y1 REGISTER_BIT(PORTC,0) #define KEY_Y2 REGISTER_BIT(PORTC,1) #define KEY_Y3 REGISTER_BIT(PORTC,6) #define KEY_Y4 REGISTER_BIT(PORTC,7) #define KEY_Y1DIR REGISTER_BIT(DDRC,0) #define KEY_Y2DIR REGISTER_BIT(DDRC,1) #define KEY_Y3DIR REGISTER_BIT(DDRC,6) #define KEY_Y4DIR REGISTER_BIT(DDRC,7) #define KEY_X1 REGISTER_BIT(PORTA,7) #define KEY_X2 REGISTER_BIT(PORTA,6) #define KEY_X3 REGISTER_BIT(PORTA,5) #define KEY_X4 REGISTER_BIT(PORTA,4) #define KEY_X1DIR REGISTER_BIT(DDRA,7) #define KEY_X2DIR REGISTER_BIT(DDRA,6) #define KEY_X3DIR REGISTER_BIT(DDRA,5) #define KEY_X4DIR REGISTER_BIT(DDRA,4) #define LED_RED REGISTER_BIT(PORTD,5) #define LED_GREEN REGISTER_BIT(PORTD,6) #define RS REGISTER_BIT(PORTD,4) #define E REGISTER_BIT(PORTD,2) char val; short int sec = 0; short int min = 0; short int hour = 0; short int datum = 0; short int month = 0; int year = 0; char s[2]; 5

char m[2]; char h[2]; char da[2]; char mo[2]; char y[2]; short int months[] = {31,28,31,30,31,30,31,31,30,31,30,31; short int check = 0; float max_in = 0; float max_out = 0; float min_in = 0; float min_out = 0; float aver_in[10]; float aver_out[10]; short int pos_aver = 0; static uint8_t enable_stats; static uint8_t temp_enable; static uint8_t clock_enable; static uint8_t alarm_light_on; static uint8_t alarm_enable; static uint8_t set_alarm_enable; static uint8_t set_time_enable; float alarm_out; short int pos_hor = 0; char alarmstring[4]; char tempstring[4]; char tempstring0[4]; void USART_Init() { UBRRH = 0b00000000; UBRRL = 0b00010111; UCSRA = 0b00000000; UCSRB = 0b00011000; UCSRC = 0b10000110; void USART_Transmit(unsigned char data) { while (!(UCSRA & (1<<UDRE))) { UDR = data; short int checkoutput(short int row) { val = val & 0xF0; if (val == 0x80) return (row + 1); else if (val == 0x40) return (row + 2); else if (val == 0x20) return (row + 3); else if (val == 0x10) return (row + 4); else return 0; 6

short int checky1() { KEY_Y1 = 1; KEY_Y2 = 0; KEY_Y3 = 0; KEY_Y4 = 0; val = PINA; return checkoutput(10); short int checky2() { KEY_Y1 = 0; KEY_Y2 = 1; KEY_Y3 = 0; KEY_Y4 = 0; val = PINA; return checkoutput(20); short int checky3() { KEY_Y1 = 0; KEY_Y2 = 0; KEY_Y3 = 1; KEY_Y4 = 0; val = PINA; return checkoutput(30); short int checky4() { KEY_Y1 = 0; KEY_Y2 = 0; KEY_Y3 = 0; KEY_Y4 = 1; KEY_Y4 = 1; KEY_Y2 = 0; val = PINA; return checkoutput(40); short int checkkeys() { short int res = 0; res = checky4(); if (res) return res; res = checky2(); if (res) return res; res = checky3(); if (res) return res; res = checky1(); if (res) return res; return 0; 7

void delay_ms(uint16_t ms) { while (ms) { _delay_ms(1); ms--; void write_cmd(short int val) { PORTB = val; RS = 0; E = 0; E = 1; E = 0; delay_ms(5); return; void write_data(short int val) { PORTB = val; RS = 1; E = 0; E = 1; E = 0; delay_ms(1); return; void setup_keys() { KEY_Y1DIR = 1; KEY_Y2DIR = 1; KEY_Y3DIR = 1; KEY_Y4DIR = 1; KEY_X1DIR = 0; KEY_X2DIR = 0; KEY_X3DIR = 0; KEY_X4DIR = 0; return; void sendmin() { if (min < 10) { itoa(min, m, 10); USART_Transmit('0'); while (m[pos]!= '\0') { USART_Transmit(m[pos]); else { itoa(min, m, 10); while (m[pos]!= '\0') { 8

USART_Transmit(m[pos]); void sendhour() { if (hour < 10) { itoa(hour, h, 10); USART_Transmit('0'); while (h[pos]!= '\0') { USART_Transmit(h[pos]); else { itoa(hour, h, 10); while (h[pos]!= '\0') { USART_Transmit(h[pos]); void sendday() { if (datum < 10) { itoa(datum, da, 10); USART_Transmit('0'); while (da[pos]!= '\0') { USART_Transmit(da[pos]); else { itoa(datum, da, 10); while (da[pos]!= '\0') { USART_Transmit(da[pos]); void sendmonth() { if (month < 10) { itoa(month, mo, 10); USART_Transmit('0'); while (mo[pos]!= '\0') { USART_Transmit(mo[pos]); else { 9

itoa(month, mo, 10); while (mo[pos]!= '\0') { USART_Transmit(mo[pos]); void sendyear() { if (year%100 < 10) { itoa(year%100, y, 10); USART_Transmit('0'); while (y[pos]!= '\0') { USART_Transmit(y[pos]); else { itoa(year%100, y, 10); while (y[pos]!= '\0') { USART_Transmit(y[pos]); void sendtime() { sendhour(); USART_Transmit(':'); sendmin(); USART_Transmit(' '); sendday(); USART_Transmit('-'); sendmonth(); USART_Transmit('-'); sendyear(); USART_Transmit(0x0a); void printstring(short int address, char line[]) { write_cmd(address); while (line[pos]!= '\0') { write_data((short int)line[pos]); void printsec() { if (sec < 10) { itoa(sec, s, 10); printstring(0xc6, "0"); 10

else { printstring(0xc7, s); itoa(sec, s, 10); printstring(0xc6, s); void printmin() { if (min < 10) { itoa(min, m, 10); printstring(0xc3, "0"); printstring(0xc4, m); else { itoa(min, m, 10); printstring(0xc3, m); void printhour() { if (hour < 10) { itoa(hour, h, 10); printstring(0xc0, "0"); printstring(0xc1, h); else { itoa(hour, h, 10); printstring(0xc0, h); void printdate() { if (datum < 10) { itoa(datum, da, 10); printstring(0x80, "0"); printstring(0x81, da); else { itoa(datum, da, 10); printstring(0x80, da); void printmonth() { if (month < 10) { itoa(month, mo, 10); printstring(0x83, "0"); printstring(0x84, mo); else { itoa(month, mo, 10); printstring(0x83, mo); void printyear() { if (year%100 < 10) { printstring(0x86, "0"); 11

else { itoa(year%100, y, 10); printstring(0x86, "0"); printstring(0x87, y); itoa(year%100, y, 10); printstring(0x86, y); void ADC_init() { ADMUX= 0x00; // AVcc with external capacitor at AREF ADCSRA=(1<<ADEN) (1<<ADPS2) (1<<ADPS1) (1<<ADPS0); int ADC_read(unsigned char ch) { ADMUX= 0x00; ch= ch & 0b00000111; // ch 0-7 ADMUX = ch; // välj ch ADCSRA =(1<<ADSC); // konvertera while(!(adcsra & (1<<ADIF))); // vänta på färdig ADCSRA =(1<<ADIF); // rensa ADIF med 1 return (ADC); float ADC_temp_convert(int tin) { float tout = ((tin/1024.0f)*351.0f-273.0f); return tout; void sendtemp() { USART_Transmit('i'); while (tempstring[pos]!= '\0') { USART_Transmit(tempstring[pos]); USART_Transmit(' '); pos = 0; USART_Transmit('u'); while (tempstring0[pos]!= '\0') { USART_Transmit(tempstring0[pos]); USART_Transmit(' '); void check_sec() { if (sec == 60) { sec = 0; min++; check_min(); check_hour(); check_date(); check_month(); 12

sendtemp(); sendtime(); void check_min() { if (min == 60) { min = 0; hour++; void check_hour() { if (hour == 24) { hour = 0; datum++; void check_month() { if (month == 12) { month = 1; year++; void check_date() { check_month(); if (datum == months[month-1] + 1) { datum = 1; month++; void printtime() { printsec(); printmin(); printhour(); printdate(); printmonth(); printyear(); SIGNAL(SIG_OUTPUT_COMPARE1A) { sec++; check_sec(); if (clock_enable) { printtime(); float average_temp(float vect[]) { float sum = 0; 13

for (short int i = 0; i < 10; i++) { sum += vect[i]; return sum/10.0; SIGNAL(SIG_OUTPUT_COMPARE1B) { int temp = ADC_read(1); float tooth = ADC_temp_convert(temp); aver_in[pos_aver] = tooth; float temp_in = average_temp(aver_in); dtostrf(temp_in, 4, 1, tempstring); int temp0 = ADC_read(0x00); float tooth0 = ADC_temp_convert(temp0); aver_out[pos_aver] = tooth0; float temp_out = average_temp(aver_out); dtostrf(temp_out, 4, 1, tempstring0); pos_aver++; pos_aver = pos_aver % 10; if (alarm_enable) { if (temp_out < alarm_out) { alarm_light_on = 0; LED_RED = 0; LED_GREEN = 1; else if (temp_out >= alarm_out) { alarm_light_on = 1; LED_RED = 1; LED_GREEN = 0; if (temp_enable) { printstring(0x8a, tempstring); printstring(0xca, tempstring0); if (enable_stats) { if (temp_in > max_in) { max_in = temp_in; else if (temp_in < min_in) { min_in = temp_in; if (temp_out > max_out) { max_out = temp_out; else if (temp_out < min_out) { min_out = temp_out; SIGNAL(SIG_OUTPUT_COMPARE0) { check = 1; void setup_clock() { printstring(0xc0, "00:00:00"); 14

sec = 55; min = 59; hour = 23; datum = 30; month = 4; year = 2011; printstring(0x80, "00-00-00"); printsec(); printmin(); printhour(); printdate(); printmonth(); printyear(); void write_temps() { write_cmd(0x89); write_data('i'); write_cmd(0x8e); write_data(0b11011111); printstring(0x8f, "C"); write_cmd(0xc9); write_data('u'); write_cmd(0xce); write_data(0b11011111); printstring(0xcf, "C"); void home_layout() { write_cmd(0x01); delay_ms(30); printstring(0xc0, "00:00:00"); printstring(0x80, "00-00-00"); printsec(); printmin(); printhour(); printdate(); printmonth(); printyear(); write_temps(); void disp_init() { delay_ms(255); write_cmd(0x01); //disp clear write_cmd(0x38); //func set write_cmd(0x08); //disp off write_cmd(0x06); //entry mode set write_cmd(0x0c); //disp on delay_ms(255); void timer_set() { TIMSK = _BV(OCIE0) _BV(OCIE1A) _BV(OCIE1B); 15

TIFR = _BV(OCF0) _BV(OCF1A) _BV(OCF1B); TCCR0 = _BV(CS00) _BV(CS02) _BV(WGM01); TCCR1B = _BV(CS12) // 256 prescale _BV(WGM12); OCR0 = 100; OCR1A = 14400; OCR1B = 6000; void datadir_set() { DDRD = 0x7C; DDRB = 0xFF; PORTD = 0x00; void setup_mode() { delay_ms(300); write_cmd(0x0f); // curs on delay_ms(300); write_cmd(0x02); //curs home void show_statsin() { printstring(0x80, "Inne min:"); printstring(0xc0, " max:"); char statstring_inmax[4]; char statstring_inmin[4]; dtostrf(min_in, 4, 1, statstring_inmin); printstring(0x8a, statstring_inmin); dtostrf(max_in, 4, 1, statstring_inmax); printstring(0xca, statstring_inmax); delay_ms(5); void show_statsout() { printstring(0x80, "Ute min:"); printstring(0xc0, " max:"); char statstring_outmax[4]; char statstring_outmin[4]; dtostrf(min_out, 4, 1, statstring_outmin); printstring(0x8a, statstring_outmin); dtostrf(max_out, 4, 1, statstring_outmax); printstring(0xca, statstring_outmax); delay_ms(5); void setalarm() { if (set_alarm_enable) { if (alarm_out > 60) { alarm_out -= 60; switch(pos_hor) { case 0: alarm_out += 10; 16

case 1: case 2: default: dtostrf(alarm_out, 4, 1, alarmstring); printstring(0xc0, alarmstring); write_cmd(0xc0); alarm_out += 1; dtostrf(alarm_out, 4, 1, alarmstring); printstring(0xc0, alarmstring); write_cmd(0xc1); alarm_out += 0.1; dtostrf(alarm_out, 4, 1, alarmstring); printstring(0xc0, alarmstring); write_cmd(0xc3); void settime() { if (set_time_enable) { switch(pos_hor) { case 0: datum++; if (datum > 31) { datum = datum % 31; itoa(datum, da, 10); if (datum < 10) { printstring(0x80, "0"); printstring(0x81, da); else { printstring(0x80, da); write_cmd(0x81); case 1: month++; if (month > 12) { month = month % 12; itoa(month, mo, 10); if (month < 10) { printstring(0x83, "0"); printstring(0x84, mo); else { printstring(0x83, mo); write_cmd(0x84); case 2: year++; 17

case 3: case 4: case 5: if (year > 2050) { year = 2011; itoa(year, y, 10); if (year%100 < 10) { printstring(0x86, "0"); itoa(year%100, y, 10); printstring(0x86, "0"); printstring(0x87, y); else { itoa(year%100, y, 10); printstring(0x86, y); write_cmd(0x87); hour++; if (hour > 23) { hour = 0; itoa(hour, h, 10); if (hour < 10) { printstring(0xc0, "0"); printstring(0xc1, h); else { printstring(0xc0, h); write_cmd(0xc1); min++; if (min > 59) { min = 0; itoa(min, m, 10); if (min < 10) { printstring(0xc3, "0"); printstring(0xc4, m); else { printstring(0xc3, m); write_cmd(0xc4); sec++; if (sec > 59) { sec = 0; itoa(sec, s, 10); if (sec < 10) { printstring(0xc6, "0"); printstring(0xc7, s); else { printstring(0xc6, s); 18

default: write_cmd(0xc7); int main (void) { setup_keys(); datadir_set(); disp_init(); timer_set(); ADC_init(); write_temps(); setup_clock(); USART_Init(); clock_enable = 1; temp_enable = 1; sei(); delay_ms(10000); enable_stats = 1; max_in = min_in = average_temp(aver_in); max_out = min_out = average_temp(aver_out); while(1) { if (check) { switch(checkkeys()) { case 11: temp_enable = 1; case 12: //Reset temp memory max_in = min_in = average_temp(aver_in); max_out = min_out = average_temp(aver_out); case 13: case 14: case 21: case 22: case 23: case 24: clock_enable = 0; clock_enable = 1; 19

case 31: // move cursor when setting time/alarm pos_hor++; delay_ms(200); if (set_alarm_enable) { if (pos_hor == 1) { write_cmd(0xc1); write_cmd(0xc3); else if (pos_hor == 2) { else if (pos_hor == 3) { pos_hor = 0; disp_init(); home_layout(); temp_enable = 1; clock_enable = 1; (alarm_enable) { set_alarm_enable = 0; if alarm_enable = 0; LED_RED = 0; alarm_enable = 1; else { else if (set_time_enable) { switch (pos_hor) { case 1: write_cmd(0x84); write_cmd(0x87); write_cmd(0xc1); write_cmd(0xc4); write_cmd(0xc7); case 2: case 3: case 4: case 5: case 6: 20

pos_hor = 0; disp_init(); home_layout(); temp_enable = 1; clock_enable = 1; set_time_enable = 0; 21 case 32: // set alarm/time delay_ms(100); if (set_alarm_enable) { setalarm(); else if (set_time_enable) { settime(); case 33: //max min in temp_enable = 0; clock_enable = 0; show_statsin(); case 34: //max min out temp_enable = 0; clock_enable = 0; show_statsout(); case 41: //return to home layout delay_ms(100); printstring(0x8a, tempstring); printstring(0xca, tempstring0); home_layout(); delay_ms(50); temp_enable = 1; clock_enable = 1; set_alarm_enable = 0; set_time_enable = 0; case 42: //set alarm set_alarm_enable = 1; set_time_enable = 0; alarm_out = 0; write_cmd(0x01); delay_ms(30); temp_enable = 0; clock_enable = 0;

setup_mode(); printstring(0x80, "Ange larmgr ns:"); write_cmd(0x8b); write_data(0b11100001); return 0; else { check = 0; printstring(0xc0, "00.0 C"); write_cmd(0xc4); write_data(0b11011111); write_cmd(0xc0); case 43: //set time set_time_enable = 1; set_alarm_enable = 0; write_cmd(0x01); temp_enable = 0; clock_enable = 0; setup_mode(); printtime(); printstring(0x8c, "Date"); printstring(0xcc, "Time"); write_cmd(0x81); case 44: // clock_enable = 0; temp_enable = 0; write_cmd(0x80); write_data(0b00100100); printstring(0x81, " Grupp 7: Joel "); printstring(0xc0, "Daniel & Marcus "); default: 22