"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 praktek. Tampilkan semua postingan
Tampilkan postingan dengan label praktek. Tampilkan semua postingan

Rabu, 22 Juli 2020

Cara Mudah Belajar MODBUS - Komunikasi Industri Jaman dulu [part 5 -End] Modbus vs Antares.id



Belum lengkap rasanya kalau saya belum mencoba praktek modbus yang telah lengkap piramida IOT nya kedalam platform IOT lokal yaitu ANTARES by telkomiot. Tentunya pembaca yang ingin mengikuti pembahasan kali ini diharapkan membaca penelusuran saya dengan Antares vs ESP 8266 disini dan disini. Masih dengan rangkaian yang sama kita akan mencoba mengirim data pembacaan sensor modbus dan juga menunggu perintah dikirimkan dari antares ke sensor modbus yang saya buat menggunakan arduino.


Dari standar OneM2M yang digunakan antares maka ada ketentuan data MQTT yang di publish dan subscribe hanya terbatas pada 2 topik berikut :


PUBLISH  TOPIC :
/oneM2M/req/access:key/antares-cse/json

SUBSCRIBE TOPIC :
/oneM2M/resp/antares-cse/access:key/json



Data yang dikirim / PUBLISH berupa JSON dimana polanya harus sesuai dimana data apapun yang akan dikirim ke Antares merupakan isi dari dalam "con" :

{
  "m2m:rqp": {
    "fr": "access:key",
    "to": "/antares-cse/antares-id/project-name/device-name",
    "op": 1,
    "rqi": 123456,
    "pc": {
      "m2m:cin": {
        "cnf": "message",
        "con": "{\"data\":\"value\"}"
      }
    },
    "ty": 4
  }
}

Jadi script publish mqtt menggunakan function atau routine sebagai berikut :


   void kirim(String tombol, String suhu, String humi) // kirim 3 item sekaligus
{
    Serial.println("publish to antares topik: " );
    Serial.print(TOPIKPUB);
    Serial.print(" : ");
    Serial.println(tombol + " - " + suhu + " - " + humi );
    
    String pubString ;  //isi json pub message yg super panjang
    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\": \"{\\\"tombol\\\":");
    pubString += tombol;
    pubString += F(",\\\"suhu\\\":");
    pubString += suhu;
    pubString += F(",\\\"humidity\\\":");
    pubString += humi;
    pubString += F("}\"");
    pubString += F("}");
    pubString += F("},");
    pubString += F("\"ty\": 4");
    pubString += F("}");
    pubString += F("}");

   // kirim ke topik TOPIKPUB
   char message_buff[pubString.length() + 1];
   pubString.toCharArray(message_buff, pubString.length() + 1);
   client.publish(TOPIKPUB,message_buff);
  
}

    




Untuk menunggu request dari antares harus diperhatikan yang diterima melalui callback merupakan JSON juga lhooo...jadi kalau mumet sebaiknya dihentikan segera melanjutkan membaca blog ini!

 {
   "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" : "access:key",
      "fr" : "/antares-cse"
   }
}


Untuk mengolah data request dari antares maka ESP8266 akan melakukan parsing JSON dari payload MQTT dengan menggunakan library ARDUINO JSON


    DynamicJsonDocument doc(512);
    deserializeJson(doc, message);
    String parsedString = doc["m2m:rsp"]["pc"]["m2m:cin"]["con"]; //pertama cari isi con
    deserializeJson(doc, parsedString);
    String lednya = doc["led"]; //kedua cari isi led on apa off
    Serial.println("lednya : " + lednya);
    

Jadi untuk mendapatkan isi dari message led "on" atau "off" maka diperlukan 2 kali parsing json karena isi dalam "con" juga di syaratkan sebagai JSON. Kenapa begitu? Ya karena itulah standar onem2m yang digunakan jadi harus diikuti saja.




Selengkapnya bisa dilihat pada video berikut ini 



Script lengkap :


// by www.aisi55.com please attach our credential if you using our script
#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

SoftwareSerial mod(4, 5); // RX, TX

const char *ssid =  "nama wifi";  
const char *pass =  "password";

