"Kembali Ke Dasar Elektronika Digital ... "

  • 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

  • Animasi LED Dengan IC 4017

    IC 4017 adalah IC 16-pin CMOS dekade counter dari seri IC CMOS 4000. Sangat berguna jika ingin membuat animasi lampu atau LED secara sederhana seperti led berjalan, tulisan berjalan , counter/timer dan masih banyak kegunaan lainnya

  • 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

  • BIKIN PCB SEDERHANA TAPI GA MURAHAN

    Bikin PCB itu ga susah kok..dengan software EAGLE CAD dan teknik sterika kamu dapat membuat PCB untuk berbagai project elektronika mu ...

Tampilkan postingan dengan label iot. Tampilkan semua postingan
Tampilkan postingan dengan label iot. Tampilkan semua postingan

Selasa, 04 Agustus 2020

[Mudah Belajar RasPi] Terhubung ke antares semakin mudah dengan python library siap pakai




Dengan library python antares-http maka semua urusan kirim terima pesan http menuju antares menjadi semakin gampang saja. Perhatikan hasil capture dari websitenya pip / pypi maka saking simpelnya anda bisa membuat aplikasi antares melalui raspberry pi dalam hitungan menit saja.


Sehingga praktek penekanan tombol yang sudah kita buat pada penjelasan sebelumnya disini menjadi makin mudah dengan mengarahkannya ke antares :


Dan script untuk membuat tombol penghitung survey seperti ini :






import RPi.GPIO as GPIO
import time
import json
from antares_http import antares #library antares

antares.setDebug(True)
antares.setAccessKey('ACCESS:KEY') #sesuaikan

GPIO.setmode(GPIO.BCM)

GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)#Button to GPIO17
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)#Button to GPIO27
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)#Button to GPIO22

def update_antares(pilihan):
    latestData = antares.get('Project name', 'device name') #Sesuaikan
    isi = latestData['content'] #parsing pertama
    satu= isi['satu'] #parsing kedua
    dua= isi['dua']
    tiga= isi['tiga']
    #pilhan dari penekanan tombol satu, dua, tiga
    if pilihan == 'satu':
       myData = {'satu':int(satu)+1,'dua':int(dua),'tiga':int(tiga)}
    elif  pilihan == 'dua':
       myData = {'satu':int(satu),'dua':int(dua)+1,'tiga':int(tiga)} 
    elif  pilihan == 'tiga':
       myData = {'satu':int(satu),'dua':int(dua),'tiga':int(tiga)+1}

    antares.send(myData,'Project name', 'device name') #Sesuaikan

try:
    while True:
         button_state1 = GPIO.input(17) #baca tombol
         button_state2 = GPIO.input(27)
         button_state3 = GPIO.input(22)
         if button_state1 == False:
             print('Button 1 is Pressed...')
             update_antares('satu')
         elif button_state2 == False:
             print('Button 2 is Pressed...')
             update_antares('dua')
         elif button_state3 == False:
             print('Button 3 is Pressed...')
             update_antares('tiga')
         time.sleep(0.2)
         
except:
    GPIO.cleanup()

    

Sangat simple dan selanjutnya bisa dilihat pada video berikut ini :




Share:

Selasa, 28 Juli 2020

[Mudah Belajar RasPi] Menghubungkan ke database MongoDB atlas



Kita lanjut penelusuran raspberry pi GPIO dengan input tombol yang masih menggunakan rangkaian 3 switch yang pernah kita bahas sebelumnya.


Interaksi dari GPIO kini akan kita gunakan untuk menyimpan angka yang ketika ada penekanan maka akan di "increment" dan ditampilkan pada grafik. Untuk itu kita gunakan MongoDB Atlas sebagai database gratis yang juga memiliki fasilitas grafik/chart.



Untuk merubah isi dari field pada database diatas kita bunakan perintah :


namaDB.namaCollection.find_one_and_update(query,value)


Jadi kita akan merubah nilai data satu dua atau tiga setiap kali penekanan tombol, gunakan script seperti berikut :



import RPi.GPIO as GPIO #library
import time
import pymongo
import json

#sesuaikan dengan client mongodb atlas kalian serta DB/Collection nya 
myclient = pymongo.MongoClient("mongodb+srv://user:password@cluster0-jb06l.mongodb.net/test?retryWrites=true&w=majority")
mydb = myclient["latihan"]
mycol = mydb["coba_tombol"]


