Model Rocket GPS Telemetry Tracker w/ Hc-12 code help

With your revised requirement, the HC12 is a poor choice. It probably (but only just) has enough range for flight use, but is a poor choice for ground searching and locating.

And if you now want remote control, be aware that the HC12 does not have internal error checking, so data may be received that is corrupt.

I was Watching James Mays 'Toy Stories' Christmas 2014;

They launched an Action Man in a large rocket. Then, when it landed they had to find it and they could not. Their tracker was poor, completely lacking in the range they needed. I don’t recall exactly but it was some days later that the rocket was found.

So I wrote a tongue in cheek article about searching for lost toys (rockets) using one of my first LoRa trackers. Read about it here;

Searching for Dolly – It aint Rocket Science

With the dolly lost and on the ground in a bit of Woodland, I was picking up the 1kbps data that was the GPS coordinates over 1.15km of mixed rural countryside at a link margin of 14dB. So at the limit of reception the distance should be 5.7km. Since those tests in late 2014 I have improved my LoRa trackers and when in a lost state they transmit co-ordinates at a very low data rate that improves the distance by a further factor of 3. Add a modest Yagi gain antenna to the hand-held receiver and you can go 3 times further again.

But there is more, if your rocket really goes astray and you need to search a large area very quickly, my trackers will work as a relay, send one up to around 100M on a small plane or drone (toys again!) and you can search huge areas quickly, read about it here;

How to Search 500 Square Kilometres in 10 minutes

the HC12 does not have internal error checking

Eew. Sending the raw NMEA data makes even less sense, because its error detection technique is so poor. There are many good choices for adding error correcting codes in the sketch. This is independent from choosing a different transmitter, data rate and antenna. The lowest (most reliable) data rates may be too slow to keep up with the raw data, anyway.

when in a lost state they transmit co-ordinates at a very low data rate...

my trackers will work as a relay...

Very nice! I love solutions that use real communications techniques.

Cheers,
/dev

srnet:
With your revised requirement, the HC12 is a poor choice. It probably (but only just) has enough range for flight use, but is a poor choice for ground searching and locating.

And if you now want remote control, be aware that the HC12 does not have internal error checking, so data may be received that is corrupt.

Ok.. the lora trackers do sound pretty good. I will have to do some more research on them. When I search for simple transmission for up to 50k feet, the hc12 is what I got at first. So I have been sticking with that since they were inexpensive and worked in a 433mhz range.

I can think of a bunch of different projects to use your tracker than for in a model rocket lol but it would be a great start.

I'm not sure if the HC12 has error checking or not but based on my research, it can handle the job of sending simple gps cords up to 1.8km, which is about 6k feet. [subpar for rocket flight, great for project#2].

I guess the good thing about my project so far is that I've only just started working on the electronics and not the actual rocket itself. I have until the spring for my first launch.

I would like to figure out the wireless communication thing though for long distances past 10k, so... if you have a Lora configuration that you suggest then I wouldn't be opposed to trying that out instead and just re-purposing the HC12s for my led project which only needs small data sent.

Thanks for all the advice! I look forward to sharing the finish project with you guys.

Not going to lie, feel like such a noob with you both here :smiley:

willhartley:
Ok.. the lora trackers do sound pretty good. I will have to do some more research on them. When I search for simple transmission for up to 50k feet, the hc12 is what I got at first. So I have been sticking with that since they were inexpensive and worked in a 433mhz range.

Distance is not a problem with LoRa, it been used a lot here in the UK for tracking high altitude balloons, at altitudes of 30,000m+.

For unlicensed use we are limited in the UK to 10mW only, but even then for data rates that would allow for around 10 tracker packets a second, distances achieved have exceeded 400km, assuming a modest omni for the ground receiving station, is that far enough ?

For a working example, look at my HAB2 repository;

Simple High Altitude Tracker

All the parts you need are a PCB, Arduino Pro Mini, LoRa Device, GPS, battery and some wire.

Oh, and in case you did not realise it, you probably need a Ublox GPS, its one of the few that can be configured to work above 18,000m. Although I dont know at what velocity the Ublox GPS stops working.

srnet:
All the parts you need are a PCB, Arduino Pro Mini, LoRa Device, GPS, battery and some wire.

I have been looking for the parts now. I found a few Lora Trackers closer to the starts that cost $50+. Not sure I want to spend that much on one component but I would like and already assembled tracker. I can seem to only find it in pieces that need to be assembled.

