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