GPIO.setmode(GPIO.BCM)

GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)#Button to GPIO17
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)#Button to GPIO27
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)#Button to GPIO22

######Update by increment database value######
def update_db(kolom):
     x= mycol.find_one_and_update({'judul':'coba'},{'$inc':{kolom:1}})
     print('update dbase :')
     print(x)
 
try:
    while True:
         button_state1 = GPIO.input(17)
         button_state2 = GPIO.input(27)
         button_state3 = GPIO.input(22)
         if button_state1 == False:
             print('Button 1 is Pressed...')
             update_db('satu')
         elif button_state2 == False:
             print('Button 2 is Pressed...')
             update_db('dua')
         elif button_state3 == False:
             print('Button 3 is Pressed...')
             update_db('tiga')
         time.sleep(0.2)
         
except:
    GPIO.cleanup()

    

Sangat simple sehingga kita bisa membuat grafik penekanan tombol seperti video berikut ini.





Share:

Rabu, 22 Juli 2020

Cara Mudah Belajar MODBUS - Komunikasi Industri Jaman dulu [part 4] Arduino MQTT Bridge




Setelah berhasil memposisikan arduino menjadi modbus master, kita akan butuh sedikit usaha lagi untuk melengkapi piramida IOT nya. Untuk itu perlu penggabungan dari beberapa tulisan sebelumnya yaitu dasar MQTT pada ESP8266 disini dengan tulisan seri modbus part 3 disini. Ada dua mode mqtt yang ingin saya gunakan yaitu mode request-reply dan mode periodic. Perhatikan rangkaian dasar yang telah kita bahas sebelumnya.


Skematik arduino mqtt bridge


Dengan asumsi pembaca telah memahami pembahasan sebelumnya, mode request-reply memiliki 5 type perintah yang akan dikirim ke perangkat modbus dan jika di tuliskan dalam script seperti berikut  :


if (Serial.available() > 0) { //perintah dari serial port monitor/putty
    // read the incoming byte:
    incomingByte = Serial.read();

    if (incomingByte == '1') {  //toggle led mati hidup
       if (!led) mod.write(ledOn, sizeof(ledOn)); //modbus led on
       else mod.write(ledOff, sizeof(ledOff)); //modbus led off

       led=!led;
      }
    else if (incomingByte == '2')  mod.write(tombol, sizeof(tombol));  //cek tombol
    else if (incomingByte == '3')  mod.write(humitemp, sizeof(humitemp)); //baca dht11
    else if (incomingByte == '4')  mod.write(aisi, sizeof(aisi)); //baca holding register

    }
Pada script diatas merupakan perintah atau request yang dikirimkan oleh Terminal Serial semisal putty atau serial monitor sketch arduino dimana terjemahan perintah nya seperti berikut :

  • '1'  : Togle led On atau Off
  • '2'  : Baca penekanan tombol
  • '3'  : Baca sensor DHT11
  • '4'  : Baca Holding Register

Kita dapat  merubah request dari terminal serial menjadi perintah yg  dikirim melalui SUBSCRIBE TOPIK  MQTT,  jadi esp8266 akan menunggu apakah ada request dari server/broker yang masuk dan membandingkan isi payloadnya sesuai script berikut :

void mqtt_callback(char* topic, byte* payload, unsigned int length) {
 
  Serial.print("Message arrived in topic: ");
  Serial.println(topic);
 
  Serial.print("Message:");
 
  String message;
  for (int i = 0; i < length; i++) {
    message = message + (char)payload[i];  //Convert *byte to String
  }
   Serial.print(message);
   if(message == "1"){  //bandingkan payload yang masuk dan kirim modbus
       if (!led) mod.write(ledOn, sizeof(ledOn));
       else mod.write(ledOff, sizeof(ledOff));

       led=!led;
      }
   if(message == "2")mod.write(tombol, sizeof(tombol));
   if(message == "3")mod.write(humitemp, sizeof(humitemp));
   if(message == "4")mod.write(aisi, sizeof(aisi));


 }
Untuk memahaminya tidaklah begitu sulit jika anda rajin membaca blog ini dari seri tulisan mengenai mqtt yang sering saya bahas sebelumnya. 