const char *mqtt_server = "mqtt.antares.id";
const int mqtt_port = 1883;
const char *mqtt_user = "";
const char *mqtt_pass = "";
const char *mqtt_client_name = "ahocool1265352";  
//sesuaikan dengan parameter akun antares kamu
#define TOPIKPUB "/oneM2M/req/access:key/antares-cse/json"
#define TOPIKSUB "/oneM2M/resp/antares-cse/access:key/json"
#define accessKey "access:key"
#define projDev "Project_name/Device_name" WiFiClient wclient; PubSubClient client(wclient); byte ledOn[] = {0x05, 0x05, 0x00, 0x00, 0xFF, 0x00, 0x8D, 0xBE};
//ngidupin Led byte ledOff[] = {0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x4E};//matikan Led byte tombol[] = {0x05, 0x02, 0x00, 0x00, 0x00, 0x01, 0xB8, 0x4E};//tombol byte tombolL[] = {0x05, 0x02, 0x01, 0x00, 0xa0, 0xB8}; // tombol Low byte tombolH[] = {0x05, 0x02, 0x01, 0x01, 0x61, 0x78}; // tombol High byte humitemp[] = {0x05, 0x04, 0x00, 0x00, 0x00, 0x03, 0xB1, 0x8F};//baca dht11 byte dhtOK[] = {0x05, 0x04, 0x06} ; byte bufferDataModbus[50]; byte *ptr; bool urut= false; bool led= false; unsigned long previousMillis = 0; String suhunya ="0"; String huminya ="0"; String tomb ="0"; void setup() { Serial.begin(9600); Serial.println(F("ESP8266 Modbus Bridge to ANTARES")); Serial.println(F("http://www.aisi555.com")); Serial.println(); if (WiFi.status() != WL_CONNECTED) { Serial.print("Connecting to Wifi: "); Serial.print(ssid); Serial.println("..."); WiFi.begin(ssid, pass); if (WiFi.waitForConnectResult() != WL_CONNECTED) return; Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } mod.begin(9600); ptr = bufferDataModbus; client.setServer(mqtt_server, mqtt_port); client.setCallback(mqtt_callback); } 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: "); Serial.println(TOPIKSUB); client.subscribe(TOPIKSUB); } } void kirim(String tombol, String suhu, String humi) { Serial.println("publish to antares topik: " ); Serial.print(TOPIKPUB); Serial.print(" : "); Serial.println(tombol + " - " + suhu + " - " + humi ); String pubString ; 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\": \"{\\\"tombol\\\":"); pubString += tombol; pubString += F(",\\\"suhu\\\":"); pubString += suhu; pubString += F(",\\\"humidity\\\":"); pubString += humi; pubString += F("}\""); pubString += F("}"); pubString += F("},"); pubString += F("\"ty\": 4"); pubString += F("}"); pubString += F("}"); char message_buff[pubString.length() + 1]; pubString.toCharArray(message_buff, pubString.length() + 1); client.publish(TOPIKPUB,message_buff); } void loop() { if (!client.connected()) { reconnectmqtt(); } else client.loop(); //cek terus kalau ada data masuk unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= 5000) { // save the last time you read the sensor previousMillis = currentMillis; if(!urut )mod.write(tombol, sizeof(tombol)); else mod.write(humitemp, sizeof(humitemp)); urut =!urut; } long millisResponModbus = millis() + 1000; while (!mod.available()) { if (millisResponModbus < millis()) { break;//timeout } } while (mod.available()) { byte b = mod.read(); *ptr++ = b; Serial.print("0x"); Serial.print(String(b, HEX)); Serial.print(" "); delay(2); } if (memcmp(bufferDataModbus, ledOn, sizeof(ledOn)) == 0) { ptr = bufferDataModbus; memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus)); } else if (memcmp(bufferDataModbus, ledOff, sizeof(ledOff)) == 0) { ptr = bufferDataModbus; memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus)); } else if (memcmp(bufferDataModbus, tombolL, sizeof(tombolL)) == 0) { ptr = bufferDataModbus; tomb="0"; kirim(tomb,suhunya,huminya); memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus)); } else if (memcmp(bufferDataModbus, tombolH, sizeof(tombolH)) == 0) { ptr = bufferDataModbus; tomb="1"; kirim(tomb,suhunya,huminya); memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus)); } else if (memcmp(bufferDataModbus, dhtOK, sizeof(dhtOK)) == 0) { ptr = bufferDataModbus; suhunya = String(ptr[4]) + '.' +String(ptr[6]) ; huminya = String(ptr[8]); kirim(tomb,suhunya,huminya) ; memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus)); } else { ptr = bufferDataModbus; //Serial.println(""); memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus)); } } 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]; //Conver *byte to String } // Serial.print(message); //kepanjangan makanya di tutup DynamicJsonDocument doc(512); deserializeJson(doc, message); String parsedString = doc["m2m:rsp"]["pc"]["m2m:cin"]["con"]; deserializeJson(doc, parsedString); String lednya = doc["led"]; Serial.println("lednya : " + lednya); if(lednya == "on") { mod.write(ledOn, sizeof(ledOn)); Serial.println("lednya hidup"); } if(lednya == "off") { mod.write(ledOff, sizeof(ledOff)); Serial.println("lednya mati "); } Serial.println(); Serial.println("-----------------------"); }

