Beacon con arduino
Non è farina del mio sacco, ho modificato un programma scritto da Nicola Salsotto IN3GJH.
Insieme a mio marito ho apportato importanti modifiche in modo che dal valore WPM si possa ottenere direttamente il "peso" dei punti e delle linee.
Funziona in questo modo:
Trasmissione messaggio , 2 secondi pausa, trasmissione portante di 30 secondi
Pausa 10 secondi
Trasmissione messaggio , 2 secondi pausa, trasmissione portante di 30 secondi
Pausa 5 minuti
Inizia nuovamente il ciclo
Le uniche cose da modificare sono:
- Valore WPM
- SendMsg nelle due stringhe in void loop()
- Eventualmente il delay 30000 per la portante di 30 secondi , sempre in void loop()
#define WPM (60) //Velocità caratteri/minuto (adattare alle necessità)
#define SPEED (9800/WPM) // adattamento WPM alla velocità baud Rate
#define NDOT (SPEED*38) //numero dei punti totali alla parola PARIS x velocità
#define DOTLEN (NDOT/60) // durata punti riferiti al minuto
#define DASHLEN (3*DOTLEN) // durata linee
#define PAUSE 10 //pausa in secondi tra le transmissioni
int ledPin=13; //Pin Digitale usato per mostrare quando un tono è in riproduzione (possibilità di utilizzarlo come keyer)
int tonePin=3; //Pin Digitale usato per tono in altoparlante.
int toneFreq=600; //Frequenza del tono.
void sendMsg(char*);
void dash();
void dot();
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
Serial.println("Arduino Morse Beacon");
Serial.println("Written by Nicola Salsotto IN3GJH, modified by Ercole Pizzo IU8JOL");
Serial.print("\n");
}
void loop()
{
sendMsg("IU8JOL/B BT LOCATOR JN71ON BT POWER PWR 2 WATT ERP BT ABOVE SEA LEVEL 650 METERS BT AR"); //Modificare con il vostro messaggio.
Serial.print("DELAY: ");//Interfaccia per il monitor.
Serial.print(PAUSE);
Serial.println(" s");
delay(2000); //Ritardo di 2 secondi tra fine messaggio e inizio portante.
digitalWrite(ledPin, HIGH); //Inizio portante sul led/keyer.
tone(tonePin, toneFreq); //Inizio portante sull'altoparlante.
delay(30000); //Durata portante in millisecondi.
digitalWrite(ledPin, LOW); //Fine portante al led/keyer.
noTone(tonePin); //Assegnazione tono al pin 3.
tone(tonePin, 21000);
delay(30000); //Durata portante sull'altoparlante.
noTone(tonePin);
delay(PAUSE*1000); //Pausa di 10 secondi tra i due messaggi.
sendMsg("IU8JOL/B BT LOCATOR JN71ON BT POWER PWR 2 WATT ERP BT ABOVE SEA LEVEL 650 METERS BT AR"); //Remember to replace it with your callsign/message!
Serial.print("DELAY: ");
Serial.print(PAUSE);
Serial.println(" s");
delay(2000);
digitalWrite(ledPin, HIGH);
tone(tonePin, toneFreq);
delay(30000);
digitalWrite(ledPin, LOW);
noTone(tonePin);
tone(tonePin, 21000);
delay(30000);
noTone(tonePin);
delay(5*60000); //Pausa di 5 minuti per riposo Beacon.
}
void dash()
{
digitalWrite(ledPin, HIGH);
tone(tonePin, toneFreq);
delay(DASHLEN);
digitalWrite(ledPin, LOW);
noTone(tonePin);
tone(tonePin, 21000);
delay(DOTLEN);
noTone(tonePin);
}
void dot()
{
digitalWrite(ledPin, HIGH) ;
tone(tonePin, toneFreq);
delay(DOTLEN);
digitalWrite(ledPin, LOW);
noTone(tonePin);
tone(tonePin, 21000);
delay(DOTLEN);
noTone(tonePin);
}
void sendMsg(char *str)
{
int i;
tone(tonePin, 21000);
delay(500);
noTone(tonePin);
Serial.print("TX: ");
for(i=0;i<strlen(str);i++)
{
switch (str[i])
{
case 'A':
dot();dash();break;
case 'B':
dash();dot();dot();dot(); break;
case 'C':
dash();dot();dash();dot(); break;
case 'D':
dash();dot();dot();break;
case 'E':
dot();break;
case 'F':
dot();dot();dash();dot(); break;
case 'G':
dash();dash();dot();break;
case 'H':
dot();dot();dot();dot();break;
case 'I':
dot();dot();break;
case 'J':
dot();dash();dash();dash(); break;
case 'K':
dash();dot();dash();break;
case 'L':
dot();dash();dot();dot(); break;
case 'M':
dash();dash();break;
case 'N':
dash();dot();break;
case 'O':
dash();dash();dash();break;
case 'P':
dot();dash();dash();dot(); break;
case 'Q':
dash();dash();dot();dash(); break;
case 'R':
dot();dash();dot();break;
case 'S':
dot();dot();dot();break;
case 'T':
dash();break;
case 'U':
dot();dot();dash();break;
case 'V':
dot();dot();dot();dash(); break;
case 'W':
dot();dash();dash();break;
case 'X':
dash();dot();dot();dash(); break;
case 'Y':
dash();dot();dash();dash(); break;
case 'Z':
dash();dash();dot();dot(); break;
case ' ':
tone(tonePin, 21000);
delay(DOTLEN*5);
noTone(tonePin);
break;
case '.':
dot();dash();dot();dash();dot( );dash();break;
case ',':
dash();dash();dot();dot(); dash();dash();break;
case ':':
dash();dash();dash();dot(); dot();break;
case '?':
dot();dot();dash();dash();dot( );dot();break;
case '\'':
dot();dash();dash();dash(); dash();dot();break;
case '-':
dash();dot();dot();dot();dot() ;dash();break;
case '/':
dash();dot();dot();dash();dot( );break;
case '(':
case ')':
dash();dot();dash();dash(); dot();dash();break;
case '\"':
dot();dash();dot();dot();dash( );dot();break;
case '@':
dot();dash();dash();dot(); dash();dot();break;
case '=':
dash();dot();dot();dot();dash( );break;
case '0':
dash();dash();dash();dash(); dash();break;
case '1':
dot();dash();dash();dash(); dash();break;
case '2':
dot();dot();dash();dash(); dash();break;
case '3':
dot();dot();dot();dash(); dash();break;
case '4':
dot();dot();dot();dot();dash( );break;
case '5':
dot();dot();dot();dot();dot() ;break;
case '6':
dash();dot();dot();dot();dot( );break;
case '7':
dash();dash();dot();dot(); dot();break;
case '8':
dash();dash();dash();dot(); dot();break;
case '9':
dash();dash();dash();dash(); dot();break;
}
Serial.print(str[i]);
delay(2*DOTLEN);
}
Serial.print("\n");
}
Nessun commento:
Posta un commento