Setelah modbus me-reply request maka esp8266 akan membandingkan reply modbus dan selanjutnya melakukan PUBLISH MQTT ke topik yang telah ditentukan ke broker mqtt. Anda juga bisa menggunakan Smartphone dengan aplikasi IOT MQTT PANEL untuk menerima data yang di PUBLISH oleh bridge mqtt esp8266 dan tentunya juga bisa mengirimkan perintah/request ke modbus.




Untuk mode periodic cukup menambahkan timer pada loop utama yang akan mengirimkan perintah modbus untuk pengecekan tombol dan pembacaan DHT11 setiap jeda waktu tertentu. Selengkapnya ikuti penjelasan pada video berikut ini :



Share:

Sabtu, 18 Juli 2020

[IOT Itu Gampang] SIM7000 NBIOT Gagal Terima Pesan Subscribe MQTT dari Antares



Senangnya hati ini saat berhasil menduplikasi alat jadul saat penulis kerja praktek pada tahun 2002 (bisa dibaca disini ) terutama saat berhasil mengirimkan data pembacaannya menuju grafik pada microsoft excel menggunakan NBIOT telkomsel dan Antares sebagai platform IOT nya. Dan sekarang saya ingin mengetes proses kebalikan dari alat ini yaitu subscribe ke topic antares dan mencoba menerima data. Sebagai pemahaman untuk pembaca, proses subscribe MQTT dari antares selalu menggunakan topik :

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

Access:key merupakan username dan password yang anda dapatkan dari platform antares . Karena topiknya satu saja maka data yg ingin diolah diterima dibagian mana ? Mari kita lihat contoh respon atau jawaban dari topik mqtt.

 {
   "m2m:rsp" : {
      "rsc" : 2001,
      "rqi" : "123456",
      "pc" : {
         "m2m:cin" : {
            "rn" : "cin_63068886",
            "ty" : 4,
            "ri" : "/antares-cse/cin-63068886",
            "pi" : "/antares-cse/cnt-682859183",
            "ct" : "20200707T152502",
            "lt" : "20200707T152502",
            "st" : 0,
            "cnf" : "message",
            "cs" : 35,
            "con" : "{\"led\":\"on\"}"
         }
      },
      "to" : "username:password",
      "fr" : "/antares-cse"
   }
}

Wihh panjangnya sekitar 500 karakter nih...padahal kalau dilihat dari buffer nya library tinyGSM hanya mencantumkan rx buffer sebanyak 64 byte saja. Jadi berdasarkan penelusuran praktek menghidupkan LED melalu NBIOT-ANTARES pesan tidak bisa diterima karena kepanjangan. Kalau saya errorkan mengirim data maka response dapat diterima dengan baik karena pesan nya tidak melewati jumlah byte buffer.







Dapat disimpulkan datanya terlalu panjang untuk buffer sim7000 bagaimana kalau buffernya dibesarkan? Yang terjadi adalah memory RAM arduino yang saya gunakan menjadi kritis 80% dan tidak mampu untuk mengerjakan  fungsi memori dinamis scriptnya. Bagaimana kalau kita menggunakan broker lain dan mencoba mengirim data panjang ? Kita coba menggunakan broker HIVEMQ dan hasil yang didapat kurang lebih sama. Untuk lebih jelasnya dapat dilihat pada video berikut ini.





Share:

[IOT Itu Gampang] NBIOT - Alat Pengukur Kematangan Kultur Alga - Flashback ke Jaman Kuliah



Pada tahun 2002 penulis mendapatkan tantangan dari dosen ketua bidang studi elektronika almarhum ir soetikno yang sangat legendaris di elektro ITS, saat itu kami di lab elka sedang mengalami kejenuhan tugas akhir yang temanya cenderung mirip - mirip. Tantangan ini berupa pilihan untuk mengerjakan skripsi mengenai "Teknologi Baru" atau "Teknologi Terapan Masyarakat". Penulis yang otak nya lumayan "cekak" membuang jauh - jauh tantangan teknologi baru dimana kawan kami yang paling pintar mendapatkan tugas akhir teknologi baru FPAA (field programmable analog array) yang fresh from the oven dari amerika dan  terbatas sekali penelitian awalnya. Tapi karena topik judul skripsi paling mudah yaitu pengenalan awal sudah diambil, maka tantangan ke mahasiswa lainnya adalah membuat aplikasi dari modul FPAA yang datang langsung dari amerika, dimana syaratnya kalau sampai merusakkan alatnya maka harus menggatinya. Otak cekak , uang juga apalagi jadi larilah penulis ke topik pilihan lainnya yaitu teknologi terapan masyarakat.


