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

Kamis, 22 April 2021

RCTI Digital Hadir Dengan Full Power di Surabaya dan Sekitarnya - The End Buat Parabola Mini ?

 



Tidak dipungkiri lagi sinetron unggulan produksi RCTI merupakan magnet untuk penonton TV di Indonesia bahkan sampai negara berbahasa melayu sekitar. Terbukti dengan diraihnya rating tertinggi dari penonton TV pada tanggal 22 april 2021 seperti pada daftar berikut ini :


  • 1. RCTI - Ikatan Cinta
  • 2. RCTI - Amanah Wali 5
  • 3. SCTV - Buku Harian Seorang Istri
  • 4. RCTI - Lazada 33 Sale
  • 5. SCTV - Love Story The Series
  • 6. Indosiar - SHI
  • 7. RCTI - Putri untuk Pangeran
  • 8. SCTV - Samudera Cinta
  • 9. RCTI - Dunia Terbalik
  • 10. RCTI - Silet
  • 11. SCTV - Dari Jendela SMP
  • 12. MNC - Upin dan Ipin
  • 13. MNC - Kembalinya Raden Kian Santang
  • 14. RCTI - Seputar iNews
  • 15. MNC - Upin dan Ipin Pagi

Dunia parabola mini juga sempat heboh di tahun 2018 -2019 dengan adanya tarik-menarik siaran RCTI dan MNC group lainnya melawan penyedia layanan pay tv, bahkan kalau ditelusur balik di 2016, MNC group bersitegang dengan telkom group sehingga telkom dengan produk IPTV UseeTv dilarang menyiarkan siaran RCTI, MNC TV, GTV akibat tidak adanya kesepakatan penarikan jaringan optik MNC play di tiang milik telkom. 



Dan ujungnya RCTI dan MNC group menjadi eksklusif di dunia satelit dengan keharusan menggunakan receiver rekomendasi, dimana pihak pay TV harus menjalin kerjasama sebelum boleh me-relay siaran MNC Group. Jika tidak patuh maka akan dihadiahi tuntutan hukum seperti yg dialami Ninmedia.



Berkah tersendiri bagi para teknisi diseluruh nusantara dengan larisnya penjualan receiver rekomendasi ini, bahkan sampai sempat kejadian langkanya receiver rekomendasi di pusat elektronika. Harga pun bisa dimainkan para dealer dan agen penyalur receiver rekomendasi. Namun di tahun 2021 untuk kota besar di pulau Jawa ada berita yg mengembirakan kalau RCTI dan MNC group hadir kembali di frekuensi TV Digital Teresterial UHF.



Power sinyal dari pemancarnya lumayan cukup tinggi dengan antena dalam rumah saja bisa mendapatkan siaran yg jernih tanpa putus.



MNC group bersiaran untuk kota Surabaya di saluran 41 UHF atau 633 MHz, namun sayangnya belum berformat HD seperti di jakarta maupun jogja. Mungkin menunggu perangkat HD nya datang kali, kita tunggu saja. Secara lengkap siaran MNC group di Surabaya yang saya ambil tanggal 22 April 2021 sebagai berikut :







Dengan lengkapnya siaran TV Digital di wilayah surabaya dan kota sekitarnya (Gersik Bangkalan Mojokerto Lamongan Pasuruan) maka menjadi ancaman tersendiri bagi teknisi parabola yg mengandalkan penjualan dengan titik berat di "SIARAN LOKAL LENGKAP JERNIH". Saatnya kita menjual dengan usaha lebih keras lagi walau tantangan ekonomi semakin berat, atau beralih menjadi Teknisi Antena UHF dengan STB DVB-T2 ? Siapa takut asal ada kesempatan hayo dimanfaatkan saja.

Berikut daftar Siaran TV Digital di Surabaya dan Sekitarnya April 2021:

 

Frekuensi

Nama TV

1

490 MHz

(23 UHF)

1

TV ONE

2

ANTV

2

506 MHz

(25 UHF)

3

MetroTV

4

MetroTV HD

5

Magna Channel  HD

6

BN TV HD

7

BBS TV

3

522 MHz

(27 UHF)

8

Trans TV HD

9

Trans 7 HD

10

CNN Indonesia HD

11

CNBC Indonesia HD

12

Kompas TV

 

4

538 MHz

(29 UHF)

13

SCTV HD

14

INDOSIAR HD

15

O CHANNEL HD

16

MENTARI TV HD

5

586 MHz

( 35 UHF)

17

TVRI SPORT HD 

18

TVRI 3

19

TVRI JATIM

20

TVRI NASIONAL

21

Jawapos TV /SBO 

6

634 MHz

( 41 UHF)

22

RCTI

23

MNC TV

24

GTV

25

I News





Untuk panduan, kami telah review beberapa merek STB digital yg sudah ada di pasaran dan anda kini bisa bandingkan sesuai fasilitas dan keunggulannya :


Matrix Apple     - Polytron PDV 600T2   - Venus Cabe Rawit  - Evinix H-1  - Akari ADS-2230

-Tanaka


Bagi anda yg berada di lokasi lain di Nusantara dapat juga membaca update perkembangan  migrasi TV digital di  kota-kota besar seluruh Indonesia :

Surabaya  MNC  ,  EMTEK , VIVA )

Malang

Jember 

Kediri

Jombang & Mojokerto

Madiun

Jogja

Semarang

Banjarmasin

Makasar

Medan

Palembang

Perbatasan Malaysia

Share:

[ Node-RED ] Mengenal Function Node - Tools Ampuh Berbasis Java

 


Bagi penggiat IT yang mungkin kebingungan akan logika dari flow dan beragam node yang ada pada platform IOT Node-RED, mungkin pada saat belajar awal perlu berkenalan dengan node yang bernama  : "FUNCTION". Ya gak jauh berbeda dengan function atau sub-routine pada bahasa pemrograman apapun, function akan menyediakan editor script berbasis java yang akan memudahkan mengubah dan mengolah pesan Input Output pada flow yang anda buat.

Namun perlu diperhatikan komunikasi antar node bukan hanya kirim-terima String biasa, namun keseluruhan berpola JSON seperti contoh berikut:



atau kalau saya copy salah satu pesan raw dari salah satu output debug sebuah pesan yg diterima dari response perangkat modbus seperti berikut ini :


{"topic":"polling","payload":[30,0,71],"responseBuffer":{"data":[30,0,71],"buffer":[0,30,0,0,0,71]},"input":{"topic":"polling","from":"Modbus-DHT22","payload":{"unitid":"6","fc":4,"address":"0","quantity":"3","messageId":"6080af997665b3af28e2168f"},"queueLengthByUnitId":{"unitId":6,"queueLength":0},"queueUnitId":6,"unitId":6},"sendingNodeId":"1c4bea20.9b9666","_msgid":"b2c9254b.4553e8"}



Sepanjang itu pesan yg dikirimkan oleh node MODBUS READ ke node Debug yg saya buat. Jadi secara praktisnya saya hanya butuh data pada object bernama "payload" yang berisikan data array :[30,0,71]  . Jadi yg nantinya saya olah adalah data dari 3 isi array itu saja.

Kemudian saya ingin merubah data payload tadi menjadi NUMBER yang akan saya tampilkan pada web UI berupa GAUGE / Meter. Karena memang yang diminta oleh gauge adalah input data berupa  angka maka saya butuh sebuah Function untuk merubahnya.



Penjelasan dari function diatas adalah sebagai berikut :


  • Variabel temp mengambil data msg.payload yg dikirimkan oleh node modbus read
  • Data array 0 dan 1 dimasukkan ke dalam variabel
  • Karena data 0 berupa puluhan dan 1 berupa angka dibelakang koma, butuh melakukan penggabungan dengan jalan mengalikan data 0 / puluhan dengan 100, menambahkan dengan data 1 lalu membagi hasilnya dengan 100
  • Hasil suhu yg didapat berupa integer kemudian diubah ke float melalui parseFloat
  • Selanjutnya suhu yg sudah berupa desimal float dibungkus kembali menjadi Json  : {payload:suhu} dan dikembalikan ke flow dengan perintah return .


Dengan function yang tepat maka hasil yg diinginkan pun tercapai. Jadi kunci disini adalah kemampuan javascript / programming yang harus cukup dimiliki oleh pengguna Node-RED.