willhartley:
I have been looking for the parts now. I found a few Lora Trackers closer to the starts that cost $50+. Not sure I want to spend that much on one component but I would like and already assembled tracker. I can seem to only find it in pieces that need to be assembled.

LoRa device = £5
Arduino Pro Mini = £1.50
GPS = £10

One of the resons that you may not find many assembled ones is the significant cost of getting assembled trackers through the required regulatory testing.

I think I destroyed this GPS unit. You will never believe. Either I am dyslexic or my board is some weird Chinese knockoff. I did a little test, because for some reason, my RX and TX lines are swapped. I just read that in the datasheet, the manufacture may define the pin differently. Makes sense, when I put gps tx to pin 1, I get data. But it is broken sadly... to eBay!

Edit: Other than that, programs compile and I get data, well garbage, no problem. I will edit the code and post here for anyone that is looking.

Full instructable to come soon.

I have been ready your Post with interest

I would just connect the gps straight to the hc-12 don’t parse

On the ground I carve up the nmea and write a kml using perl for google earth

And log it at the same time

Andrew

Just as a reference, I built one of these about 10 years ago for tracking class 2 rockets to over 2000 meters using small controllers and 433MHZ links with similar power. The receiver lost all connections during the boost phase of the rocket mostly because of rotation and velocity of the transmitter and also loss of connection with the GPS satellites. There was intermittent data at apogee but lost it again during free fall due to tumbling. When I could pick up the transmitter it rarely had a single satellite lock and getting three was even more rare. After separation it got even worse. But after it completed re-entry there was a good signal but range was highly compromised due to what appeared to be ground proximity. No signal outside 50-75 meters. But a lot of these tests were out in the Utah Salt Flats. Suggest a good 433Mhz Yagi hand held antenna at the ground station and a large dual wire antenna in the rocket. Fortunately a lot of good DIY 433 dipole antenna designs are available with the boon of the drone market. You might want to consider using one of these in the rockets nose. A lot has improved with GPS and transceiver technology in 10 years so maybe the newer digital components can overcome some of the problems I faced earlier. I'll be curious and excited to hear the results from your first launch! Build it TOUGH. Those launch G-forces can rip surface mount components from their board if not glued on. I learned that the hard way several times.

vk4tec:
I have been ready your Post with interest

I would just connect the gps straight to the hc-12 don’t parse

On the ground I carve up the nmea and write a kml using perl for google earth

And log it at the same time

Andrew

The only problem with this method is that the HC12 unit still has to be able to receive commands in the even a quick channel needs to be changed before take-off. This scenario is highly unlikely as all the config for the module should be done way prior to launch.

Another reason to not have the data automatically sent out is that I need other variables to happen as well with the data. I would like it logged through SD card while in flight.

Other than that, I think it would be a good idea to just let the data flow straight out of the hc-12. Wouldn't even need an arduino, just the gps unit and transmitter but eventually I want this to do more.

Like activating a second stage only when a certain altitude is hit.

wzaggle:
Just as a reference, I built one of these about 10 years ago for tracking class 2 rockets to over 2000 meters using small controllers and 433MHZ links with similar power. The receiver lost all connections during the boost phase of the rocket mostly because of rotation and velocity of the transmitter and also loss of connection with the GPS satellites.....

It is amazing to see another DIYer and rocketry hobbyist. I have not thought too much about the thigns you mentioned. After doing some research, I am thinking of changing some things around in the project.

Such as:

Instead of the 433 MHz transmitter, implement a module in the 900 MHz spectrum for slower data speeds but longer distance [up to 6 miles]. The Neo-6m datasheet rates these modules to go Altitude- 50,000 m,
Velocity 500 m/s.

I will also make a sattelite/yagi attenna as I want to stay in comms with the rocket as long as possible.

This is my first "smart" rocket in a sense so it will definitely be trial and error but I will try and keep it documented here.

EDIT: I'm also interested in your rocket designs that include a payload such as this, if you're willing to share. I have been thinking of optimal places for the circuitry.

Started in Rockets 50 years ago or so (yikes). About the same time as I got into computers and electronics. I really think the barometric sensors based electronic circuits for stage and separation management are a better more reliable bet than trying to do altitude events with GPS. My issue was losing rockets that went over 3000 meters high and caught a wind on the way back down. 900MHz might be a better answer than 433.

