✓ Speciaal voor VO, Technasium & Bèta-onderwijs ✓ Scholen bestellen op rekening (achteraf betalen)
Direct contact: info@funmetelectronica.nl | Tel: 06-53111122
Arduino Basis › Les 16: SOS met Switch Case

Les 16: SOS met Switch Case

Arduino Basis
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.
/*
  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();
}

Opdrachten

Opdracht 16.1: De switch case is enorm overzichtelijk. Er kan dus ook makkelijk letters aan toegevoegd worden. Probeer dit eens.