Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Ayo Migrasi TV Digital

    Kami bantu anda untuk memahami lebih jelas mengenai migrasi tv digital, apa sebabnya dan bagaimana efek terhadap kehidupan. Jasa teknisi juga tersedia dan siap membantu instalasi - setting perangkat - pengaturan antena dan distribusi televisi digital ke kamar kos / hotel

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Tampilkan postingan dengan label tulisan. Tampilkan semua postingan
Tampilkan postingan dengan label tulisan. Tampilkan semua postingan

Kamis, 25 Juni 2020

[IOT Itu Gampang] Bug Fatal Pada Mqtt Subscription - Library AntaresESP8266Mqtt - Part 2



[versi youtube dapat dilihat disini]

Kegatalan akibat "kutu" pada library AntaresEsp8266Mqtt berlanjut padahal telah diobati makan siang yang lumayan maknyus di sebual mall surabaya ( sekalian survey apa cafe sudah buka setelah psbb). Selama makan siang, saya beberapa kali ditegur tidak fokus sama kawan, ya iyalah karena pada tulisan sebelumnya http://www.aisi555.com/2020/06/solution-bug-pada-library-antares-mqtt.html , saya hanya berhasil melakukan proses PUB atau kirim dari esp8266 menuju server serta dibaca oleh client pc MQTT.FX. Kenapa tidak lanjut ke proses SUB atau menerima data ? Sebelumnya untuk mendapatkan konsep MQTT dan rangkaian yg saya gunakan sebaiknya lihat video youtube saya di https://www.youtube.com/watch?v=2o9JRb1FGEc .








Konsep yang berbeda ternyata ditemui pada proses PUBSUB apabila terbiasa menggunakan broker berbasis Mosquitto. Dari manual pada website antares.id dinyatakan bahwa proses Menyimpan dan Mengambil data baik secara http maupun mqtt berpola sama seperti ini :

PUSH/PUB  : /oneM2M/req/your-access-key/antares-cse/choose-a-serialization-format 
GET/SUB   : /oneM2M/resp/antares-cse/your-access-key/choose-a-serialization-format 

Dari keduanya ditemukan "oneM2M" yg merupakan standar IOT platform yg digunakan oleh antares, jadi data akan dikirim dan diolah menggunakan REST API dengan serialization berformat XML ata JSON. Pada library antares yg kita bahas kali ini yg karena library oprekan dari pubsubclient maka digunakan format JSON yang saya sangat sukai. Jadi dalam library ini dicopas juga berbagai file library ArduinoJSON untuk melakukan parsing data seperti contoh payload MQTT berikut:

{
   "m2m:rsp" : {
      "rsc" : 2001,
      "rqi" : "123456",
      "pc" : {
         "m2m:cin" : {
            "rn" : "cin_702783788",
            "ty" : 4,
            "ri" : "/antares-cse/cin-702783788",
            "pi" : "/antares-cse/cnt-682859183",
            "ct" : "20200625T172017",
            "lt" : "20200625T172017",
            "st" : 0,
            "cnf" : "message",
            "cs" : 24,
            "con" : "{\"ledstatus\":\"hijau on\"}"
         }
      },
      "to" : "Accesskey:Password",
      "fr" : "/antares-cse"
   }
}


Nah, kini sudah jelas data yg di kirim-terima pada antares berformat json dan kita akan melakukan parsing untuk mendapatkan nilai pada bagian "con", dan saya oprek dulu tambahan  script untuk SUB sebuah topik yg akan menunggu perintah menyalakan atau mematikan LED. Gunakan saja script contoh subscribe yang ada pada LIBRARY ...dan ternyata hasilnya tidak bisa membaca respon SUB apapun ...kesalahan fatalnya ada dibagian ini  antares.checkMqttConnection(); dan kita check dulu


