Go Down

Topic: Arduino + Wire = Morse Code AM Radio Beacon (reopen) (Read 3458 times) previous topic - next topic

ellisgl


ellisgl

Code: [Select]

/**
* Arduino + Wire = Morse Code AM Radio Beacon
* By EllisGL 2011-08-09
* Version 1.03 (Arduino version)
* Based on http://arduino.cc/forum/index.php/topic,8456.msg68164.html
*
* Change log:
*  V1.00: Initial
*  V1.01: Refactored for smaller size
*  V1.02: More refactoring
*  V1.03: More refactoring
*
* Known Issues:
*  Harmonics
*/
// Beacon message
const char message[] = "hello from my arduino 1022";

// Timings
const unsigned int dahLen = 1000; // 1000 ms - dah length
const unsigned int ditLen = 250;  // 250  ms - dit length - same timeing between dots and dashes of the same letter
const unsigned int lPause = 750;  // 750  ms - length between charaters
const unsigned int wPause = 1750; // 1750 ms - length for spaces
const unsigned int ledPin = 13;
const unsigned int outPin = 11;

// Character mapping
const char chars[36][6]        =
{
    {'.', '-'               }, // 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
    {'-', '-', '-', '-', '-'}, // 0
    {'.', '-', '-', '-', '-'}, // 1
    {'.', '.', '-', '-', '-'}, // 2
    {'.', '.', '.', '-', '-'}, // 3
    {'.', '.', '.', '.', '-'}, // 4
    {'.', '.', '.', '.', '.'}, // 5
    {'-', '.', '.', '.', '.'}, // 6
    {'-', '-', '.', '.', '.'}, // 7
    {'-', '-', '-', '.', '.'}, // 8
    {'-', '-', '-', '-', '.'} // 9
};

unsigned int msgLen, i, l, p, x;
char buff;

void dit(void);
void dah(void);
void pause(void);
void broadcast(int N_cycles);
void dontbroadcast(int N_cycles);

void setup()
{
    Serial.begin(9600);
    pinMode(outPin, OUTPUT);      // sets the digital pin as output

    msgLen = strlen(message);
}

void loop()
{
    for(x = 0; x < msgLen; x++)
    {
        buff = message[x];

        if(buff >= 'a' && buff <= 'z')
        {
            l = buff - 97;
        }
        else if(buff >= '0' && buff <= '9')
        {
            l = buff - 22;
        }
        else
        {
            l = 36;
        }
       
        Serial.print(buff);

        if(l == 36)
        {
            Serial.println("SPACE");
            delay(wPause);
        }           
        else
        {
            p = strlen(chars[l]);

            for(i = 0; i < p; i++)
            {

                if(chars[l][i] == '.')
                {
                  dit();
                }
                else if(chars[l][i] == '-')
                {
                  dah();
                }
            }

            delay(lPause);
            Serial.println();
        }
    }

    Serial.println();
    delay(wPause); 
}

void dah(void)
{
    Serial.print("-");
    digitalWrite(ledPin, HIGH);
    analogWrite(outPin, 128);
    delay(dahLen);
    digitalWrite(ledPin, LOW);
    analogWrite(outPin, 0);
    delay(ditLen);
}

void dit(void)
{
    Serial.print(".");
    digitalWrite(ledPin, HIGH);
    analogWrite(outPin, 128);
    delay(ditLen);
    digitalWrite(ledPin, LOW);
    analogWrite(outPin, 0);
    delay(ditLen);
}


ellisgl

Now 76 Bytes smaller!
Code: [Select]

/**
* Arduino + Wire = Morse Code AM Radio Beacon
* By EllisGL 2011-08-12
* Version 1.04 (Arduino version)
* Based on http://arduino.cc/forum/index.php/topic,8456.msg68164.html
*
* Change log:
*  V1.00: Initial
*  V1.01: Refactored for smaller size
*  V1.02: More refactoring
*  V1.03: More refactoring
*  V1.04: A lot of refactoring. Now 3380 Bytes intead of
*         3456 Bytes. Based on:
*         http://refactormycode.com/codes/1765-lpt-morse-code-transmitter#refactor_572471
*
* Known Issues:
*  Harmonics
*/
// Beacon message
const char c_message[] = "hello from my arduino 1022";

// Timings
const unsigned int c_dahLen = 1000; // 1000 ms - dah length
const unsigned int c_ditLen = 250;  // 250  ms - dit length - same timeing between dots and dashes of the same letter
const unsigned int c_lPause = 750;  // 750  ms - length between charaters
const unsigned int c_wPause = 1750; // 1750 ms - length for spaces
const unsigned int c_ledPin = 13;
const unsigned int c_outPin = 11;

// Character mapping
// Character mapping
const char * c_alpha[]    =
{
    ".-",       // 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
};

const char * c_nums[]     =
{
    "-----",    // 0
    ".----",    // 1
    "..---",    // 2
    "...--",    // 3
    "....-",    // 4
    ".....",    // 5
    "-....",    // 6
    "--...",    // 7
    "---..",    // 8
    "----.",    // 9
};

unsigned int msgLen, x;

void Send(char);
void SendLetter(char);
void SendNumber(char);
void SendSpace(void);

void setup()
{
    Serial.begin(9600);
    pinMode(c_ledPin, OUTPUT);      // sets the digital pin as output
    pinMode(c_outPin, OUTPUT);      // sets the digital pin as output

    msgLen = strlen(c_message);
}

void loop()
{
    for(x = 0; x < msgLen; x++)
    {
        Serial.print(c_message[x]);
        Send(c_message[x]);
    }

    Serial.println();
    delay(c_wPause);
}

void Send(char ch)
{
    if(isdigit(ch))
    {
        SendNumber(ch);
    }
    else if(isalpha(ch))
    {
        SendLetter(ch);
    }
    else
    {
        SendSpace();
    }
}

void SendCode(const char * pszCode)
{
    while(*pszCode)
    {
        Serial.print(*pszCode);
        digitalWrite(c_ledPin, HIGH);
        analogWrite(c_outPin, 128);
        delay(*pszCode == '-' ? c_dahLen : c_ditLen);
        digitalWrite(c_ledPin, LOW);
        analogWrite(c_outPin, 0);
        delay(c_ditLen);
        ++pszCode;
    }

    delay(c_lPause);
    Serial.println();
}

void SendLetter(char ch)
{
    SendCode(c_alpha[tolower(ch) - 97]);
}

void SendNumber(char ch)
{
    SendCode(c_nums[ch-'0']);
}

void SendSpace(void)
{
    Serial.println("SPACE");
    delay(c_wPause);
}

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy