Weather Balloon Foxhunt Beacon

This weather balloon foxhunt beacon utilized K4RY design for a normal foxhunt scenario.
https://wiki.eng.auburn.edu/k4ry/doku.php?id=fox_hunt_transmitter

Frequencies for Transmitter:

Frequency Notes
145.530MHz Primary High-power transmitters
145.570MHz
145.610MHz
145.650MHz
145.690MHz
145.730MHz
145.770MHz Low Power transmitters

Parts List:

  • Arduino nano(2x)
  • Baofeng HT
  • Audio jack 3/32”
  • 3s 11.1v lipo battery for arduino nano
  • 2s 7.4v lipo battery for Baofeng
  • 6FT latex balloon
  • BMP180 pressure and temp scensor
  • 12v to 5v converter (car usb charger modified)
  • LMR-174




Note- we are not utilizing D4 "found switch" for our beacon

Arduino program slightly modified from K4RY https://wiki.eng.auburn.edu/k4ry/doku.php?id=fox_hunt_transmitter


/*
Foxhunt Beacon SOURCE K4RY  
Morse blinker/sounder
*/

// Global variables

boolean done = false; // initialize a Boolean flag if we don't want to endlessly loop

#define PTT_Low 2  // Transmitter PTT. If PTT goes LOW, use PIN 2
#define PTT_High 3  // Transmitter PTT. If PTT goes HIGH, use PIN 3
#define FOUND 4 // This is the IM FOUND button. Keep LOW for off. Switch HIGH for FOUND Tone Activation.
#define LED 13
#define SPEAKER 6  // Audio out to radio
#define TONE 600.0   // Tone of CWID
#define USESPEAKER true

#define intracharacter 3 // delay between characters
#define dot 1 // length of a dit -- 1 unit
#define dash 3 // length of a dah
#define eow 7 // length at end of word
#define fiveWPM 240 // milliseconds for 5 wpm (based on sending PARIS 5 times for a total of 250 units)
#define wpm 15 // *** SET THIS TO YOUR DESIRED SPEED ***
#define speed fiveWPM / (wpm / 5) // multiplier to apply to 5 wpm rate. 2 = 10wpm, 2.5 = 15wmp, etc.

// CHANGE THESE SETTINGS
// CHANGE THESE SETTINGS

char send[] = "W8UPD WEATHER BALLOON FOXHUNT BEACON";  // SET THIS TO THE CW STRING YOU WANT TO SEND -- MUST BE UPPRCASE ***
char sendFound[] = "W8UPD WEATHER BALLOON FOXHUNT BEACON";  // SET THIS TO THE CW STRING YOU WANT TO SEND -- MUST BE UPPRCASE ***
int timer = 3; // Set the time between transmissions in SECONDS
char PTT_Setting = LOW; // Set how your radio transmits.     Low = PTT goes LOW.       High = PTT goes HIGH

// CHANGE THESE SETTINGS
// CHANGE THESE SETTINGS

int tx_hold = timer*1000;

// Morse code tokens. 0 = dit, 1 = dah any other character will generate 8 dit error.

// NOTE: These need to be in ASCII code sequence to work

char tokens [][7] = { "110011","100001", // ,,-
"010101","10010", // .,/
"11111","01111","00111","00011","00001","00000", // 0,1,2,3,4,5
"10000","11000","11100","11110", // 6,7,8,9
"111000","10101","<", // :,;,<"=",">","001100", // =,>,?
"@", // @,
"01","1000","1010", // A,B,C
"100","0","0010", // D,E,F
"110","0000","00", // G,H,I
"0111","101","0100", // J,K,L
"11","10","111", // M,N,O
"0110","1101","010", // P,Q,R
"000","1","001", // S,T,U
"0001","011","1001", // V,W,X
"1011","1100"}; // Y,Z }
;

// Arduino setup routine
void setup()

{
pinMode(SPEAKER,OUTPUT);
pinMode(PTT_Low, OUTPUT);
pinMode(PTT_High, OUTPUT);
pinMode(FOUND, INPUT);
digitalWrite(PTT_Low, HIGH); // Sets the PTT to OFF when its not supposed to TX
digitalWrite(PTT_High, LOW); // Sets the PTT to OFF when its not supposed to TX
}

// Routine to output a dit
void dit()
{
if (USESPEAKER)
{
tone(SPEAKER,TONE, dot * speed);
delay(dot * speed); }
else
{
digitalWrite(LED, HIGH); // set the LED on
delay(dot * speed); // wait for a dot's worth
digitalWrite(LED, LOW); // set the LED off
}

delay(speed);
}

