Optimering af fraværsregistrering

Relaterede dokumenter
Indholdsfortegnelse Indledning... 2 Projektbeskrivelse... 2 Dette bruger vi i projektet... 2 Komponenter... 2 Software... 2 Kalibrering...

Programmering C Eksamensprojekt. Lavet af Suayb Köse & Nikolaj Egholk Jakobsen

Arduino kursus lektion 3:

Arduinostyret klimaanlæg Afsluttende projekt programmering C

Arduinostyret klimaanlæg Afsluttende projekt informationsteknologi B

Arduino Programmering

Start på Arduino og programmering

Enes Kücükavci Roskilde Tekniske Gymnasium Mathias Turac Informationsteknolog B Vejleder: Karl Bjranasson Programmering C

Projekt Når maskinen reagerer - Dataopsamling og aktuatorer

RF-ID Kompendium. RF-ID & Radio control. Dette kompendium indeholder materiale om RF-ID. Materialet er meget foreløbigt.

Michael Jokil

Microcontroller, Arduino

CANSAT & ARDUINO step by step

Test af It-komponent

Kapitel 3 Betinget logik i C#

Brugermanual 3D Webcam

Internt interrupt - Arduino

Fra programmering til mikroprocessor

EKSEMPEL PÅ ELEVOPGAVE TIL ARBEJDET MED PROGRAMMERING AF ARDUIONO MED LED BÅND

Brug af digitale ind og udgange

Alt elektronik heri er købt via og arduino udviklingssoftware er hentet fra

DANMARKS TEKNISKE UNIVERSITET

Systemkald DM Obligatoriske opgave. Antal sider: 7 inkl. 2 bilag Afleveret: d. 18/ Afleveret af: Jacob Christiansen,

Programmering af CS7002 GSM/GPRS modul Version 5

Program Dokumentation PC Software Skrevet af. Gruppen. Version 1.0

Indholdsfortegnelse for kapitel 2

Programmering for begyndere Lektion 2. Opsamling mm

Analoge indgange og A/D konvertering. Analoge udgange

Fang Prikkerne. Introduktion. Scratch

Cykel Score når chips sætter gang i cyklisterne

My booking. Generelt. Forsiden. Version 9.0

IT sikkerhed Whitelist

Mircobit Kursus Lektion 4 (Du skal her vælge Lets Code Og herefter Block Editor.)

ARDUINO PROGRAMMERING

Visualiseringsprogram

Microcontroller, Arduino

Arduino kursus lektion 4:

Spil Master Mind. Indledning.

Specialiseringen Rapport Lavede Af Rasmus R. Sørensen Side 1 af 6

Af: Safa Sarac Klasse 3.4 Skole: Roskilde Tekniske Gymnasium, HTX Vejleder(e): Karl B Dato: 26. marts 2012

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:

Lectio. Introduktion til Lectio Elevmodul. MaCom A/S Vesterbrogade 48, København V Telefon:

Programmering C RTG

Klasse 1.4 Michael Jokil

NVR Client system. Bruger Manual. SuperVision Alarmteknik ApS Cedervej 2, 8462 Harlev J

DM536. Rapport og debug

FIP INFORMATIK C/B IT A

Automatisk varmeregulering

IT-progressionsplan 2014

SSI GSM Fjernbetjenings system for porte/garage døre

Martin Olsen. DM507 Projekt Del I. 19. marts 2012 FOTO: Colourbox

Typisk modul-opbygget PLC system (Allan Bradley)

Mircobit Kursus Lektion 1

Python 3 kursus lektion 1:

MANUAL SKIOLD GØR EN FORSKEL DISTRIWIN SERVICE INSTALLATION

Undervisnings plan til Programmering

Ide med Diff. Mål. Tidsplan. 1.uge: 2.uge:

Det skrå kast, en simulation

Elevforudsætninger I forløbet indgår aktiviteter, der forudsætter, at eleverne kan læse enkle ord og kan samarbejde i grupper om en fælles opgave.

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version

Programmeringseksempel tl BCxxxx (Seriel)

Qwickly fremmøderegistrering mm. i Blackboard

Installationsmanual. 2 Installering Installering SMS sender Installering PSTN/GSM sender Installering PSTN GSM konverter...

// Definition af porte og funktioner

Velkommen til TIS-Web

AVR MP Ingeniørhøjskolen i Århus Michael Kaalund

Demonstration af transitmetoden

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter Abstract

Programmering i C. Lektion december 2008

TinkerCad - Arduino simulator

DANSK SKOLEDATA APS. Tlf DSA-Ventelisten

Undervisningsbeskrivelse

Udarbejdet af CFU Absalon

Adobe Digital Editions

Dette korte foredrag er opdelt i 3 dele: 1. ARDUINO i flere versioner, hvad er det? 2. DEMO-video 3. Din fremtidige Oscillator, SI5351A 4.

Transkript:

Journal Optimering af fraværsregistrering Eksamensprojekt i Programmering C, klasse 3.4, 2011 AFLEVERET 09-05-2014

Indhold Abstract... Fejl! Bogmærke er ikke defineret. Problemformulering... 2 Produktet... 3 Funktion... 3 Uddybelse af programmet... 5 Test... 10 Konklusion... 12 Bilag... 14 Bilag 1 Produktkode, inklusiv kommentarer (software)... 14 Bilag 2 Arduino og RFID-system (hardware)... 14 1

Resume Denne journal præsentere og dokumentere det endelige produkt, der er produceret i sammenhæng med eksamensprojektet i Programmering C og Informationsteknologi B 2014. Journalen er udelukkende tiltænkt som besvarelse af opgaven i forhold til Programmering C, mens en separat rapport dokumentere arbejdet i forhold i til Informationsteknologi B. Journalen indleder med en problemformuleringen, der er baggrunden for udviklingen af produktet. Dokumentationen af produktet består af en overfladisk del, som giver et en overblik over dets funktion og virkemåde, samt en mere detaljeret del, hvori det vigtigste kode dokumenteres og uddybes. Herefter beskrives de tests, der er blevet udført i sammenhæng med udviklingen af produktet og det endelige produkt. Journalen afsluttes med en konklusion. Bilaget indeholder det endelige produkt i form af en.ino fil, samt billeder af opsætningen af de fysiske komponenter. Problemformulering Produktet er udarbejdet fra resultat af en indledende problemanalyse, der kort er opsummeret i følgende problemformulering: Elevers tendens til arbejde i andre rum end klasselokalet, grundet det manuelle arbejde der ligger fraværsregisteringen, gør det registreringen, vha. Lectio, til et uhensigtsmæssigt system. 2

Produktet Dette kapitel er hovedsageligt en dokumentation af produktet og dets funktioner, samt uddybelse af de vigtigste kodeelementer der ligger bag. Derudover vil der blive udført dokumenteret og beskrevet enkelte tests. Funktion Produktet er bestående af et fysisk RFID-system forbundet til en Arduino-Uno, hvori der er lagret en virtuel kode (det reelle programmeringsprodukt). Ved at forbinde Arduino en til en computer, kan databehandling formidles i tekst via Arduino-softwarens SerialRead funktion. Den fysiske hardware vil ikke uddybes i denne journal, men en illustration af opsætningen er vedlagt i Bilag 2 Arduino og RFID-system (hardware). Programmet starter et loop der gentages et vilkårligt antal gange i sekundet (kan justeres og er i sammenhæng med journalen sat til 4 gange / sekundet), indtil der er gået 20 sekunder. De 20 sekunder skal imitere et skole forløb, hvor der starter en 10 sekunders undervisning efter 10 sekunder. Efter de 20 sekunder er gået vil programmet stoppe. Ved at benytte fysiske RFID-tags kan man integrere med programmet via RFID-læseren, der er tilkoblet Arduino en. Programmet vil registrere hvert unikt tag som enkelte elever og justere elevernes fravær alt efter tidspunktet i forløbet de bliver registreret. Efter de 20 sekunder vil en oversigt over alle elevers fravær blive fremvist. Flowdiagram For at skabe et overblik over produktets funktion er der herunder illustreret et flowdiagram, der forklarer, hvordan programmet arbejder i forhold til hvilke ting det evaluerer og hvilke handlinger det tager på baggrund af de evalueringer. 3

4

