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

Selasa, 20 April 2021

[ Node-RED ] Komunikasi ke sensor menggunakan MQTT


Blog ini sudah banyak membahas MQTT terutama sejak 2 tahun lalu saat saya mulai melirik barang yang bernama IOT. Bagi kalian yang baru beralih dari microcontroller 8 bit ke dunia IOT atau kebalikannya  seorang IT programmer yang ingin berkecimpung di dunia 8 bit, mungkin ini suatu keputusan yg akan membingungkan. Jangan salah langkah deh pokoknya, lalu mulai dari mana sih ? Jadi saran saya adalah :


  • Jika anda pecinta elektronika, skema belajar yg tepat adalah Serial Com=>MQTT => Python => Node-RED
  • Jika anda seorang praktisi IT maka kebalikannya  Node-RED => MQTT => Arduino => Serial com

Jadi seperti saya ini yg pecinta dunia 8 bit, maka sudah tepat sekali menghindari Node-RED di awal belajar, karena akan mengalami kesulitan mengikuti logika Flow diagramnya. Sehingga saat saya sudah menguasai betul- betul MQTT sampai ke level advance ( bisa dibaca disini ), saat menghadapi Node-RED yang tinggal Drag-Drop maka akan sangat dimudahkan.



Untuk melanjutkan project MQTT pada Node-RED sebaiknya baca terlebih dahulu praktek MQTT sebelumnya pada pembahasan saya 2 tahun yang lalu : https://www.aisi555.com/2019/10/iot-lebih-lanjut-dengan-mqtt.html .

Dengan rangkaian yg masih sama dengan praktek sebelumnya, kita akan mebutuhkan modul esp8266 sebagai jembatan ke TCP/IP  menggunakan wi-fi. Sehingga akan lebih mudah jika menggunakan WeMos D1 dan sejenis. Jika tidak maka tinggal disesuaikan saja sesuai perangkat yg ada. Script yg dulu kita bahas 2 tahun yg lalu kita modifikasikan seperti ini, menggunakan DHT 22 dan 7 segmen komon katoda.



#include <DHT.h>
#include <ESP8266WiFi.h> //library esp 8266
#include <PubSubClient.h> //library MQTT pubsub client


const char *ssid =  "wifiku";   // nama AP wifi dirumah
const char *pass =  "passwordku";   
//server atau broker MQTT gratis
const char *mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char *mqtt_user = "";
const char *mqtt_pass = "";
const char *mqtt_client_name = "ahocool123"; 
//topik yang akan dituju
#define SUHUTOPIC "/test/suhu" 
#define HUMITOPIC "/test/kelembaban"
#define SEGTOPIC "/test/seg"

//Constants
#define DHTPIN 13     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino

//7seg

#define SEGA 16
#define SEGB 5
#define SEGC 4
#define SEGD 14
#define SEGE 12
#define SEGF 0
#define SEGG 2

//timer dht22
unsigned long previousMillis = 0;
const long interval = 5000;  

//Variables
float hum;  //Stores humidity value
float temp; //Stores temperature value

int incomingByte = 0; // for incoming serial data

//inisialisasi klien wifi vs Mqtt
WiFiClient wclient;
PubSubClient client(wclient);

void setup()
{

    pinMode(SEGA, OUTPUT);
    pinMode(SEGB, OUTPUT);
    pinMode(SEGC, OUTPUT);
    pinMode(SEGD, OUTPUT);
    pinMode(SEGE, OUTPUT);
    pinMode(SEGF, OUTPUT);
    pinMode(SEGG, OUTPUT);

    client.setServer(mqtt_server, mqtt_port);
    client.setCallback(mqtt_callback);
    
    Serial.begin(9600);
    setupwifi();
    dht.begin();

}

void setupwifi()  
{
   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());
  }
}

void reconnectmqtt()  //ngecek broker KQTT 
{
   
    
      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(SEGTOPIC);
      client.subscribe(SEGTOPIC); //subscribe ke topic 7 segmen
    }  
  
}