Seketika penulis teringat akan sebuah balai penelitian perikanan di bukit gondol bali yg pernah dikunjungi pada masa SMA,  membuka beberapa foto album lama saat kunjungan kesana, dan berujung pada keputusan untuk menjajaki kerja praktek pada balai perikanan yang pilihannya ada di Sidoarjo, Sukabumi dan Buleleng Bali. Ternyata balai di sidoarjo yg cukup dekat sedang penuh karena memang ada kampus perikanan berdempet dengan balai. Sukabumi kejauhan walau ingin banget mencoba pengalaman hidup di kota lain. Akhirnya pilihan akhir kembali ke kota kelahiran singaraja bali dan melakukan penjajakan kerja praktek di balai perikanan disana dan sedikit kecewa karena hampir ditolak dengan alasan tidak ada topik untuk anak elektronika disana. Berita baiknya ada fasilitas baru kerjasama uni eropa yang super canggih dibangun di ujung tanjung bukit gondol dan saya berhasil menego pihak balai untuk bisa kerja praktek pada fasilitas tropical marine fish farming, dengan syarat saya harus tetap mengikuti kerja praktek standar siswa perikanan selama sebulan dan tidak berhak untuk mengutak-atik alat-alat kontrol yang fresh baru dibuka plastiknya.


Kulit menggelap karena tiap hari berjemur memberi pakan ke tambak dan tempat pembesaran ikan pelari kencang macam ikan kuwe dan red snapper, mengecek perkembangan pembesaran kerapu, memijah ikan dan mengambil gonad/telur ikan, mengecek jenis kelamin ikan, mengumpulkan telur bandeng di malam hari, menghitung banyaknya plankton pada mikroskop dan banyak hal diluar elektronika yang saya kerjakan, padahal didepan mata ada mesin kontrol PLC buatan jerman yang sedang dikonfigurasi oleh seorang bule finlandia  dan karena bahasa inggris saya lumayan bagus jadi mengalami momen "jaka sembung bawa golok". Si bule kurus tinggi ini hanya berbahasa jerman - perancis dan Finish ..lhaa kok finish ? Lomba lari dong ? hehhe benar baru pertama kali melihat bule skandinavia bahasa inggrisnya kacau dan susah di mengerti. Jadilah bahasa tarzan lebih dominan kita gunakan dalam komunikasi sehari-hari.

- Prinsip Dasar


Diujung sebulan menjadi calon petambak handal, saya kembali ke wujud asli sebagai tukang solder dan dengan sekejap mata mendapatkan judul laporan skripsi yaitu alat pembaca tingkat kematangan kultur alga / pithoplankton berbasis mikrokontroler mcs 51 dengan prinsip sensor cahaya terhalang. Kultur alga pada polibag bening ini akan berubah tingkat kegelapannya karena mahluk hidup berfungsi sebagai makanan ikan kecil ini adalah tumbuhan yang berfotosintesis. 


Back to the future pada tahun 2020 saya merangkai alat ini kembali dengan menambahkan prinsip IOT yang nantinya akan mengirim pembacaan sensor ke smartphone. Bisa dilihat pada video dibawah ini dimana merupakan kelanjutan pada praktek membaca ADC ke microsoft excel. Awalnya saya akan mengirim data pembacaan langsung ke PC menggunakan komunikasi serial saja persis dengan pembahasan membikin grafik excel lewat arduino disini. 

 




- Menghubungkan Dengan NBIOT - ANTARES

Beberapa tulisan saya sebelumnya sudah cukup lengkap membahas pengiriman data melalui NBIOT modul SIM7000 ke MQTT dan chart seperti yang dibahas disini. Jadi silahkan menuju pembahasan cara pengiriman data melalui NBIOT dan jangan kecewa kalau dilokasi kalian hanya terdapat sinyal GPRS saja yang bisa dikoneksikan. Sedangkan untuk platform antares saya sampai ke tahapan penggunaan NBIOT dengan ESP8266. Jadi jika menggunakan Antares dan SIM7000 maka yang diwaspadai adalah kemampuan pengolahan data json yang lumayan panjang dan untungnya karena proses sensor kita ini satu arah saja maka menjadi lebih mudah.

Saya akan membagi skripnya dari percobaan saya dan selanjutnya anda bisa melihat pebahasannya pada videonya.



#include <SoftwareSerial.h> //koneksi ke modem

#define TINY_GSM_MODEM_SIM7000
#define TINY_GSM_DEBUG SerialMon
#define BAUD 9600
#define SerialMon Serial

SoftwareSerial SerialAT(2, 3); // RX, TX ke modem

const char apn[]  = "NB1INTERNET"; //untuk gprs gunakan "internet"
const char user[] = "";
const char pass[] = "";
byte randomValue = random(0, 37);
const char *mqtt_server = "mqtt.antares.id"; //server antares
const char *mqtt_user = "";
const char *mqtt_pass = "";
const int mqtt_port = 1883;
const char *mqtt_client_name = "ahocool" + randomValue; // random

//dibawah ini sesuaikan dengan akun atares kamu
#define TOPIKPUB "/oneM2M/req/access:key/antares-cse/json"
#define accessKey "access:key"
#define projDev "Device/project"

// library modem dan mqtt 
#include <TinyGsmClient.h>
#include <PubSubClient.h>

#ifdef DUMP_AT_COMMANDS
  #include <StreamDebugger.h>
  StreamDebugger debugger(SerialAT, SerialMon);
  TinyGsm modem(debugger);
#else

TinyGsm modem(SerialAT);
#endif
TinyGsmClient client(modem);
PubSubClient mqtt(client);

long lastReconnectAttempt = 0;
int val;


void setup()
{
  // Set debug console dan modem
  SerialMon.begin(9600);
  delay(10);
  SerialAT.begin(9600);
  delay(3000);

  String modemInfo = modem.getModemInfo();
  SerialMon.print("Modem: ");
  SerialMon.println(modemInfo);

  SerialMon.print("Waiting for network...");
  if (!modem.waitForNetwork(240000L)) {
    SerialMon.println(" fail");
    delay(10000);
    return;
  }
  SerialMon.println(" OK");

  if (modem.isNetworkConnected()) {
    SerialMon.println("Network connected");
  }

  SerialMon.print(F("Connecting to "));
  SerialMon.print(apn);
    if (!modem.gprsConnect(apn, user, pass)) {
    SerialMon.println(" fail");
      delay(10000);
      return;
  }
  
    SerialMon.println(" OK");


   // MQTT Broker setup
  mqtt.setBufferSize(512);
  mqtt.setServer(mqtt_server, mqtt_port);
}


boolean mqttConnect() {
  SerialMon.print("Connecting to ");
  SerialMon.print(mqtt_server);

  // koneksi ke MQTT Broker
  boolean status = mqtt.connect(mqtt_client_name,mqtt_user, mqtt_pass);

  if (status == false) {
    SerialMon.println(" fail");
    return false;
  }
  SerialMon.println(" OK");

  return mqtt.connected();
}


void loop()
{

  //cek jika koneksi mqtt gagal maka ulang lagi
   if (!mqtt.connected()) {
    SerialMon.println("=== MQTT NOT CONNECTED ===");
    // Reconnect every 10 seconds
    unsigned long t = millis();
    if (t - lastReconnectAttempt > 10000L) {
      lastReconnectAttempt = t;
      if (mqttConnect()) {
        lastReconnectAttempt = 0;
      }
    }
    delay(100);
    return;
  }

  val = analogRead(0);  //baca sensor photodioda
                

  String pubString ;

 //JSON yang panjang untuk kirim data ADC ke antares
    pubString +=  F("{");
    pubString += F("\"m2m:rqp\": {");
    pubString += F("\"fr\": \"");
    pubString += String(accessKey) ;
    pubString += F("\",");
    pubString += F("\"to\": \"/antares-cse/antares-id/");
    pubString += String(projDev);
    pubString += F("\",");
    pubString += F("\"op\": 1,");
    pubString += F("\"rqi\": 123456,");
    pubString += F("\"pc\": {");
    pubString += F("\"m2m:cin\": {");
    pubString += F("\"cnf\": \"message\",");
    pubString += F("\"con\": \"{\\\"level\\\":");
    pubString += String(val);
    pubString += F("}\"");
    pubString += F("}");
    pubString += F("},");
    pubString += F("\"ty\": 4");
    pubString += F("}");
    pubString += F("}");
  
  // kirim atau publish ke antares

  SerialMon.println(pubString);
  char message_buff[pubString.length() + 1];
  pubString.toCharArray(message_buff, pubString.length() + 1);
  mqtt.publish(TOPIKPUB, message_buff);

delay(5000);
}
Penjelasan videonya bisa dilihat pada youtube berikut ini :




