Arduinostyret klimaanlæg Afsluttende projekt programmering C Udarbejdet af: Mathias R W Sørensen, klasse 3.4 Udleverings-dato: 02-03-2012 Afleverings-dato: 11-05-2012 Programmeringvejleder: Karl G. Bjarnason ROSKILDE TEKNISKE GYMNASIUM Side 1 af 14
Indholdsfortegnelse Indledning...3 Problemstilling og løsning...3 Forudsætninger for løsning...3 Flowchart...4 Implementering...5 Prototype 1...5 Prototype 2...6 Prototype 2.1...7 Prototype 3...8 Færdige produkt og videreudvikling...9 Konklusion...10 Bilag...11 1. Diagram Prototype 1...11 2. Diagram Prototype 2...12 3. Diagram Prototype 3...13 4. Kildekoden...14 z Side 2 af 14
Indledning I forbindelse med eksamens-projektet i programmering, fik vi stort set frie tøjler. Vi skulle selv komme frem med en problemstilling vi ville løse. Til denne selv valgte problemstilling fik vi også selv mulighed for at vælge i hvilket udviklingsmiljø vi ville løse den. Projektet vil være en kombination mellem Informationsteknologi B og programmering C. Der vil være et fælles produkt, men hvert fag vil have hver sin dokumentation. Da jeg har valgt at arbejde alene i projektet har jeg også selv skulle vælge problemstilling og udviklingsmiljø. Det har hurtigt været besluttet at udviklingsmiljøet skulle omhandle et arbejde med Arduino, derfor er problemstillingen også nød til at være mulig at løse med Arduino. Problemstilling og løsning Den problemstilling der er fundet frem til at være gældene for mit projekt, er problemstillingen med indendørsklima. Et dårligt indeklima nedsætter ens præstationsevner og koncentration. Dette er en problemstilling jeg er kommet frem til da jeg selv ved hvordan det er at arbejde koncentreret i et dårligt indeklima. Der er også fundet videnskabelig dokumentation, der viser de negative effekter et højt CO 2 niveau og ubehagelig temperaturer har på en persons koncentration og præstationsevner 1. Da produktet der skal laves for at løse problemstillingen skal laves i med arduino, er det blevet besluttet at der skal laves et primitivt klimaanlæg som løsning. Dette klimaanlæg skal kunne måle og vise en temperatur, og i forhold til et valgt middeltemperatur kunne skrue op eller ned for varmen. Forudsætninger for løsning Forudsætningerne der er til produktet, omfatter de redskaber og værktøjer der skal være til rådighed for at prototyperne kan laves. De fordudsætnigner der kræves for at prototyperne kan fremstilles er: Arduino Uno board Fumlebræt LM35 standardkomponent Ledninger Modstande af forskellige størrelser Varme og kuldeblæser, men skolen har ikke nogen så har illustreret dem ved brug af dioder 2*16 bits display Arduino's egen software til kodeskrivning 1 http://www.indeklimaportalen.dk/indeklima/luftkvalitet/maaling/indendors_co2.aspx Side 3 af 14
Flowchart Der er blevet lavet et flowchart der skal vise hvordan gennemgangen af programmet skal foregå. Ud fra dette flowchart skal der skrives et program til arduinoen Temperaturmåler ARDUINO Sammenligner data i forhold Til angivet min/max temp. Over max. Under max. - Over min. Under min. Kuldeblæser starter Kulde/varme- Blæser slukket Varmeblæser starter Side 4 af 14
Implementering Prototype 1 Helt grundlæggende skal der laves en temperaturmåler, hvor arduinoen kan reagere på den målte data. En temperaturmåler har vi som et standardkomponent, en LM35. Datablad til dette komponent, vil være vedhæftet i bilag. Den første prototypes formål er egentlig at få arduinoen til at opfange og beregne en målt temperatur. Opstillingen og kildekoden er dokumenteret her, diagram over opstillingen er vedhæftet som bilag. Det lykkede at lave en opstillingen hvor LM35'eren reagerede på ændringer i temperaturen. Der blev skrevet en kildekode der omsatte de mv som temperaturmåleren sendte til arduinoen, om til en temperatur på celcius grader. Det har dog ikke løst problemstillingen med at starte en varme eller kuldeblæser, men som tidligere nævnt, så var den første prototypes formål, at få lavet en temperaturmåler der kan opfange temperatur i celcius grader. Kildekoden der er lavet her vil være den resten af projektet er bygget videre op omkring. Side 5 af 14
Prototype 2 Da arduinoen ikke har processerkraft nok til at den kan trække varme og kuldeblæsere, er de begge blevet erstatet af en rød og en blå diode for at illustrere varme eller kulden. Eftersom der skal være to dioder, skal der være en grænse imellem hvor de hver især tænder. Hvis de begge er tændt på samme tide, så udligner de bare hinanden og der vil ikke være nogen temperaturændring. Samtidig må vi også gå ud fra at der må være et eller andet temperatur interval der vil bliver betragtet som behagelig temperatur. Derfor skal der være en maximum og en minimumsgrænse der indikerer ved hvilke temperaturer de to forskellige blæsere skal starte. I den del af kildekoden der er vist, er der et melleminterval på 0.5 grader. Denne kan ændres efter hvad der nu ønskes. Denne prototype løser faktisk problemstillingen, men den er dog et bug. Lige omkring intervalskift er der en del flimren når dioden skifter mellem tændt og slukket. Dette skal rettes. For ellers vil blæseren hele tiden svinge mellem tændt og slukket imellem intervalskift. Side 6 af 14
Prototype 2.1 Kildekoden skal ændres således at den holder sin sidste værdi indtil den får noget nyt at vide. Istedet for et direkte intervalskift kommer der et nyt lille interval på 0.2 grad. I det lille interval holder dioden den sidste værdi den fik. Derfor kan temperaturen godt have nogle minimale små svingninger, men så længe de er mindre end 0.2 grad, så vil der ikke komme noget flimren Side 7 af 14
Prototype 3 Som vi så ved evalueringen af prototype 2, så er problemstillingen faktisk løst i forhold til dårligt klima ved ubehagelige temperaturer i et lokale. Dog er det meget primitivt. Det var selvfølgelig et krav at det skulle være simpelt, men ikke primitivt.da der også var et krav om at det kunne fungere uafhængigt af brugen af computer. Derfor skal der tilføjes et display som kan vise temperaturen i lokalet. Der er blevet tilkoblet et 16*2 bits LCD display. Dette displays formål er at vise den nuværende temperatur i lokalet. Side 8 af 14
Dette har ikke løst problemstillingen på nogen bedre måde, det er blevet mere brugervenligt og informationspræget at du kan se temperaturen i rummet. Derfor er den tredje prototype ikke en bedre løsning, men mere en mere informationspræget løsning. Færdige produkt og videreudvikling Dette er langs fra den færdige prototype. Der er stadig en del forbedringer at lave. Et produkt kan altid forbedres mere, eller man kan stille flere krav til det. Nogle idéer til videreudvikling på produktet kunnne være at det skal være muligt at ændre intervalerne mellem de to grænser. Altså du skal via nogle knapper og aflæsning i displayet kunne vælge hvilke temperaturer de forskellige blæsere skal starte ved. En meget passende videreudvikling kunne også være at kombinere mit løsningsforslag sammen med løsningsforslag 1, således at det blæserne også reagerer på om det er nogen, og hvor mange personer i et lokale. Side 9 af 14
Konklusion I dette afsluttende projekt er der er blevet arbejdet med en selvvalgt problemstilling der omhandler dårligt indendørsklima. Til den problemstilling, skulle vi selv finde på en løsning der måtte være lavet i hvilket som helst udviklingsmiljø. Der arbejdede jeg for første gang mere i dybden med arduino, og har prøvet at have en hvis form for interaktionen mellem alle elementerne der har været i min løsning. Altså interaktionen mellem måler og arduino og derefter den pågældene respons i form at dioder. Gennem flere implementeringer af forskellige prototyper med arduino er der begyndt at komme en indskrænkelse der nærmer sig et mere brugbart færdigt produkt. Det er bare et spørgsmål om flere iterationer. Side 10 af 14
Bilag 1. Diagram Prototype 1 Side 11 af 14
2. Diagram Prototype 2 Side 12 af 14
3. Diagram Prototype 3 Side 13 af 14
4. Kildekoden // include the library code: #include <LiquidCrystal.h> // initialize the library with the numbers of the interface pins LiquidCrystal lcd(12, 11, 5, 4, 3, 2); float temp; int temppin = 0; const int ledtemplav = 8; const int ledtemphoj = 9; void setup() { Serial.begin(9600); lcd.begin(16, 2); lcd.print("temperatur:"); } void loop() { temp = analogread(temppin); temp = temp * 0.48828125; Serial.println(temp); if (temp >= 27) { digitalwrite(ledtemphoj, HIGH); } if (temp <= 26.8) { digitalwrite(ledtemphoj, LOW); } if (temp<= 24.8) { digitalwrite(ledtemplav, HIGH); } if (temp >= 25.0) { digitalwrite(ledtemplav, LOW); } lcd.setcursor(0, 1); lcd.print(temp); lcd.print((char)223); lcd.print("c"); } Side 14 af 14