Uddybelse af programmet I dette afsnit forklares programmets vigtigste kodeelementer i forhold til, hvordan de er skrevet og hvorfor de er skrevet således. Biblioteket For at Arduino en skal kunne aflæse de signaler, som RFID-læseren opfanger, benyttes de digitale porte. Portene kan kun sættes i gang ved at inddrage biblioteket SoftwareSerial. Med dette bibliotek kan der tildeles et navn, og derved en identifikation, til en indgangsport (RX) samt en udgangsport (TX) med følgende kode: #include <SoftwareSerial.h> SoftwareSerial RFID = SoftwareSerial(2, 3); Portene bliver tildelt navnet RFID, og vi benytter port 2 som indgangsport og port 3 som udgangsport. Aflæsningen af portene igangsættes på samme måde som serial-porten i void setup, hvor det tildelte navn benyttes i stedet: void setup(){ Serial.begin(9600); RFID.begin(9600); Ved at sætte RFID-læseren til denne indgangsporten kan Arduino en opfange det modtaget data og bearbejde det. Variabler I programmet bliver der brugt en række variabler, og for at give et overblik over de vigtigste er de beskrevet herunder i tabellen herunder i forhold til type, navn og deres funktion. Type Navn Funktion string msg Midlertidig lager til tag-id char c Midlertidig lager til enkelte tegn af tag-id string elever Permanent lager til tag-id string ankommet Lager til elever der er tilstede i undervisningen Float counter1 Lagrer tiden integer counter2 Bruges til at holde styr på, hvornår der er gået ét sekund float (array [10] ) attendance Lagring af de enkelte elevers tilstedeværelse integer elevantal Antallet af elever, registreret i systemet 5

Tiden (if-statement) Programme er bestående af to dele: et void setup, hvori portene igangsættes, og et void loop, hvori den aktive del af programmet er. Denne overordnede void-løkke er tildelt en justérbar forsinkelse, således man kan ændrer på antallet af gentagelser løkken skal tage hvert sekund. #define hastighed x delay(1000 / hastighed) Uden for både void-setup og void-loop defineres en værdi x som hastighed. Under kodens kompilering vil alle de steder, der står hastighed blive udskiftet med denne værdi. Således opnås den justérbare frekvensfunktion. En tæller, i form af en float-variabel, holder styr på, hvor lang tid der er gået. En separat integer -tæller holder styr på, hver gang der er gået et sekund således det kan formidles i serial-overvågningen. counter1 += 1.0 counter2 += 1; if(counter2 == hastighed && counter1 <= 20){ Serial.println("Tid: "+String((int)counter1)); counter2=0; Kortet opfanges (while-løkke) For at registrere kortet, benyttes en while-løkke og den digitale port RFID. En whileløkke vil gentage det tildelte stykke kode, så længe den angivet betingelse er sand eksempel på dette: while(x <= 10){ x += 1 Denne løkke vil gentage sig selv 10 gange, da den betingelsen ellers ikke vil være sand. I forhold til programmet, bruges RFID.available() i løkkens betingelse, der giver et tal, hvis dét, der er sat til porten opfanger noget data. Dataene opfanges i et enkelt tegn ad gangen, indtil al informationen er blevet aflæst (da vil betingelsen ikke længere være sand). De enkelte tegn kan aflæses vha. funktionen RFID.read() og lagres i en char variabel, hvorefter det hele stykkes sammen i én tekst variabel og beskriver det pågældende tag- ID. Dette gøres med følgende kode: 6