void AntaresESP8266MQTT::checkMqttConnection() {
    

_subscriptionTopic = "/oneM2M/req/" + _accessKey + "/antares-cse/json";

    if(!client.connected()) {
        while(!client.connected()) {
            printDebug("[ANTARES] Attempting MQTT connection...\n");

            String clientId = "ESP8266-" + _accessKey;

            char clientIdChar[clientId.length() + 1];
            clientId.toCharArray(clientIdChar, clientId.length() + 1);

            if(client.connect(clientIdChar)) {
                printDebug("[ANTARES] Connected! Client ID:");
                printDebug(clientIdChar);
                printDebug("\n");
                char subscriptionTopicChar[_subscriptionTopic.length() + 1];
                _subscriptionTopic.toCharArray(subscriptionTopicChar, _subscriptionTopic.length() + 1);

                Serial.println();
                Serial.print("[ANTARES] Topic: ");
                Serial.println(subscriptionTopicChar);

                client.publish(subscriptionTopicChar, "connect!");
                client.subscribe(subscriptionTopicChar);
            }
            else {
                printDebug("[ANTARES] Failed, rc=" + String(client.state()) + ", Will try again in 5 secs.\n");
                delay(5000);
            }
        }
    }
    client.loop();
}

Yang berwarna merah pada library antaresEsp8266mqtt.cpp merupakan KESALAHAN FATAL karena seharusnya pada proses SUBSCRIBE scriptnya seperti ini :

   _subscriptionTopic = "/oneM2M/resp/antares-cse/" + _accessKey + "/json";

Setelah dicoba..ehhh ternyata salah juga..pesan diterima tapi payloadnya kosong ..


Usut-punya usut setelah melakukan debug satu persatu kesalahn FATAL mengikuti kesalahan sebelumnya yaitu parsing JSON "rqp" vs "rsp", sehingga harus diubah pada bagian ini :

String AntaresESP8266MQTT::get(char* topic, byte* payload, unsigned int length) {
    _receivedTopic = String(topic);

    String payloadString;
    for(int i = 0; i < length; i++) {
        payloadString += char(payload[i]);
    }

    DynamicJsonBuffer jsonBuffer;
    JsonObject& object = jsonBuffer.parseObject(payloadString);
    //ASLINYA SALAH
    //String parsedString = object["m2m:rqp"]["pc"]["m2m:cin"]["con"];
    //BENAR NYA SEPERTI INI
    String parsedString = object["m2m:rsp"]["pc"]["m2m:cin"]["con"];
    
    
    _jsonSubDataString = parsedString;
    
    return _jsonSubDataString;
}


Dan ketika saya publish payload json dengan message con: "{\"hijau\":\"on\"} " dari MQTT.FX , saya sukses menyalakan LED pada Wemos D1 saya .




Karena penulis lagi bergembira dapat sukses mengoprek ANTARES yang terlihat cacat, maka saya share script lengkap untuk mengirim PUB tombol dan SUB led pada Wemos D1



#include <AntaresESP8266MQTT.h>

//gunakan acces key antares kamu
#define ACCESSKEY "access:key"

#define WIFISSID "myIOT" //wifi ssid
#define PASSWORD "selaluterhubung" //wifi pass

//Nama project dan device antares
#define projectName "AHOCOOL_IOT"
#define deviceName "test_pubsub"

AntaresESP8266MQTT antares(ACCESSKEY);

int counter=0;


void setup() {
  pinMode(16, INPUT); //Tombol pada port GPIO 16
  pinMode(4, OUTPUT); //LED pada port GPIO 4
  Serial.begin(9600);//Serial monitor
  //koneksi antares
  antares.setDebug(true);
  antares.wifiConnection(WIFISSID, PASSWORD);
  antares.setMqttServer();
  //set function callback yg akan mendeteksi pesan masuk
  antares.setCallback(callback);
}