Yang menjadi perhatian dalam function adalah bagaimana menyimpan variabel yang nantinya akan diambil saat flow berikutnya, semisal saya ingin mengubah 7 segmen secara increment. Jika ketemu masalah seperti ini maka yang perlu dipahami adalah perintah java berupa context atau flow. Perhatikan node berikut :



Output Function 7 segmen yg ingin kita dapatkan adalah membaca node inject dan  tombol pada dashboard /web UI yang akan merubah angka 7 segmen naik turun. Singkat saja scriptnya, dimana payload dari inject atau tombol berupa msg.payload = 1 untuk tambah dan msg.payload = 2 untuk pengurangan. Sedangkan variabel 7 segmen yang harus disimpan dan dipanggil lagi pada flow berikutnya disimpan melalui flow.get dan flow.set . Selengkapnya seperti berikut :


var count=flow.get('count') || 0;

var temp = msg.payload


if(temp == 1) count+=1;

else if(temp == 2) count-=1;


if(count > 9) count =0;

if(count < 0) count =9;


flow.set('count',count);


var result = {payload:count};

return[result];



Garis besar dari script diatas seperti ini : 


  • Ambil nilai variabel 'count' yg disimpan pada flow (global) ke dalam variabel count lokal , jika belum ada kasikan nilai 0,   var count=flow.get('count') || 0; 
  • Ambil nilai payload yang diberikan oleh inject atau tombol ui, kemudian cek apakah 1 atau 2 dan lakukan penambahan atau pengurangan variabel count
  • Set kondisi maksimum dan minimum dari count
  • Simpan kembali nilai variabel count lokal ke variabel count global dengan perintah : flow.set('count',count);
  • Kembalikan data ke flow dan lanjut dikirim ke node Modbus Write

Dengan susunan script function yang tepat maka flows node-RED yang diingikan tercapai. Function node yang simple juga sudah disediakan, tinggal drag drop dan siap pakai, namun dengan beberapa keterbatasan. Jadi kalau mau berkreasi lebih manfaatkan script Function saja sesuai keinginan. 

Penjelasan function yang saya buat ini adalah kelanjutan dari praktek Modbus-RTU-Serial sebelumnya yg dapat dibaca disini.







Share:

Rabu, 21 April 2021

[ Node-RED ] Komunikasi Dengan Perangkat MODBUS-RTU Serial - Praktek Sensor Suhu + 7 Segmen


 

Modbus dan PLC  baik dalam komunikasi jadulnya yg berbasis serial RS 485/ RS 232 maupun kini sudah merambah ke komunikasi TCP/IP, menjadi pilihan yang menurut penulis sudah "Final" dikalangan dunia kontrol industrial. Pengalaman penulis ketika menawarkan otomasi berbasis mikrokontroller 8 bit yg saya rancang dengan fungsi yang hampir sama, tetap mendapatkan tantangan dan pertanyaan seputar kehandalannya. Jadi saya yang pecinta hardware dasar pun di sangsikan apalagi mereka yg ingin menawarkan kemudahan dari sisi dunia IT. Sehingga menurut rekan dosen otomasi di UK-Petra Surabaya, Node-Red menjadi jembatan yang ampuh untuk menyatukan perangkat jadul dengan sistem IOT-Industri 4.0

Seperti yang pernah saya bahas di tahun sebelumnya, saat saya belajar dan berhasil merancang Modbus-RTU bridging ke MQTT (silahkan mulai disini , dibaca dan dipahami terlebih dahulu), mutlak diperlukan pemahaman sistem pengiriman data, register I/O , error checking dan sebagainya. Untuk itu perlu diulang kembali praktek awal belajar modbus yaitu menjadikan arduino sebagai perangkat Modbus-slave, dengan penyesuaian rangkaian yg sudah saya buat di praktek node-red sebelumnya,  sebagai berikut :




Dengan Input berupa pembacaan suhu dan kelembaban, maka saya menempatkan data pada Input / Analog Register berupa :


  • 30001 : Angka didepan koma / Puluhan suhu
  • 30002 : Angka desimal / di belekang koma suhu
  • 30003 : Angka pengukukuran kelembaban


Sedangkan untuk Output berupa 7 segmen, register yg digunakan adalah Holding Register dengan alamat 40001. Register ini juga dapat diubah mengunakan Function 0x06. Jadi script untuk merubah rangkaian arduino diatas menjadi berbasis MODBUS-RTU sebagai berikut :



