/*
Il sistema dovrà prendere in ingresso un messaggio tramite seriale, quindi replicarlo in codice morse tramite un led.
Sono accettati caratteri dalla a alla z (maiuscoli e minusculi) e numeri (i caratteri speciali non sono previsti).
*/
#define LEDPIN 8
#define DOTLENGHT 100
#define DASHLENGHT 300
#define LETTERPAUSE 300
#define WORDPAUSE 600
String mapCharToMorse[26] = {"12","2111","2121","211","1","1121","221","1111","11","1222","212","1211","22","21","222","1221","2212","121","111","2","112","1112","122","2112","2122","2211"};
String mapIntToMorse[10] = {"12222","11222","11122","11112","11111","21111","22111","22211","22221","22222"};
void flash(int duration){
digitalWrite(LEDPIN, HIGH);
delay(duration);
digitalWrite(LEDPIN, LOW);
}
void dot() {
flash(DOTLENGHT);
delay(LETTERPAUSE);
}
void dash() {
flash(DASHLENGHT);
delay(LETTERPAUSE);
}
void setup(){
Serial.begin(9600);
pinMode(LEDPIN, OUTPUT);
}
void loop(){
Serial.println("Enter message: ");
while (Serial.available() == 0) {}
String text = Serial.readString();
Serial.print("\t >>>>"+text);
for(char& c : text) {
if(int(c) == 32){ // 32 è il valore acii del carattere "spazio"
delay(WORDPAUSE);
continue;
}
if(isalpha(c))
{
if(isUpperCase(c))
c += 32; // li porto alla sequenza acii dei caratteri in minuscolo
for(char& morseValue : mapCharToMorse[int(c) - 97]) // la lettera a è al 97° posto della tab. acii e in questo modo la posso allineare/confrontare con il mio array
{
switch (morseValue)
{
case '1':
dot();
break;
case '2':
dash();
break;
default:
break;
}
}
} else {
for(char& morseValue : mapIntToMorse[int(c) - 48]) //il numero 0 è alla posizione 48 della tabella acii - allineo i numei acii all'array
{
switch (morseValue)
{
case '1':
dot();
break;
case '2':
dash();
break;
default:
break;
}
}
}
}
}