void loop() {
  
  // ngecek koneksi
  antares.checkMqttConnection();
  
  //tombol ditekan = 0, pin GPIO pullup
  if( digitalRead(16) == 0 ){
  //tambah counter
  counter++;
  //kirim mqtt ke antares
  antares.add("counter", counter);
  antares.publish(projectName, deviceName);
  delay(300);
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
  /*
   Function ini di panggil saat ada pesan masuk
   pada topic : "/oneM2M/resp/antares-cse/" + _accessKey + "/json" 
*/
antares.get(topic, payload, length); Serial.println("New Message!"); // Print topic and payload Serial.println("Topic: " + antares.getTopic()); Serial.println("Payload: " + antares.getPayload()); // Print individual data Serial.println("Lednya: " + antares.getString("ledstatus")); //nyala dan matikan LED if( antares.getString("ledstatus") == "hijau on" ) digitalWrite(4,HIGH); if( antares.getString("ledstatus") == "hijau off" ) digitalWrite(4,LOW); }
Untuk mengirim pada MQTT.FX maka ikuti aturan berikut :

TOPIK PUB :  /oneM2M/req/ACCESS:KEY/antares-cse/json
 
dengan format payload :

{"m2m:rqp": {"fr": "ACCESS:KEY","to": "/antares-cse/antares-id/AHOCOOL_IOT/test_pubsub","op": 1,"rqi": 123456,"pc": {"m2m:cin": {"cnf": "message","con": "{\"ledstatus\":\"hijau off\"}"}},"ty": 4}}

Sedangkan untuk menerima data pada MQTT.FX seperti berikut:

TOPIK SUB :  /oneM2M/resp/antares-cse/ACCESS:KEY/json


Bagaimana sudah puyeng kah ? yang penting ..

[CASE CLOSED and SOLVED]
Share:

[IOT Itu Gampang] BUG pada Library antares Mqtt ESP8266 - part1



[youtube version dapat klik disini]

Antares merupakan sebuah entitas IOT yang dikembangkan oleh PT TELKOM INDONESIA untuk menjawab tantangan teknologi terbaru jaman now. Penulis yang pernah 10 tahun berhubungan dengan perusahaan BUMN ini  sangat memahami bahwa telkom merupakan pelopor banyak teknologi mutahir di negeri ini. Jadi setiap ada tren baru diluar sana maka telkom dan groupnya dengan RnD yang kelas wahid akan segera mempelajari dan selanjutnya  mendeploy layanannya. Dari laman web antares.id, perkenalan dari antares seperti yg saya baca :

ANTARES merupakan sebuah Horizontal IoT Platform, yang berarti kami mencoba untuk menjadikan layanan kami se-umum mungkin agar solusi vertikal IoT anda dapat menyesuaikan dengan arsitektur yang umumnya digunakan. Banyak kasus-kasus IoT yang dapat dipecahkan dengan menggunakan layanan kami, contohnya adalah smart home, smart metering, asset tracking, smart building, dan lain-lain.

Kebutuhan akan platform IOT dalam negeri memang sangat saya dukung agar kita tidak hanya menjadi pengguna tapi juga bisa menjadi penyedianya. Lawan berat dari luar sana seperti AWS, Google IOT, ThingSpeak dll. dan  memang akan membuat ciut nyali dengan nama besar itu apalagi  melihat prospek meng "uang" kan belum secepat jualan fiber optik ke pelanggan indihome. 


Perkenalan penulis dengan antares terjadi sekitar tahun 2019, saat penulis kembali menekuni dunia 8 bit. Dari saran beberapa teman menujulah ke platform iot lokal ini dan terkejutnya karena terlalu banyak sisi IT nya dan menyoldernya hampir sedikit sekali, dan otak serta otot solderan saya berontak ketika melihat perintah pengiriman data melalui REST API seperti dibawah ini:




Bingung dan terkesan sulit dan saya beralih ke MQTT berbasis Mosquitto yang sangat mudah bagi tukang solder ini. Saya tinggalkan menggunakan antares sampai ada request dari seorang pembaca blog dan kebetulan saya sudah sedikit paham mengenai mqtt dengan esp8266. Apalagi pada sketch arduino, library ANTARES sudah terpampang dengan gagahnya di library manager.






Kita akan mencoba mencontoh example pada libraries ini dengan sedikit modifikasi mengirimkan counter penekanan tombol, scriptnya sederhana saja , saya gunakan wemos d1 r1:



#include <AntaresESP8266MQTT.h>

//gunakan acces key antares kamu
#define ACCESSKEY "access:key"

#define WIFISSID "myIOT" //wifi ssid
#define PASSWORD "selaluterhubung" //wifi pass

//Nama project dan device antares
#define projectName "AHOCOOL_IOT"
#define deviceName "test_pubsub"

AntaresESP8266MQTT antares(ACCESSKEY);

int counter=0;


void setup() {
  pinMode(16, INPUT); //Tombol pada wemos
  Serial.begin(9600);//Serial monitor
  //koneksi antares
  antares.setDebug(true);
  antares.wifiConnection(WIFISSID, PASSWORD);
  antares.setMqttServer();
}

void loop() {
  
  // ngecek koneksi
  antares.checkMqttConnection();
  
  //tombol ditekan = 0, pin pullup
  if( digitalRead(16) == 0 ){
  //tambah counter
  counter++;
  //kirim mqtt ke antares
  antares.add("counter", counter);
  antares.publish(projectName, deviceName);
  delay(300);
  }
}



Dan hasil yg saya dapatkan sedikit mengecewakan..


Seperti kembali ketahun lalu dan saya kembali membaca manual pada website antares dan de-ja-vu dengan bahasa Inggris yg di paksakan menjadi Bahasa Indonesia. Jadi maaf sepertinya developer antares hanya berusaha menterjemahkan manual ke bahasa Indonesia tapi bukan berusaha menjelaskan secara teknisnya. Ayo kita perhatikan debug diatas, saya menemukan bahwa yg belum konek WIFI NYA ! ESP saya rusak? Oooo tidak ketika saya mencoba script mqtt lain lancar saja, berarti ada salah di library antaresesp8266mqtt, dan saya coba buka script library AntaresESP8266MQTT.cpp


bool AntaresESP8266MQTT::wifiConnection(String SSID, String wifiPassword) {
    char ssidChar[sizeof(SSID)];
    char wifiPasswordChar[sizeof(wifiPassword)];

    SSID.toCharArray(ssidChar, sizeof(SSID));
    wifiPassword.toCharArray(wifiPasswordChar, sizeof(wifiPassword) );

    int count = 0;
    _wifiSSID = ssidChar;
    _wifiPass = wifiPasswordChar;
   
    WiFi.begin(_wifiSSID, _wifiPass);
    

   
    printDebug("[ANTARES] Trying to connect to " + SSID + "...\n"); 
    //saya tambahkan debug wifi name dan password disini
    printDebug("ssid dan password setelah di char array:  "); 
    printDebug(String(_wifiSSID) +" : " + String(_wifiPass));
    
 for (count=0;count<20;count++)
    {
      delay(500);
      printDebug(".");
    }

    if(WiFi.status() != WL_CONNECTED) {
        printDebug("[ANTARES] Could not connect to " + SSID + ".\n");
        return false;
    }
    else {
        WiFi.setAutoReconnect(true);
        printDebug("\n[ANTARES] WiFi Connected!\n");
        printDebug("[ANTARES] IP Address: " + ipToString(WiFi.localIP()) + "\n");
        return true;
    }
}
Dan benar saja librarynya hanya merupakan penyesuaian dari library yang sudah banyak beredar yaitu pub sub client milik knoleary, tapi tidak mengapa namanya juga library OPEN SOURCE sah sah aja bikin, tapi dari hasil penambahan debug saya dapatkan kenyataan wifi saya tidak konek sesuai gambar berikut:



Ternyata ohh ternyata..terjadi lagi permasalahan classic pada C++ yaitu passing string ke function, dimana banyak yg mengeluh sampe ada yg pindah coding ke micropython. Password saya terpotong hampir 4 char array...jadi solusinya gampang saja..kita tambahkan panjang arraynya + 5.



Dan console Antares saya di website antares.id pun pertama kalinya merasakan data masuk...wkwkwkwkw


Yeahhhh...berhasil ...dan yg bikin saya geleng-geleng ada output pada layar sub MQTT.FX yang biasa saya gunakan untuk mencoba pub sub, awalnya saya sebelum menggunakan esp8266 saya gunakan mqtt.fx, lalu frustasi gak ada data masuk. Ehhhh nongol dia...


Ternyata memang data yg dikirim masih berupa JSON REST API ..ckkcckkkckkk , jadi cicak deh saya

Baiklah..demikian penelusuran BUG PADA ANTARES MQTT , semoga pihak antares bisa memperbaiki librarynya..

PS: BUG yang lebih gatel ternyata muncul juga..silahkan baca lanjutannya di :
Share:

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 
Share:

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..

 -7.245862 ,  112.737799

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

Share:

Kamis, 16 Januari 2020

[Elektronika Simple] Mudahnya mengkoding pengiriman SMS melalui Mblock

Pada tahun 2013 silam saya telah menuliskan cara berkirim SMS melalui modem dan microcontroller AVR ( dapat dibaca disini ) dan begitu ringkasnya perintah AT command yg dikirimkan. Untuk merubah coding nya ke format Mblock mungkin bukan menjadi masalah besar bagi saya, cukup mengikuti alur langkah pengiriman serial. Tapi kali ini saya akan memposisikan ke kondisi dimana saya anggap yang melakukan koding adalah anak-anak. Jadi sebelumnya kita akan berkenalan dengan AT COMMAND dari modem yg kita gunakan yaitu SIM800L



Ketika barang datang mungkin kita butuh melakukan penyolderan kaki-kaki header dan antena ke board, tapi jika kamu membeli yg sudah tersolder mungkin akan lebih gampang. Jadi pertimbangan jika perkenalan koding pengiriman sms diberikan ke anak-anak maka sebaiknya dilakukan penyolderan sebelumnya dibantu oleh orang dewasa. Dengan alat tambahan USB to TTL Serial maka kita dapat melakukan perintah dasar AT command seperti pada umumnya yg telah saya bahas tahun 2013. Perintah yg umum perlu ditest melalui terminal serial / putty adalah :


ATE1 <enter>   :  untuk menampilkan penekanan keyboard
AT+IPR? <enter>   : Untuk mengetahui baudrate serial, umumnya saat datang baudrate default 115200 (pas dengan baud rate serial pada Mblock)
AT+IPR=9600 <enter>  : Jika ingin merubah baudrate ke 9600 bps , gunakan default saja karena sesuai dengan baudrate serial pada Mblock
AT&W <enter>  : Menyimpan setting ke eeprom SIM800
AT+CMGF=1  <enter>  : Mengubah SMS menjadi mode teks
AT+CMGS="081xxxxxx" <enter> : Mengirim sms ke nomer yg dituju
AT+CMGR=1  <enter>  :  membaca sms pada memori no 1

Lebih khususnya ketika kita mengirimkan AT COMMAND untuk perintah kirim SMS seperti berikut :

AT+CMGS="081xxxxxx" <enter> 

maka pada terminal akan muncul caret

> masukkan teks yang akan dikirim

lalu setelah teks di tuliskan maka harus dilakukan pengiriman tombol CTRL+Z  atau ASCII (0x1A)

Bagaimana dengan pengiriman SMS menggunakan MBLOCK ? Kita akan bahas satu persatu dengan menggabungkan project lanjutan dari pembacaan DHT11 ke LCD yang bisa dibaca terlebih dahulu disini . Kita akan mengirimkan SMS yg berisikan pesan berupa pembacaan suhu dan kelembaban.




Dari gambar diatas merupakan blocks inisialisasi setup dari perangkat yaitu berupa sensor DHT11 , dua buah variabel suhu dan humi, inisialisasi port LCD serta perintah inisialisasi modem yaitu :

AT+CMGF = 1    serta   ASCII 13  


Kita tahu AT+CMGF=1 merupakan perintah untuk merubah menjadi modem menjadi SMS format teks (bisa juga langsung disimpan saja seting nya dan modem menjadi selalu bermode SMS teks), lalu ASCII 13 itu apa? itu artinya CR (cariage return) alias enter, dimana 13 decimal dalam tabel ascii berarti CR (enter) , lalu kalau CTRL+z (0x1A) ? Kita gunakan kalkulator saja dan kita dapatkan angka desimalnya 26 dan cocok pada tabel ascii nya.



Blok diatas telah kita bahas pada pembahasan DHT11 vs LCD cuma ada perbaikan dimana nilai pembacaan data kita simpan ke variabel suhu dan humi sehingga dapat digunakan lagi (alias pembacaan sensor sekali saja dalam satu periode loop).


Kelanjutannya adalah blocks untuk pengiriman SMS dengan perintah yg dikirim melalui serial ke modem SIM800 yaitu : AT+CMGS ="081xxxxxx" , dan kemudian diikuti dengan penyusunan kalimat SMS berupa " saat ini suhu = (suhu dht11) celsius , kelembaban = (humi dht11) %rH. Diakhiri dengan pengiriman desimal 26 yang dalam tabel ASCII berarti CTRL+Z . Pesan SMS akan dikirimkan setiap 30 detik (LOOP FOREVER) dan hasilnya seperti dalam gambar dan video dibawah. 







Bagaimana ? Mudah bukan ?
Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (8) arduino (26) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (58) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (7) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (7) radio (26) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) transistor (2) troubleshoot (3) tulisan (93) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika