Nu poden alligevel var syg igår, så kunne jeg jo lige så godt få pudset den sidste del af morse koden af.
Nu mangler jeg blot at finde ud af om den medfølgende MOSFET kan trække et bilhorn.....
-Eivind
byte text[] = "All your base are belong to us"; // Transmittet text
// Morse code generator for the Arduino
// Transmitted text is placed in the first line
// Tempo sets the speed of a dot etc.
// Morde code was tanken from http://en.wikipedia.org/wiki/M...code
// Text is looping and prior to transmitting the active pin blinks rapidly
// Version 1.0, made by Eivind Triel
int ledPin = 13; // Active led pin
int tempo = 500; // timing of one dot
void setup () {
pinMode(ledPin, OUTPUT);
}
void start(){ // rapid blink at startup
for(int i = 0; i < 50; i++){
digitalWrite(ledPin, HIGH);
delay(25);
digitalWrite(ledPin, LOW);
delay(25);
}
delay(7 * tempo);
}
void dot() { // we need more dots
digitalWrite(ledPin, HIGH);
delay(1 * tempo);
digitalWrite(ledPin, LOW);
delay(1 * tempo);
}
void dash() { // a dash and a splash
digitalWrite(ledPin, HIGH);
delay(3 * tempo);
digitalWrite(ledPin, LOW);
delay(1 * tempo);
}
void morse(byte letter) { // time to transmit
Serial.println(letter, DEC);
if (letter == 'a' or letter == 'A') {dot(); dash();}
if (letter == 'b' or letter == 'B') {dash(); dot(); dot(); dot();}
if (letter == 'c' or letter == 'C') {dash(); dot(); dash(); dot();}
if (letter == 'd' or letter == 'D') {dash(); dot(); dot();}
if (letter == 'e' or letter == 'E') {dot();}
if (letter == 'f' or letter == 'F') {dot(); dot(); dash(); dot();}
if (letter == 'g' or letter == 'G') {dash(); dash(); dot();}
if (letter == 'h' or letter == 'H') {dot(); dot(); dot(); dot();}
if (letter == 'i' or letter == 'I') {dot(); dot();}
if (letter == 'j' or letter == 'J') {dot(); dash(); dash(); dash();}
if (letter == 'k' or letter == 'K') {dash(); dot(); dash();}
if (letter == 'l' or letter == 'L') {dot(); dash(); dot(); dot();}
if (letter == 'm' or letter == 'M') {dash(); dash();}
if (letter == 'n' or letter == 'N') {dash(); dot();}
if (letter == 'o' or letter == 'O') {dash(); dash(); dash();}
if (letter == 'p' or letter == 'P') {dot(); dash(); dash(); dot();}
if (letter == 'q' or letter == 'Q') {dash(); dash(); dot(); dash();}
if (letter == 'r' or letter == 'R') {dot(); dash(); dot();}
if (letter == 's' or letter == 'S') {dot(); dot(); dot();}
if (letter == 't' or letter == 'T') {dash();}
if (letter == 'u' or letter == 'U') {dot(); dot(); dash();}
if (letter == 'v' or letter == 'V') {dot(); dot(); dot(); dash();}
if (letter == 'w' or letter == 'W') {dot(); dash(); dash();}
if (letter == 'x' or letter == 'X') {dash(); dot(); dot(); dash();}
if (letter == 'y' or letter == 'Y') {dash(); dot(); dash(); dash();}
if (letter == 'z' or letter == 'Z') {dash(); dash(); dot(); dot();}
if (letter == '1') {dot(); dash(); dash(); dash(); dash();}
if (letter == '2') {dot(); dot(); dash(); dash(); dash();}
if (letter == '3') {dot(); dot(); dot(); dash(); dash();}
if (letter == '4') {dot(); dot(); dot(); dot(); dash();}
if (letter == '5') {dot(); dot(); dot(); dot(); dot();}
if (letter == '6') {dash(); dot(); dot(); dot(); dot();}
if (letter == '7') {dash(); dash(); dot(); dot(); dot();}
if (letter == '8') {dash(); dash(); dash(); dot(); dot();}
if (letter == '9') {dash(); dash(); dash(); dash(); dot();}
if (letter == '0') {dash(); dash(); dash(); dash(); dash();}
if (letter == ' ') {delay(5 * tempo);} // This makes 7 * tempo for space
// and now for some national/special letters
// values were foundt with Serial.print(letter, DEC)
if (letter == 166 or letter == 134) {dot(); dash(); dot(); dash();} // æ/Æ is recognized as 166/134
if (letter == 184 or letter == 152) {dash(); dash();dash();dot();} // ø/Ø is recognized as 184/152
if (letter == 165 or letter == 133) {dot();dash();dash();dot();dash();} // å/Å is recognized as 165/133
delay(2 * tempo); // this makes 3 * tempo for letter end, and 7 * tempo for space
}
void loop () {
start();
for (int i = 0; i < sizeof(text); i++) {
morse(text[i]);
}
}
Jeg øjner nogle produktmuligheder her. Jeg har altid selv ønsket at sende visse beskeder med hornet til med-(mod?) trafikanter ("D.I.N.K.Æ.M.P.E.S.P.A.S.S.E.R")
Mon Arduino-udviklerne nogensinde vidste hvilke frembringelser de ville blive skyld i...?
PS: Kan du ikke optage en demonstrationsvideo og lægge på youtube, når du har fundet den rigtige MOSFET til at trække bilhornet? ;-)
Hejsa,
Lækkert projekt! Jeg har lavet et tilsvarende til brug på spejderløb osv. Min erfaring er at morse-standarden er temmelig hård kost at opfange for ikke-morse-hajer. Det vil sige at de spejdere jeg har sendt gennem 'maskinen' ikke har fået en kode efter ovenstående forhold ( hvor en streg er 3 gange længere end en prik), men noget mere i nærheden af 5-7 gange længere.
En nem måde at kontrollere 'sværheds graden' og den realistisk fornemmelse kunne være at indføre en variabel 'level' som kan bruges til angive hvor mange gange længere en streg skal være (ligeledes pausen mellem tegn, bogstaver og ord)
ellers et fedt projekt og en sjov ide med et bilhorn :) hvad med et rigtigt kompressorhorn fra en lastbil, det skal jo larme lidt ;)
Et lille tip til at spare halvdelen af if'erne er at konvertere dit 'letter' til en uppercase.
letter=toupper(letter); // funktionen eller en tilsvarende skulle findes i dit funktionsbibliotek.
Når den sparer halvdelen, så er det fordi din if (letter=='a' or letter=='A')....
oversættes til 2 compares i maskinkode.
Ligenu pløjer du i gennemsnit igennem 20 if'er for at finde ud af hvilket tegn det er...Rent faktisk kan det laves uden at bruge en eneste if hvis du istedet bruger en array-konstruktion...dvs. det koster lidt mere ram (ca. 1KB), men der kan også laves løsninger der er mere balancerede mellem ram og cpu.
Det fylder lidt, specielt definitionen af morsekoderne, men du kan jo fjerne kommentarerne. Ellers skulle det være lige ud af landevejen.
Jeg har for syns skyld valgt at lave morsekoderne som et array af strenge, det fylder en del og man kan faktisk lave det så hver kode kun fylder 2 byte istedet. Ligeledes kan den tertiære operator der skelner mellem dot og dash erstattes af en anden konstruktion der fjerner sammenligningen.
Jeg har desværre ikke en arduino selv, men det skulle være lige til at passe ind i den første listning øverst i 'ode til en kode'.
Vil du have yderligere forklaring så bare skriv.
#include <ctype.h> // pga af toupper
#include <stdio.h> // kan fjernes hvis du fjerner alle put*
// dec. 32-> 'space' ! " ø $ ø & '
char *morsecode[]={"","-.-.--",".-..-.","","...-..-","",".-...",".----.",
// ( ) ø + , - .
"-.--.","-.--.-","",".-.-.","--..--","-....-",".-.-.-",
// /
"-..-.",
// 0 1 2 3 4 5
"-----",".-----","..---","...--","....-",".....",
// 6 7 8 9 : ;
"-....","--...","---..","----.","---...","-.-.-.",
// ø = ø ? @
"","-...-","","..--..",".--.-.",
// 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 Æ Ø Å ø _
"-.--","--..",".-.-","---.",".--.-","","..--.-"};
void morse(char);
void dash(void);
void dot(void);
void wordbreak(void);
void morsetekst(char *);
// morse: . en unit, - 3 unit, mellemrum mellem bogstaver 3 unit, mellem ord 7 unit
// mellem morsetegn 1 unit
void morse(char letter)
{
char *tegn;
letter=toupper(letter);
tegn=morsecode[(unsigned int)letter-32];
puts(tegn);//fjern
while(*tegn){
(*tegn=='-'?dash():dot());// kan laves helt uden brug af ?:
*tegn++;
}
}
void dash(void)
{
putchar('-');//erstat med indhold fra oprindelig dash
}
void dot(void)
{
putchar('.');// erstat med indhold fra oprindelig dot
}