void segmen(int angka)
{
 
   switch(angka) {
                  case 0 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, HIGH);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, LOW);
                             break;
                  }
                  case 1 : { digitalWrite(SEGA, LOW);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, LOW);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, LOW);
                             digitalWrite(SEGG, LOW);
                             break;
                  }
                  case 2 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, LOW);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, HIGH);
                             digitalWrite(SEGF, LOW);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }
                  case 3 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, LOW);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }
                  case 4 : { digitalWrite(SEGA, LOW);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, LOW);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }

                  case 5 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, LOW);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }                                                          
                  case 6 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, LOW);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, HIGH);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }
                  case 7 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, LOW);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, LOW);
                             digitalWrite(SEGG, LOW);
                             break;
                  }
                  case 8 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, HIGH);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }
                  case 9 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }
   }
}
void loop()
{
   if (!client.connected())  //ngecek koneksi ke broker
   {
    reconnectmqtt();
   }
   else client.loop(); //cek terus kalau ada data masuk
  
    
    
    
    unsigned long currentMillis = millis();
 
   if(currentMillis - previousMillis >= interval) {
    // save the last time you read the sensor 
    previousMillis = currentMillis;   
    
    //Read data and store it to variables hum and temp
    hum = dht.readHumidity();
    temp= dht.readTemperature();
    //Print temp and humidity values to serial monitor
    Serial.print("Humidity: ");
    Serial.print(hum);
    Serial.print(" %, Temp: ");
    Serial.print(temp);
    Serial.println(" Celsius");
   
    String pubStringt = String(temp);
    String pubStringh = String(hum);
    

    Serial.println("publish to topic: " );
    Serial.print(SUHUTOPIC);
    Serial.print(" : ");
    Serial.println(pubStringt);
    char message_bufft[pubStringt.length() + 1];
    pubStringt.toCharArray(message_bufft, pubStringt.length() + 1);
    client.publish(SUHUTOPIC,message_bufft );

    Serial.println("publish to topic: " );
    Serial.print(HUMITOPIC);
    Serial.print(" : ");
    Serial.println(pubStringh);
    char message_buffh[pubStringh.length() + 1];
    pubStringh.toCharArray(message_buffh, pubStringh.length() + 1);
    client.publish(HUMITOPIC,message_buffh );
   
   
   }


}
   // call back untuk SUBSCRIBE topik 7 segmen
void mqtt_callback(char* topic, byte* payload, unsigned int length) {
 
  Serial.print("Message arrived in topic: ");
  Serial.println(topic);
 
  Serial.print("Message:");
  //ada SUB masuk
  String message;
  for (int i = 0; i < length; i++) {
    message = message + (char)payload[i];  //Conver *byte to String
  }
   Serial.print(message);
  //ubah tampilan 7 segmen
  if(message == "SEG1") {segmen(1); }
  if(message == "SEG2") {segmen(2); }
  if(message == "SEG3") {segmen(3); }
  if(message == "SEG4") {segmen(4); }
  if(message == "SEG5") {segmen(5); }
  if(message == "SEG6") {segmen(6); }
  if(message == "SEG7") {segmen(7); }
  if(message == "SEG8") {segmen(8); }
  if(message == "SEG9") {segmen(9); }
  if(message == "SEG0") {segmen(0);}
}


   


Saya memilih broker MQTT di internet yg opensource dan gratis yaitu htp://broker.hivemq.com dengan port 1883. Jika tidak ada internet di rumah anda dapat menginstall Mosquitto pada PC berbasis linux atau raspberry pi. Penjelasannya dapat dibaca disini : https://www.aisi555.com/2020/05/iot-geopy-sebagai-pengolah-data-gis.html . Jadi jika hardware sudah terhubung dan kita ingin mengetest koneksi PUBLISH dan SUBSCRIBE nya , dapat menggunakan software MQTT FX di pc windows anda.


Setting parameter Broker :



PUBLISH message ke TOPIC di Broker


SUBSCRIBE Topic ke broker dan melihat outputnya berupa suhu dan kelembaban.


Setelah hardware arduino / wemos terhubung dengan sukses ke Broker dan bisa dilakukan kontrol terhadapnya, maka di sisi Node-RED kita perlu menambahan Node MQTT dengan perintah pada command prompt seperti berikut :

npm install node-red-contrib-mqtt-broker

Dan kita bisa langsung melakukan drag-drop node MQTT in seperti gambar dibawah ini :




Karena HiveMq sangat sederhana dan tanpa security, maka dengan setup seperti diatas kita bisa melakukan subscribe pada topic yang diinginkan , seperti  contoh yg kita pakai di topik : /test/suhu :


 
Dan kita bisa menghubungkan MQTT input ke debug sehingga dapat melihat pesan yang masuk.



