7/19/24 Balloon Launch from High Point State Park

Here is the data from our successful launch on 7/19/24. 

We launched at 12:16 pm from the Appalachian Trail head parking lot in High Point State Park, Sussex, NJ.

At 3:46 pm, 125 miles of flight later, the balloon landed in Bantam Lake, Bantam, CT.

Splashdown was witnessed by the ops team of Leonardo DRS from Danbury, CT, out on the lake for a boat day, who made the recovery.  A special thank you to Shae and the DRS ops team for saving the electronics from a watery grave!

Long Island in the distance.

Peak altitude: 24 km!!

The fork of Long Island.

Here is the complete flight video.  Note that the software cut out midway through the descent.  The problem is being investigated – it is possible the battery froze.

 

Balloon Code V4

import os
import picamera
import serial
import time
import board
import adafruit_bmp280
import RPi.GPIO as GPIO
import json
 
 
GPIO.setwarnings(False)
#GPIO.setmode(GPIO.BOARD)
GPIO.setup(18, GPIO.OUT, initial=GPIO.LOW)
 
i2c = board.I2C()
bmp = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)
bmp.sea_level_pressure = 1013.25
 
camera = picamera.PiCamera()
camera.resolution = (1280, 720)
camera.rotation = 180
framerate = 5
camera.framerate = framerate
camera.annotate_text_size = 18
 
gps = "GPS Data"
gpsPort = "/dev/ttyACM0"
gpsSerial = serial.Serial(gpsPort, baudrate = 9600, timeout = 0.5)
loggingObject = {
    'GPS':{
        'latitude':{
            'degrees': 0,
            'minutes': 0,
            'seconds': 0,
            'NS': 0
        },
        'longitude':{
            'degrees': 0,
            'minutes': 0,
            'seconds': 0,
            'EW': 0
        },
        'altitude': 0,
        'satellites': 0
    },
    'speed': 0,
    'altitude': 0,
    'time': '',
    'temperature': 0,
    'humidity': 0
}

def getPicture(annotation):
    filename = "/home/pi/Pictures/" + str(time.strftime("%Y-%m-%d_%H:%M:%S", time.localtime())) + ".jpg"
    try:
        camera.start_preview()
        time.sleep(2.5)
        camera.annotate_text = annotation
        camera.capture(filename)
        camera.stop_preview()
    except Exception as error:
        return(error)
        
        camera.stop_preview()
 
    return filename
 
def getVideo(length):
    filename = "/home/pi/Videos/" + str(time.strftime("%Y-%m-%d_%H:%M:%S", time.localtime())) + ".mp4"
    
    try:
        camera.start_recording("/home/pi/testVideo.h264")
 
        for index in range(length):
            start = time.time()
 
            camera.annotate_text = (annotate())
            
            end = time.time()
            
            elapsed = start - end
 
            if elapsed <= 1:
                time.sleep(1 - elapsed)
        
        camera.stop_recording()
    except Exception as error:
        return(error)
 
    os.system("ffmpeg -r " + str(framerate) + " -i /home/pi/testVideo.h264 -vcodec copy " + filename)
    os.system("del /home/pi/testVideo.h264")
    
    return filename
 
def gpgga():
    output = ""
    emailgps = ""
    try:
        n = 1
        while output == "" and n<50:
            gps = str(gpsSerial.readline())
            #print(n)
            if (gps[2:8] == "$GPGGA" or gps[2:8] == "$GNGGA"):
                gps = gps.split(",")
                #lat long formatted for digital maps
                latgps = gps[2][0:2] + ' ' + gps[2][2:]
                longgps = '-'+gps[4][1:3] + ' ' + gps[4][3:]
                emailgps = latgps+','+longgps
 
                latDeg = int(gps[2][0:2])
                latMin = int(gps[2][2:4])
                latSec = round(float(gps[2][5:9]) * (3/500))
                latNS = gps[3]
                output += "Latitude: " + str(latDeg) + " deg " + str(latMin) + "'" + str(latSec) + '" ' + latNS + "\n"
                
                longDeg = int(gps[4][0:3])
                longMin = int(gps[4][3:5])
                longSec = round(float(gps[4][6:10]) * (3/500))
                longEW = gps[5]
                output += "Longitude: " + str(longDeg) + " deg " + str(longMin) + "'" + str(longSec) + '" ' + longEW + "\n"
                
                alt = float(gps[9])
                output += "Altitude: " + str(alt) + " m" + "\n"
 
                sat = int(gps[7])
                output += "Satellites: " + str(sat)
                loggingObject['GPS'] = {
                    'latitude':{
                        'degrees': latDeg,
                        'minutes': latMin,
                        'seconds': latSec,
                        'NS': latNS
                    },
                    'longitude':{
                        'degrees': longDeg,
                        'minutes': longMin,
                        'seconds': longSec,
                        'EW': longEW
                    },
                    'altitude': alt,
                    'satellites': sat
                }
            n+=1
        return [output,emailgps]
    except Exception as error:
        return ["",""]
 
def gprmc():
    output = ""
    
    try:
        n = 1
        while output == "" and n<50:
            #print(n)
            gps = str(gpsSerial.readline())
            
            if gps[2:8] == "$GPRMC" or gps[2:8] == "$GNRMC":
                gps = gps.split(",")
 
                output = ""
 
                speed = round(float(gps[7]) * 1852)/1000
                loggingObject["speed"] = speed
                output += "Speed: " + str(speed) + " km/h"
            n+=1
        return output
        
    except Exception as error:
        return("")
 
def gps():
    try:
        output = gpgga()[0] + "\n" + gprmc()    
        return output
    except Exception as error:
        return("")
 
def accurate_altitude():
    try:
        output = 'BMP280 Altitude: {} m'.format(round(bmp.altitude))
        loggingObject['altitude'] = round(bmp.altitude)
        return output
    except Exception as error:
        return("")
 
def annotate():
    timeNow = str(time.strftime("%a %d %b %Y %H:%M:%S", time.localtime()))
    print(timeNow)
    locationNow = gps()
    bmpa = accurate_altitude()
    annotation = timeNow + "\n" + locationNow + "\n" + bmpa
    return annotation
 
def logData():
    try:
        loggingObject['time'] = time.time()
        filename = 'home/pi/loggedData/' + str(time.strftime("%Y-%m-%d_%H:%M:%S", time.localtime())) + '.json'
        writtenFile = open(filename,'w')
        writtenFile.write(json.dumps(loggingObject, sort_keys=True, indent=4))
        writtenFile.close()
    except Exception as error:
        pass


def flyBalloon():
    while True:
        try:      
            getVideo(10) #40
            GPIO.output(18, GPIO.HIGH)
            getPicture("")
            getPicture(annotate())
            logData()
            GPIO.output(18,GPIO.LOW)
        except Exception as error:
            return(error)
 
flyBalloon()