telkomsel iot, telkomsel, nbiot, ITS surabaya, ITB Bandung, Telkom antares, Telkom University, elektronika, Kementrian kelautan dan perikanan, susi pudjiastuti, eddy prabowo, deddy corbuzier
Share:

Kamis, 02 Juli 2020

The Coolest Way To Visualize VU Meter From Arduino to Microsoft Excel



On this tutorial i will try to show you how cool is python if combined with arduino, as i've already wrote on previous blogs Here dan Here . Sorry since i was writing only in Bahasa so please use google translate for your convenience and now i would like to write in english and i hope you'll understand.

First prepare some components from this schematic for amplifier part, the purpose is to create audio signal gain (from condenser mic) which is too weak for arduino's ADC to read from. 

Since we only want to read the signal's voltage so we can skip loud speaker part, but if you want to hear some poor noisy sound then it is up to you. Pin no 5 of LM386 can directly feed into any arduino ADC pin and the power supply can directly connected to 5 volt on arduino. The Script is quite simple as i only copy and paste from arduino's ADC example scripts collection.


int analogPin = A0; // Any ADC Pin on ardiuno
                    
int val = 0;  // variable to store the value read

void setup() {
  Serial.begin(9600);           //  setup serial
}

void loop() {
  val = analogRead(analogPin);  // read the input pin
  Serial.println(val);          // send value to serial
  delay(100);   // 100 ms delay is the best, try other number
}
That is one simple scripts, i only use hardware serial directly connecting to USB COM port then the python will do the rest. Xlwings library is a simple tools to write and read directly to any excel 'cell' so then the graph chart on excel can becoming "alive" in real time if the data is changed rapidly. 


import serial #serial library
import xlwings as xw #excel library

wb = xw.Book('Audio.xlsx') #file name, change accordingly
sht = wb.sheets['data'] #sheets name, change it depend on your excel
row = 1

serialPort = serial.Serial(port = "COM4", baudrate=9600,   #baudrate
                           bytesize=8, timeout=2, 
                           stopbits=serial.STOPBITS_ONE)

serialString = ""   

while(1):
    if(serialPort.in_waiting > 0): #read if any serial data is coming
        serialString = serialPort.readline()
        data=serialString.decode('utf-8')     
        print(data) 
        if row == 51: #reset the row
          row=2 
        else: 
          row=row+1
        audio='A'+str(row) #new cell
        sht.range(audio).value= float(data) #write cell

The scripts read the integer value from ADC readout which is sent by arduino, then write it rapidly on cell A2 until A51 in excel file. The graph will be "dancing" according to the sound wave traveling through the condenser microphone.



As microsoft excel is easy to use or to customize then you can create any chart or graph you like and can be use as simple visualization as long as the data speed is not very fast, eg: Heart Beat or ECG.





 I hope you understand and happy Visualizing your favorite music on Excel


Naya Marie Rivera , naya rivera, glee, @nayarivera, missing
Share:

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:

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 :


  1. Raspbery Pi Sebagai MQTT Broker Publik
  2. Geopy Library Python Untuk GIS
  3. Bermain GPS Jadul - Part 1
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.

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


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


- Inisialisasi Python  (raspberry pi)


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

Kontak Penulis



12179018.png (60×60)
+628155737755

HP: 081331339072
Mail : ahocool@gmail.com

Site View

Categories

555 (6) 7 segmen (3) adc (4) amplifier (2) analog (10) android (11) antares (3) arduino (14) attiny (1) attiny2313 (17) blog (1) bluetooth (1) cmos (2) crypto (2) dasar (35) display (3) esp8266 (3) gcc (1) iklan (1) infrared (2) Input Output (3) iot (16) jam (6) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (12) komputer (3) komunikasi (1) kontrol (4) lain-lain (8) lcd (2) led (9) led matrix (6) line tracer (1) lm35 (1) memory (1) metal detector (4) microcontroller (55) mikrokontroller (7) mikrotik (5) ninmedia (2) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (38) pcb (2) praktek (2) project (33) proyek (1) python (1) radio (3) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (1) sharing (3) signage (1) sinyal (1) sms (6) software (18) tachometer (2) telepon (7) televisi (72) television (5) transistor (1) troubleshoot (3) tulisan (59) tutorial (78) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika