In de voorgaande lessen hebben we vooral gekeken naar wat je met een Arduino kan besturen en hebben we minder gelet op slimme oplossingen in het programma zelf. Deze les is speciaal bedoeld om je programma kleiner en overzichtelijker te maken. Dit kan je onder andere doen door te werken met switch-cases. Deze les is nieuw en daarom nog niet opgenomen in het geheel.
Morse code
Morse is een communicatiecode, bestaande uit met tussenpozen uitgezonden signalen, die letters, leestekens en cijfers representeren. De code werd in 1835 uitgevonden en ontwikkeld door Samuel Morse met het doel deze te gebruiken voor de telegrafie. Morse kent twee symbolen: punten en streepjes, ofwel dits en dahs . De lengte van de ‘dit’ bepaalt de snelheid waarmee de boodschap wordt verzonden en wordt als ‘eenheid’ gebruikt. Een dah is volgens de afspraken drie keer zo lang als een dit. Spaties tussen dits en dahs binnen een lettercode hebben de lengte van één dit, spaties tussen letters in een woord hebben de lengte van 3 dits (één dah ), en spaties tussen woorden zijn 7 dits lang.
Bron: Wikipedia
In bovengenoemde tekst worden de woorden “dit” en “dah” genoemd, vaak gebruikt men hiervoor ook de woorden “dot” en “dash”. In de verdere uitleg gebruiken we “dot” en “dash”. Hieronder een afbeelding het alfabet en de nummers in Morsecode:
Implementatie SOS 1
In deze les is de morse-code van SOS geprogrammeerd op pin 13. Deze pin is op de Arduino ingebouwd. De lengte van een dot is gekozen voor 500 miliseconden. Deze code is enorm lang en onnodig.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
/* Autheur: Fun met Electronica Link: https://training.funmetelectronica.nl/docs/arduino-basis/lessen/les-16-sos-met-switch-case/ Beschrijving: SOS signaal op de makkelijke manier. Kost enorm veel code en is onoverzichtelijk. */ int Led = 13; // led op pin 13 /* Het programmablok void setup wordt eenmaal beschreven */ void setup (){ pinMode (Led, OUTPUT); // led is output } /* Het programmablok void loop herhaalt zich keer op keer */ void loop () { digitalWrite(Led, HIGH); //dot delay (500); //dotlengte digitalWrite(Led, LOW); //symboolspatie delay(500); //symboolspatie lengte = dotlengte digitalWrite(Led, HIGH); //dot delay (500); digitalWrite(Led, LOW); delay(500); digitalWrite(Led, HIGH); //dot delay (500); digitalWrite(Led, LOW); //letterspatie delay(1500); //letterspatie lengte = 3 x dotlengte digitalWrite(Led, HIGH); //dash delay (1500); //dashlengte is 3x dotlengte digitalWrite(Led, LOW); //symboolspatie delay(500); //symboolspatie lengte = dotlengte digitalWrite(Led, HIGH); //dash delay (1500); digitalWrite(Led, LOW); delay(500); digitalWrite(Led, HIGH); //dash delay (1500); digitalWrite(Led, LOW); //letterspatie delay(1500); digitalWrite(Led, HIGH); //dot delay (500); digitalWrite(Led, LOW); delay(500); digitalWrite(Led, HIGH); //dot delay (500); digitalWrite(Led, LOW); delay(500); digitalWrite(Led, HIGH); //dot delay (500); digitalWrite(Led, LOW); //woordspatie delay(3500); //woordspatie lengt = 7x dotlengte } |
Implementatie SOS2
De code kan verbeterd worden door voor een dot en dash een eigen functie te maken. Ook wordt het interval gedeclareerd. Voor een letterspatie en een woordspatie zal tevens een functie gemaakt worden. Het wordt duidelijk dat de code al een stuk overzichtelijker is geworden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
/* Autheur: Fun met Electronica Link: https://training.funmetelectronica.nl/docs/arduino-basis/lessen/les-16-sos-met-switch-case/ Beschrijving: SOS signaal op de redelijke manier. Overzichtelijker dan vorige implementatie. */ int Led = 13; // led op pin 13 int interval = 500; // interval is 500 miliseconden /* Het programmablok void setup wordt eenmaal beschreven */ void setup () { pinMode (Led, OUTPUT); // led is output } /* Het programmablok void loop herhaalt zich keer op keer */ void loop () { dot(); dot(); dot(); letterSpatie(); dash(); dash(); dash(); letterSpatie(); dot(); dot(); dot(); woordSpatie(); } /* Functie voor dot. */ void dot () { digitalWrite(Led, HIGH); delay (interval); digitalWrite(Led, LOW); delay(interval); } /* Functie voor dash. */ void dash () { digitalWrite(Led, HIGH); delay (interval * 3); digitalWrite(Led, LOW); delay(interval); } /* Functie voor letterspatie. */ void letterSpatie() { delay (interval * 2); } /* Functie voor woordspatie. */ void woordSpatie() { delay (interval * 6); } |
Implementatie SOS 3
De code kan nog beter! In de “void letter” maken we een switch naar “karakters” (char) aan, met de variabele “c”. Binnen de switch kennen we de cases toe. Die cases bestaan uit karakters en die plaatsen we tussen ‘enkele – aanhalingsstreepjes’. Roep je in de hoofd – loop nu een bepaalde letter aan, dan gaat het programma binnen de switch – case zoeken. Heeft het programma de bepaalde letter gevonden, dan zorgt “break” ervoor dat het programma doorgaat naar het einde van de “void letter” loop. Daar staat een “letterSpatie”. Vandaar dat in deze sketch de loop van “woordSpatie” is aangepast. Kijk maar eens goed…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
/* Autheur: Fun met Electronica Link: https://training.funmetelectronica.nl/docs/arduino-basis/lessen/les-16-sos-met-switch-case/ Beschrijving: SOS signaal op de goede manier. Meest overzichtelijk. */ int Led = 13; // led op pin 13 int interval = 500; // interval is 500 miliseconden /* Het programmablok void setup wordt eenmaal beschreven */ void setup () { pinMode (Led, OUTPUT); } /* Het programmablok void loop herhaalt zich keer op keer */ void loop () { letter ('s'); letter ('o'); letter ('s'); woordSpatie(); } /* Functie voor dot. */ void dot () { digitalWrite(Led, HIGH); delay (interval); digitalWrite(Led, LOW); delay(interval); } /* Functie voor dash. */ void dash () { digitalWrite(Led, HIGH); delay (interval * 3); digitalWrite(Led, LOW); delay(interval); } /* Functie voor letterspatie. */ void letterSpatie() { delay (interval * 2); } /* Functie voor woordspatie. */ void woordSpatie() { delay (interval * 4); } /* Functie voor letter. Kiest welke functie gekozen wordt voor een character. */ void letter (char c) { switch (c) { case 's': // als de letter s is dot(); dot(); dot(); break; case 'o': // als de letter o is dash(); dash(); dash(); break; } letterSpatie(); } |
Opdrachten
Opdracht 16.1:
De switch case is enorm overzichtelijk. Er kan dus ook makkelijk letters aan toegevoegd worden. Probeer dit eens.