Arduino & C. – Codice Morse e stringhe

Qui i post aumentano e più si va avanti, più vengono nuove idee!

Bene, nel post precedente abbiamo messo un po’ di ordine nello sketch per visualizzare il segnali Morse di “SOS” con il LED della scheda. In questo post, invece, faremo qualcosa con le stringhe, dato che nel post precedente avevamo ipotizzato uno sketch un po’ più generico (lampeggiamento di un codice Morse corrispondente a una stringa).

Innanzi tutto per conoscere meglio il codice Morse potete guardare a questa pagina di Wikipedia: https://it.wikipedia.org/wiki/Codice_Morse.

Qui trovate una tabella con la parte principale della codifica, ma poi ci sono altri codici speciali che al momento non ci interessano.


CodiceMorse

Con questa tabella sarà semplicissimo codificare nel nostro sketch le lettere dell’alfabeto, ma per brevità ho inserito solo quelle che ci servono per questo esempio, cioè: “M”, “A”, “R”, “I” e “O” per comporre la parola “MARIO”:

void M() {
   linea();
   linea();
   delay(500);
   }

void A() {
   punto();
   linea();
   delay(500);
   }

void R() {
   punto();
   linea();
   punto();
   delay(500);
   }

void I() {
   punto();
   punto();
   delay(500);
   }

Ora potremmo anche ridefinire la funzione loop() in questo modo:

void loop() {
   // ritardo iniziale per non confonderci con il Blinker attivo
   // e per dividere due messaggi “SOS” tra loro
   delay(1000);

  // lettera “M” 
   M();

   // lettera “A”
   A();

  // lettera “R”
   R();

   // lettera “I”
   I();

  // lettera “O”
   O();

}

ma sarebbe banale e dispersivo, anche perché con parole o frasi più lunghe dovremmo di nuovo scrivere moltissime istruzioni in fila, una dietro l’altra.

Per migliorare anche questa situazione andiamo a vedere come creare una sorta di “funzione stringa” che ci potrà semplificare il compito nell’estrarre carattere per carattere da, appunto, una stringa:

  unsigned int i;
  String str = “MARIO”;
   unsigned int lunghezza = str.length();
   char val[lunghezza];
   String mystr = str;
   mystr.toCharArray(val,lunghezza);

Questo frammento di codice ci permette di prendere una stringa (str), a cui abbiamo assegnato un valore (“MARIO”), e di scomporla nei singoli caratteri da trattare poi con la parte che effettua il lampeggio in codice Morse con i segnali appropriati per ciascuna lettera. Il vettore contenente i singoli caratteri (char) è mystr, mentre l’accesso ai singoli elementi del vettore è fatto attraverso l’indice i, cioè con mystr[i].

#define LED 13


void setup() {
   pinMode(LED, OUTPUT);
   digitalWrite(LED,LOW);
   Serial.begin(9600);
}


// the loop function runs over and over again forever
void loop() {
   unsigned int i;
   String str = “MARIO”;
   unsigned int lunghezza = str.length();
   char val[lunghezza];
   String mystr = str;
   mystr.toCharArray(val,lunghezza);
   for (i=0;i<lunghezza;i++) {
     delay(1000); 
     switch (mystr[i]) {
       case ‘M’:
         M();
         break;
       case ‘A’:
         A();
         break;
       case ‘R’:
         R();
         break;
       case ‘I’:
         I();
         break;
       case ‘O’:
         O();
         break;
       default:
         //
       break;
     }
   }
   delay(1000);
}


void M() {
   linea();
   linea();
   delay(500);
}


void A() {
   punto();
   linea();
   delay(500);
}


void R() {
   punto();
   linea();
   punto();
   delay(500);
}


void I() {
   punto();
   punto();
   delay(500);
}


void O() {
   linea();
   linea();
   linea();
   delay(500);
}


void punto() {
   digitalWrite(LED, HIGH);
   delay(250);
   digitalWrite(LED, LOW);
   delay(250);
}


void linea() {
   digitalWrite(LED, HIGH);
   delay(500);
   digitalWrite(LED, LOW);
   delay(500);
}

Quando vedremo l’utilizzo della porta seriale per poter inviare una stringa dal PC alla scheda, sarà molto semplice modificare questo esempio e far lampeggiare qualsiasi segnale in codice Morse voi desideriate.

Alla prossima! Winking smile

Pubblicato il 1 settembre 2017, in Arduino, IoT, Programmazione, VS 2017 con tag , , , . Aggiungi il permalink ai segnalibri. Lascia un commento.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d blogger hanno fatto clic su Mi Piace per questo: