Go Down

Topic: Arduino + Wire = Morse Code AM Radio Beacon (reopen) (Read 3091 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