Indholdsfortegnelse Indledning... 2 Projektbeskrivelse... 2 Dette bruger vi i projektet... 2 Komponenter... 2 Software... 2 Kalibrering... 3 Kildekoden... 4 Variabler... 4 Setup... 4 Loop... 4
Indledning I dette projekt skal vi arbejde med dataopsamling og regulering. Det vil vi gøre ved at opsamle værdier for noget i dagligdagen, f.eks. temperatur, luftfugtighed, tryk, kuldioxidkoncentration e.lign. Herefter skal data evalueres og bruges til at tænde/slukke for andre enheder, f.eks. en diode, ventilator, affugter e.lign. Til projektet bruger vi arduino platformen. Arduino er et opensource hardware- og softwaresystem, som er lettilgængeligt og nemt at komme i gang med. Arduinohardwaren er et stykke printplade med en programmerbar mikrochip, usb-tilslutning, 2.1mm ac tilslutning og diverse pins, både analoge og digitale, hvor alle mulige elektriske komponenter kan tilsluttes og give programmet mulighed for både input og output. Projektbeskrivelse Vi har valgt at lave et temperaturafhængigt reguleringssystem. Ideen med produktet er, at temperaturen skal måles. Hvis temperaturen er under en fastsat nedre grænse, så skal et varmelegeme tændes og hvis temperaturen er over, så skal en ventilator tændes. På den måde kan man bygge en simpel automatisk varmestyring, som bruges mange steder i hverdagen, som f.eks. i nyere biler med klimaanlæg. Vi erstatter dog varmelegemet og ventilatoren med hhv. en blå og rød diode, så man i stedet kan aflæse, at temperaturen ikke er i orden. Dette har vi valgt at gøre, da det gør den elektriske del af projektet mere simpelt og selve programmeringsdelen er stadig den samme. Hvis produktet skulle implementeres i et hus, så skulle man bruge nogle transistorer til at åbne for strømmen til f.eks. et varmelegeme, da det kræver en større spænding og strøm end selve styreenheden, som vi skal programmere. Dette bruger vi i projektet Komponenter Arduino printplade Temperaturmåler 3 farvet LED (rgb-led) Display Strømforsyning (9v blokbatteri) Software Arduino IDE Evt. Processing Arduino IDE bruges til at indskrive og kompilere programkode, som kan køres på arduino'en. IDE'en er simpelt opbygget med et tekstfelt til koden, en kompilerings- og en uploadknap. Der er også en række eksempler, som man kan uploade direkte for at teste funktionaliteterne. I Arduino IDE har man også mulighed for at skrive til og læse fra serielporte, så man f.eks. kan læse output fra arduino'en mest til test og debugging, da man ikke kan bruge serieloutputtet direkte i Arduino. Her skal man bruge programmet Processing i stedet, som indeholder kode, som i modsætning til Arduino IDE kan køres på computeren. Man kan i processing lave et program, som læser serieloutput og f.eks. tegner en graf over data. Sproget i Arduino IDE og Processing er det samme og kaldes Processing, som er baseret på andre kendte sprog som C
og java. Sproget minder utroligt meget om java efter vores mening så meget at man stort set ville kunne køre et simpelt Arduino program, som et java program. Kalibrering Den temperatursensor vi bruger har 10-bit præcision, hvilket betyder at den giver et analogt output mellem 0 og 1023. Hvis den f.eks. kan tåle temperaturer mellem -30 C og +50 C, så vil præcisionen være: 80 C/1024=0,08 C hvilket må siges at være rigelig p ræsision. Usikkerheden ligger altså i hvor præcist føleren indstiller sig, og bliver kalibreret. Vi kan jo ikke bruge en værdi, som 452,5. Vi vil hellere have et output som 23,2 C. Vi har målt temp eraturer forskellige steder, både med temperaturføleren og et digitalt termometer, som er kalibreret. På den måde har vi fået nogle datapar, som man kan analysere matematisk. Sensor værdi C 471 22,6 409 16,2 281 2,1 640 41,0 Herunder kan man se punkter fra vores lille dataopsamling indsat i et koordinatsystem. Det så ud til, at der var en lineær sammenhæng, så vi bedte programmet om at lave en lineær regression, hvorved vi fik nedstående funktionssammenhæng. Denne funktion bruger vi i programmet, når vi skal omsætte de målte værdier til noget, som et menneske skal kunne forstå. 45,0 40,0 35,0 30,0 25,0 20,0 15,0 10,0 5,0 f(x) = 0,11x - 28,26 R² = 1 0,0 250 300 350 400 450 500 550 600 650 700
Kildekoden Al kildekode i Arduino består af tre dele. I første del bliver alle variabler defineret. De to andre dele, er henholdsvis setup og loop. I setup delen, bliver al koden som kun skal køre én gang kørt. Loop delen er ligesom et hvert andet loop, som bliver ved med at køre. Her er selve programmets kode. I dette projekt som omhandler dataopsamling, vil komponenterne til at opsamle data initialiseres i setup delen, og dataen bliver opsamlet og processeret i loop delen. Variabler Første linje af kildekoden importerer et bibliotek, så der kan arbejdes med LCD-displayet. Dernæst initialiseres en variabel af typen LiquidCrystal, lcd. Objekttypen LiquidCrystal kommer fra det importerede bibliotek. De næste linjer (5-12) laver variabler som bestemmer de forskellige komponenters pinnumre og opsætter nogle variabler ved at give dem en start-værdi. De sidste to linjer er kommenteret ud. De beskriver de to ligninger der skal til for at konvertere Arduino ens input (0-1023) til grader celsius, og den anden vej. #include <LiquidCrystal.h> LiquidCrystal lcd(2, 3, 4, 5, 6, 7, 8); int sensorpin = 1; int bluepin = 10; int greenpin = 11; int redpin = 12; int sensorvalue = 0; int mintemp = 20; //Celsius int maxtemp = 25; //Celsius float temp = 0.0; //sensor->degree 0.10821788*x - 28.2626 //degree->sensor 9.2401825*x + 261.17276 Setup Setup delen af koden kører ligesom initialisationen af variablerne kun én gang. Setup delen er et krav for Arduino-koden, så den kan kompilere korrekt. Linjerne 1-4, sætter de tre dioders pins til output, så der kan sendes en tilstrækkelig spænding gennem dem. void setup() { pinmode(greenpin, OUTPUT); pinmode(redpin, OUTPUT); pinmode(bluepin, OUTPUT); lcd.begin(16, 2); lcd.clear(); lcd.print("temp:"); Femte linje starter displayet, så der kan sendes kommander til det. Sjette linje visker det rent, og syvende linje skriver Temp:. Syvende og sidste linje flytter cursoren til næste linje, så det næste der bliver skrevet starter der. Loop Loop delen er der hvor selve programmet kører. Derfor er det oftest den længste del af kildekoden. I dette tilfælde aflæses temperaturen og den konverteres til grader. Derefter sammenlignes den med variablerne mintemp og maxtemp, som blev initialiseret i starten af kildekoden. Ud fra disse resultater, tændes den rigtige diode, og temperaturen skrives til displayet. De tre dioder lyser således: rød = over maxtemp, grøn = mellem maxtemp og mintemp. Og den blå lyser når temperaturen er under mintemp. Temperaturen sammenlignes med variablerne mintemp og maxtemp med en række if-statements. Den korrosponderende diode tændes så, og de to andres slukkes. Den første linje læser værdien fra temperaturmåleren. Derefter bliver den konverteret til grader celsius, så den kan sammenlignes med start-værdierne. På linje 5 starter et if-statement, som tjekker hvilket interval temperaturen ligger i. Linje 6-8 tænder og slukker nogle af dioderne. De to input i syntaksen er henholdsvis pinnummer og tilstand. HIGH svarer til at tænde den, og LOW til at slukke.
Det næste if-statement tjekker om temperaturen er positiv eller negativ. Hvis den er positiv, skrives der et mellemrum først, både for at fjerne minusset hvis det har været der før, og for at temperaturen er indskudt ens. Til sidst skrives C for at vise at det er grader celsius. Da mange programmer bruger forskellige udvidede asciitabeller, vil det være svært at finde præcis den som bruges i et bestemt program. For at finde det rigtige tegn, kørte vi en lille løkke, som skriver hvert ascii tegn. Ud fra det kunne vi finde tegnets asciiværdi. Det viste sig at i dette tilfælde er ascii-værdien 223. void loop() { sensorvalue = analogread(sensorpin); temp = (float)((int)((((float)sensorvalue * 0.10821788) - 28.2626)*10))/10; if (temp > maxtemp) { digitalwrite(redpin, HIGH); else if (mintemp < temp && temp <= maxtemp){ digitalwrite(greenpin, HIGH); else if (temp <= mintemp) { digitalwrite(bluepin, HIGH); else { if (temp < 0) { lcd.print(temp); else { lcd.print(" "); lcd.print(temp); lcd.setcursor(5,1); lcd.print(" "); lcd.print(223, BYTE); lcd.print("c"); delay(100);