//Silahkan unduh Library modbus slave: 
//https://code.google.com/archive/p/arduino-modbus-slave/downloads

#include <modbus.h>
#include <modbusDevice.h>
#include <modbusRegBank.h>
#include <modbusSlave.h>
#include "DHT.h"

//7seg

#define SEGA 5
#define SEGB 6
#define SEGC 7
#define SEGD 8
#define SEGE 9
#define SEGF 10
#define SEGG 11

#define dhtPin 4
#define DHTTYPE DHT22
DHT dht(dhtPin, DHTTYPE);

unsigned long previousMillis = 0;
const long interval = 5000; 


modbusDevice regBank;
modbusSlave slave;

void setup()
{   //7 seg
    pinMode(SEGA, OUTPUT);
    pinMode(SEGB, OUTPUT);
    pinMode(SEGC, OUTPUT);
    pinMode(SEGD, OUTPUT);
    pinMode(SEGE, OUTPUT);
    pinMode(SEGF, OUTPUT);
    pinMode(SEGG, OUTPUT);

 //Ubah modbus device ID.  
  regBank.setId(6);
  dht.begin();
/*
register modbus mengikuti format berikut
00001-09999 Output Digital, Perangkat master dapat membaca dan menulis ke register ini
10001-19999 Input Digital, Perangkat master hanya dapat membaca nilai dari register ini
30001-39999 Input Analog, Perangkat master hanya dapat membaca nilai dari register ini
40001-49999 Output Analog/ Holding register, 
            Perangkat master dapat membaca dan menulis ke register ini

Nilai analog adalah kata unsigned 16 bit yang disimpan dengan kisaran 0-32767
Nilai digital disimpan sebagai byte, nilai nol OFF dan nilai nonzer ON

Cara terbaik adalah mengkonfigurasi register tipe serupa ke dalam blok yang bersebelahan. ini
memungkinkan pencarian register yang lebih efisien dan dan mengurangi jumlah pesan
dibutuhkan oleh master untuk mengambil data
*/

 
//Pesan alamat Register Analog input di register bank 30001-10010 
  regBank.add(30001);  //DHT11 - suhu puluhan
  regBank.add(30002);  //DHT11 - suhu desimal
  regBank.add(30003);  //DHT11 - kelembaban
  
//Pesan alamat Holding Register 40001
  regBank.add(40001);  // 7 SEGMEN
//Isi nilai awal dari 7 segmen
  regBank.set(40001,8);
    

  slave._device = &regBank;  

// Serial 9600 baud  
  slave.setBaud(9600);   

}

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;
                  }
   }
}

// mengubah koma 
int ExtractDecimalPart(float Value, int numberOfDecimals)
{
  float temp = Value - (long)(Value); 
  long p = 1;
  for (int i=0; i< numberOfDecimals; i++) p*=10;
  long DecimalPart = p * temp;
  return DecimalPart;
}

void loop()
{
//Tulis 7 segmen sesuai nilai pada register
  segmen(regBank.get(40001));  


//Baca suhu 5 detikan
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis >= interval) {
   
    previousMillis = currentMillis;   
 
    int h = dht.readHumidity();
    float t= dht.readTemperature();
    int t1 = t;
    int t2 = ExtractDecimalPart(t,2);

//tulis ke register 30001 -30003
    if (isnan(h) || isnan(t)) {
    regBank.set(30001,1000);
    regBank.set(30002,1000);
    regBank.set(30003,1000); 
    }

    
    regBank.set(30001,t1);
    regBank.set(30002,t2);
    regBank.set(30003,h);
   } 

  //jalan terus berulang sebagai slave  
  slave.run();  

}


Jadi jika selesai programming, dapat dilakukan test dengan software simulator modbus RADZIO : 




7 segmen kemudian bisa juga diubah dengan klik 2x pada kolom register  yang sesuai .




Selanjutnya di sisi Node-RED kita akan melakukan instalasi node yg bernama node-red-contrib-modbus. Instalasinya bisa juga dilakukan melalui editor Node-RED dengan memilih pilihan "manage pallete" di menu kanan atas.