Tambahkan juga untuk topik :  /test/kelembaban 



Untuk proses PUBLISH yang bertujuan ingin merubah 7 segmen maka Node-RED melakukan PUB ke topik  /test/seg , kita gunakan 10 injector saja untuk memudahkan mengirim string " SEG0 - SEG9 " ke MQTT broker.



Dan hasilnya bisa dilihat pada monitor serial di Arduino lanjut bisa dilihat pula pada display 7 segmen.





Nahh..mudah bukan ? Untuk menghadirkan tampilan yang lebih interaktif pada WEB UI seperti pada pembahasan sebelumnya ( disini ) , maka kita cukup mengganti input port serial menjadi MQTT, kemudian 7 segmennya saya tambahkan drop down menu seperti gambar dibawah :






Tampilannya pun cukup menarik sebagai interface otomasi perangkat IOT di rumah anda.




Wew ...kerennn....Lanjut ke Node-RED vs MODBUS ya pada pembahasan selanjutnya.
Share:

[ Node-RED ] Hello World Dari Pecinta IC Micro 8 bit - Part 2

 




Semangat yg ingin dibangun dari platform Node-RED adalah bagaimana alat kontrol yg sudah ada sebelumnya kini bisa menjadi terhubung secara IOT. Itulah yg menjadi latar belakang dimana orang yg berkecimpung dalam dunia kontrol, PLC, Modbus , dan sebagainya,  kini sudah dilibas juga oleh para opreker IT dengan iming-iming jargon industri 4.0. Tapi kenyataannya memang seperti itu di era setelah 2010 dimana dunia elektronika-kontrol mulai di gabungkan oleh platform hardware opensource dari eranya Arduino - Raspberry pi , hingga protokol komunikasi gratisan nan tangguh seperti MQTT. 

Bagi insinyur yang mulai memasuki masa senja tidak perlu berkecil hati karena Node-RED menyediakan segala kemudahan, tidak lebih susah dibanding saat mempelajari bahasa assembly. Hanya butuh pengenalan disisi programming berbasis web, dimana Node-RED menggunakan Java /Node JS sebagai pembuat server di PC atau raspberry pi. Jadi tidak perlu lagi menginstall PHP TRIAD jaman dulu atau database mySql yg susah itu, kini cukup hanya dengan menginstall package Node bernama dashbord maka kita bisa membuat UI (User Interface) berbasis web sebagai IO ke perangkat yang ingin kita kontrol. 



Langkah pertama untuk membuat UI yang cantik seperti gambar diatas adalah menginstall melalui command prompt :


npm i node-red-dashboard


Selanjutnya kita akan meneruskan praktek Hello World bagian pertama ( baca disini ) , dan kita akan mengontrol display 7 segmen dari UI Node-RED. 




Yang perlu diperhatikan dalam Node-RED adalah format pesan yg dialirkan melalui flow di tiap node adalah berupa JSON yang merupakan standar format komunikasi dalam Node JS / Java. Jadi pesan serial yg diterima PC melalui com port seperti berikut :


{"payload":"Humidity: 79.10 %, Temp: 28.70 Celsius\r\n","port":"COM17","_msgid":"1a33573e.67c289"}


Sehingga untuk menerima data ASCII nya yg dikirim arduino harus melakukan parsing JSON pada "payload" ( msg.payload).



Kembali ke praktek pembuatan UI web dari Node-RED, saya akan melakukan hello world ke UI dengan menuliskan pembacaan serial com port ( yg dikirim arduino sebagai suhu dan kelembaban). perhatikan gambar berikut :


Saya akan menempatkan text pada web UI dan meghubungkannya ke seral COM17 dari PC saya. Untuk itu saya butuh melakukan seting UI nya dengan pertama membuat UI GROUP sebagai canvas untuk menempatkan elemen web nya seperti text, form, grafik dan lain sebagainya.




Dari gambar diatas jangan lupa butuh meng-create nama dan tab dari group UI yg ingin ditampilkan dan hasilnya seperti gambar dibawah ini, web UI dapat diakses pada alamat : http://localhost:1880/ui .