// Routine to output a dah
void dah()
{
if (USESPEAKER)
{
tone(SPEAKER,TONE, dash * speed);
delay(dash * speed);
}
else
{
digitalWrite(LED, HIGH); // set the LED on
delay(dash * speed); // wait for a dah's worth
digitalWrite(LED, LOW); // set the LED off
}
delay(speed);
}

// Intracharacter delay
void ic()
{
digitalWrite(LED, LOW); // set the LED off
delay (intracharacter * speed); // wait for a half second
}

// a space is 7 units of off based on speed
void spaceCharacter()
{
digitalWrite(LED, LOW); // set the LED off
delay((eow * speed) + (intracharacter * speed)); // wait for 7 units
}

// Send a CW error for unknown characters
void error()
{
for (int i = 0; i <8; i++)
{
dit();
}
ic();
}

// Look up a character in the tokens array and send it
void send_element(int c)
{
char token_to_send[7]; // allocate space for the token
strcpy(token_to_send,tokens[c]); // copy the token from the table into our variable

int len = strlen(token_to_send); // figure out how many dit dahs are in it
for (int i = 0; i <len; i++) // for each item in the token
{
if (token_to_send[i] == '0') // if its a 0
{
dit(); // send a dit
}
else if (token_to_send[i] == '1')
{
dah(); // otherwise we send a dah
}
else
{
error(); // we don't have a valid morse token
}
}
ic(); // after each character there is an intercharacter delay
}

// The main send routine. Pull each character apart and determine its corresponding token.
void send_code()
{
int len = strlen(send); // get the length of the string to send
int c;

for (int i = 0; i <len; i++) // loop thru each character in the string to send
{
c = send[i]; // get the ASCII integer value of the character
if (c == ' ') // see if we are between words
{
spaceCharacter(); // send a space
}
else
{
c -= ','; // offset it by the lowest ASCII character in the tokens table (a comma)
send_element(c); // send that element from the token array

}

}
}

void startup_tones()
{
tone(SPEAKER,988,250);
delay(1000);
tone(SPEAKER,988,250);
delay(400);
tone(SPEAKER,880,250);
delay(400);
tone(SPEAKER,988,250);
delay(1000);

tone(SPEAKER,988,250);
delay(400);
tone(SPEAKER,880,250);
delay(400);
tone(SPEAKER,988,250);
delay(1000);

tone(SPEAKER,988,250);
delay(400);
tone(SPEAKER,880,250);
delay(400);
tone(SPEAKER,784,1000);
delay(1000);
tone(SPEAKER,880,1000);
delay(1000);
};

void found_tones()
{
tone(SPEAKER,400,500);
delay(130);
tone(SPEAKER,600,500);
delay(130);
tone(SPEAKER,800,500);
delay(800);
tone(SPEAKER,400,500);
delay(130);
tone(SPEAKER,600,500);
delay(130);
tone(SPEAKER,800,500);
delay(800);
tone(SPEAKER,400,500);
delay(130);
tone(SPEAKER,600,500);
delay(130);
tone(SPEAKER,800,500);
delay(3000);
};

// The Arduino main run loop
void loop()

{
if (!done) // see if we are done the loop
{

digitalWrite(PTT_Low, LOW);    // Enable PTT for "Low" type radios
digitalWrite(PTT_High, HIGH);  // Enable PTT for "High" type radios
delay(2000); // Wait 2 seconds to allow radio to Key Up
startup_tones(); // Play the startup tones
delay(3000);  // Wait 3 seconds
if (digitalRead(FOUND) == HIGH) { found_tones();  };  // Check to see if FOUND button was pressed, if YES, then play tones
send_code(); // send the string
spaceCharacter(); // make sure we have a space if we loop around to the beginning
delay(1000); // Wait 1 second to allow radio to UnKey
digitalWrite(PTT_Low, HIGH);  // Disable PTT for "Low" type radios
digitalWrite(PTT_High, LOW);  // Disable PTT for "High" type radios

// Multiple delays are used below, since the code doesnt like to run long delays. Use multiples for more time.
delay(tx_hold);  // Delay between transmissions, set above in config area
delay(tx_hold);  // Delay between transmissions, set above in config area
//delay(tx_hold);  // Delay between transmissions, set above in config area
//delay(tx_hold);  // Delay between transmissions, set above in config area
//delay(tx_hold);  // Delay between transmissions, set above in config area
done = false; // Uncomment to set our flag to finish sending
}

}
------------------------------------------------------------------------------------------------------------------------






Comments