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