Share:

Selasa, 09 Juni 2020

[Praktek Gampang] Jam di TV dengan Arduino - Part 2 - ESP8266-01 NTP

Ini merupakan kelanjutan dari pembahasan Jam TV part1 dan merupakan bagian yang paling penting untuk mendapatkan waktu yg akurat. Umumnya para desainer elektronika yg membutuhkan pewaktu akan menggunakan RTC baik yg jadul paralel DS12887 atau yg sangat murah RTC serial/i2c DS1807. Penulis sangat benci menggunakan RTC karena ketidak akuratannya yg akan melenceng seiring waktu. Bahkan tidak pernah menggunakan RTC dalam proyek apapun karena selalu menggunakan timer internal dari AVR seperti yg pernah saya bahas secara gamblang disini. Karena sekarang saya menggunakan timer secara khusus untuk timing raster tv maka akan mengganggu library tvout nya. Untuk itu saya menggunakan NTP atau network time protocol yang kekauratatnnya teruji untuk penggunaan komputer. Menurut wikipedia....

Network Time Protocol (NTP) adalah sebuah protokol yang digunakan untuk pengsinkronan waktu di dalam sebuah jaringan bisa pada jaringan LAN (Local Area Network) maupun pada jaringan internet dan untuk sinkronisasi jam-jam sistem komputer di atas paket-switching, variabel-latency jaringan data. Proses sinkronisasi ini dilakukan didalam jalur komunikasi data yang biasanya menggunakan protokol komunikasi TCP/IP. Sehingga proses ini sendiri dapat dilihat sebagai proses komunikasi data yang hanya melakukan pertukaran paket-paket data saja.

NTP menggunakan port komunikasi UDP nomor 123. Salah satu contoh NTP server yg bisa dicoba adalah  ntp.bmkg.go.id  dan banyak lagi NTP server lainnya. Data yg diberikan oleh server NTP berupa elapsed second sejak tahun 1900. Komputer pada umumnya menggunakan unix / epoch time yg dihitung mulai 1 januari 1970,  jadi butuh perhitungan mengurangi data yg diterima sebanyak 2208988800 . Wow lumayan besar angkanya jadi kita akan terbiasa dengan format angka Unsigned Long. Untuk mempelajari prinsip epoch, unix time, dan NTP bisa baca di epochconverter.com .

- ESP8266 / ESP-01


Modul murah meriah ESP8266 merupakan penggerak utama dari perkembangan IOT di dunia sejak 10 tahun lalu. Bagaimana tidak hampir semua alat ber-wifi menggunakan platform yg sama dan membuat saya heran karena harganya super murah. Gak habis pikir deh berapa nilai keuntungan yg diambil oleh espressif ? Sebagai jebolan pabik komponen jadi ingat kalau pabrik di china bisa sampai menekan harga dan mengambil untung hanya 1 sen untuk tiap produknya, dengan catatan order  ke mereka main kuantitas besar. Ahh jangan dibahas lah kalau lawan industri china, kita di Indonesia hanya bisa lihat dan impor saja, bermimpi kembali ke jaman 80-90an dimana ada pabrik komponen yg pabriknya lokal jawa timuran.

Gambar Yang saya tampilkan diatas merupakan interfacing / hubungan antara ESP yg berlevel tegangan 3.3 volt dengan Arduino dengan level 5 volt. Pembagi tegangan menggunakan resistor bisa ditambahkan untuk keamanan, tapi menurut saya sudah bertahun-tahun level uart TTL bisa langsung dipake ke uart 3.3 volt asal jangan sampai tegangan supplynya / vcc aja sampe salah. 

Baudrate UART dari ESP pada umumnya di set 115200 dan menggunakan perintah AT command seperti halnya pada modul GSM SIM800. Anda bisa mencobanya dengan USB UART dan terminal yang memiliki fasiitas penambahan "CR" pada akhir command. Jadi jangan gunakan putty secara polos ya, gunakan monitor uart pada arduino atau Real Term daripada bingung karena Putty tanpa respond  hanya keluar tulisan " Ready". 

