/* * A simple GPS Morse Telemetry Sender * for the HopeRF rfm69hcw * on a ProMini 3.3 * Charles Webb * KC1ENN@arrl.net * * With thanks to.... * * "This code is so trivial that I'm releasing it completely without restrictions." * Simple Arduino Morse Beacon v0.0 * Written by Mark VandeWettering * Check out my blog @ http://brainwagon.org */ #include #include #include #define ssPin 10 // SS Chip select pin for reading/writing to the rf69 registers with SPI //#define ssPin 8 // adafruit feather M0 #define rstPin 9 // reset pin //#define rstPin 4 // adafruit feather M0 #define MY_DELAY 3000 // 3 second delay between loops, sending the message #define N_MORSE (sizeof(morsetab)/sizeof(morsetab[0])) #define SPEED (15) // WORKS 5 - 50 wpm FL-DIGI #define DOTLEN (1200/SPEED) #define DASHLEN (3*(1200/SPEED)) //#define MY_TX_POWER 0x50 // PA0 only range 0x50 -18dBm to 0x5F -3dBm //#define MY_TX_POWER 0x58 // 6 dBm //#define MY_TX_POWER 0x5B // 9 dBm //#define MY_TX_POWER 0x5E // 12 dBm //#define MY_TX_POWER 0x70 // 2 dbm #define MY_TX_POWER 0x7F // 17 dBm char mytext[80]; String inputString = ""; // a String to hold incoming data String myCallSign = "CALLSIGN/B"; long myFrequency = 433200000; //long myFrequency = 915000000; String myString = ""; String myCall = ". CALLSIGN/B"; int myStringLen = 0; unsigned int count=0; //char mycount = 0; int myHour, myMinute, mySecond, myAlt, mySpd, mySat; double myLat, myLng; TinyGPSPlus gps; SoftwareSerial ss(6,7); // Tx Rx void setup() { Serial.begin(9600); // baud speed for sending to the arduino serial monitor Serial.println("Starting up"); // print to the serial monitor pinMode(ssPin, OUTPUT); // define pinMode(rstPin, OUTPUT); setupSPI(); delay(1000); resetRFM69(); delay(1000); setupRFM69(); } void loop() { count++; fetchGPS(); buildString(); //myString = myCall; myString.toUpperCase(); myStringLen = myString.length(); myString.toCharArray(mytext,myString.length() + 1); // Serial.print("I am sending: "); Serial.println(myString); sendmsg(mytext); inputString = ""; myString = ""; } void buildString() { myString = myCallSign; myString += " COUNT " + String(count); myString += " TIME " + String(myHour) + "/" + String(myMinute) + "/" + String(mySecond); myString += " LAT " + String(myLat) + " LNG " + String(myLng); myString += " ALT " + String(myAlt) + " SPD " + String(mySpd) + " SAT " + String(mySat); myString += "..."; myString.toUpperCase(); myStringLen = myString.length(); Serial.print("I am sending: "); Serial.println(myString); } void fetchGPS() { //Remeber to only enable and softwear serial as needed, to thre the GPS then disable as it messes with the timing/printing of FH ss.begin(9600); myHour = gps.time.hour(); smartDelay(0); myMinute = gps.time.minute(); smartDelay(0); mySecond = gps.time.second(); smartDelay(0); myLat = gps.location.lat(); smartDelay(0); myLng = gps.location.lng(); smartDelay(0); myAlt = gps.altitude.feet(); smartDelay(0); mySpd = gps.speed.mph(); smartDelay(0); mySat = gps.satellites.value(); smartDelay(0); ss.end(); delay(100); } void setupRFM69() { writeReg(0x02,0x34); // Modulation for OOK, Continuous w.o bit synch, OOK, no shaping setFrequency(myFrequency); writeReg(0x01,0x0C); // Set mode to Transmitter TX mode Serial.println("Transmitter is ready...."); } struct t_mtab { char c, pat; } ; struct t_mtab morsetab[] = { {'.', 106}, {',', 115}, {'?', 76}, {'/', 41}, {'A', 6}, {'B', 17}, {'C', 21}, {'D', 9}, {'E', 2}, {'F', 20}, {'G', 11}, {'H', 16}, {'I', 4}, {'J', 30}, {'K', 13}, {'L', 18}, {'M', 7}, {'N', 5}, {'O', 15}, {'P', 22}, {'Q', 27}, {'R', 10}, {'S', 8}, {'T', 3}, {'U', 12}, {'V', 24}, {'W', 14}, {'X', 25}, {'Y', 29}, {'Z', 19}, {'1', 62}, {'2', 60}, {'3', 56}, {'4', 48}, {'5', 32}, {'6', 33}, {'7', 35}, {'8', 39}, {'9', 47}, {'0', 63} } ; void resetRFM69() { digitalWrite(rstPin, HIGH); delay(100); digitalWrite(rstPin, LOW); delay(100); } void printReg(byte data) { Serial.print("Register "); Serial.print(data); Serial.print(" = "); Serial.println(readReg(data), HEX); } void writeReg(uint8_t addr, uint8_t value) { digitalWrite(ssPin,LOW); SPI.transfer(addr | 0x80); SPI.transfer(value); digitalWrite(ssPin, HIGH); } uint8_t readReg(uint8_t addr) { digitalWrite(ssPin, LOW); SPI.transfer(addr & 0x7F); uint8_t regval = SPI.transfer(0); digitalWrite(ssPin, HIGH); return regval; } void setupSPI() { SPI.begin(); SPI.setBitOrder(MSBFIRST); SPI.setClockDivider(SPI_CLOCK_DIV4); } void setFrequency(uint32_t freqHz){ // Setup the frequency freqHz /= 61; // resolution is 61 Hz so divide it it down and mask it out writeReg(0x07, freqHz >> 16); // Frequency MSB writeReg(0x08, freqHz >> 8); // Frequency Middle Byte writeReg(0x09, freqHz); // Frequency LSB Serial.print("Frequency set to "); Serial.println(myFrequency); } void txOn(int txTime) { writeReg(0x11,MY_TX_POWER); // PA On ******************************************* delay(txTime); writeReg(0x11,0x00); // PA off ************************************************* } void dash() { txOn(DASHLEN); delay(DOTLEN); } void dit() { txOn(DOTLEN); delay(DOTLEN); } void send(char c) { int i ; if (c == ' ') { //Serial.print(c) ; delay(7*DOTLEN) ; return ; } for (i=0; i