I tried to always put the circuits in the nose section and included a small drag streamer. Even as the rocket tumbled after apogee separation the nose cone seemed to be more aerodynamically stable especially if on a longer tether. But I don't have data to support that hypothesis. However at times the electronics might have to go in the body to manage the center of balance against the center of pressure and be sure the rocket stays a rocket and not a missile. Fortunately electronics today are much smaller and lighter as are batteries!

I used two small threaded through rods that were locked into the solid nose and then secured a glass fiber tube section to mount and hold the electronics and battery with an end plate and locking nut. That unit had to also withstand the chute deployment as chute and lower sections were attached to this end plate with an eye bolt.

Hey, so a quick update.

The new GPS unit came in today. Realized I never did fry the last one. Just crappy signal and terrible noob mistakes lead to me getting garbled data.

Updated my code today and everything looks to be working well. Data is sent via the HC12 to the remote arduino.

I do have one drawback though. When receiving the data on the other side and even before sending and checking things out in serial, it seems that I am printing to serial with no \n

When I go into my earth bridge software, It looks like all the data is transmitting on one line. When attempting to add \n into the receiving side, the real time tracking still doesnt work but I will play around with it a little more.

Ordering an antenna to make this easier while inside. Here is the updated code with help from /dev

#include <NMEAGPS.h>
#include <AltSoftSerial.h>
#include <NeoHWSerial.h>
#include <NeoTee.h>
#include <NeoTeeStream.h>
#include <NMEAprint.h>
#include <GPSport.h>

#define setPin 6 // "SET" Pin on HC12
#define gpsPort NeoSerial  // Hook GPS TX to pin 0, GPS RX to pin 1
#define GPS_PORT_NAME "NeoSerial"
#define DEBUG_PORT NeoSerial

AltSoftSerial HC12; // RX pin 8, TX pin 9 on an UNO
NMEAGPS gps; // the NMEA parser
gps_fix fix; // the parsed fields, all in one struct
char HC12buffer[ 80 ];
const size_t HC12_MAX = sizeof(HC12buffer);
size_t HC12count = 0;
volatile uint32_t newlines = 0UL;


static void handleRxChar( uint8_t c )
{
  if (c == '\n')
    newlines++;
}


// Parse GPS characters in the background (even during delay)
static void GPSisr( uint8_t c )
{
  gps.handle( c );

} // GPSisr


void setup() {
  
  pinMode(setPin, OUTPUT);             // Output High for Transparent / Low for Command
  digitalWrite(setPin, HIGH);         // Enter Transparent mode
  delay(80);                               // 80 ms delay before operation per datasheet
  HC12.begin(9600);
  NeoSerial.attachInterrupt( handleRxChar );
  NeoSerial.begin(9600);
  DEBUG_PORT.begin(9600);
  gpsPort.attachInterrupt( GPSisr );
  gpsPort.begin(9600);
}

void loop() {

  while (gps.available()) {
    fix = gps.read();  

    NMEAprintRMC( &DEBUG_PORT, fix ); 
    NMEAprintGGA( &DEBUG_PORT, fix );
    NMEAprintRMC( &HC12, fix ); 
    NMEAprintGGA( &HC12, fix );
  }

  /*while (HC12.available() > 0) {
    char c = HC12.read();

    // end of line?
    if ((c == '\n') || (c == '\r')) {

      // An empty line?
      if (HC12count > 0) {

        HC12buffer[ HC12count ] = '\0'; // NUL-terminate C string (lowercase "string")

        if (strstr( HC12buffer, "AT" ) == &HC12buffer[0]) {
          // Execute a command

          digitalWrite(setPin, LOW);                // If true, enter command mode
          delay(80);                                // Delay before writing command
          HC12.println( HC12buffer );               // Send incoming command to HC12
          delay(1000);                              // Wait 1.0s for reply
          digitalWrite(setPin, HIGH);               // Exit command / enter transparent mode
          delay(80);                                    // Delay before proceeding
          HC12.println( F("Remote Command Executed") );

        } else if (strstr( HC12buffer, "GPS" ) == &HC12buffer[0]) {
          // Requested GPS data

          HC12.print( F("Remote GPS:") );                  // Arduino responds to remote request
          HC12.write( (uint8_t *) &fix, sizeof(fix) );     // Transmit binary structure to remote
          HC12.println(); // optional
        }
      
        HC12count = 0; // reset counter
      }

    } else if (HC12count < HC12_MAX-1) {
      // save another character, if there's room
      HC12buffer[ HC12count++ ] = c;
    }
  }*/
}

