-
-
Save dextersiah/68949d78fff5e6a03c6be575f9882e2a to your computer and use it in GitHub Desktop.
| # This code is only workable on python 2 | |
| import httplib, urllib | |
| import time | |
| from GPS_API import * | |
| import serial | |
| ser = serial.Serial("/dev/serial0") # Select your Serial Port | |
| ser.baudrate = 9600 # Baud rate | |
| ser.timeout = 0.5 | |
| sleep = 2 # how many seconds to sleep between posts to the channel | |
| key = '<YOUR WRITE API KEY>' # Thingspeak Write API Key | |
| msgdata = Message() # Creates a Message Instance | |
| # This Function will upload Latitude and Longitude values to the Thingspeak channel | |
| def upload_cloud(): | |
| temp = get_latitude(msgdata) | |
| temp1 = get_longitude(msgdata) | |
| params = urllib.urlencode({'field1': temp,'field2': temp1, 'key':key }) | |
| headers = {"Content-typZZe": "application/x-www-form-urlencoded","Accept" : "text/plain"} | |
| conn = httplib.HTTPConnection("api.thingspeak.com:80") | |
| try: | |
| conn.request("POST", "/update", params, headers) | |
| response = conn.getresponse() | |
| print("Lat:",temp) | |
| print("Long:",temp1) | |
| print(response.status, response.reason) | |
| data = response.read() | |
| conn.close() | |
| except KeyboardInterrupt: | |
| print("Connection Failed") | |
| if __name__ == "__main__": | |
| start_gps_receiver(ser, msgdata) | |
| time.sleep(2) | |
| ready_gps_receiver(msgdata) | |
| while True: | |
| upload_cloud() | |
| time.sleep(sleep) |
| # This code is for python 3 and above | |
| # You would need to install http.client with pip3 install http.client | |
| import http.client, urllib.request, urllib.parse, urllib.error | |
| import time | |
| from GPS_API import * | |
| import serial | |
| ser = serial.Serial("/dev/serial0") # Select your Serial Port | |
| ser.baudrate = 9600 # Baud rate | |
| ser.timeout = 0.5 | |
| sleep = 2 # how many seconds to sleep between posts to the channel | |
| key = '<YOUR WRITE API KEY>' # Thingspeak Write API Key | |
| msgdata = Message() # Creates a Message Instance | |
| def upload_cloud(): | |
| temp = get_latitude(msgdata) | |
| temp1 = get_longitude(msgdata) | |
| params = urllib.parse.urlencode({'field1': temp,'field2': temp1, 'key':key }) | |
| headers = {"Content-typZZe": "application/x-www-form-urlencoded","Accept" : "text/plain"} | |
| conn = http.client.HTTPConnection("api.thingspeak.com:80") | |
| try: | |
| conn.request("POST", "/update", params, headers) | |
| response = conn.getresponse() | |
| print(("Lat:",temp)) | |
| print(("Long:",temp1)) | |
| print((response.status, response.reason)) | |
| conn.close() | |
| except KeyboardInterrupt: | |
| print("Connection Failed") | |
| if __name__ == "__main__": | |
| start_gps_receiver(ser, msgdata) | |
| time.sleep(2) | |
| ready_gps_receiver(msgdata) | |
| while True: | |
| upload_cloud() | |
| time.sleep(sleep) | |
| # This File consists of API calls for the GPS Parsing Functionality.This section parse the GPS values from the GPS Module. | |
| # pynmea2 is Python library for parsing the NMEA 0183 protocol (GPS). To get that thing : pip install pynmea2 | |
| import threading | |
| import pynmea2 | |
| import sys | |
| class Message: | |
| def __init__(self): | |
| self.msg ='' | |
| # Gps Receiver thread funcion, check gps value for infinte times | |
| def get_gps_data(serial, dmesg): | |
| print("Initializing GPS\n") | |
| while True: | |
| strRead = serial.readline() | |
| if sys.version_info[0] == 3: | |
| strRead = strRead.decode("utf-8","ignore") | |
| if strRead[0:6] == '$GPGGA': | |
| dmesg.msg = pynmea2.parse(strRead) | |
| else: | |
| if strRead.find('GGA') > 0: | |
| dmesg.msg = pynmea2.parse(strRead) | |
| # API to call start the GPS Receiver | |
| def start_gps_receiver(serial, dmesg): | |
| t2 = threading.Thread(target=get_gps_data, args=(serial, dmesg)) | |
| t2.start() | |
| print("GPS Receiver started") | |
| # API to fix the GPS Revceiver | |
| def ready_gps_receiver(msg): | |
| print("Please wait fixing GPS .....") | |
| dmesg = msg.msg | |
| while(dmesg.gps_qual != 1): | |
| pass | |
| print("GPS Fix available") | |
| # API to get latitude from the GPS Receiver | |
| def get_latitude(msg): | |
| dmesg = msg.msg | |
| return dmesg.latitude | |
| # API to get longitude from the GPS Receiver | |
| def get_longitude(msg): | |
| dmesg = msg.msg | |
| return dmesg.longitude |
Hi @adhityaven, have you added your API key yet in line 14 without the angle brackets? If yes maybe u can try test if the connection to Thinkspeak has been connected by using Postman like so.
Write to ThinkSpeak
GET https://api.thingspeak.com/update?api_key=WRITEAPIKEY&field1=0
Thanks for the help! I removed the angle brackets and it is now uploading to my Thinkspeak.
Quick question because I cannot find a way to get it done..
Your script seems to work fine for my setup, thanks for sharing :)
How would one make it run on/ after boot?
Both via systemd or crontab, I am getting some error of
Initializing GPS
GPS Receiver started
Please wait fixing GPS .....
Traceback (most recent call last):
File "ConnectionV3.py", line 36, in
ready_gps_receiver(msgdata)
File "/home/pi/Documents/gps/GPS_API.py", line 35, in ready_gps_receiver
while(dmesg.gps_qual != 1):
AttributeError: 'str' object has no attribute 'gps_qual
Could you please hint me in the correct direction?
Dear author
I am also getting the following error after running your script
nitializing GPS
GPS Receiver started
Please wait fixing GPS .....
Traceback (most recent call last):
File "ConnectionV3.py", line 36, in
ready_gps_receiver(msgdata)
File "/home/pi/Documents/gps/GPS_API.py", line 35, in ready_gps_receiver
while(dmesg.gps_qual != 1):
AttributeError: 'str' object has no attribute 'gps_qual
Any hints please.
Hello @kazim425 I have same error with you, did you already fix your error?
Hi @danii998 sorry this is quite a legacy code that I had used back in my school. I took a quick look at the code and google and can u try this piece of code of it does solve the issue?
def ready_gps_receiver(msg):
print("Please wait fixing GPS .....")
dmesg = msg.msg
while not hasattr(dmesg, 'gps_qual') or dmesg.gps_qual != 1:
dmesg = msg.msg
print("GPS Fix available")
Hi @dextersiah, Thanks for making the revisions! I have been able to output the latitudes and longitudes on my Pi but it is followed by:
(400, 'Bad Request')
and nothing is uploading to the Thinkspeak.
Do you possibly know why I am getting this?