Programmering for begyndere Brug af Arduino Start på Arduino og programmering EDR Hillerød Knud Krogsgaard Jensen / OZ1QK 1
Start på Arduino og programmering Sidste gang (Introduktion) Programmeringssproget C Programstruktur (Det gentages og udbygges) Indholdet i en mikroprocessor Præsentation af Arduino En mulig brug i Power Meter 2
Start på Arduino og programmering Denne gang er planen: Repetition af programstruktur (Hvad er et C program) Lidt mere om variable Løkker At få programmet til at gøre noget forskelligt afhængig af data Lidt om test af programmer Filtyper (Kildetekst, Hex-filer, biblioteksfiler m.m.) Fra kildetekst til mikroprocessor (Oversættelse af C-kode) Start pogrammering af Arduino / Mulige projekter 3
Programstruktur Sidst havde vi følgende program: Nu med nogle kommentarer void main (void) int a, b, c; //Dette er heltal a = 5; b = 4; c = a + b; /* Her har vi et resultat som ikke bruges til noget */ 4
Programstruktur i Arduino - Ikke noget main() /* Blink2 Tænder og slukker en diode. Tænd og sluk tiden begynder med at være i100 ms og øges trinvis til 2 s med en løkke. KKJ 25. august 2012. */ // Pin 13 er forbundet til en LED. int led = 13; /* setup routine kører en gang når reset trykkes (programstart): */ void setup() /* initialize the digital pin as an output.*/ pinmode(led, OUTPUT); /*the loop routine runs over and over again forever: */ void loop() for (int n = 1; n <= 20; n++) digitalwrite(led, HIGH); delay(n * 100); // venter i n * 100ms digitalwrite(led, LOW); delay(n * 100); // venter i n * 100ms
Start på Programmering Variable og variabeltyper 7
Variabeltyper De vigtigste variable til vores brug: Type Egenskab Mindste Værdi Største værdi long Heltal 2.147.483.648 2.147.483.647 int Heltal 32.768 32.767 float / double Real tal 3.4028235E+38 3.4028235E+38 boolean Logisk variabel false (0) true (1) 8
Variable Husk at heltal gemmes i heltal osv. (God stil) main() int a; float c; c = 3.14; a = c;.. Her taber man decimalerne. Vi får kun en advarsel ved oversættelse! Der er eksempler hvor det går helt galt! 9
C Navngivning Brug navne der siger fortæller noget. Det er meget enkelt. I stedet for f for frekvens, så skriv frekvens eller frekv I stedet for n så skriv antal. (n eller i er ok i en løkke.) osv. I bestemmer jo selv Husk I skal også forstå det om et år Det fylder ikke mere i processoren den ved det alligevel ikke. God navngivning gælder både for variable, konstanter og funktioner! 10
C - Navngivning Programmeringskursus, Kursusaften 2 Skal man bruge PI ( ᴫ) så brug navnet. Konstant som ikke kan ændres laves således: const float PI = 3,1415; (Tildeling skal ske med det samme!) Og så det er det formelle: Et navn skal begynde med et bogstav eller _ (understregning) Forskel på store og små bogstaver Må ikke bruge reserverede ord. (Dvs. f.eks. int, goto, continue) Det er kun de første otte bogstager der gælder! Nogle bøger foreslår at man lader forskellige variabeltyper begynde med et bestemt bogstav: F. eks. Heltal med i eller n, duble med d. 11
Start på Programmering VALG OG LØKKER 12
Valg og løkker Det er programdele af typen main(void) if (a > 7) lcd.setcursor (3,0); // Første linje, position 3 lcd.print ( Stort tal indlæst ); else lcd.setcursor (3,0); // Første linje, position 3 lcd.print ( Lille tal indlæst ); 13
Relationsoperatorer Følgende muligheder har vi for at sammenligne. Operator Betydning < Mindre end <= Mindre end eller lig med > Større end >= Større end eller lig med == Lig med!= Forskellig fra 14
Valg og løkker Der er følgende muligheder for valg og løkker if if.. else switch while do while for Dem tager vi en af gangen 15
Valg og løkker if Program eksempel main(void) if (a == 7) lcd.setcursor (3,0);; // Første linje, position 3 lcd.print ( Tallet er syv ); lcd.setcursor (3,0); lcd.print ( Dette udskrives altid );. 16
Valg og løkker if else Den har vi jo set tidligere (ændret lidt her) main(void) if (a == 7) lcd.setcursor (3,0); // Første linje, position 3 lcd.print ( Tallet er syv ); else llcd.setcursor (3,0); // Første linje, position 3 lcd.print ( Tallet er ikke syv ); En lille ændring og 17
Valg og løkker if else Hvis man skriver sådan: main(void) if (a = 7) // Bemærk et enkelt lighedstegn lcd.curcer (0,3); // Første linje, position 3 lcd.print ( Tallet er syv ); else lcd.curcer (0,3); // Første linje, position 3 lcd.print ( Tallet er ikke syv ); Skriver programmet altid Tallet er syv og tildeler variablen a værdien 7!!! 18
Valg og løkker switch Switch bruges hvis man har en række muligheder som man skal vælge mellem. int mulighed;... switch (mulighed) case 1: lcd.print ( Mulighed 1 ); break; case 2: lcd.print ( Mulighed 2 ); break; case 3: lcd.print ( Mulighed 2 ); break; default: lcd.print ( Ukendt mulighed ); Kan naturligvis også laves med nogle if- sætninger Bemærk : mulighed skal være en heltal type Husk break!! -- Default god ide! Vender tilbage til det fordi man kan lade variablen mulighed antage nogle værdier, der giver mere mening. 19
Valg og løkker switch Skal man lave flere ting i hvert tilfælde bliver konstruktionen: int mulighed; switch (mulighed) case 1: lcd.print ( Mulighed 1 ); // Her sker et eller andet break; case 2: lcd.print ( Mulighed 2 ); // Her kan der være mange linjer break; case 3: case 4: cd.print ( Mulighed 3 eller 4 ); // Her sker noget mere break; default: lcd.print ( Ukendt mulighed )
Valg og løkker while while sætning gør noget indtil et eller andet.. int n = 10; //Man kan godt tildele en værdi samtidig med definition af en variabel while (n > 0) //.her sker et eller andet n= n - 1; Løkken slutter aldrig hvis man kommer til at lægge sammen. Så bliver n ved at være større end 0!!!! 21
Valg og løkker do while Denne løkke ser således ud. do. // her sker et eller andet while (betingelse); do while løkken gennemløbes altid en gang Husk det sidste semikolon! Eksempel: int n =77;... do lcd.setcursor (3,0);; lcd.print ( Tallet er:,n ); n = n + 2; delay(2000); while ( n < 100);... 22
Valg og løkker for... Denne løkke har formen:. for (initialværdi, betingelse, iteration) // her gøres et eller andet. Et eksempel:. int sum = 0; for (int n = 0; n< 5; n++) sum = sum + n; Ved start af løkke er sum = 0. Derefter bliver sum : n 0, 1, 2, 3, 4 sum 0, 1, 3, 6, 10 Det kikker vi lige lidt mere på. 23
Eksempel på Papir test.. int sum = 0; for (int n = 0; n< 5; n++) trin sum n trin sum n 0 - - 1 0 - sum = sum + n;. 24
Eksempel på Papir test.. int sum = 0; for (int n = 0; n< 5; n++) sum = sum + n;. trin sum n trin sum n 0 - - 1 0-2 0 0 25
Eksempel på Papir test.. int sum = 0; for (int n = 0; n< 5; n++) sum = sum + n;. trin sum n trin sum n 0 - - 1 0-2 0 0 3 0 0 26
Eksempel på Papir test.. int sum = 0; for (int n = 0; n< 5; n++) sum = sum + n;. trin sum n trin sum n 0 - - 1 0-2 0 0 3 0 0 4 0 1 27
Eksempel på Papir test.. int sum = 0; for (int n = 0; n< 5; n++) sum = sum + n;. trin sum n trin sum n 0 - - 1 0-2 0 0 4 0 0 4 0 1 5 1 1 28
Eksempel på Papir test.. int sum = 0; for (int n = 0; n< 5; n++) sum = sum + n;. trin sum n trin sum n 0 - - 1 0-2 0 0 3 0 0 4 0 1 5 1 1 6 1 2 29
Eksempel på Papir test.. int sum = 0; for (int n = 0; n< 5; n++) sum = sum + n;. trin sum n trin sum n 0 - - 7 3 2 1 0-2 0 0 3 0 0 4 0 1 5 1 1 6 1 2 30
Eksempel på Papir test.. int sum = 0; for (int n = 0; n< 5; n++) sum = sum + n;. trin sum n trin sum n 0 - - 7 3 2 1 0-8 3 3 2 0 0 3 0 0 4 0 1 5 1 1 6 1 2 31
Eksempel på Papir test.. int sum = 0; for (int n = 0; n< 5; n++) sum = sum + n;. trin sum n trin sum n 0 - - 7 3 2 1 0-8 3 3 2 0 0 9 6 3 3 0 0 4 0 1 5 1 1 6 1 2 32
Eksempel på Papir test.. int sum = 0; for (int n = 0; n< 5; n++) sum = sum + n;. trin sum n trin sum n 0 - - 7 3 2 1 0-8 3 3 2 0 0 9 6 3 3 0 0 10 6 4 4 0 1 5 1 1 6 1 2 33
Eksempel på Papir test.. int sum = 0; for (int n = 0; n< 5; n++) sum = sum + n;. trin sum n trin sum n 0 - - 7 3 2 1 0-8 3 3 2 0 0 9 6 3 3 0 0 10 6 4 4 0 1 11 10 4 5 1 1 6 1 2 34
Eksempel på Papir test.. int sum = 0; for (int n = 0; n< 5; n++) sum = sum + n;. trin sum n trin sum n 0 - - 7 3 2 1 0-8 3 3 2 0 0 9 6 3 3 0 0 10 6 4 4 0 1 11 10 4 5 1 1 12 10 5 6 1 2 løkken slutter 35
Afslutning af en løkke Måder af afslutte løkker på. break - den har vi haft i switch- sætninger continue goto - Den kan være uheldig Punkterne uddybes evt. senere hvis der ikke er tid nu. 36
Brug af break Vi har set det brugt i case-sætninger. Kan bruges til at komme ud af en løkke. Eksempel: for (x = 0; x < 255; x ++) digitalwrite(pwmpin, x); sens = analogread(sensorpin); if (sens > threshold) // bail out on sensor detect x = 0; break; delay(50);
Brug af continue continue bruges til at komme ud af en løkke (do, for eller while) Eksempel (Hov jeg har ikke behandlet &&) for (x = 0; x < 255; x ++) if (x > 40 && x < 120) // create jump in values continue; digitalwrite(pwmpin, x); delay(50);
Brug af goto Brug af goto er meget omdiskuteret og jeg synes man skal undgå at bruge det. Nu findes det! Eksempel som er ok: for(byte r = 0; r < 255; r++) for(byte g = 255; g > -1; g= g 1) for(byte b = 0; b < 255; b++) if (analogread(0) > 250) goto bailout; // more statements... bailout:
Start på programmering
Start på programmering Her er skrevet noget program.
Test af programmer Man kan gøre følgende: Man kan bruge display og skrive testværdier ud Ulempe: Ødelægger det pæne layout man har lavet Dur ikke hvis man netop skal have display til at virke Dur ikke hvis der ikke er et display Man kan bruge seriel overvågning Det har den fordel at man kan gøre det på pc'en og gribe mindre ind i det program man nu har skrevet. En egentlig debugging funktion findes ikke i Arduino 42
Program som skal testes #include <LiquidCrystal.h> void setup() lcd.begin(16, 2); lcd.print("hello, world!");// Print a message to the LCD. void loop() int tid; lcd.setcursor(0, 1); tid = millis()/1000; lcd.print(millis()/1000); delay(2000);
Test ved hjælp af seriel overvågning #include <LiquidCrystal.h> void setup() Serial.begin(9600); // send and receive at 9600 baud lcd.begin(16, 2); lcd.print("hello, world!");// Print a message to the LCD. Serial.print("Hello world er skrevet til Display "); void loop() int tid; lcd.setcursor(0, 1); tid = millis()/1000; lcd.print(millis()/1000); Serial.print("Loop er slut. "); Serial.println( tid); delay(2000);
Test bruges ikke mere fjernes senere #include <LiquidCrystal.h> void setup() //Serial.begin(9600); // send and receive at 9600 baud lcd.begin(16, 2); // Print a message to the LCD. lcd.print("hello, world!"); //Serial.print("Hello world er skrevet til Display "); void loop() int tid = 10; lcd.setcursor(0, 1); tid = millis()/1000; lcd.print(millis()/1000); //Serial.print("Loop er slut. "); //Serial.println( tid); delay(2000);
Start på Programmering Fra kildetekst til mikroprocessor 49
Start på programmering Nu skal vi se hvordan vi kommet fra C til noget mikroprocessoren forstår. C-kode Oversæt Build Link Hex-fil Hex-fil 50
Start på Programmering Lidt mere om processen Preprocessor Henter funktioner uden for kildeteksten Kompileren Checker syntaks i kildekoden Output er objektfiler (en eller flere) Linker Fra en eller flere objektfiler laves en exe fil Exe filen sendes ned i mikroprocessoren og udføres der. 52
Start på Programmering Lidt mere om processen Preprocessor Henter funktioner uden for kildeteksten Kompileren Checker syntaks i kildekoden Output er objektfiler (en eller flere) Linker Fra en eller flere objektfiler laves en exe fil Exe filen sendes ned i mikroprocessoren og udføres der. 53
Programmering /Preprocessor Her er kendt C-kode: #include <LiquidCrystal.h> main(void) int a; if (a > 7) lcd.setcursor (1,3); lcd.print ( Stort tal indlæst ); else lcd.setcursor (1,3); lcd.print ( Lille tal indlæst ); #include <LiquidCrystal.h> sikre at alle funktioner er kendt. Her er det lcd.setcursor () lcd.print () som defineres. Vi udnytter altså noget kode som er lavet. Derefter kan syntaks test laves. Nu er alt kendt forhåbentlig. 54
Programmering /Kompiler Preprocessor Henter funktioner uden for kildeteksten Kompileren Checker syntaks i kildekoden Checker alle variable er kendt og bruges på den rigtig måde. Checker om løkker er lavet lovligt ikke om de gør som vi tror Checker om funktioner er kendt og om semikoloner er sat rimeligt Output er objektfiler (en eller flere) Linker Fra en eller flere objektfiler laves en exe fil 55
Programmering / linker Programmerings kursus Preprocessor Henter funktioner uden for kildeteksten Kompileren Checker syntaks i kildekoden Output er objektfiler (en eller flere) Linker Fra en eller flere objektfiler laves en exe fil HEX fil Her sikres f.eks. at funktioner virkelig har indhold At bruge #include <.> sikrer kun at funktionerne findes i en prototype. 56
Start på Arduino og programmering Planen for i aften var: Repetition af programstruktur --- Lidt mere om variable Løkker og papirtest Filtyper Fra kildetekst til mikroprocessor Start programmering 57
Projekter??? Kan vi måske nå meget mere end vi regnede med!!! Vi holder fast i at det er et begynderkursus Det er hel elmetærer emner der behandles Programmerne er simple I det mindste indtil andet besluttes Der er nogen her som har prøvet det før. Det kan måske udnyttes ved: De hjælper os andre med programmering De kan forberede dele af projekter som vi andre når Kan vi skitsere projekter som vi andre han bruge?
Start på Arduino Start på programmering efter en Pause 59
Gang i Arduino Nu skal vi programmerer! Først : Har alle startet Arduino fra deres Pc? Jeg har lavet en I gang med Arduino til udlevering. Vi kikker først på programmet Blink Så retter vi lidt i det Så laver vi en helt ny udgave med lidt mere programmering i
/* Blink Turns on an LED on for one second, then off for one second, repeatedly. This example code is in the public domain. */ // Pin 13 has an LED connected on most Arduino boards. // give it a name: int led = 13; // the setup routine runs once when you press reset: void setup() // initialize the digital pin as an output. pinmode(led, OUTPUT); // the loop routine runs over and over again forever: void loop() digitalwrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalwrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second
/* Blink Turns on an LED on for one second, then off for one second, repeatedly. This example code is in the public domain. */ // Pin 13 has an LED connected on most Arduino boards. Give it a name: int led = 13; // the setup routine runs once when you press reset: void setup() pinmode(led, OUTPUT); // initialize the digital pin as an output. void loop() // the loop routine runs over and over again forever. digitalwrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalwrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second digitalwrite(led, HIGH); delay(3000); digitalwrite(led, LOW); delay(3000);
Blink med lidt mere programmering Jeg vil foreslå at I lave et program hvor: Dioden begynder med at blinke hurtigt og så langsommere indtil et vist punkt og så forfra igen. Bruge en for-løkke.
/* Blink2 Tænder og slukker en diode. Tænd og sluk tiden begynder med at være 100 msek og øges trinvis til 2 sekunder med en løkke. */ // Pin 13 er forbundet til en LED. Diode benet får et navn: int led = 13; void setup() pinmode(led, OUTPUT); void loop() for (int n = 1; n <= 20; n++) digitalwrite(led, HIGH); // tænder LED (HIGH er + 5 Voltl) delay(n * 100); // venter i n * 100 msek digitalwrite(led, LOW); // slukker LED ved at gøre spændingen LOW delay(n * 100); // venter i n * 100 msek
For løkke til display /* LiquidCrystal Library Forløkke til display */ #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() Serial.begin(9600); lcd.begin(16, 2); lcd.print("hello, world!"); delay(2000); void loop() lcd.clear(); delay(500); lcd.setcursor(2,0); lcd.print("n = "); lcd.setcursor(2,2); lcd.print("sum ="); int sum = 0; for (int n = 0; n< 5; n++) sum = sum + n; lcd.setcursor(8+n*2,0); lcd.print(n); lcd.setcursor(8+n*2,1); lcd.print(sum); delay(2000);
Program med for løkke
Programmering af Arduino Forslag Gem de ændrede programmer i jeres PC Lav andre udgaver - eksperimenter lidt!
Programmering af Arduino Arbejde på egen hånd
Arduino og programmering Til slut: Hvordan har det været i aften? Er der noget jeg skal lave anderledes i fremtiden? Hvis der noget I tumler med som I gerne vil have belyst så ring eller skriv en mail. Jeg vil forsøge at tage det op den følgende gang. 69
Arduino og programmering Tak for i aften På gensyn den mandag den 8. oktober Det er på mandag 70