-Library ESPWiFi mode AT COMMAND



Kita lanjut pembahasan bagaimana interfacingnya modul ESP01 ini ke arduino dan penulis sangat terkejut bahwa library dari ESP yg dengan firmware AT "WiFiEsp" sudah memiliki fasilitas NTP-UDP siap pakai. Wahh tinggal copy paste ini sepertinya dan benar saja dari kumpulan script example bisa kita langsung dapatkan hasil yang memuaskan.

Untuk mengubah data waktu EPOCH dengan hasil yg lebih spesifik (hari tanggal bulan tahun) maka kita perlu menambahkan libary pengolah kalender "TimeLib.h". Ini karena pada library WiFiEsp tidak ada fasilitas pengolahan data EPOCH nya. Modifikasi saja pada script sesuai contoh berikut:

if (Udp.parsePacket()) {
    Serial.println("packet received");
    // We've received a packet, read the data from it into the buffer
    Udp.read(packetBuffer, NTP_PACKET_SIZE);

    // the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    Serial.print("Seconds since Jan 1 1900 = ");
    Serial.println(secsSince1900);

    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears + 25200; //offset +7
    // print Unix time: Indonesia + 7 WIB
    Serial.println(epoch);

   
    // print the hour, minute and second , ini mode libraru standar
    Serial.print("Waktu WIB (+7) = ");       // WIB +7
   Serial.print(( epoch % 86400L) / 3600); // print the hour 
    Serial.print(':');
    if (((epoch % 3600) / 60) < 10) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute 
    Serial.print(':');
    if ((epoch % 60) < 10) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch % 60); // print the second
  
  // dibawah ini penggunaan TimeLib.h yang lebih singkat

    char buffer[100] ;
sprintf(buffer, "  Tanggal : %4d-%02d-%02d", year(epoch), month(epoch),day(epoch));
    Serial.println(buffer);
  } 



- Mengubah ESP01 menjadi Berbasis Arduino 


Kelanjutan pembahasan saya kali ini alur ceritanya maju kedepan saat kegagalan mencoba Wifi + NTP + TVOUT gara-gara critical timingnya. Jadi saya perlu mendapatkan parameter waktu tanpa mengganggu timer 16 bit nya atmega328 dan ini sangat mustahil. Awalnya saya berpikir menggunakan Software Serial untuk mengambil data vi AT command, akan tetapi layar TV langsung blank. Jadi Mau tidak mau harus menggunakan jalur komunikasi lainnya yg memungkinkan, dan benar saja GPIO dari ESP8266/01 ini ada 2 buah yg GPIO 0 dan 2, jadi cukup lah untuk menjadikannya port I2C ( SDA dan SCL). Namun saya perlu merangkai flashernya agar bisa diprogram melalui sketch arduino.




Cara flashingnya  dengan urutan :  Menekan 2 Tombol Flash + Reset , kemudian lepas tombol Reset dan tombol Flash tetap ditekan , ditandai dengan led esp warna biru kedip sekali. Nah selanjutnya anda bisa menekan Upload pada sketch seperti biasanya. Pembahasan I2C untuk mengirim data kalender akan dibahas pada tulisan berikutnya.  Anda bisa mencoba menggunakan ESP01 untuk menerima data NTP dan menampilkan pada serial port / debug port seperti script dibawah.

#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char *ssid     = "Nama Wifi";
const char *password = "Passwordnya";

const long utcOffsetInSeconds =  25200; //offset +7 WIB

char daysOfTheWeek[7][12] = {"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};

// NTP lokal aja yg dipake, ubah kalau mau

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ntp.bmkg.go.id", utcOffsetInSeconds);

void setup(){
  Serial.begin(9600); 

  WiFi.begin(ssid, password);

  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }

  timeClient.begin();
}

void loop() {
  timeClient.update();

  Serial.print(daysOfTheWeek[timeClient.getDay()]);
  Serial.print(", ");
  Serial.print(timeClient.getHours());
  Serial.print(":");
  Serial.print(timeClient.getMinutes());
  Serial.print(":");
  Serial.println(timeClient.getSeconds());
  
  delay(1000);
}


Lalu bagaimana menggabungkan Jam TV menggunakan Arduino dengan ESP8266-01 sebagai pengirim  NTP ? Bisa dibaca 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