Voor een radioamateur doeleinde ben ik bezig om morse via 8 leds door te sturen, ieder opvolgend led moet een letter zijn. Bijvoorbeeld .- staat voor A, B -... , C -.-. , enz. Als het woord langer is dan 8 letters, moet het vanaf led 1 verder gaan. Dit in een loop. Ik heb me al gek gezocht, maar ik geraak er niet aan uit. Ik ben er al lang mee bezig, doch ik moet toegeven dat zonder wat hulp het me niet zal lukken. Dit is mijn code dat een beetje werkt, maar het geeft voor elke . en - 8x hetzelfde. Veel dank voor wie me op de juiste weg wilt zetten.
int PIN_LEDS[] = {2,3,4,5,6,7,8,9};
#define UNIT_LENGTH 150
int k;
int p;
static const struct {const char letter, *code;} MorseMap[] =
{
{ 'A', ".-" },
{ 'B', "-..." },
{ 'C', "-.-." },
{ 'D', "-.." },
{ 'E', "." },
{ 'F', "..-." },
{ 'G', "--." },
{ 'H', "...." },
{ 'I', ".." },
{ 'J', ".---" },
{ 'K', ".-.-" },
{ 'L', ".-.." },
{ 'M', "--" },
{ 'N', "-." },
{ 'O', "---" },
{ 'P', ".--." },
{ 'Q', "--.-" },
{ 'R', ".-." },
{ 'S', "..." },
{ 'T', "-" },
{ 'U', "..-" },
{ 'V', "...-" },
{ 'W', ".--" },
{ 'X', "-..-" },
{ 'Y', "-.--" },
{ 'Z', "--.." },
{ ' ', " " },
{ '1', ".----" },
{ '2', "..---" },
{ '3', "...--" },
{ '4', "....-" },
{ '5', "....." },
{ '6', "-...." },
{ '7', "--..." },
{ '8', "---.." },
{ '9', "----." },
{ '0', "-----" },
{ '.', "·–·–·–" },
{ ',', "--..--" },
{ '?', "..--.." },
{ '!', "-.-.--" },
{ ':', "---..." },
{ ';', "-.-.-." },
{ '(', "-.--." },
{ ')', "-.--.-" },
{ '"', ".-..-." },
{ '@', ".--.-." },
{ '&', ".-..." },
};
void setup() {
for (p = 0; p <= 7; p++) {
pinMode( PIN_LEDS[p], OUTPUT );
}
}
void loop()
{
String morseWord = encode( "demo morse programma " );
for(int i=0; i<=morseWord.length(); i++)
for (k = 0; k <= 7; k++)
{
{
switch( morseWord[i] )
{
case '.':
digitalWrite( PIN_LEDS[k], HIGH );
delay( UNIT_LENGTH );
digitalWrite( PIN_LEDS[k], LOW );
delay( UNIT_LENGTH );
break;
case '-':
digitalWrite( PIN_LEDS[k], HIGH );
delay( UNIT_LENGTH*3 );
digitalWrite( PIN_LEDS[k], LOW );
delay( UNIT_LENGTH );
break;
case ' ': //gap
delay( UNIT_LENGTH );
}
}
}
}
String encode(const char *string)
{
size_t i, j;
String morseWord = "";
for( i = 0; string[i]; ++i )
{
for( j = 0; j < sizeof MorseMap / sizeof *MorseMap; ++j )
{
if( toupper(string[i]) == MorseMap[j].letter )
{
morseWord += MorseMap[j].code;
break;
}
}
morseWord += " ";
}
return morseWord;
}
String decode(String morse)
{
String msg = "";
int lastPos = 0;
int pos = morse.indexOf(' ');
while( lastPos <= morse.lastIndexOf(' ') )
{
for( int i = 0; i < sizeof MorseMap / sizeof *MorseMap; ++i )
{
if( morse.substring(lastPos, pos) == MorseMap[i].code )
{
msg += MorseMap[i].letter;
}
}
lastPos = pos+1;
pos = morse.indexOf(' ', lastPos);
while( morse[lastPos] == ' ' && morse[pos+1] == ' ' )
{
pos ++;
}
}
return msg;
}