Questo fine settimana ho lavorato al mio primo progetto con l'arduino Uno... sto realizzando un CW beacon, ovvero un automatismo che invia via radio una frase in codice morse ad intervalli regolari. Ci stavo lavorando con un altro sistema ma adesso con l'arduino è tutta unaltra cosa. ma veniamo a noi:
questo è il codice che ho già scritto ieri:
// personalizzazione
int intervallo = 5 * 1000; // 5 è l'intervallo in secondi tra una trasmissione e l'altra...in realtà dovrà essere dell'ordine dei minuti
int velocita = 30 ; // velocità di manipolazione in caratteri al minuto
String messaggio = "CQ CQ de IS0CFU IS0CFU etc etc"; // stringa da trasmettere
// fine personalizzazione
int lMax = 14 ; // n° di caratteri max da visulaizzare sull'LCD
int nChar = 40; // n° di caratteri di cui si compone il codice morse (lettere, numeri, punteggiatura e qualche altro segno, vedi caratteri_alfab[] e caratteri_morse[]
char caratteri_alfab [] = { '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' ,'.' ,',' ,'?' , ' ' };
String caratteri_morse [] = { ".-" , "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--","-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", ".-.-.-", "--..--","..--..", " "};
String chrMorse;
const int ledPin = 13; // the number of the LED pin
const int tonePin = 11; // the number of the tone pin
void setup()
{
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(tonePin, OUTPUT);
}
void stampa_seriale(String pm, char l, String m){ Serial.print(pm); Serial.print(" "); Serial.print(l); Serial.print(" "); Serial.print (m); Serial.println();}// serve solo per fare i controlli durantelo sviluppo
void stampa_lcd (String pm, char l, String m){}// da sviluppare in un secondo tempo, dopo verificato che funziona bene tutto
void trova_chrMorse (char l){ for( int i = 0; i < nChar; i++){if (l == caratteri_alfab [i]){chrMorse = caratteri_morse[i];}}} // trova la stringa morse corrispondente al carattere l e la pone in chrMorse
void digita_chrMorse (String m)
{
int tempo = int(60*1000) / ( 20 * float(velocita)) ;
tempo = 100;
Serial.print(tempo);
char segno;
for(int i = 0; i < m.length(); i++)
{
segno = m.charAt(i);
switch (segno)
{
case '.':
Serial.print('.');
digitalWrite(ledPin, HIGH); tone(11, 1000); delay (1*tempo); digitalWrite(ledPin, LOW); noTone(11); delay (2*tempo);
break;
case '-':
Serial.print('-');
digitalWrite(ledPin, HIGH); tone(11, 1000); delay (3*tempo); digitalWrite(ledPin, LOW); noTone(11); delay (2*tempo);
break;
case ' ':
Serial.print(' ');
delay (5*tempo);
break;
}
}
Serial.println();
delay (7*tempo);
}
void loop()
{
char lettera ;
String parte_messaggio ;
messaggio = messaggio.toUpperCase(); // trasforma tutto in maiuscolo
for(int i = 0; i < messaggio.length(); i++)
{
lettera=messaggio.charAt(i);
parte_messaggio = parte_messaggio + lettera;
if (parte_messaggio.length() > lMax ){parte_messaggio = parte_messaggio.substring (parte_messaggio.length()-lMax );}; //taglia la parte di messaggio già trasmesso agli ultimi lMax caratteri. Per poter visualizzare sull'LCD - max 16 caratteri
trova_chrMorse (lettera);
//stampa_seriale (parte_messaggio, lettera, chrMorse); //invia i dati per il controllo durante lo sviluppo
//stampa_lcd (parte_messaggio, lettera, chrMorse); // invia i dati all'LCD
digita_chrMorse(chrMorse);
}
delay (intervallo);
}
La prima domanda è la seguente: come mai la seguente espressione
int tempo = int(60*1000) / ( 20 * float(velocita)) ;
mi dà sempre come risultatao (mi pare) -27 ... mentre invece dovrebbe dare 100 posto che velocità e pari a 30??
ho provato in ntutti modi, variabile double, float, dentro la funzione, fuori etc.. pare che la divisione proprio non gli vada bene... spiegatemi un poco..
altra domanda:
per prelevare il tono da 1000 Hz dal piedino 11 come devo fare... perchè ho provato semplicemente con un piccolo auricolare ma non c'era nulla.. o forse c'è qualcosa di sbagliato nel codice? .. oppure l'ampiezza del segnale è così bassa da essere impercettibile senza amplificazione?... bho!!!!
altra domanda?
cè qualche suggerimento per otimizzare il codice?.. per esempio
per associare la giusta stringa di caratteri (punto - linea) alla generica lettera dell'alfabeto uso un ciclo for per scorrere l'array e quando trovo la lettera uso l'indice per leggere la stringa morse.. in questo modo:
void trova_chrMorse (char l){ for( int i = 0; i < nChar; i++){if (l == caratteri_alfab [i]){chrMorse = caratteri_morse[i];}}} // trova la stringa morse corrispondente al carattere l e la pone in chrMorse
cè qualche sistema per otimizzare questa funzione.. non è che è meglio utilizzare una struttura tipo "switch case" ... se qualcuno vuole dermi la propia opinione .. ne farò tesoro.. grazie..