Anda di sini

Pemrograman

[Tutorial Lengkap] Kontrol Lampu via Internet of Things MQTT ESP8266 NodeMCU

Aditya Suranata - 24 September 2019 13:02:39 0

Setup IDE (Integrated Development Environmen

Pada sesi ini dilakukan praktikum instalasi dan konfigurasi perangkat lunak yang diperlukan untuk dapat memprogram mikrokontroler kit NodeMCU. Terdiri dari Arduino IDE dan NodeMCU Manifest & Libraries. Ini dilakukan di komputer/laptop masing-masing peserta.

Sebelum dapat menggunakan Arduino IDE untuk memprogram, kita harus menginstall driver USB untuk sistem operasi yang mana bisa saja versi CH340 atau CP2102, bergantung pada jenis board NodeMCU yang kita gunakan. Apabila menggunakan versi ogirinal dari vendor Amica, maka tipenya adalah CP2102 yang mana untuk sistem operasi Windows 7 ke atas tidak diperlukan lagi untuk menginstall driver tambahan.

NodeMCU diprogram menggunakan banyak tools, aslinya menggunakan bahasa Lua, tetapi kebanyakan menggunakan Arduino IDE karena dirasa lebih umum dan mudah. Berikut adalah cara dan apa saja persiapannya untuk dapat mulai mempogram NodeMCU melalui komputer atau laptop. Agar hasilnya sesuai dengan yang diharapkan, kita hendaknya mengikuti acuan dari dokumentasi resmi, dan untuk NodeMCU dengan Arduino IDE halaman dokumentasi resminya dapat diakses melalui tautan berikut: https://github.com/esp8266/Arduino. Langkah demi langkah:

  1. Download Arduino versi terbaru melalui tautan berikut: https://www.arduino.cc/en/Main/Software pastikan kalian mengunduh versi bit yang tepat.
  2. Setelah selesai mendownload, langsung Install dengan settingan bawaan hingga selesai.
  3. Buka Arduino IDE, kemudian klik File > Preferences > Additional Boards Manager URLs.
  4. Paste pada field Additional Boards manager URLs link ini: https://github.com/esp8266/Arduino/releases/download/2.5.0/package_esp82...
  5. Klik OK.
  6. Kemudian, klik Tools > Board [...] > Board Managers...
  7. Pada field filter, ketik esp8266 maka selanjutnya akan muncul nama librarynya esp8266 by ESP8266 Community.
  8. Pilih versi 2.5.0 kemudian klik install.
  9. Tunggu sekitar satu jam-an, tergantung koneksi Internet. Total paket yang harus diunduh lumayan besar, sekitar 200-300MB.
  10. Setelah selesai mengunduh, close, dan buka ulang Arduino IDE.
  11. Pilih boardnya menjadi ESP8266, klik Tools > (Geser kebawah) Pilih NodeMCU 1.0 (ESP-12E Module)
  12. Pilih nomer port COM, klik Tools > Port > COMxx , caranya mengetahui berapa portnya coba lihat dari device manager, klik Start > ketik di kolom search Device Manager > expand Port Serial, disana akan terlihat berapa nomer portnya.

Memprogram Mikrokontroler (Arduino Language)

Setelah seluruh perangkat lunak terinstal dengan baik, dilanjutkan dengan sesi belajar pemrograman dasar mikrokontroler. Pada sesi ini dijabarkan bagaimana struktur pemrograman dasar mikrokontroler dengan bahasa Arduino. Fungsi-fungsi dasar input/output. Setelah itu, peserta diajarkan proses flashing kode program dasar yang telah ditulis ke mikrokontroler.

Hal pertama yang harus dilakukan untuk dapat memprogram mikrokontroler yang dalam tutorial ini menggunakan NodeMCU adalah menyetel nomer port dan jenis board, seperti yang dipaparkan pada bagian sebelumnya. Bahasa pemrograman Arduino C/C++ memiliki struktur yang sederhana. Untuk dapat dikompilasi, kode program kita harus memiliki dua fungsi utama, void loop() dan void setup(). Masing-masing fungsi wajib ini memiliki fungsi yaitu:

  • Loop: berisi kode program yang akan dieksekusi terus meneruse selama MCU menyala. Contohnya: pembacaan sensor dan pengendalian aktuator.
  • Setup: berisi kode program yang hanya dieksekusi sekali saja saat MCU menyala. Contohnya: konfigurasi mode operasi port, dan aktivasi komunikasi serial

Selain kedua fungsi tersebut, Arduino menyediakan beberapa fungsi built-in yang mempermudah kita memprogram MCU kita. Daftar fungsi built-in yang tersedia dapat dilihat melalui menu Help > Reference. Menu ini akan membuka halaman web yang dapa t kita lihat secara offline. Selain daftar referensi fungsi, kita juga dapat membaca panduan Getting Started yang juga ada di menu Help untuk membantu kita mempersiapkan MCU kita ketika digunakan untuk pertama kalinya.

Beberapa fungsi umum yang paling sering digunakan diantaranya adalah Digital I/O, Analog I/O, Advanced I/O, Time, dan Math. Selain fungsi itu juga ada fungsi-fungsi tingkat lanjut seperti Trigonometry, Character, Random Number, Bit & Byte, External Interrupt, Interrupt, Communication, dan USB. Sebagai contoh, pada fungsi Digital I/O, kita dapat menggunakan fungsi pinMode(), dan digitalWrite() untuk dapat menyalakan sebuah lampu LED pada salah satu pin dari NodeMCU.

Untuk mengetahui apa yang dilakukan oleh fungsi pinMode(), kita dapat membaca referensinya pada halaman function reference yang ada di menu Help. Secara singkat, pinMode() berguna untuk mengatur mode operasi pin, apakah pin yang dimaksud bertindak sebagai input ataukah sebagai output. Karena kita ingin menyalakan sebuah LED kita dapat menyetel mode operasi portnya sebagai outout sehingga kaki pin tersebut menghasilkan tegangan high yang selanjutnya dapat menyalakan lampu LED dengan cara menggunakan perinta digitalWrite(). Contoh kode program untuk membuat sebuah lampu LED menyala di pin nomer D0 adalah sebagai berikut:

void setup() {
  // Set mode operasi pin ke output
  pinMode(D0, OUTPUT);
}

void loop() {
  // Set pin ke HIGH (LED menyala)
  digitalWrite(D0, HIGH);
  delay(1000);  // Jeda satu detik
  // Set pin ke LOW (LED mati)          
  digitalWrite(D0, LOW);
  delay(1000);          
}

Basic I/O, Membaca Sensor, Mengendalikan Aktuator

Pada sesi ini dilakukan praktikum memprogram mikrokontroler, diantaranya menggunakan basic I/O, membaca sensor dan mengendalikan aktuator. Seperti yang telah dipaparkan pada bagian sebelumnya, Arduino telah menyertakan beberapa fungsi built-in pembantu yang bisa kita gunakan dalam kode program kita. Sebagai contoh, selain membuat lampu LED berkedip-kedip, kita dapat membuat LED tersebut menjadi terang dan redup. Tekniknya adalah, kita dapat menggunakan fitur PWM (pulse width modulation) yang dapat membuat variasi tegangan pada pin tertentu. Fungsi untuk dapat membuat PWM adalah analogWrite(). Sebagai contoh, mari perhatikan Gambar 2.5 yang menampilkan pengkabelan dari LED yang terhubung ke pin D1, dan kode berikut yang akan membuat lampu LED yang terhubung ke pin D1 menjadi redup dan terang secara bertahap:

/** Membuat LED di pin D1 menyala redup dan terang secara bertahap **/
void setup() {
  // Set mode operasi port sebagai output
  pinMode(D1, OUTPUT);
}

 

void loop() {
  // set kecerahan 0%
  analogWrite(D1, 0);
  // Jeda satu detik          
  delay(1000);

  // set kecerahan 25%
  analogWrite(D1, 255);
  // Jeda satu detik          
  delay(1000);

  // set kecerahan 50%
  analogWrite(D1, 511);
  // Jeda satu detik          
  delay(1000);

  // set kecerahan 75%
  analogWrite(D1, 767);
  // Jeda satu detik          
  delay(1000);

  // set kecerahan 100%
  analogWrite(D1, 1023);

  // Jeda satu detik          
  delay(1000);
}

Pada kode di atas, dapat dilihat rentang nilai PWM yang dapat ditulis adalah dari 0 - 1023, nilai ini di dapat dari resolusi PWM ESP8266 sebesar 10 bit. Terang redup lampu juga dapat diset menggunakan perulangan dengan pernyataan for loop, apabila kita sudah pernah memprogram menggunakan bahasa pemrograman apapaun, tentunya kita tidak asing dengan pernyataan for loop. Pernyataan ini digunakan untuk mengulang-ngulang blok program yang ada di dalam for loop sesuai dengan kondisi yang telah ditentukan. Dalam contoh ini, kita dapat melakukan perulangan sebanyak rentang PWM yaitu 256 kali dan menuliskan setiap hitungan perulangan sebagai nilai PWM sehingga dapat membuat lampu menjadi terang dan redup dengan transisi yang lebih lembut:

/**
    Membuat lampu LED di pin D1 menjadi terang
    dan redup dengan transisi yang lembut
    menggunakan perulangan for loop
**/

void setup() {
  // Set mode operasi port sebagai output
  pinMode(D1, OUTPUT);
}

void loop() {
  // Set perulangan for loop dengan dengan putaran sebanyak 256 (8 bit)
  for (unsigned int pwm = 0; pwm < 1024; pwm++){
    // Set nilai PWM dengan nilai pwm dari perulangan
    analogWrite(D1, pwm);
    // Jeda 100 milidetik untuk melihat perubahan
    delay(100);
  }
}

NodeMCU tentunya tidak saja dapat digunakan untuk mengendalikan aktuator seperti lampu LED, namun juga dapat digunakan membaca sensor. Sebagai contoh, kita dapat menggunakan sebuah potensiometer sebagai simulasi pembacaan sensor analog. Sensor analog seperti misalnya sensor suhu berjenis LM35 akan menghasilkan perubahan resistansi/hambatan dan perubahan tegangan yang selanjutnya dapat dibaca dan diterjemahkan menjadi data oleh MCU dengan bantuan komponen bernama ADC (analog-to-digital converter). Data tersebut yang masih berupa nilai ADC selanjutnya dikalibrasi dengan beberapa perhitungan matematika untuk mendapatkan nilai suhu yang sebenarnya dalam satuan derajat misalnya celcius. Gambar 2.6 menampilkan rangkaian pengkabelan potensiometer yang terhubung ke NodeMCU.

Untuk dapat membaca data analog menggunakan ADC, kita dapat menggunakan fungsi analogRead(). Dikarenakan ADC dari NodeMCU memiliki resolusi sebesar 10 bit, maka fungsi analogRead() mengembalikan nilai pembacaan dari rentang 0 sampai 1023. Perlu diketahui, Platform Arduino mendukung penggunaan serial monitor untuk melakukan debugging atau memecahkan masalah program. NodeMCU juga memiliki fitur komunikasi serial yang memungkinkan kita untuk menerima dan mengirim data dua arah dari komputer dan NodeMCU yang juga kompatibel dengan Platform Arduino. Sebagai contoh penggunaan fitur input sensor dengan menggunakan potensiometer, kode program berikut akan mencoba membaca nilai potensiometer dan menampilkannya pada serial monitor dari Arduino IDE:

/**
  Membaca data sensor analog dan menampilkannya
  pada serial monitor
**/
void setup(){
  // Set mode operasi port A0 sebagai input_iterator
  pinMode(A0, INPUT);
  // Mulai komunikasi serial
  Serial.begin(9600);
}
void loop(){
  // Baca data analog dan simpan di variabel dataSensor
  int dataSensor = analogRead(A0);
  // Kirim data sensor ke serial monitor
  Serial.print("Data sensor: ");
  Serial.println(dataSensor);
  // Buat delay agar data tidak masuk terlalu cepat dan bertubi-tubi
  delay(1000);
}

Pada contoh kode program di atas, kita pertama-tama menyetel mode operasi pin analog dari NodeMCU (A0) menjadi input agar dapat menerima data sensor. NodeMCU hanya memiliki satu pin analog untuk membaca ADC. Baris berikutnya kita mengaktifkan fungsi komunikasi serial dari NodeMCU menggunakan perintah Serial.begin() yang menerima parameter berupa baud rate atau kecepatan transfer data. Besaran baud rate yang digunakan di progam harus sama seperti yang digunakan di serial monitor agar proses trasfer data berhasil dan datanya dapat dibaca dengan baik. Kemudian pada bagian void loop(), kita melakukan pembacaan data sensor menggunakan fungsi analogRead() yang menerima parameter berupa nomer pin yaitu A0. Data yang diterima disimpan pada sebuah variabel bertipe data integer lalu dikirim ke serial monitor melalui fungsi Serial.print(). Fungsi Serial.println() digunakan untuk mengirim data ke serial monitor disertai dengan baris baru, sehingga data yang dikirim akan muncul di serial monitor dari baris ke baris.

Untuk memanipulasi data sensor, Arduino menyertakan beberapa fungsi pembantu untuk mempermudah kita mengolah data. Salah satunya adalah fungsi math yaitu map() yang berfungsi untuk memetakan nilai dari satu rentang ke rentang yang lainnya. Pada percobaan sebelumnya, kita sudah pernah menggunakan fitur PWM untuk mengendalikan terang redup lampu. Sekarang kita akan coba mengintegrasikan potensiometer sebagai pengendali terang redup lampu. Jadi saat kita memutar-mutar potensiometer, maka terang redup lampu juga akan berubah sesuai putaran dan mencetak nilainya ke serial monitor dalam persen. Ini dilakukan dengan cara memetakan nilai masukan dari sensor yang berada di rentang 0 - 1023 menjadi rentan persen yang berada di rentang 0 - 100. Contoh kode:

/**
  Membaca data sensor analog dan menggunakannya untuk mengatur
  terang redup lampu LED
**/
// Variabel global untuk menyimpan data sensor
int dataSensor = 0;
// Variabel global untuk menyimpan data sensor sebelumnya dalam persen,
// untuk tujuan mencetak ke serial monitor
byte dataSensorBefore = 0;
// Variabel global untuk menyimpan data sensor dalam persen
byte persenKecerahan = 0;
void setup(){
  // Set mode operasi port A0 sebagai input_iterator
  pinMode(A0, INPUT);
  // Set mode operasi port D1 sebagai output untuk menyalakan LED
  pinMode(D1, OUTPUT);
  // Mulai komunikasi serial
  Serial.begin(9600);
}
void loop(){
  // Baca data analog dan simpan di variabel dataSensor
  dataSensor = analogRead(A0); 
  // Atur kecerahan LED berdasarkan dataSensor
  analogWrite(D1, dataSensor);
  // Konversi kecerahan menjadi persen
  persenKecerahan = map(dataSensor, 0, 1023, 0, 100);
  // Cetak ke serial monitor tingkat kecerahan
  // Tambahkan pengkondisian agar data hanya dicetak
  // Saat potensiometer diputar-putar
  if(persenKecerahan != dataSensorBefore){
    // Cetak tingkat kecerahan
    Serial.print("Kecerahan: ");
    Serial.print(persenKecerahan);
    Serial.println(" %");
    // Reset dataSensorBefore menjadi persenKecerahan
    dataSensorBefore = persenKecerahan;
  }
}

Dari beberapa praktikum di atas kita telah mempelajari bagaimana menggunakan basic I/O dari NodeMCU yang diprogram menggunakan Arduino IDE. Basic I/O secara umum dapat dibedakan menjadi dua, analog dan digital. Masing-masing fungsi pembanti dari basic I/O Arduino IDE dapat dipelajari dari menu referensi (Help > References) pada Arduino IDE. Selanjutnya, berbekal pengetahuan dasar dari Basic I/O kita dapat menyusun program yang lebih canggih dengan mengintegrasikan alat kita dengan teknologi Internet of Things, menghubungkan perangkat kita ke Internet dan mulai bekerja dari jarak jauh untuk mengontrol dan memantau perangkat kita.

240
Daftar Artikel Terkait
Image

Aditya Suranata

Aditya suka menulis, bukan hanya sekedar hobi, menulis menjadi medianya untuk mencurahkan pikiran dan perasaan. Di TutorKeren.com kebanyakan menyumbang tulisan sesuai dengan minat dan keahliannya yaitu pada kategori pemrograman dan elektronika. Selain itu juga gemar menulis mengenai hal-hal umum, seperti ilmu alam, sosial dan beberapa pengalamannya yang mungkin bisa berguna untuk orang lain.

Artikel Menarik Lainnya
Mari Gabung

Halo Emo 51 , Ada yang ingin disampaikan? Jangan sungkan untuk gabung diskusi ini. Silahkan Login dulu atau Daftar baru.