while(rfid.available() >0){ c = RFID.read(); msg += c; Tjekker og registrerer tag-id (if-statement) For at holde styr på alle registrerede tags samles de i en string variabel. Der bruges her en if-statement for at sikre, at det samme tag ikke bliver registreret to gange: if(elever.indexof(msg) >=0){ else{ elever += msg; Først tjekkes der, om det læste tag-id er en del af de allerede-registrerede ved at bruge.indexof( )-funktionen, der sammenligner teksten i parentesen med teksten i funktionens variabel. Hvis ikke det pågældende tag-id er en del af de registrerede ID, så tilføjer programmet det i den efterfølgende else-statement. Ankommet eller gået (if-statement) Som beskrevet i det tidligere flowdiagram, så skal programmet nu evaluere, hvorvidt eleven er på vej ind eller ud af undervisningen, og hvorvidt eleven kommer for sent eller går for tidligt. Dette opnås ved at bruge en overordnet if-statement samt flere sub-statements. En if-statement sammenligner det gældende tag-id med listen over de ID, som er tilstede i undervisningen (string-variablen ankommet ) ved igen at bruge.indexof()-funktionen. if(ankommet.indexof(msg) >=0){ Er eleven allerede tilstede (det gældende tag-id er en del af variable ankommet ), skal elevens ID fjernes fra variablen. Dette gøres ved at lokalisere positionen af det pågældende ID i variablen, og skære de to bider af variablen omkring ID et væk, for at sætte dem sammen igen. Derved fås den samme variabel uden det gældende ID. Hertil gøres der brug af, at de det bruge tags har et ID på 13 tegn. int pos=ankommet.indexof(msg); msg=""; msg += ankommet.substring(0,pos); 7

msg += ankommet.substring(pos+12,ankommet.length()); ankommet=""; ankommet += msg; Dette fjerner eleven fra databasen over ankommet elever. Herefter skal programmet vurdere, hvorvidt eleven forlader lokalet før undervisningen er slut. Dette gøres ved at gøre brug af en simpel if-statement samt programmets tidstæller: if(ankommet.indexof(msg) >=0){ int pos=ankommet.indexof(msg); msg=""; msg += ankommet.substring(0,pos); msg += ankommet.substring(pos+12,ankommet.length()); ankommet=""; ankommet += msg; if(counter1<20 && counter1 > 10) Serial.println("Elev "+String(elevnummer)+" er gaaet foer tid"); //Vurderer om eleven går for tidligt else Serial.println("Elev "+String(elevnummer)+" er gaaet"); Er eleven ikke ankommet til undervisningen vil betingelsen i den overordnede if-statement være falsk, og den fortsætter derfor til en else-statement. Her skal eleven tilføjes til ankommet -variablen, og programmet skal vurdere, vha. af en if-statement, hvorvidt eleven kommer til tiden eller for sent. else{ if(counter1 < 20){ ankommet += msg; if(counter1>10) Serial.println("Eleven er ankommet for sent"); else Serial.println("Elev er ankommet"); else Serial.println("Timen er slut - eleven er ikke blevet registreret"); Hvis timen er slut, er der ingen grund til at eleven bliver registreret i det permanente system, og eleven bliver derfor ignoreret. Fraværsregistreringen (array, if- og for-statement) Programmet bearbejder alle elevers fravær, hver gang det overordnede void loop gentages. Dette gøres ved at tildele alle elever i string -variablen ankommet et antal sekunders tilstedeværelse, afhængigt af frekvensen på løkken. 8

Ved at identificere hvert tag (eller hver elev) med et nummer, kan de tildeles separat og personligt tilstedeværelse ved at gøre bruge af en float-variabel med et array. Elevnumrene virker som et indeksnummer i denne variabel, således man kan få adgang til den enkelte elevs tilstedeværelse. float var[4]; var[0] = 1; var[1] = 2; var[3] = 5; Elevnumrene kan produceres ud fra string-variablen, der indeholde listen over alle registrerede elever. Da hvert ID består af 13 tegn, kan der for hvert 13. tegn udledes et nummer, som er nummeret til det pågældende ID: string s; int elevnummer = 0; s = elever.substring(elevnummer*12, (elevnummer+1)*12); Svarer elevnummer 0 til 1, så vil dette udlede det første ID i listen over elever. Ved at øge int-variablen (altså elevnummeret) kan man finde et ID til en vilkårlig elev. Ved at bruge denne model og en array variabel sammen med for-løkke kan man opbygge en funktion, der kan vurdere elevernes tilstedeværelse. En for-løkke er en løkke, der vil gentage et stykke kode et givent antal gange: for(int i=0; i<5; i++){ Serial.println((int)i); Denne løkke vil gentage sig selv 5 gange, og printe værdien af i for hver gang. Benytter vi en float-variabel ved navn attendance kan den samlede kode for registrering af tilstedeværelse for eleverne beskrives ved hjælp af dette: if(counter1 >= 10.0 && counter1 < 20.0){ for(int i=0; i<=(elevantal-1); i++){ s = elever.substring(i*12, (i+1)*12); if( ankommet.indexof(s) >= 0){ attendance[i] += 0.25; 9

Optælling af tilstedeværelse (for-løkke) For hver gentagelse af den overordnede void-løkke, tjekkes tiden, og hvorvidt undervisningen er slut. Er undervisningen slut (der er gået 20 sekunder) stoppes tælleren ved at være styret af if-statements, og oversigten over fravær formidles via Serial.print() og en for-løkke. if(counter1==20){ Serial.println("Undervisningen er slut"); Serial.println(""); Serial.println("Oversigt over fremmoede for alle elever:"); for(int i=0; i<=(elevantal-1); i++){ Serial.println("Elev "+String(i+1)+ ": "+String((int)(attendance[i]*10.0))+"%"); Test Både under og efter udviklingen, er produktet blevet testet vha. forskellige metoder. Hvordan disse tests er blevet udført, samt deres formål, er beskrevet herunder. Under udviklingen I sammenhæng med udviklingen af produktet blev der udført adskillige tests, som skulle sikre, at produktet blev udviklet i den ønskede retning. Dette indebar at programmet løbende blev kompileret og overført til Arduino en for at blive testet, inden udviklingen fortsatte til næste stadie. Disse tests sikrer at programmets enkelte dele fungerer fejlfrit, således der ikke opstår større fejl i programmets helhed og at de i så fald let kan lokalisere og rettes. Arduino-softwaren kan lokalisere syntaksfejl i programmet under kompileringen, men for at lokalisere logic-errors benyttes softwarens Serial.print() samt Serial-overvågning. Denne testmetode blev f.eks brugt til udviklingen af den if-statement, der skal fjerne et pågældende tag fra listen over ankommet elever. 10

Denne funktion (Serial.println(ankommet);) printer listen over de resterende tag-id efter det pågældende ID er blevet fjernet, så det kan vurderes om det er blevet fjernet rigtigt. Test af det færdige produkt Det endelige produkt er blevet testet ved at køre en Serial-overvågning af programmet mens det kører og bliver brugt. Et eksempel på overvågningen af sådan en test kan ses til højre, hvor 3 elever løbende bliver registreret i systemet. Testen viser at eleverne bliver registreret korrekt, og at de bliver tildelt den rigtige status på baggrund af deres daværende status, når de registreres. Denne test givet et eksempel af det færdige produkt uden nogen former for test-print brugt af programmøren. Ændre på hastigheden Frekvensen af void-loopet kan justeres, hvilket er implementeret, da det har betydning for, hvor ofte der tjekkes, om et forsøger at blive læst. Der udføres tests ved at ændre på hastigheden: - I eksemplet programmets totale forløb er void-loopet sat til at gentage sig selv 2 gange i sekundet. Der ses her, at elev 1, efter 18 sekunder, forlader undervisningen for at ankomme igen med det samme. 11

- I denne test sættes frekvensen til 4 gentagelser i sekundet. Dette giver samme resultat som den forrige, dog forværres problemet. - Sættes frekvensen til én gentagelse i sekundet, opstår samme problem på trods af, at kortet fjernes inden den bør læses igen. Denne test med at justere hastigheden giver et indblik i, at produktet blot er en prototype. På baggrund af resultaterne, tyder det på, at produktet denne ikke umiddelbart skyldes variationen i hastigheden, men snarer en anden fejl i programmet. Konklusion På trods af at produktet blot er tiltænkt som en tidlig prototype på et potentielt system, formår det eksemplificere, hvordan sådan et system kan udføres. Her hentydes til adskillige af produktets funktioner, såsom tidsbestemmelse i forhold til moduler samt vurderinger af de enkelte elevers fraværsprocent. Programmet gør brug af en bred variation af både kompliceret og simple programsætninger og funktioner, samt inddragelse af biblioteker. På den måde kommer produktet bredt omkring programmeringsfaget. Da produktet ikke forventes at implementeres på nuværende stadie, er det åbenlyst, at det besidder visse mangler, såsom kommunikation med en online database og en automatisering af undervisningstider. Mange mangler har indflydelse både på produktets funktioner, men også hvor flydende disse funktioner udføres. Dette betyder også, at produktet ikke er vurderet som at værende fejlrit og det kan derfor besidde ukendte run time errors, samt uhensigtsmæssige funktioner og kodeelementer. En implementering af det endelige produkt, som det er tiltænkt, vil overlade ansvarer for de enkelte elevers fravær til dem selv, og derved skabe e mere flydende og mobil registrering af elevernes tilstedeværelse i undervisningen. 12

13

Bilag Bilag 1 Produktkode, inklusiv kommentarer (software) Se vedlagt mappe Programmet, hvori der ligger en.ino-fil. Åben filen vha. af Arduinosoftwaren. Bilag 2 Arduino og RFID-system (hardware) Opsætningen mellem chippen og Arduino er som følgende: Pin 5 -> 5v, Pin 4 -> Ground, Pin 1 -> Digital Pin 2. Billederne stammer fra http://www.instructables.com/id/arduino-and-rfid-fromseeedstudio/ (09-05-2014), og er den samme opstilling som benyttet i dette produkt. 14