Untuk membuat lebih cantik saya akan menambahkan item berupa gauge (meteran) dan grafik pada web UI, namun perlu melakukan parsing payload sehingga butuh script untuk mendapatkan angka suhu dan kelembaban nya saja. Saya menambahkan FUNCTION node pada flow seperti gambar dibawah :



Isi script pada function bernama temp adalah parsing nilai temperature seperti berikut :



Kita ingat payload string ascii yg dikirimkan arduino ber format seperti berikut :


Humidity: 79.10 %, Temp: 28.70 Celsius


Jadi parsingnya suhu pada karakter  25-29 dan kelembaban pada karakter 10-14. Script diatas berformat java dan hasil akhirnya mengembalikan nilai angka dalam format JSON.


Kemudian pada node gauge kita seting tampilan seperti berikut :



Saya juga menambahkan chart / grafik untuk nilai dari kelembaban. Hasil dari web UI nya seperti berikut :




Nah..bagaimana dengan kontrol 7 segmen dari web UI ? Saya akan menambahkan Slider yang kita bisa geser pada web UI dan otomatis mengirimkan ascii serial ke arduino dan mengubah 7 segmen.



 

Jangan lupa kalau data yg dikirimkan ke comport berupa ASCII karakter jadi topic yg dikirimkan harus sesuai. hasilnya bagaimana ? bagus kok ...



Bagaimana ? Tertarik untuk mengoprek lebih lanjut ? Tunggu tulisan saya berikutnya yaa....

Share:

Senin, 19 April 2021

[ Node-RED ] Hello World Dari Pecinta IC Micro 8 bit - Part 1

 


Tidak ada kata terlambat sesuai pepatah "Old Soldier Never Die", padahal Node-RED telah saya install di PC yang saya gunakan sejak 3 tahun yg lalu. Kenapa saya tinggalkan saat awal menekuni dunia IOT? Ya karena Node-RED terlalu "IT minded" seperti bahasa asing yang bagi mereka para opreker yang terbiasa menggunakan bahasa assembly 8 bit akan menjadi keder juga dibuatnya. Namun di 2021 "Racun" diberikan oleh teman dosen otomasi industri di UK Petra surabaya, dimana mahasiswanya kebanyakan mengembangkan Node-RED dalam meraih ilmu industri 4.0 , dan akhirnya saya pun menyerah dan berusaha catch up dengan anak muda gen-Z yg mulai menjauh dari generasi pre-milenial yang sedikit canggung ketika meninggalkan dunia 8 BIT.

Sepertinya dulu jaman saya kuliah teknik pengaturan / kontrol sangat benci terhadap "FLOW DIAGRAM" karena tidak seperti kabel yg sangat jujur memberitahu arah dan tujuan sinyal kemana, namun flow diagram entah kenapa sangat disukai para engineer berbasis kontrol. Jadi Node-RED adalah kompromi antara dunia KONTROL dengan INFORMATIKA, dan lahirlah sesuatu yang bagi insinyur elektronika sedikit menjelimetkan karena harus dipahami :


  • Node-RED itu membuat sistem IOT standalone berbasis prosesor minimal 32 bit 
  • Node-RED itu Node JS / Java yang membutuhkan minimum system ber - OS Linux/windows
  • Node-RED layaknya membuat web server sederhana untuk kontrol perangkat IOT 
  • Node-Red tidak bisa langsung untuk arduino, jadi microcontroller 8 bit hanya sebagai perantara menuju sensor dan I/O lainnya


Untuk mempersingkat waktu, kita akan loncat ke praktek sesungguhnya yaitu berusaha membuat Hello World menggunakan pembacaan sensor suhu kelembaban DHT 11 /22 yang sudah sangat sering saya bahas. Disisi output saya akan menggunakan 7 segmen  yang nantinya akan dikendalikan oleh Node-RED. Jadi sebelumnya pastikan hardware anda mirip dengan setup yg saya gunakan:


  • Windows PC : Win 7 minimum, Node Js + Node-RED bisa diinstal secara open source
  • Arduino atau Wemos 
  • DHT 11 /22
  • Seven Segmen komon katoda/negatif





Jika instalasi Node-RED sukses maka anda dapat mengaksesnya melalui alamat browser  http://localhost:1880 , dan perlu diperhatikan bahwa semua proses editing dan programming dilakukan melalui web browser. 