I don't see the current system configuration, so I don't know what the receiving HC-12 is connected to... but if it connected to an Arduino, you should not be sending the NMEA sentences. As I have said multiple times, just send the fix structure (31 bytes) instead of ~150 bytes of two reconstructed NMEA sentences. It's doubly silly to parse the raw characters and then send a reconstructed version.

The whole point of providing you with the NMEAprint routines was so that you could send fix structures Over The Air and then emit reconstructed NMEA sentences at the receiver. Instead of this:

void loop() {

  while (gps.available()) {
    fix = gps.read();  

    NMEAprintRMC( &DEBUG_PORT, fix );  // These could be too much to print!
    NMEAprintGGA( &DEBUG_PORT, fix );  //   This will delay your sketch by about 90ms.
    NMEAprintRMC( &HC12, fix );             //  Don't send raw NMEA!  This will also delay your sketch.
    NMEAprintGGA( &HC12, fix );
  }

... just do this on the transmitter:

void loop() {

  while (gps.available()) {
    fix = gps.read();  

    HC12.print( F("FIX=") );               // A "start marker" that the receiver can watch for...
    HC12.write( (uint8_t *) &fix, sizeof(fix) );     // Transmit binary structure to remote
  }

This short message will not delay your sketch at all. The message will be sent in the background, and your sketch can continue to do other things.

  • NOTE: You can add all kinds of things to make this short transmission more reliable, since the HC12 doesn't do that for you. Checksums, error detection and correction codes, go crazy.On the receiver, you simply read the 31 bytes into a fix structure after receiving the special "FIX=" start marker. Then use the NMEAprint routines to emit the reconstructed NMEA sentences. Something like this on the receiver:
enum receiverState_t { WAITING_FOR_FIX, RECEIVING_FIX };
receiverState_t receiverState = WAITING_FOR_FIX;

const char   startMarker[] = "FIX=";
      size_t startCount    = 0;

gps_fix  fix;      // loaded with received bytes
size_t   fixCount; // the count of received bytes

void loop()
{
  if (HC12.available()) {
    char c = HC12.read();

    switch (receiverState) {

      case WAITING_FOR_FIX:

        // Did we receive the next character of the start marker?
        if (startMarker[ startCount ] == c) {
          startCount++;

          // Yes, is this the whole start marker?
          if (startCount == sizeof(startMarker)-1) {

            // Yes, the next bytes are the binary fix structure
            receiverState = RECEIVING_FIX;
            fixCount      = 0;
          }

        } else {
          // The character didn't match, start over...
          startCount = 0;
        }
        break;

      case RECEIVING_FIX:
        {
          // Save the next received byte into the local fix structure
          uint8_t *fixBytes = (uint8_t *) &fix;  // an "alias" for the fix structure's memory bytes
          fixBytes[ fixCount++ ] = c; // increments the counter, too

          if (fixCount >= sizeof(fix)) {
            // Complete fix received!  Print reconstructed NMEA sentences from the fix.
            NMEAprintRMC( &DEBUG_PORT, fix );
            NMEAprintGGA( &DEBUG_PORT, fix );

            // Restart the process
            receiverState = WAITING_FOR_FIX;
            startCount    = 0;
          }
        }
        break;

    } // end switch
  }
}

This is similar to the Serial Input Basics tutorial in that it watches for a special start string and then gradually accumulates bytes (in the fix memory bytes). When the required count of bytes has been received, the fix structure has been completely filled out. No NMEA parsing required, because all of that was performed at the transmitter. The fix structure can be used for whatever purpose at the receiver, including recreating the original (verbose) NMEA character stream.

Both NMEAprint routines use the same method to print CR/LF (aka '\r' and '\n'), so the HC12 transmission might be dropping a byte. I don't see any receiver code (or the system connections), so I can't suggest why a LF is being dropped somewhere. Of course, adding some kind of error detection to the transmitted message would have told you for sure... :-/

Image embedded for our convenience:

Technique described here. In the future, just select the text in the Serial Monitor window, then copy and paste it into a code block in your post.

The first line shows that characters are being dropped. I don't mean that in a bad way, just that the HC-12 does not have its own error detection and correction. Bytes just get corrupted (i.e. lost). Maybe the LF is being dropped consistently.

This is confirmation that

  • Sending raw NMEA data is not a good idea. The NMEA checksum is very weak.

  • The HC-12 is not reliable. You will have to add EDC to the transmitted message so it can be rejected (i.e., an error was detected) or fixed (i.e., an error was corrected). This can be in addition to encryption.

-dev:
I don't see the current system configuration, so I don't know what the receiving HC-12 is connected to... but if it connected to an Arduino, you should not be sending the NMEA sentences. As I have said multiple times, just send the fix structure (31 bytes) instead of ~150 bytes of two reconstructed NMEA sentences. It's doubly silly to parse the raw characters and then send a reconstructed version.

Hey /dev, as always thanks for your assistance. The debug_port portion of that code will be removed once the transmitter is set up. It was only added for testing purposes but I can see that it would slow down during the testing.

Now the nmea print thing did have me somewhat confused. Reading through the earlier posts, I thought you had suggested that I transmit the structure this way then output at the receiver side. I was confused by this and just figure it was a better work around.

I am sorry to be a little slow but I will do full pictures and code/description today and post later today. I will include all code and pictures of the setup. Everything is connected with a breadboard before I 3d print a case and make a suitable GPS holder.

-dev:

  • Sending raw NMEA data is not a good idea. The NMEA checksum is very weak.

  • The HC-12 is not reliable. You will have to add EDC to the transmitted message so it can be rejected (i.e., an error was detected) or fixed (i.e., an error was corrected). This can be in addition to encryption.

I am still working on the concept of sending bytes and instead of actual data. This concept has my brain a little frizzled but at least I can find info on it such as here.

Will update and come back with video and pictures of everything attached.

EDIT: Slow day today at work so I have been looking through and editing the code. Finished changing things around but have yet to test. Here is the update code here for both the transceiver and receiver.

Finally, here's an update.. have everything hooked up. This time I got some pictures, updated the code, the whole shebang. I'm still getting some strange output in certain softwares, such as EarthBridge. It seems as though it can't read the sentences accurately. It outputs them on one line over and over until a new line. If I were to just output the raw data, no libraries, it would work but I'm guessing it doesn't like the way it is printed to serial.

Weirdly enough, if I use u-blox u-center , it displays everything just like it should. The real-time tracking is a little outdated compared to google earth but I can deal with that. I get what I want at least, which is; it does real-time tracking and it supports exporting the data to KML to display on GE. Although. the altitude seems to be way off, even when outside with a valid lock. Not sure what screwed that up?

u-blox software

GE Pro

Other than that, I am getting some pretty good data on the other side. Every once in awhile I will get corrupt data or a random, incomplete sentence only when closing serial for some time then reopening after maybe a few minutes or so. Doesn't do it if I just close and open quickly.

Here is the code:

Transceiver w/ GPS

#include <NMEAGPS.h>
#include <AltSoftSerial.h>
#include <NeoHWSerial.h>
#include <GPSport.h>

#define gpsPort NeoSerial  // Hook GPS TX to pin 0, GPS RX to pin 1
#define GPS_PORT_NAME "NeoSerial"
#define DEBUG_PORT NeoSerial


AltSoftSerial HC12; // RX pin 8, TX pin 9 on an UNO
NMEAGPS gps; // the NMEA parser
gps_fix fix; // the parsed fields, all in one struct
char HC12buffer[ 80 ];
const size_t HC12_MAX = sizeof(HC12buffer);
size_t HC12count = 0;
volatile uint32_t newlines = 0UL;


static void handleRxChar( uint8_t c )
{
  if (c == '\n')
    newlines++;
}


// Parse GPS characters in the background (even during delay)
static void GPSisr( uint8_t c )
{
  gps.handle( c );

} // GPSisr


void setup() {
  
  //pinMode(setPin, OUTPUT);                // Output High for Transparent / Low for Command
  //digitalWrite(setPin, HIGH);            // Enter Transparent mode
  //delay(80);                               // 80 ms delay before operation per datasheet
  HC12.begin(9600);
  NeoSerial.attachInterrupt( handleRxChar );
  NeoSerial.begin(9600);
  //DEBUG_PORT.begin(9600);
  gpsPort.attachInterrupt( GPSisr );
  gpsPort.begin(9600);
}

void loop() {

  while (gps.available()) {
    fix = gps.read();  

    HC12.print( F("FIX=") );             // A "start marker" that the receiver can watch for...
    HC12.write( (uint8_t *) &fix, sizeof(fix) );     // Transmit binary structure to remote
  }
  
}

Receiver

#include <NMEAGPS.h>
#include <AltSoftSerial.h>
#include <NeoTee.h>
#include <NeoTeeStream.h>
#include <NMEAprint.h>
#include <GPSport.h>


AltSoftSerial HC12;     // RX pin 8, TX pin 9 on an UNO
#define GPS_PORT_NAME "AltSoftSerial"
#define DEBUG_PORT Serial
NMEAGPS gps;        // the NMEA parser
gps_fix fix;        // the parsed fields, all in one struct
size_t fixCount;      // the count of received bytes


// ----------- Global Declarations ----------- 
const char   startMarker[] = "FIX=";
size_t startCount    = 0;
enum receiverState_t { WAITING_FOR_FIX, RECEIVING_FIX };
receiverState_t receiverState = WAITING_FOR_FIX;
// ----------- Global Declarations ----------- \\

void setup() {

  Serial.begin(9600);
  HC12.begin(9600);
}

void loop() {

  if (HC12.available()>0) {
  char c = HC12.read();
  
  switch (receiverState) {
    
    case WAITING_FOR_FIX:
      // Did we receive the next character of the start marker?
      if (startMarker[ startCount ] == c) {
        startCount++;

        // Yes, is this the whole start marker?
        if (startCount == sizeof(startMarker)-1) {

        // Yes, the next bytes are the binary fix structure
        receiverState = RECEIVING_FIX;
        fixCount      = 0;
        }

      } else {
        // The character didn't match, start over...
        startCount = 0;
      }
      break;
    
    case RECEIVING_FIX:
      // Save the next received byte into the local fix structure
      uint8_t *fixBytes = (uint8_t *) &fix;  // an "alias" for the fix structure's memory bytes
      fixBytes[ fixCount++ ] = c; // increments the counter, too

      if (fixCount >= sizeof(fix)) {
        // Complete fix received!  Print reconstructed NMEA sentences from the fix.
        NMEAprintRMC( &Serial, fix );
        NMEAprintGGA( &Serial, fix );

        // Restart the process
        receiverState = WAITING_FOR_FIX;
        startCount    = 0;
      }
      break;
  }
  }
}

Here are some pictures of the setup as it is now. I haven't made any final connections as of yet. That will come soon when my PCB board gets here and also my 3D printer. I will probably switch to an arduino nano for the final build. I could send the uno into space but it is a great practice board.

Big thanks to /dev for alot of the code. I will eventually pretty this up, add an sd card module so I will be back with more for sure.

ArduinoTX_GPS_v3.ino (1.38 KB)

ArduinoRX_GPS_v2.ino (1.89 KB)

Looking good!

the altitude seems to be way off, even when outside with a valid lock. Not sure what screwed that up?

240m is about right for your location. What were you expecting? Perhaps GE is showing alt=0 for the imagery. You may need to use "geoid height" if GE shows the imagery at geoid height=0.

Every once in awhile I will get corrupt data

Error Detection and Correction...

incomplete sentence only when closing serial for some time then reopening after maybe a few minutes or so. Doesn't do it if I just close and open quickly.

The Arduino keeps babbling while the Serial Monitor window is closed. You might be reopening the Serial Monitor window when the Arduino is in the middle of a print.

-dev:
Looking good!

Thanks! Thanks for the help with the code. I will def make sure it stays public and available to anyone who wants it. sharing is caring

-dev:
240m is about right for your location. What were you expecting? Perhaps GE is showing alt=0 for the imagery. You may need to use "geoid height" if GE shows the imagery at geoid height=0.
Error Detection and Correction...
The Arduino keeps babbling while the Serial Monitor window is closed. You might be reopening the Serial Monitor window when the Arduino is in the middle of a print.

I don't know why but that whisper thing was funny :smiley: and as far as the altitude, I was expecting it to be closer to the ground haha, but that is no big deal. I will just add in the code somewhere to remove 200 meters when printing to serial. It's ok though as it isn't a big deal that it is off.

Now all I need to do is order some lora modules and assemble the rocket and final circuit.