- GPS receiver menerima data dari satelit berupa koordinat berformat "Lattitude , Longitude" dan dikirimkan melalui serial/UART ke arduino
- Arduino mengirimkan informasi (PUBLISH) ke topic "Lattitude , Longitude" ke broker MQTT melalui Wifi
- Karena alat akan mobile/bergerak maka butuh Smartphone sebagai Hotspot yg akan ikut dibawa berkeliling selain juga berfungsi sebagai internet gateway melalui 3G/4G
- Raspberry Pi dirumah berfungsi sebagai broker MQTT (Mosquitto) yang terhubungkan ke modem WAN/Internet.
- Script python pada Raspi melakukan SUBSCRIBE pada topic mqtt dan menunggu informasi koordinat , setelah data tersedia akan melakukan Geopy Reverse Nominatim untuk mendapatkan nama titik GPS yg dimaksud.
- Python juga akan melakukan pengiriman data nama titik tadi secara PUBLISH ke topic mqtt sekaligus melakukan penyimpanan data log dalam format csv.
- Arduino menunggu kiriman data secara SUB pada topik yg sama dengan yg di PUB oleh python dan selanjutnya ditampilkan di LCD 4 x 20.
Selasa, 26 Mei 2020
[IOT Ternyata Mudah] Bermain dengan alat GPS receiver jadul - Part 2 - MQTT vs GIS
Sebelum melanjutkan membaca lebih kebawah, ada baiknya prolog nya dibaca terlebih dahulu agar tidak kehilangan arah ya! Ini urutan membacanya :
Titik kulminasi dari beberapa tulisan saya setelah gatel meng"oprek" raspi zero w yg di berikan seorang teman, saya curahkan pada tulisan ini. Jadi dapat dibilang lengkap end to end yang sangat bermanfaat bagi pembaca yg kemungkinan sedang mencari judul tugas atau skripsi. Memang saya sarankan jangan di jiplak langsung karena dapat membunuh kreatifitas, tapi cobalah baca skema paling atas ! Modifikasi di bagian sensor dan output dengan apapun yg kamu inginkan maka ratusan ide judul skripsi dapat kamu kreasikan.
kalau kita ingat pada 2 tulisan sebelumnya, dapat dilihat keterkaitan kedua gambar yaitu informasi koordinat GPS bisa diberikan oleh arduino ke Raspberry dan kemudian python akan melakukan Reverse Geopy untuk mendapatkan nama titik koordinat tadi. Ujungnya informasi nama titik yg sudah didapatkan dikembalikan oleh python menuju ke arduino dan ditampilkan pada LCD. Bingung ? Begini kalau dijabarkan secara sederhana.
Selanjutnya saya akan berbaik hati membahas satu per satu bagian dari script nya, akan saya bahas berselingan antara script arduino dan python agar seperti cerita bersambung.
- Insialisasi Arduino
#include <TinyGPS++.h> // library parsing data gps
#include <LiquidCrystal.h> // library LCD
#include <SoftwareSerial.h> // library serial port tambahan
#include <ESP8266WiFi.h> // library wifi
#include <PubSubClient.h> // library MQTT dari knoleary
#include "DHT.h" // Librasi sensor DHT
static const int RXPin = 0, TXPin = 15; //pake RX aja hanya baca data !
static const uint32_t GPSBaud = 4800; // kecepatan serial GPS
#define DHTPIN 2 // pin sensor DHT
#define DHTTYPE DHT11 // Saya pake DHT11
//inisialisasi DHT
DHT dht(DHTPIN, DHTTYPE);
// The TinyGPS++ object
TinyGPSPlus gps;
// Koneksi serial GPS
SoftwareSerial ss(RXPin, TXPin);
//PIN LCD
LiquidCrystal lcd(16, 5, 4, 14, 12, 13);
//milis agar timer lebih jitu
unsigned long previousMillis = 0;
//interval pembacaan dht 11
const long interval = 5000;
const char *ssid = "Nama wifi mu";
const char *pass = "Passwordnya";
//inisialisasi client dan server MQTT
WiFiClient wclient;
PubSubClient client(wclient);
const char *mqtt_server = "sesuaikan_nama_server.hopto.org";
const int mqtt_port = 1883;
const char *mqtt_user = "nama user";
const char *mqtt_pass = "password mqtt";
const char *mqtt_client_name = "ahocool123";
String latlong = "invalid"; // variabel koordinat
import paho.mqtt.client as mqtt #import modul mqtt client
from geopy.geocoders import Nominatim #import nominatim sebagai geocoder
from datetime import datetime #waktu
humitemp=[""] #list global suhu kelembaban
#inisialisasi geolocator nominatim gratisan
geolocator = Nominatim(user_agent="my-application")
- Setup Arduino
void setup()
{
Serial.begin(9600); // monitor serial
ss.begin(GPSBaud); // hidupkan software serial u/ gps
lcd.begin(20, 4); //hidupkan LCD 4 x 20
dht.begin(); //hidupkan sensor dht 11
lcd.setCursor(0,0); // awal lcd
lcd.print("--Network Startup--");
//Setup MQTT server
client.setServer(mqtt_server, mqtt_port);
client.setCallback(mqtt_callback);
delay(10);
Serial.println();
Serial.println();
//konek ke wifi
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Connecting to Wifi: ");
Serial.print(ssid);
Serial.println("...");
WiFi.begin(ssid, pass);
//tunggu sampe terkoneksi dengan wifi..
if (WiFi.waitForConnectResult() != WL_CONNECTED)
return;
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
}
- Setup Python (Raspberry Pi)
broker_address="localhost" #lokal aja di raspi
broker_port=1883
broker_user="username"
broker_pass="password"
print("creating new instance")
client = mqtt.Client("P1") #create new instance
client.on_message=on_message #attach function to callback
client.username_pw_set(broker_user,broker_pass)
print("connecting to broker")
client.connect(broker_address,broker_port) #connect to broker
#start the loop
print("Subscribing to topic...")
client.subscribe("/gps") #subscribe ke topik /gps
client.subscribe("/dht") #subscribe ke topik /dht
client.loop_forever()
#muter terusss
- Function pada Arduino
Function berikut ini memiliki tujuan untuk menunggu koneksi ke broker mqtt, jika sukses terhubung lanjut subscribe pada topik "/lokasi".
void reconnectmqtt()
{
Serial.println("Connecting to MQTT server..");
if (client.connect(mqtt_client_name,mqtt_user, mqtt_pass)) {
Serial.println("Connected to MQTT server");
} else {
Serial.println("Could not connect to MQTT server");
}
if (client.connected()){
Serial.println("subscribe to topic: ");
client.subscribe("/lokasi"); //subscribe ke topic lokasi point
}
}
Yang dibawah ini merupakan rutin untuk mengambil data GPS dan kemudian menuliskannya ke LCD. Sudah pernah dibahas pada tulisan sebelumnya. Selain outputnya dapat dilihat pada LCD, juga di output monitor melalui serial port/console.
void displayInfo()
{
Serial.print(F("Location: ")); //kirim ke console serial
if (gps.location.isValid()) // jika data GPS lengkap dan valid
{
Serial.print(gps.location.lat(), 6); //nulis ke serial
Serial.print(F(","));
Serial.print(gps.location.lng(), 6);
lcd.setCursor(0,0);
lcd.print(F("LAT : "));
lcd.print(gps.location.lat(), 6); //nulis ke LCD
lcd.print(F(" "));
lcd.setCursor(0,1);
lcd.print(F("LONG: "));
lcd.print(gps.location.lng(), 6);
//jangan lupa informasi koordinat disimpan dalam variabel
latlong = String(gps.location.lat(), 6) + "," + String(gps.location.lng(), 6) ;
}
else //jika GPS nya error
{
Serial.print(F("INVALID"));
lcd.setCursor(0,0);
lcd.print(" ---GPS SEARCHING---");
latlong = "invalid";
}
// yang dibawah ini untuk menulis tanggal dan jam
Serial.print(F(" Date/Time: "));
if (gps.date.isValid())
{
Serial.print(gps.date.month());
Serial.print(F("/"));
Serial.print(gps.date.day());
Serial.print(F("/"));
Serial.print(gps.date.year());
lcd.setCursor(0,2);
lcd.print(gps.date.month());
lcd.print(F("/"));
lcd.print(gps.date.day());
lcd.print(F("/"));
lcd.print(gps.date.year());
}
else
{
Serial.print(F("INVALID"));
lcd.setCursor(0,2);
lcd.print(F("Date Err"));
}
Serial.print(F(" "));
if (gps.time.isValid())
{
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
Serial.print(F(":"));
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
Serial.print(F(":"));
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(F("."));
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.print(gps.time.centisecond());
lcd.setCursor(10,2);
if (gps.time.hour() < 10) lcd.print(F("0"));
lcd.print(gps.time.hour());
lcd.print(F(":"));
if (gps.time.minute() < 10) lcd.print(F("0"));
lcd.print(gps.time.minute());
lcd.print(F(":"));
if (gps.time.second() < 10) lcd.print(F("0"));
lcd.print(gps.time.second());
}
else //jam error
{
Serial.print(F("INVALID"));
lcd.setCursor(10,2);
lcd.print(F("Time Err"));
}
Serial.println();
}
Yang selanjutnya adalah function untuk pengolahan data sensor DHT11 sekaligus sebagai timer untuk pengiriman data MQTT secara PUBLISH
void baca_dht(){
//timer milis digunakan agar tidak mengganggu proses subscribe mqtt
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= interval) {
//baca sensor dan simpan waktu terakhir membaca
previousMillis = currentMillis;
float h = dht.readHumidity();
float t = dht.readTemperature();
// jika sensor ngaco
if (isnan(h) || isnan(t)) {
lcd.setCursor(0,3);
lcd.print(F("..DHT Sensor Err...."));
return; //This will ensure that data is always sent
}
else{ //jika bener nulis LCD
lcd.setCursor(0,3);
lcd.print(F("H="));
lcd.print(h);
lcd.print(F(" % "));
lcd.setCursor(10,3);
lcd.print(F("T="));
lcd.print(t);
lcd.print(F(" C "));
//publish data suhu kelembaban ke topik /dht
String pubString = String(t)+ "," + String(h);
Serial.println("publish to topic: /dht : " );
Serial.println(pubString);
//serialisasi data mqtt
char message_buff[pubString.length() + 1];
pubString.toCharArray(message_buff, pubString.length() + 1);
client.publish("/dht",message_buff );
//sekalian barengan ngirim data GPS jika ada ke topik /gps
if(latlong != "invalid")
{
Serial.println("publish to topic: /gps : " );
Serial.println(latlong);
char message_buffgps[latlong.length() + 1];
latlong.toCharArray(message_buffgps, latlong.length() + 1);
client.publish("/gps",message_buffgps );
}
}
}
}
Lanjut nih kita mau bikin function untuk callback / menunggu pesan yg telah di SUBSCRIBE yaitu pada topik "/lokasi". Jika data lokasi telah diterima maka lanjut ditulis ke LCD.
void mqtt_callback(char* topic, byte* payload, unsigned int length) {
//jika data masuk
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
//Tulis di serial console
String message;
for (int i = 0; i < length; i++) {
message = message + (char)payload[i]; //Convert *byte to String
}
Serial.print(message);
//biar ringkas saya bikin function baru
tulis_lokasi(message);
}
//function khusus menulis ke LCD hasil reply nama lokasi dari MQTT
void tulis_lokasi(String lokasi)
{
//sedikit tricky untuk membaagi nama yg panjang ke LCD 4x20
//yg ini menentukan berapa bagian baris yg akan ditampilkan
//trick nya jika dibagi 20 gak genap baris tambahkan 1
int bagian = lokasi.length() / 20;
if( (lokasi.length() % 20) != 0 ) bagian+=1;
//yg ini menentukan berapa kali layar full akan ditampilkan
//trick nya jika dibagi 4 gak genap layar tambah 1 lagi
int layar = bagian / 4;
if( (bagian % 4) != 0 ) layar+=1;
String tulisan[bagian]; //array yg berisikan bagian (20 karakter)
//loop untuk mengepaskan tampilan LCD sesuai panjang tulisan
for(int a =0 ; a< bagian ; a++)
{
tulisan[a]= lokasi.substring(a*20,(a*20)+20);
}
// ini ketemu by trial dan error..jangan mumet ya...
int ujung =0;
for(int a = 0 ; a < layar ;a++)
{ lcd.clear();
for( int b = 0 ; b < 4 ; b++)
{
ujung++;
lcd.setCursor(0,b);
if(ujung <= bagian) lcd.print( tulisan[ (a*4) + b]);
}
delay(5000);
}
lcd.clear();
unsigned long currentMillis = millis();
previousMillis = currentMillis; //biar 5 detiknya dht lancar
}
Untuk loop utama seperti ini :
void loop()
{
// Jika ada koordinat GPS yg selesai di parsing
while (ss.available() > 0)
if (gps.encode(ss.read()))
displayInfo();
// Jika parsing salah mulu
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println(F("GPS Mu Matek Bozz..."));
while(true);
}
// Yang ini loop untuk ngecek MQTT nyambung apa tidak
if (!client.connected())
{
reconnectmqtt(); // Jika mqtt putus sambungkan lagi
}
else client.loop(); //cek terus jaga2 kalau ada data masuk
baca_dht(); // baca sensor suhu dan kirim2 data
}
##CATATAN##
Ubah panjang maksimum teks dari library MQTT pada file PubSubClient.h
// MQTT_MAX_PACKET_SIZE : Maximum packet size
#ifndef MQTT_MAX_PACKET_SIZE
#define MQTT_MAX_PACKET_SIZE 256
#endif
- Function pada script Python (raspberry pi)
Function yg dibawah ini bertujuan untuk me Reverse GeoLocator dari koordinat menjadi nama titik atau alamat yg diwakilkan. Data API yang digunakan adalah Nominatim dari OpenStreetMap yang bersifat gratisan, jadi tidak seakurat Google Map API yg berbayar.
def on_message(client, userdata, message): #routine pesan mqtt masuk
print("message received " ,str(message.payload.decode("utf-8")))
print("message topic=",message.topic)
if (message.topic == '/gps'): #jika topik /gps
outF = open("log.csv", "a")
dateTimeObj = datetime.now()
kor=str(message.payload.decode("utf-8"))
location = geolocator.reverse(kor)
loc = (location.address).split(',') #ambil nama geo
lokasi = ''.join(loc)
print(lokasi)
client.publish("/lokasi",lokasi) #kirim ke topik /lokasi
# dibawah ini untuk menulis log.csv
outF.write(str(dateTimeObj))
outF.write(",")
outF.write(humitemp[0])
outF.write(",")
outF.write(kor)
outF.write(",")
outF.write(lokasi)
outF.write("\n")
outF.close()
elif (message.topic == '/dht'): #jika topik /dht
humitemp[0]=str(message.payload.decode("utf-8")) #simpan di var
That's it...telah saya tulis satu persatu dan semoga penjelasannya dirasa cukup jelas. Oh iya untuk menjalankan Script tanpa membuka layar terminal terus menerus, gunakan cara NOHUP seperti dibawah ini :
pi@raspberry:~ $ nohup python3 coba_geopy.py &
Dan selanjutnya biarkan raspberry pi nya menyala sedangkan alat akan kita bawa berkeliling mencari Landmark / Titik terkenal diseputaran rumah. Mau tahu hasil yang saya dapatkan ? Maaf kalau gambarnya kurang jelas tapi berusahalah membaca (pakai kaca pembesar kalau bisa ! wkwkwkw)
Dan script python saya juga memiliki fasilitas untuk menyimpan ke log.csv, jadi bikin dulu header kolomnya dengan notepad seperti halnya membikin file csv pada umumnya. hasil keliling saya seperi ini nih.
Untuk lebih kerennya, file CSV ini dapat juga diolah menjadi informasi GIS pada software Google EARTH ataupun yg paling gampang dengan meng import CSV nya ke google "MY MAPS". Ini fasilitas GRATIS baru dari google dan sangat menarik untuk dicoba.
Jika mau melihat kemana saja kemarin saya jalan-jalan (walau PSBB) saat lebaran hari ke-2 bisa meng klik LINK DISINI.
SELAMAT MENCOBA
Sabtu, 23 Mei 2020
[Praktek Mudah Banget] Bermain dengan alat GPS receiver jadul - Part 1
Masih dalam rangka kegatelan tangan mengoprek sesuatu yang berhubungan GeoPy dan pengolahan data lokasi, kali ini dalam 2 seri tulisan akan saya bahas mengenai Hardware GPS receiver yg umum ada pasaran elektronika di olshop. Ternyata masa lebaran ini agak beresiko kalau belanja dan kirim barang, jadi saya terpaksa kembali ke 15 tahun yang lalu ketika saya bekerja di salah satu vendor perangkat telekomunukasi CDMA. Jadi saat itu salah satu cara membedakan BTS CDMA dengan GSM adalah mencari antena berbentuk setengah bola atau kerucut yg diletakkan tidak terlalu tinggi dekat dengan shelter BTS.
Bernostalgia ke masa-masa proyek memasang antena GPS di tower, yg nilai rupiahnya bisa untuk beli HP baru belum lagi sisa kabel yang panjang kualitas jerman yg laku keras di loak...ahhhh sudahlahh...kini yang menjadi warisan di saya hanya sebuah receiver GPS USB yang dulunya digunakan untuk referensi lokasi saat melakukan drive test sinyal. Dan saat saya colokkan port USB nya ke komputer terdeteksi sebagai Usb to serial converter. Wahh ini dalemannya pasti masih berupa UART dan bisa di interfacing ke arduino !
Jadi makin semangat nih buat menyambungkannya ke Arduino. Tapi sebelumnya ada baiknya mencari referensi tentang data yg dikirim oleh si receiver. Sial nya si pembuat modul telah bangkrut dan sedikit yg bisa saya dapatkan digoogle tapi cukuplah informasi yg di dapat bahwa receiver ini berbasis NMEA yg masih umum digunakan. Dengan terminal putty dan serial baudrate 4800 layar menangkap seperti ini :
Buset dah..banyak amat tuh tulisan yg harus diparsing, dan dari yg saya baca di standar NMEA receiver ini lumayan lengkap karena bisa membaca berbagai standar GPS , jadi ada $GPRSV dan $GPRSA untuk melihat informasi satelit dan $GPGGA dan $GPRMC untuk membaca koordiat, waktu, kecepatan, ketinggian dsb. Wah saya mumet ini kalau membaca parsingan segitu banyak, dan pilihan tertuju ke google dan saya cari ada gak software gratis untuk membaca parsingan NMEA seperti diatas...dan ternyata banyak loo..ayo kita coba dan bawa keruangan terbuka agar sinyal satelitnya lebih bagus.
Pilihan saya tertuju ke software yg pertama dimana terpampang jelas parsingan NMEA nya sehingga dari data serial yg didapat seperti ini :
$GPRMC,040503.246,A,0719.6784,S,11243.4344,E,0.00,0.00,220520,,*1B
Artinya kira-kira :
040503.246 = jam 04 , Menit 05, Detik 03.246 (UTC)
A = Data Benar (V jika datanya salah )
0719.6784,S = Latitude 7' 19.6784 " South
11243.4344,E = Longitude 112' 43.4344 " East
220520 = Tanggal 22 Bulan 05 Tahun 20
Nah sudah siap nih...ayo kita siapkan bahan-bahan dan mulai menyolder modul receiver GPSnya agar bisa dihubungkan ke Arduino.
Skematik tidak akan saya bahas karena sangat gampang dicari apalagi cara koneksi LCD ke Arduino seperti apa pasti para pembaca sudah tahu, dan kalau belum ya tinggal googling aja bagaimana cara menyambungkan LCD ke arduino. Microcontroller yg pas ada disaya adalah wemos d1 r1 yang memiliki wifi berbasis ESP8266 dan nantinya akan saya proogram untuk membaca GPS secara serial dan DHT11 sebagai tambahan sensor agar sedikit berbau IOT. Tujuan akhir dari praktek ini adalah mengirimkan data sensor suhu/kelembaban beserta dengan data GPS dan nama lokasi pembacaan yg akan dikolaborasikan dengan Mqtt serta Geopy phyton. Pada part 1 ini akan difokuskan pembahasan mengenai pembacaan GPS ke LCD.
Pertanyaan besarnya adalah bagaimana cara parsing text serial secara efektif? Apakah manual saja? Secara tukang solder ini memiliki pengalaman buruk dengan parsing serial ! Teringat bahwa modul GPS receiver banyak dijual sebagai interfacing Arduino dan pastinya ada Library jadinya, dan benar saja beberapa library terpampang di sketch dan stelah mencoba beberapa kali akhirnya diputuskan untuk menggunakan library TinyGps++ . Kenapa? Karena dengan script examplenya (ada di folder lib nya) alat saya sukses membaca data GPS dengan bagus. Mari kita berkreasi dengan cara copy paste ala tukang solder ini.
#include <TinyGPS++.h>
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
static const int RXPin = 0, TXPin = 15;
//pake RX aja hanya baca data !
static const uint32_t GPSBaud = 4800;
Seperti biasanya menggunakan board arduino versi kecil maka serial portnya harus dengan software serial. Baudrate disesuaikan yaitu 4800
// The TinyGPS++ object
TinyGPSPlus gps;
// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
LiquidCrystal lcd(16, 5, 4, 14, 12, 13);
Inisialisai LCD seperti biasa simple aja dan harus diperhatikan Wemos D1 R1 memiliki GPIO yang agak loncat loncat, jadi sesuaikan penamaan portnya jangan sampe salah. Gunakan Google Search jika salah.
void setup()
{
Serial.begin(9600);
ss.begin(GPSBaud);
lcd.begin(20, 4);
Serial.println(F("Coba-Coba GPS"));
Serial.println(F("Menggunakan TinyGPS++ Dan GPS module"));
Serial.print(F("Testing TinyGPS++ library v. "));
Serial.println(TinyGPSPlus::libraryVersion());
Serial.println(F("by ahocool with respect to Lib creator Mikal Hart"));
Serial.println();
}
Function setup menyatakan bahwa serial dari wemos akan digunakan sebagai console juga untuk melihat hasil pembacaan GPS selain di LCD. keuntungan lainnya adalah memudahkan untuk debugging.
void displayInfo()
{
Serial.print(F("Location: "));
if (gps.location.isValid())
{
Serial.print(gps.location.lat(), 6);
Serial.print(F(","));
Serial.print(gps.location.lng(), 6);
lcd.setCursor(0,0);
lcd.print(" ---- GPS VALID ----");
lcd.setCursor(0,1);
lcd.print("LAT :");
lcd.print(gps.location.lat(), 6);
lcd.setCursor(0,2);
lcd.print("LONG:");
lcd.print(gps.location.lng(), 6);
}
else
{
Serial.print(F("INVALID"));
lcd.setCursor(0,0);
lcd.print(" ---GPS INVALID --- ");
}
Serial.print(F(" Date/Time: "));
if (gps.date.isValid())
{
Serial.print(gps.date.month());
Serial.print(F("/"));
Serial.print(gps.date.day());
Serial.print(F("/"));
Serial.print(gps.date.year());
}
else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" "));
if (gps.time.isValid())
{
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
Serial.print(F(":"));
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
Serial.print(F(":"));
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(F("."));
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.print(gps.time.centisecond());
}
else
{
Serial.print(F("INVALID"));
}
Serial.println();
}
Pada sript diatas berfungsi sebagai tampilan GPS ke Serial dan LCD, secara umumnya dapat dilihat class yg umum digunakan :
gps.location.isValid()
gps.location.lat()
gps.location.lng()
gps.date.isValid()
gps.time.hour()
gps.time.minute()
gps.time.second()
gps.time.second()
Untuk loop utama seperti dibawah ini :
void loop()
{
// Data ditampilkan hanya setelah data selesai di olah
while (ss.available() > 0)
if (gps.encode(ss.read()))
displayInfo();
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println(F("GPSMU pedot brooo! cek kabelmu."));
while(true);
}
}
Hasilnya ketika saya jalankan diluar ruangan sangat akurat apalagi saat cuaca ternag dan LED dari GPS rceiver tidak berkedip yg artinya FULLY LOCKED TO 3 SATELLITES.
Tidak terlalu sulit jika kita sudah mengetahui langkah-langkah "googling" yang sesuai untuk meng "oprek" arduino. Untung saja saya punya receiver GPS jadul kalau tidak harus keluar duit 200rb an untuk membeli modul GPS Ublox Neo.
.....TUNGGU YANG LEBIH KEREN DI TULISAN PART 2...
Selamat mencoba
Kamis, 21 Mei 2020
[IOT Ternyata Mudah] GeoPy Sebagai Pengolah Data GIS Paling Sederhana
Setelah berhasil menjadikan Raspberry Pi Zero sebagai broker MQTT Publik saya jadi berpikir untuk melihat resource yg dihabiskan oleh mosquitto pada komputer kecil ini. Dan ternyata masih banyak ruang tersedia untuk pengembangan lainnya , ini tidak berlebihan karena setelah saya kerjakan proyek data logger menggunakan mongoDB seperti yang kita bahas terdahulu disini http://www.aisi555.com/2019/10/iot-menyimpan-data-sensor-lewat-nbiot.html , terasa masih ringan saja bahkan bisa sampai sukses mengirim ke database di cloud.
Data GPS yang alat saya kirimkan melalui MQTT dapat di olah selanjutnya oleh python dan aplikasi GIS lanjutan pada mongoDB atlas. Apakah Raspberry Pi mampu mengolah data Geo menjadi pelaporan seperti gambar diatas ? Mungkin jalan masih jauh kearah sana karena keterbatasan kemampuan tukang solder ini. Lalu paling tidak, saya berkeinginan agar data GPS yg saya punya dapat disimpan menjadi data nama point terdekat atau alamat dari koordinat GPS nya, dan akan saya coba menggunakan kemampuan raspberry pi. Script yg saya bayangkan akan menunjukkan koordinat gambar dibawah ini sesuai dengan nama titik nya dan dapat dilakukan oleh komputer kecil Raspberry Pi Zero.
Langkah pertama adalah mencari plugin dari PYTHON yang bisa mengolah data GPS.
Geopy merupakan library python yang mampu mengolah beberapa GEO API terkenal seperti google, openstreet, baidu, ArcGis dll. Secara default Raspbian telah menginstall python 2 dan 3 , untuk itu lakukan installasi di raspberry pi menggunakan perintah :
pi@raspberry:~ $ pip3 install geopy
Kita gunakan python 3.x agar lebih up to date , dan dari github resmi geopy untuk mengubah koordinat GPS menjadi nama lokasi kita gunakan cara seperti ini :
>>> from geopy.geocoders import Nominatim
>>> geolocator = Nominatim(user_agent="specify_your_app_name_here")
>>> location = geolocator.reverse("lat, long")
>>> print(location.address)
Dari hasil membaca beberapa blog yg membahas GeoPy , Nominatim adalah API gratis walau terbatas yang paling mudah digunakan, untuk itu ayo kita mencoba nya di PC saya dulu sesuai contoh diatas, dan hasilnya saat saya masukkan koordinat tugu pahlawan -7.425808 , 112.737785 ...
Jiiiahhhh koordinatnya salah yang diberikan oleh website tadi...hahahah...cek punya googlemap ahh...Koordinat dari Tugu Pahlawan : -7.245862 , 112.737799 ..dan kita coba ulang..
Ternyata website yg pertama salah posisi 1 angka saja sudah menyebabkan sasaran melenceng jauh. Selanjutnya saya ingin menggunakan MQTT untuk mengirim / Publish data GPS dan kemudian diolah oleh Script Python pada Raspberry Pi untuk mendapatkan nama lokasi dan kemudian dikembalikan secara pPublish dan di Subscribe balik oleh pengirim awal. Untuk itu jangan lupa menginstal library PAHO MQTT pada raspberry pi.
pi@raspberry:~ $ pip3 install paho-mqtt
Script python MQTT sudah pernah saya bahas pada tulisan data logger sebelumnya, dan untuk keperluan kali ini scritnya kira - kira seperti ini :
import paho.mqtt.client as mqtt #import mqtt client
from geopy.geocoders import Nominatim #import nominatim sebagai geocoder
geolocator = Nominatim(user_agent="my-application") #Gratisan Harus Seperti ini
########################################################
def on_message(client, userdata, message): #routine pesan mqtt masuk
print("message received " ,str(message.payload.decode("utf-8")))
print("message topic=",message.topic)
if (message.topic == '/gps'): #jika topik /gps
location = geolocator.reverse(str(message.payload.decode("utf-8")))
lokasi = location.address #ambil lokasi dari geo
print(lokasi)
client.publish("/lokasi",lokasi) #kirim ke topik /lokasi
########################################################
broker_address="localhost"
broker_port=1883
broker_user="usernya"
broker_pass="paswordnya"
print("creating new instance")
client = mqtt.Client("P1") #instance mqtt baru
client.on_message=on_message #attach function ke routine callback
client.username_pw_set(broker_user,broker_pass)
print("connecting to broker")
client.connect(broker_address,broker_port) #connect to broker
#start the loop
print("Subscribing to topic...")
client.subscribe("/gps")
client.loop_forever()
#muter terusss
Jalankan script diatas pada terminal yg terhubung pada raspberry pi, dan buka juga 2 buah terminal (melalui putty dan sejenis) sebagai terminal PUB yang akan mengirim koordinat GPS ke topik /gps dan satunya sebagai SUB yang akan menunggu kiriman nama titik koordinat tadi dari topik /lokasi. Hasilnya seperti ini nih..
Sukses tapi tidak begitu menarik ya sepertinya karena semuanya berbasis teks. Yang menarik pakai apa ya ? Kita manfaatkan SMARTPHONE aja dengan menggunakan aplikasi IOT MQTT PANEL sebagai dashboard komunikasi MQTT paling terjangkau sampe saat ini karena masih GRATIS walau pake iklan. Cari pada play store dan install pada smartphone kamu dan lakukan setup koneksi ke broker yg digunakan.
Kita akan mengirim dan menerima TEKS , jadi kita butuh 2 panel yaitu Text Input dan Text Log.
Dan hasilnya menggembirakan seperti dibawah ini :
Selamat Mencoba