Dengan demikian kita bisa menggunakan NODE modbus paling dasar yaitu MODBUS READ untuk membaca sensor suhu kelembaban DHT22 yg saya pakai. Settingnya cukup menyesuaikan dengan praktek sebelumnya yaitu penyesuaian com port, ID slave, dan debug sebagai output.



Hasilnya mencengangkan !



Sehari-semalam saya bingung dibuatnya, kenapa response dari Modbus Slave menampilkan array [0,0,0] ? Sampai kemudian saya ingat ada tools untuk melakukan debug / spy serial port bernama " SerialMon".



Dari hasil penelusuran, saya bandingkan serial yg dikirim terima oleh Radzio dengan Node-RED dan hasilnya saya salah di penomeran register.



Kejadian lagi deh kesalahan saat awal belajar modbus dulu ...jadi alamat register bukan dimulai dari 30001 melainkan cukup ditulis 0 (karena aturan offset jadi 1), ingat deh dulu seperti ini nih seharusnya :


06 04 00 00 00 03 B1 BC

06     =  Alamat device id slave
04     =  Perintah baca input analog/ function 04
00 00  = 2 byte alamat address memori (mulai 0 , logic 1)
00 03  = 2 byte panjang data yg diharapkan (3 buah data)
B1 BC  = Checksum / CRC 16 modbus


Dan yang benar seperti ini nih...langsung muncul angka suhu dan kelembabanya ...


 

Selanjutnya praktek sangat lancar dan cukup mengikuti praktek Node-RED web UI sebelumnya dan berhasil membuat hasil seperti video berikut ini :




Untuk Script Node-Red dalam JSON, saya tempel aja disini, kemudian bisa di import dan copy paste pada editor Node-RED kamu :



