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()))