Gambar rangkaian diatas sangat umum saya bahas di blog ini, jadi anda yg rajin mengikutinya akan tidak mengalami masalah berarti, dimana scriptnya cukup sederhana membaca DHT11 tiap selang beberapa waktu dan kemudian mengirimkan datanya secara serial ke PC. Lalu PC dapat mengirimkan data kembali ke arduino untuk mengontrol display 7 segmen. Scriptnya saya bagikan seperti dibawah ini :



#include <DHT.h>

//pengaturan port DHT11
#define DHTPIN 9     // PIN 9
#define DHTTYPE DHT11   // DHT 11  sesuaikan yg anda pakai
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino

//7seg

#define SEGA 2
#define SEGB 3
#define SEGC 4
#define SEGD 5
#define SEGE 6
#define SEGF 7
#define SEGG 8

//timer dht22 
unsigned long previousMillis = 0;
const long interval = 2000;  //tiap 2 detik, sesuaikan

//Variables
float hum;  //humi
float temp; //temperature 

int incomingByte = 0; // menyompan serial data

void setup()
{

    pinMode(SEGA, OUTPUT);
    pinMode(SEGB, OUTPUT);
    pinMode(SEGC, OUTPUT);
    pinMode(SEGD, OUTPUT);
    pinMode(SEGE, OUTPUT);
    pinMode(SEGF, OUTPUT);
    pinMode(SEGG, OUTPUT);

    
    Serial.begin(9600);
    dht.begin();

}



void segmen(char angka)
{
 //ini menulis 7 segmen komon katoda , balik logika kalau anda pakai komon anoda
   switch(angka) {
                  case '0' : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, HIGH);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, LOW);
                             break;
                  }
                  case '1' : { digitalWrite(SEGA, LOW);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, LOW);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, LOW);
                             digitalWrite(SEGG, LOW);
                             break;
                  }
                  case '2' : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, LOW);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, HIGH);
                             digitalWrite(SEGF, LOW);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }
                  case '3' : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, LOW);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }
                  case '4' : { digitalWrite(SEGA, LOW);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, LOW);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }

                  case '5' : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, LOW);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }                                                          
                  case '6' : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, LOW);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, HIGH);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }
                  case '7' : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, LOW);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, LOW);
                             digitalWrite(SEGG, LOW);
                             break;
                  }
                  case '8' : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, HIGH);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }
                  case '9' : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }
   }
}
void loop()
{
    unsigned long currentMillis = millis();
 
   if(currentMillis - previousMillis >= interval) {
    // dibaca tiap jeda yg ditentukan diatas 
    previousMillis = currentMillis;   
    
    //Read data and store it to variables hum and temp
    hum = dht.readHumidity();
    temp= dht.readTemperature();
    //Print temp and humidity values to serial monitor
    Serial.print("Humidity: ");
    Serial.print(hum);
    Serial.print(" %, Temp: ");
    Serial.print(temp);
    Serial.println(" Celsius");
   }

if (Serial.available() > 0) {
    // read the incoming byte:
    incomingByte = Serial.read();

    segmen(char(incomingByte));

  //  7 segmen akan berubah sesuai 
  //  incoming byte yg masuk
   
 }
   
}

   


Hasil jika dijalankan dan dihubungkan ke PC akan seperti ini :



Kita akan menuju ke Node-Red dan jangan lupa untuk menginstal add ons / node red serial ports melalui comand prompt windows.


  npm i node-red-node-serialport


Langkah selanjutnya akan kita baca data serial port dan kita masukkan ke debuger pada Node-RED



Kita akan membaca input serial dari COM17 pada PC saya dengan baudrate 9600 dan tipe datanya berupa ASCII text. Lalu saya hubungkan dengan debuger yg bisa dipilih pada icon berderet disebelah kiri layar Node-RED. Hasil outputnya adalah sebagai berikut :




Mudah bukan ? Data pembacaan suhu DHT11 saya sudah tampil pada debugger. Bagaimana dengan kirim balik ke Arduino ? Kita akan bahas selanjutnya digabungkan dengan UI web dari Node-Red yang sangat menarik seperti gambar dibawah ini :




Silahkan lanjut ke part 2 disini : https://www.aisi555.com/2021/04/node-red-hello-world-dari-pecinta-ic_20.html


Share:

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:

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 (24) 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