[{"id":"a8d0e1d9.32142","type":"tab","label":"Flow 5","disabled":false,"info":""},{"id":"d299086b.f08a88","type":"modbus-read","z":"a8d0e1d9.32142","name":"","topic":"","showStatusActivities":false,"logIOActivities":false,"showErrors":false,"unitid":"6","dataType":"InputRegister","adr":"0","quantity":"3","rate":"5","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"824b1538.161228","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":279.32994079589844,"y":205.96183681488037,"wires":[["7967f3c9.3415bc","5cfa62af.b1f89c","e0c9cab0.13e948"],[]]},{"id":"7967f3c9.3415bc","type":"debug","z":"a8d0e1d9.32142","name":"read_modbus","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":526.3299407958984,"y":55.16672134399414,"wires":[]},{"id":"341bb8e1.0d3b38","type":"modbus-write","z":"a8d0e1d9.32142","name":"","showStatusActivities":false,"showErrors":false,"unitid":"6","dataType":"HoldingRegister","adr":"0","quantity":"1","server":"824b1538.161228","emptyMsgOnFail":false,"keepMsgProperties":false,"x":685.3369064331055,"y":450.8092050552368,"wires":[[],[]]},{"id":"b0f6eeca.9fc8f","type":"debug","z":"a8d0e1d9.32142","name":"out_modbus","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":681.3334045410156,"y":365.1701936721802,"wires":[]},{"id":"36302ceb.d3b7b4","type":"inject","z":"a8d0e1d9.32142","name":"decrement","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":"","topic":"","payload":"2","payloadType":"num","x":272.8958435058594,"y":403.8888854980469,"wires":[["44bf1fc9.8d7fd"]]},{"id":"96e67c14.b9386","type":"inject","z":"a8d0e1d9.32142","name":"increment","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":"","topic":"","payload":"1","payloadType":"num","x":272.8958435058594,"y":363.8888854980469,"wires":[["44bf1fc9.8d7fd"]]},{"id":"44bf1fc9.8d7fd","type":"function","z":"a8d0e1d9.32142","name":"7 segmen","func":"var count=flow.get('count') || 0;\n\nvar temp = msg.payload\n\nif(temp == 1) count+=1;\nelse if(temp == 2) count-=1;\n\nif(count > 9) count =0;\nif(count < 0) count =9;\n\nflow.set('count',count);\n\nvar result = {payload:count};\nreturn[result];","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":473.89587783813477,"y":379.8889045715332,"wires":[["b0f6eeca.9fc8f","341bb8e1.0d3b38","8ca591c3.507c8"]]},{"id":"39680ef0.a0ec02","type":"ui_gauge","z":"a8d0e1d9.32142","name":"SUHU DHT 11","group":"fc14d827.fe2ea8","order":1,"width":0,"height":0,"gtype":"gage","title":"Suhu Celcius","label":"Celcius","format":"{{value}}","min":0,"max":"50","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":746.8958358764648,"y":147.88887405395508,"wires":[]},{"id":"fc85d4ce.fbaa78","type":"ui_chart","z":"a8d0e1d9.32142","name":"","group":"fc14d827.fe2ea8","order":2,"width":0,"height":0,"label":"Kelembaban %Rh","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"40","ymax":"100","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"60","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"x":756.8958511352539,"y":260.88890075683594,"wires":[[]]},{"id":"5cfa62af.b1f89c","type":"function","z":"a8d0e1d9.32142","name":"ubah suhu","func":"var temp = msg.payload;\nvar puluhan = temp[0]\nvar desimal = temp[1]\n\nvar ongko = (parseInt(puluhan) * 100) + desimal;\nvar suhu = parseFloat(ongko /100);\nvar result = {payload:suhu};\nreturn[result];\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":532.3402481079102,"y":154.70834350585938,"wires":[["39680ef0.a0ec02"]]},{"id":"e0c9cab0.13e948","type":"function","z":"a8d0e1d9.32142","name":"ubah humi","func":"var temp = msg.payload\nvar humi = parseInt( temp[2] )\n\nvar result = {payload:humi};\nreturn[result];\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":527.8958129882812,"y":237.88888549804688,"wires":[["fc85d4ce.fbaa78","f739dfd5.58126"]]},{"id":"f739dfd5.58126","type":"debug","z":"a8d0e1d9.32142","name":"ubah suhu","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":755.3402862548828,"y":202.18057250976562,"wires":[]},{"id":"8ca591c3.507c8","type":"ui_text","z":"a8d0e1d9.32142","group":"fc14d827.fe2ea8","order":4,"width":0,"height":0,"name":"","label":"7 Segmen","format":"{{msg.payload}}","layout":"row-spread","x":681.3299102783203,"y":407.0590515136719,"wires":[]},{"id":"5b185e1a.af2f7","type":"ui_button","z":"a8d0e1d9.32142","name":"Tambah","group":"fc14d827.fe2ea8","order":8,"width":"3","height":"2","passthru":false,"label":"Tambah ","tooltip":"","color":"","bgcolor":"","icon":"","payload":"1","payloadType":"num","topic":"payload","topicType":"msg","x":269.32643127441406,"y":313.2986240386963,"wires":[["44bf1fc9.8d7fd"]]},{"id":"a4c4a5d.a88cc58","type":"ui_button","z":"a8d0e1d9.32142","name":"Kurang","group":"fc14d827.fe2ea8","order":8,"width":"3","height":"2","passthru":false,"label":"Kurang","tooltip":"","color":"","bgcolor":"","icon":"","payload":"2","payloadType":"num","topic":"payload","topicType":"msg","x":273.8958435058594,"y":454.8888854980469,"wires":[["44bf1fc9.8d7fd"]]},{"id":"824b1538.161228","type":"modbus-client","name":"","clienttype":"simpleser","bufferCommands":true,"stateLogEnabled":false,"queueLogEnabled":false,"tcpHost":"127.0.0.1","tcpPort":"502","tcpType":"DEFAULT","serialPort":"COM7","serialType":"RTU-BUFFERD","serialBaudrate":"9600","serialDatabits":"8","serialStopbits":"1","serialParity":"none","serialConnectionDelay":"100","unit_id":"1","commandDelay":"1","clientTimeout":"1000","reconnectOnTimeout":true,"reconnectTimeout":"2000","parallelUnitIdsAllowed":true},{"id":"fc14d827.fe2ea8","type":"ui_group","name":"modbus RTU ui testing","tab":"53c1826d.1539dc","order":2,"disp":true,"width":"6","collapse":false},{"id":"53c1826d.1539dc","type":"ui_tab","name":"HumiTemp Node Red","icon":"dashboard","order":1,"disabled":false,"hidden":false}]






SELAMAT MENCOBA ....

Share:

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:

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 (26) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (59) 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 (28) 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