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