Les 16: SOS met Switch Case
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.
/*
Autheur: Fun met Electronica
Link: lessen.php?id=524
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.
/*
Autheur: Fun met Electronica
Link: lessen.php?id=524
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.../*
Autheur: Fun met Electronica
Link: lessen.php?id=524
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();
}