Category Archives: Weather Balloon
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()
6/15/19 Balloon Launch
7/9/21 Balloon Launch Allentown, PA to Lafayette, NJ
7/29/22 Balloon Launch from High Point State Park
8/3/23 Balloon Launch from Cold Spring
Balloon Code V3
import os import picamera import serial import time import board import adafruit_bmp280 import RPi.GPIO as GPIO 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) 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) 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 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)) return output except Exception as error: return("") def annotate(): timeNow = str(time.strftime("%a %d %b %Y %H:%M:%S", time.localtime())) locationNow = gps() bmpa = accurate_altitude() annotation = timeNow + "\n" + locationNow + "\n" + bmpa return annotation def flyBalloon(): while True: try: getVideo(10) #40 GPIO.output(18, GPIO.HIGH) getPicture("") getPicture(annotate()) GPIO.output(18,GPIO.LOW) except Exception as error: return(error) flyBalloon()
Current Combined Code
import os import picamera import sense_hat import time import yagmail camera = picamera.PiCamera() camera.resolution = (1280, 720) framerate = 5 camera.framerate = framerate camera.annotate_text_size = 18 senseHat = sense_hat.SenseHat() gps = "GPS Data" def annotate(): timeNow = "Time: " + str(time.strftime("%a %d %b %Y %H:%M:%S", time.localtime())) temperatureNow = "Temperature: " + str(round(senseHat.get_temperature())) + " C" humidityNow = "Humidity: " + str(round(senseHat.get_humidity())) + "%" locationNow = "Location: " +gps annotation = timeNow + "\n" + temperatureNow + "\n" + humidityNow + "\n" + locationNow return annotation 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(5) camera.annotate_text = annotation camera.capture(filename) camera.stop_preview() except Exception as error: print(error) 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): camera.annotate_text = (annotate()) time.sleep(1) camera.stop_recording() except Exception as error: print(error) os.system("ffmpeg -r " + str(framerate) + " -i /home/pi/testVideo.h264 -vcodec copy " + filename) return filename def sendMail(filename): receiver = ["yoimgeorge25@gmail.com", "otheremail@gmail.com"] body = "Sent at " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "." try: gmail = yagmail.SMTP("email@gmail.com", "password") gmail.send( to = receiver, subject = "Paul's Balloon", contents = body, attachments = filename ) except Exception as error: print(error) print("Message sent.") sendMail(getPicture(annotate()))