Aplikasi#1. Lemari Pintar

Sebuah lemari pintar, apakah itu? Tentu saja, ini adalah lemari pintar versi saya, bukan lemari pintar yang sesungguhnya, jadi tidaklah canggih-canggih amat. Saya beri nama "pintar" hanya agar kelihatan keren. Definisi "pintar" menurut saya di sini, adalah bisa berhitung. Jadi lemari pintar versi saya ini adalah sebuah lemari, tempat menyimpan barang, yang bisa menghitung dan memberi tahu berapa banyak barang yang ada di dalamnya, dan apa saja jenisnya. Tentu berhitungnya lemari itu masih harus dibantu oleh kita. Supaya mudah, pendataan barang dan penghitungannya menggunakan bantuan Arduino IoT Cloud. Oya, sebelum saya menunjukkan langkah-langkah pembuatannya, saya akan memberikan alasan pertimbangan, mengapa kita memerlukan lemari pintar ini. Perhatikan gambar lemari berikut ini.


Tentunya senang sekali memiliki rumah yang bersih dan rapi, dengan lemari seperti gambar di atas, di mana lemari tersebut dapat dikunci untuk melindungi barang-barang kita. Hanya saja, kelemahan dari lemari itu, kita bisa tidak tahu, barang yang kita butuhkan ada di mana. Kita harus membuka laci lemari satu persatu untuk menemukan barang yang kita butuhkan. Apalagi kalau barangnya banyak, wah, bagaikan mencari jarum di tumpukan jerami. 

Untuk itu, ada ide sederhana, yaitu membuat lemari yang terhubung dengan Cloud, sehingga kita bisa tahu isi lemari tersebut dari waktu ke waktu, bisa mendata penambahan dan pengurangan isinya, serta di laci mana barang tertentu berada. Untuk memudahkan kita mengambil barang, kita bisa mengontrol dari Cloud agar laci tempat barang yang kita butuhkan bisa terbuka, atau memberi tanda dengan menyalakan indikator. Begitu juga jumlah barang serta update datanya, bisa tersimpan di Cloud dengan mudah, yaitu dengan menambahkan tombol atau sensor pendeteksi barang, sehingga setiap kali ada barang ditambahkan atau diambil, data di Cloud bisa diperbaharui.

Baiklah, mari kita lihat, seperti apa penerapan idenya. Berikut ini bahan-bahan yang kita butuhkan:
1. Modul LED & KEY
2. NodeMCU

Mengapa komponennya hanya 2? Ya, ... supaya murah dan mudah membuatnya (sekedar info, saat saya menulis artikel ini, harga Modul LED&KEY dan NodeMCU, total kurang dari 60 ribu). 

Supaya pembuatannya lebih mudah, sehingga saya menjelaskannya juga lebih cepat, maka untuk buka tutup laci di sini, hanya berupa simulasi saja, yaitu ditunjukkan dengan indikator LED. Kalau LED menyala, berarti laci terbuka, kalau LED padam, berarti laci tertutup. Kemudian untuk pendataan secara otomatis, seharusnya ada sensor pendeteksi barang masuk, dan sensor pendeteksi barang keluar. Untuk memudahkan pembuatan, maka sensor pendeteksi barang masuk dan barang keluar ini disimulasikan dengan tombol. Lebih jelasnya, lihat gambar Modul LED & KEY dan gambaran lemari berikut ini beserta keterangannya:
Gambar 2. Modul LED & KEY untuk mensimulasikan buka tutup laci (indikator LED1-LED8), penambahan dan pengambilan barang (tombol S1-S8), dan jumlah barang di setiap laci (7-segmen)

Dari Gambar 2 di atas, terlihat gambaran ide simulasi dari lemari pintar ini. Supaya lebih jelas, saya tuliskan kembali berikut ini:
1. Anggap bahwa saya memiliki sebuah lemari dengan 4 laci seperti gambar berikut ini:

Gambar 3. Lemari dengan 4 laci

2. Untuk menunjukkan bahwa keempat laci tersebut bisa dikontrol, maka keempat laci tersebut saya simulasikan dengan kedelapan LED di Modul LED&KEY. Kalau 2 LED pertama menyala, berarti Laci1 sedang dibuka, sebaliknya ketika 2 LED tersebut padam, maka Laci1 sedang ditutup. Begitu pula untuk LED-LED yang lain, yang menunjukkan kondisi dari Laci2 - Laci4. Mengapa butuh 2 buah LED untuk membuka dan menutup sebuah Laci? Karena untuk membuat motor bisa berputar searah jarum (CW) dan berlawanan jarum jam (CCW), membutuhkan 2 buah Relay, dengan gambaran seperti berikut:

 
Gambar 4(a). Ketika 2 LED menyala, berarti ada 2 sinyal HIGH, membuat 2 buah Relay ON, mengalirkan arus ke motor, sehingga motor berputar searah jarum jam, membuat laci bergerak maju

Gambar 4(b). Ketika 2 LED padam, berarti ada 2 sinyal LOW, membuat 2 buah Relay OFF, mengalirkan arus ke motor, sehingga motor berputar berlawanan jarum jam, membuat laci bergerak mundur

Catatan: Agar motor tidak berputar terus ketika laci sudah membuka/menutup secara maksimal, maka perlu ditambahkan 2 buah Limit Switch, yang akan memutuskan aliran arus ke motor. Jadi agar Laci tidak maju terus, maka tempatkan LS1 di posisi maksimal, sehingga ketika LS1 tertekan, motor akan berhenti. Agar Laci tidak mundur terus, maka tempatkan LS2 di posisi minimal, sehingga ketika LS2 tertekan, motor akan berhenti.

3. Berikutnya, untuk menampilkan jumlah barang dalam keempat laci, digunakan 7-segmen 8 digit pada Modul LED&KEY, masing-masing Laci menggunakan 2 digit 7-segmen. Jadi dua digit 7-segmen yang pertama (mulai dari kiri), digunakan untuk menampilkan jumlah barang di Laci1. Dua digit berikutnya untuk menampilkan jumlah barang di Laci2, dan seterusnya. Jadi jumlah barang di setiap Laci dibatasi maksimum hanya 99 buah. Lebih dari itu, nilainya tidak bisa ditampilkan.

4. Berikutnya, untuk membuat jumlah barang di setiap laci bisa ditambah atau dikurang, setiap laci menggunakan 2 buah tombol, yang posisinya sesuai dengan posisi 7-segmennya, seperti terlihat pada Gambar 2 di atas. Jadi tombol yang pertama (diberi tanda +) digunakan untuk menambah jumlah barang, dan tombol yang kedua (diberi tanda -) digunakan untuk mengurangi jumlah barang. Tombol penambah jumlah barang ini bisa diganti dengan Limit Switch, yang akan mendeteksi barang yang dimasukkan secara otomatis, dan tombol pengurang bisa digunakan untuk mengeluarkan barang satu persatu, dengan mekanisme seperti terlihat pada gambar berikut ini. 

Gambar 5(a). Barang dimasukkan, menekan tuas Limit Switch, membuat barang terdeteksi

Gambar 5(b). Tombol ditekan, membuat Roller berputar mengeluarkan barang

Catatan: Setiap kali sebuah barang dimasukkan melewati Limit Switch, akan membuat Limit Switch tertekan, sehingga mengirimkan data penambahan ke Cloud. Sedang tombol pengurang bisa dibuat menjadi tombol pengeluar barang, seperti terlihat pada gambar di atas. Setiap kali tombol ditekan, maka sebuah barang akan keluar dan jumlah barang di Cloud akan berkurang satu.

Hal yang menarik dari alat yang dibuat ini adalah sebagai berikut:
  1. Karena menggunakan Cloud, maka data jumlah barang tidak akan hilang ketika Modul LED&KEY dimatikan, karena datanya tersimpan di Cloud, dan lagi, kita tidak perlu membuat program untuk menyimpan dan membaca data dari EEPROM atau kartu memori.
  2. Pencarian barang mudah dilakukan, karena terdata di Cloud, dan laci di mana barang tersebut berada, dapat dibuka dari Cloud (atau dinyalakan indikatornya), sehingga barang bisa cepat diketahui lokasinya. 
  3. Jumlah barang dapat diketahui dengan mudah, sehingga ketika jumlah barang mulai menipis, penyediaan barang dapat cepat dilakukan.
  4. Karena menggunakan Arduino IoT Cloud, maka pembuatan aplikasinya menjadi mudah, dan dalam 1 akun, kita bisa membuat 2 lemari 4 laci terhubung dengan Cloud tanpa membayar, alias gratis (untuk lemari yang lebih dari 2, bisa menggunakan trik jadul, yaitu buat akun yang lebih banyak, atau cara lain, bisa menggunakan Node-RED dan protokol MQTT atau Modbus, yang akan saya jelaskan di artikel selanjutnya).
  5. Kita bisa menggunakan variabel Alexa Compatible, sehingga laci bisa dibuka (atau indikatornya bisa dinyalakan) menggunakan suara, dan jumlah barang di dalam laci tersebut juga bisa diatur atau diupdate dengan suara.
  6. Fitur Webhook di Arduino IoT Cloud membuat kita bisa menyimpan data perubahan jumlah barang di lemari, dan juga kapan lemari dibuka, yang datanya bisa ditampilkan di Google Sheet. Jadi tidak hanya tersimpan di widget Messenger, tetapi juga bisa disimpan di Google Sheet, sehingga datanya lebih mudah dilihat tanpa perlu membuka Dashboard Arduino IoT Cloud.
Kelemahan dari alat ini:
Apabila listrik mati atau internet mati, ada kemungkinan laci tidak dapat dibuka, dan update data tidak bisa dilakukan.

Baiklah, begitu penjelasan dari ide Lemari Pintar ini. Lalu bagaimana cara membuatnya, berikut ini langkah-langkahnya:
1. Mula-mula buka Arduino IoT Cloud, login dan buat sebuah Thing, beri nama Lemari1.
2. Buat 5 buah variabel seperti tabel berikut:

Thing: Lemari1

Variable

Tipe Variable

Permission

Update

one

CloudDimmedLight (Alexa | Dimmed Light)

Read & Write

On Change

two

CloudDimmedLight (Alexa | Dimmed Light)

Read & Write

On Change

three

CloudDimmedLight (Alexa | Dimmed Light)

Read & Write

On Change

four

CloudDimmedLight (Alexa | Dimmed Light)

Read & Write

On Change

out1

String (Basic | Character String)

Read & Write

On Change


3. Setelah kelima variabel tersebut selesai ditambahkan, berikutnya tekan tombol Select Device (di Associated Device). Di jendela yang muncul, pilih Set Up New Device, pilih Set up a 3rd Party device, pilih ESP8266 dan pilih model: NodeMCU 1.0 (ESP-12E Module). Jangan lupa untuk menyimpan kode Device ID dan Secret Key (gunakan download the pdf). Tidak perlu mengisi Network di kedua Thing, karena Sketch nantinya akan di-download dari Web Editor dan kemudian di-upload menggunakan software Arduino IDE. 

4. Berikutnya, klik pada Tab Sketch, tekan tombol Open Full Editor, untuk membuka Web Editor. Di halaman Web Editor, download Sketch Lemari1. Setelah Sketch tersebut terdownload, ekstrak file. Di Sketch Lemari1, klik 2 kali pada file program ino. Setelah software Arduino IDE terbuka, di Tab program ino, hapus seluruh isinya, dan ganti dengan program berikut ini: 
  1. #include "arduino_secrets.h"
  2. #include "thingProperties.h"
  3. #include <TM1638plus.h>
  4. TM1638plus tm(D5, D6, D7, false);
  5. unsigned long waktusekarang = 0;
  6. int laci1 = 0;
  7. int laci2 = 0;
  8. int laci3 = 0;
  9. int laci4 = 0;
  10. int laci1a = 0;
  11. int laci2a = 0;
  12. int laci3a = 0;
  13. int laci4a = 0;
  14. bool satu = false;
  15. bool dua = false;
  16. bool tiga = false;
  17. bool empat = false;
  18. uint8_t tombol = 0;
  19. void setup() {
  20.   Serial.begin(9600);
  21.   delay(1500);
  22.   initProperties();
  23.   ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  24.   setDebugMessageLevel(2);
  25.   ArduinoCloud.printDebugInfo();
  26.   tm.displayBegin();
  27.   delay(1000);
  28.   waktusekarang = millis();
  29.   tm.reset();
  30. }
  31. void loop() {
  32.   ArduinoCloud.update();
  33.   tombol = tm.readButtons();
  34.   switch (tombol) {
  35.     case 1:
  36.       if (satu) {
  37.         laci1++;
  38.         tampil1();
  39.         out1 = "1:" + String(laci1);
  40.       }
  41.       break;
  42.     case 2:
  43.       if (satu) {
  44.         laci1--;
  45.         tampil1();
  46.         out1 = "1:" + String(laci1);
  47.       }
  48.       break;
  49.     case 4:
  50.       if (dua) {
  51.         laci2++;
  52.         tampil2();
  53.         out1 = "2:" + String(laci2);
  54.       }
  55.       break;
  56.     case 8:
  57.       if (dua) {
  58.         laci2--;
  59.         tampil2();
  60.         out1 = "2:" + String(laci2);
  61.       }
  62.       break;
  63.     case 16:
  64.       if (tiga) {
  65.         laci3++;
  66.         tampil3();
  67.         out1 = "3:" + String(laci3);
  68.       }
  69.       break;
  70.     case 32:
  71.       if (tiga) {
  72.         laci3--;
  73.         tampil3();
  74.         out1 = "3:" + String(laci3);
  75.       }
  76.       break;
  77.     case 64:
  78.       if (empat) {
  79.         laci4++;
  80.         tampil4();
  81.         out1 = "4:" + String(laci4);
  82.       }
  83.       break;
  84.     case 128:
  85.       if (empat) {
  86.         laci4--;
  87.         tampil4();
  88.         out1 = "4:" + String(laci4);
  89.       }
  90.       break;
  91.   }
  92. }
  93. void onOut1Change() {
  94.   if (out1 == "a1" || out1 == "A1" || out1 == "v" || out1 == "V") {
  95.     one.setSwitch(true);
  96.     leda1();
  97.   }
  98.   if (out1 == "a0" || out1 == "A0" || out1 == "x" || out1 == "X") {
  99.     one.setSwitch(false);
  100.     leda0();
  101.   }
  102.   if (out1 == "b1" || out1 == "B1" || out1 == "v" || out1 == "V") {
  103.     two.setSwitch(true);
  104.     ledb1();
  105.   }
  106.   if (out1 == "b0" || out1 == "B0" || out1 == "x" || out1 == "X") {
  107.     two.setSwitch(false);
  108.     ledb0();
  109.   }
  110.   if (out1 == "c1" || out1 == "C1" || out1 == "v" || out1 == "V") {
  111.     three.setSwitch(true);
  112.     ledc1();
  113.   }
  114.   if (out1 == "c0" || out1 == "C0" || out1 == "x" || out1 == "X") {
  115.     three.setSwitch(false);
  116.     ledc0();
  117.   }
  118.   if (out1 == "d1" || out1 == "D1" || out1 == "v" || out1 == "V") {
  119.     four.setSwitch(true);
  120.     ledd1();
  121.   }
  122.   if (out1 == "d0" || out1 == "D0" || out1 == "x" || out1 == "X") {
  123.     four.setSwitch(false);
  124.     ledd0();
  125.   }
  126.   if (out1.length() == 3) {
  127.     String out2 = out1.substring(1);
  128.     if (out1.startsWith("a") || out1.startsWith("A")) {
  129.       laci1 = out2.toInt();
  130.       tampil1();
  131.     }
  132.     if (out1.startsWith("b") || out1.startsWith("B")) {
  133.       laci2 = out2.toInt();
  134.       tampil2();
  135.     }
  136.     if (out1.startsWith("c") || out1.startsWith("C")) {
  137.       laci3 = out2.toInt();
  138.       tampil3();
  139.     }
  140.     if (out1.startsWith("d") || out1.startsWith("D")) {
  141.       laci4 = out2.toInt();
  142.       tampil4();
  143.     }
  144.   }
  145. }
  146. void onOneChange() {
  147.   if (one.getSwitch()) {
  148.     leda1();
  149.     out1 = "1:ON";
  150.   } else {
  151.     leda0();
  152.     out1 = "1:OFF";
  153.   }
  154.   laci1 = one.getBrightness();
  155.   if (laci1 != laci1a) {
  156.     out1 = "1:" + String(laci1);
  157.     tm.displayASCII(0, char(laci1 / 10 + 48));
  158.     tm.displayASCIIwDot(1, char(laci1 % 10 + 48));
  159.     laci1a = laci1;
  160.   }
  161. }
  162. void onTwoChange() {
  163.   if (two.getSwitch()) {
  164.     ledb1();
  165.     out1 = "2:ON";
  166.   } else {
  167.     ledb0();
  168.     out1 = "2:OFF";
  169.   }
  170.   laci2 = two.getBrightness();
  171.   if (laci2 != laci2a) {
  172.     out1 = "2:" + String(laci2);
  173.     tm.displayASCII(2, char(laci2 / 10 + 48));
  174.     tm.displayASCIIwDot(3, char(laci2 % 10 + 48));
  175.     laci2a = laci2;
  176.   }
  177. }
  178. void onThreeChange() {
  179.   if (three.getSwitch()) {
  180.     ledc1();
  181.     out1 = "3:ON";
  182.   } else {
  183.     ledc0();
  184.     out1 = "3:OFF";
  185.   }
  186.   laci3 = three.getBrightness();
  187.   if (laci3 != laci3a) {
  188.     out1 = "3:" + String(laci3);
  189.     tm.displayASCII(4, char(laci3 / 10 + 48));
  190.     tm.displayASCIIwDot(5, char(laci3 % 10 + 48));
  191.     laci3a = laci3;
  192.   }
  193. }
  194. void onFourChange() {
  195.   if (four.getSwitch()) {
  196.     ledd1();
  197.     out1 = "4:ON";
  198.   } else {
  199.     ledd0();
  200.     out1 = "4:OFF";
  201.   }
  202.   laci4 = four.getBrightness();
  203.   if (laci4 != laci4a) {
  204.     out1 = "4:" + String(laci4);
  205.     tm.displayASCII(6, char(laci4 / 10 + 48));
  206.     tm.displayASCIIwDot(7, char(laci4 % 10 + 48));
  207.     laci4a = laci4;
  208.   }
  209. }
  210. void leda1() {
  211.   tm.setLED(0, 1);
  212.   tm.setLED(1, 1);
  213.   satu = true;
  214. }
  215. void leda0() {
  216.   tm.setLED(0, 0);
  217.   tm.setLED(1, 0);
  218.   satu = false;
  219. }
  220. void ledb1() {
  221.   tm.setLED(2, 1);
  222.   tm.setLED(3, 1);
  223.   dua = true;
  224. }
  225. void ledb0() {
  226.   tm.setLED(2, 0);
  227.   tm.setLED(3, 0);
  228.   dua = false;
  229. }
  230. void ledc1() {
  231.   tm.setLED(4, 1);
  232.   tm.setLED(5, 1);
  233.   tiga = true;
  234. }
  235. void ledc0() {
  236.   tm.setLED(4, 0);
  237.   tm.setLED(5, 0);
  238.   tiga = false;
  239. }
  240. void ledd1() {
  241.   tm.setLED(6, 1);
  242.   tm.setLED(7, 1);
  243.   empat = true;
  244. }
  245. void ledd0() {
  246.   tm.setLED(6, 0);
  247.   tm.setLED(7, 0);
  248.   empat = false;
  249. }
  250. void tampil1() {
  251.   one.setBrightness(laci1);
  252.   tm.displayASCII(0, char(laci1 / 10 + 48));
  253.   tm.displayASCIIwDot(1, char(laci1 % 10 + 48));
  254. }
  255. void tampil2() {
  256.   two.setBrightness(laci2);
  257.   tm.displayASCII(2, char(laci2 / 10 + 48));
  258.   tm.displayASCIIwDot(3, char(laci2 % 10 + 48));
  259. }
  260. void tampil3() {
  261.   three.setBrightness(laci3);
  262.   tm.displayASCII(4, char(laci3 / 10 + 48));
  263.   tm.displayASCIIwDot(5, char(laci3 % 10 + 48));
  264. }
  265. void tampil4() {
  266.   four.setBrightness(laci4);
  267.   tm.displayASCII(6, char(laci4 / 10 + 48));
  268.   tm.displayASCIIwDot(7, char(laci4 % 10 + 48));
  269. } 
5. Berikutnya, sebelum meng-upload program tersebut ke NodeMCU, isi dulu nama Wi-Fi, password Wi-Fi dan Kode Secret Key di Tab program arduino_secrets.h, dan kode Device ID diisikan di Tab program thingProperties.h di Device_Login_Name (ini harusnya sudah terisi). Sketch di atas memerlukan 5 library berikut ini. Pastikan 5 library ini telah di-instal di software Arduino IDE, yaitu secara berturut-turut:
  • ArduinoIoTCloud (versi 1.8.0)
  • Arduino_ConnectionHandler (versi 0.7.1)
  • Arduino_DebugUtils-master
  • ArduinoMqttClient-master
  • TM1638plus 
6. Rekan-rekan dapat mengunduh kelima file library di atas pada file lampiran yang disertakan di langkah no. 19. Setelah kelima library di atas terinstal, berikutnya pilih Board dan Port. Gunakan Board NodeMCU 1.0, dan Port sesuai dengan yang digunakan. Upload program, dan tunggu hingga selesai. Setelah selesai, buka Serial Monitor. Apabila muncul tulisan, Connected to Arduino IoT Cloud, berarti Device NodeMCU sudah online, alias sudah terhubung dengan variabel di Cloud. 

7. Berikutnya, buka Dashboard, klik tombol Add, pilih Things, pilih Lemari1. Kemudian pilih kelima variabel, klik Create Widgets, maka akan muncul 4 buah widget Dimmed Light dan sebuah widget Messenger.

Gambar 6. Klik Add, pilih Things, pilih Lemari1, klik tombol Create Widgets

8. Berikutnya, klik Tool Arrange widgets. Kemudian atur ukuran dan posisi kelima widget hingga seperti gambar berikut ini..

Gambar 7. Atur posisi dan ukuran kelima widget menggunakan Tool Arrange widgets

9. Setelah pengaturan di Dashboard selesai, seharusnya nilai di Dashboard tersebut akan dapat dibaca dan ditulis oleh NodeMCU. Karena input output NodeMCU terhubung dengan Modul LED&KEY, yang berisi 8 buah tombol, 8 buah 7-segmen dan 8 buah LED, maka silahkan menghubungkan Modul LED&KEY ke NodeMCU seperti gambar berikut. Hubungkan kaki VCC, GND, STB, CLK dan DIO Modul LED&KEY secara berturut-turut ke kaki 3V, GND, D5, D6 dan D7 NodeMCU.

Gambar 8. Hubungkan D5, D6, D7 NodeMCU dengan STB, CLK, DIO modul LED&KEY (TM1638)

10. Beri suplai ke NodeMCU. Tunggu hingga tampilan 7-segmen menampilkan angka yang sama seperti pada keempat widget Dimmed Light. Setelah muncul angka pada 7-segmen, lakukan perubahan angka dengan menggeser Slider pada keempat widget Dimmed Light, dan perhatikan tampilan 7-segmen.

11. Berikutnya tekan tombol yang berada di tengah-tengah widget Dimmed Light, dan perhatikan nyala kedelapan indikator LED di Modul LED&KEY. Seharusnya ketika tombol di-ON-kan, LED yang bersesuaian akan menyala, sedangkan ketika tombol di-OFF-kan, LED tersebut padam.

12. Berikutnya, ketik v di kotak input widget Messenger. Seharusnya kedelapan LED indikator menyala. Ketik x, seharusnya kedelapan LED padam. Ketik a1, maka LED pertama dan LED kedua di Modul LED&KEY seharusnya menyala. Ketik a12, maka  seharusnya widget Dimmed Light yang bernama one akan bernilai 12, begitu pula tampilan 7-segmen di digit pertama dan kedua, seharusnya menampilkan angka 12. Ketik d25, maka seharusnya widget Dimmed Light yang bernama four akan bernilai 25, dan tampilan 7-segmen di digit ketujuh dan kedelapan, seharusnya juga menampilkan angka 25. Lebih jauh, berikut ini kode input di widget Messenger dan output yang dihasilkannya:
  • Ketik v: semua LED ON, semua widget Dimmed Light = ON
  • Ketik x: semua LED OFF, semua widget Dimmed Light = OFF
  • Ketik a1: LED1 & LED2 ON
  • Ketik a0: LED1 & LED2 OFF
  • Ketik b1: LED3 & LED4 ON
  • Ketik b0: LED3 & LED4 OFF
  • Ketik c1: LED5 & LED6 ON
  • Ketik c0: LED5 & LED6 OFF
  • Ketik d1: LED7 & LED8 ON
  • Ketik d0: LED7 & LED8 OFF
  • Ketik aXX (dimana XX adalah angka): dua digit 7-segmen yang pertama dan widget Dimmed Light one menampilkan angka XX.
  • Ketik bXX (dimana XX adalah angka): dua digit 7-segmen yang kedua menampilkan angka XX dan widget Dimmed Light two menampilkan angka XX. 
  • Ketik cXX (dimana XX adalah angka): dua digit 7-segmen yang ketiga menampilkan angka XX dan widget Dimmed Light three menampilkan angka XX. 
  • Ketik dXX (dimana XX adalah angka): dua digit 7-segmen yang keempat menampilkan angka XX dan widget Dimmed Light four menampilkan angka XX. 
13. Selain dapat diatur dari widget Messenger dan widget Dimmed Light, jumlah barang yang ditampilkan di 7-segmen juga dapat diatur dengan menekan tombol di Modul LED&KEY. Setiap kali tombol + ditekan, maka akan menambah jumlah barang, dan setiap kali tombol - ditekan, akan mengurangi jumlah barang. Untuk alasan privasi, maka penambahan dan pengurangan jumlah barang ini hanya bisa dilakukan apabila indikator LED yang bersesuain dengan tombol tersebut menyala, alias laci harus dalam kondisi dibuka dulu dari Cloud. Ketika indikator LED masih padam (laci dalam kondisi tertutup), maka penekanan tombol + dan tombol - tidak akan bisa mengubah jumlah barang.

14. Matikan NodeMCU dengan memutus suplai tegangan. Kemudian hidupkan lagi NodeMCU. Perhatikan bahwa angka pada 7-segmen akan menampilkan kembali angka yang sama dengan keempat widget Dimmed Light. Dengan kondisi seperti ini, kita tidak perlu kuatir data hilang karena listrik mati, karena datanya tersimpan di Cloud.

15. Agar buka tutup laci dan jumlah barang dapat dikontrol dengan suara, yaitu dengan bantuan Alexa, maka buka aplikasi Alexa di HP. Apabila rekan-rekan belum memiliki aplikasi Alexa, silahkan unduh di Play Store, dan instal aplikasi Alexa. Setelah terinstal, ikuti langkah-langkah pada gambar berikut ini.

Gambar 9. Buka Alexa, klik More, klik Skills & Games

Gambar 10. Ketik Arduino di kolom pencarian, pilih Arduino, klik Settings

Gambar 11. Klik Enable to Use untuk mengaktifkan Device

Catatan: apabila sebelumnya telah terhubung dengan akun di Arduino IoT Cloud, maka di halaman Settings akan muncul tulisan Account Linking: Linked seperti terlihat pada gambar di atas. Untuk mengganti akun yang terhubung tersebut dengan akun yang baru, klik tombol Back, klik tombol Disable Skill, klik Disable, maka akun yang lama akan terputus. Untuk menghubungkan ke akun yang baru, klik Settings kembali, dan klik Enable to Use.

Gambar 12. Akan muncul halaman Sign In untuk memasukkan nama dan password akun yang terdaftar di Arduino IoT Cloud. Setelah sign in berhasil, Alexa akan mencari Device Arduino IoT Cloud

Gambar 13. Setelah beberapa saat, Alexa akan menemukan Device. Nama Device ini akan sama dengan nama variable di Arduino IoT Cloud. Klik satu persatu nama Device tersebut.

Gambar 14. Ada 4 Device sesuai variabel di Arduino IoT Cloud, yaitu, one, two, three dan four. Masing-masing Device memiliki 2 tipe nilai: Boolean (true/false) dan Integer (0-99) 

Gambar 15. Setelah semua Device selesai dibuka, berikutnya klik tanda + pada Favorites, dan pilih keempat Device tersebut untuk menampilkannya di kolom Favorites. Untuk pemanggilannya dengan Alexa, gunakan turn on/turn off untuk LED dan set to angka dalam % untuk 7-segmen

16. Agar setiap perubahan pada jumlah barang dapat tersimpan, tidak hanya di kotak widget Messenger, tetapi juga di Google Sheet (agar tidak perlu membuka Dashboard), maka kita bisa tambahkan link Webhook Google Sheet di halaman Things. Untuk pembuatan link Webhook ini, silahkan teman-teman bisa mengikuti langkah-langkah di sini: https://bermainarduinoiotcloud.blogspot.com/p/5-kontrol-di-mana-mana.html di topik "Memantau Data Arduino IoT Cloud dengan Webhook & Google Sheet". Gambar-gambar berikut ini menunjukkan langkah-langkah penambahan Webhook Google Sheet ke aplikasi Arduino IoT Cloud ini.

Gambar 16. Klik 3 kali pada link Webhook yang telah dibuat, klik Ctrl+C untuk meng-copy

Gambar 17. Di halaman Things Lemari1, klik tombol Set Webhook

Gambar 18. Di jendela Set Webhook, tempelkan link Webhook (Ctrl+V), kemudian klik Set Webhook

Gambar 19. Maka muncul keterangan link Webhook telah aktif (Active)

17. Setelah link Webhook aktif, lakukan pengubahan nilai pada kelima widget di Dashboard dan perhatikan tampilan data di Google Sheet. Karena tipe data widget Dimmed Light berbentuk kompleks (gabungan Boolean dengan Integer), sedangkan widget Messenger bertipe data String, maka Google Sheet hanya akan menampilkan satu tipe data saja, yaitu tipe data yang pertama kali muncul di baris paling atas. Oleh sebab itu, saat pertama kali melakukan pengubahan nilai widget, pastikan yang diubah pertama kali adalah widget Messenger, dengan cara mengetikkan kata "a1" pada kotak input widget Messenger, maka untuk seterusnya, pada kolom values_0_value, hanya data tipe string saja yang akan muncul, sedangkan tipe data yang lain tidak muncul. Berikutnya, agar tampilan data di Google Sheet lebih baik, tambahkan Data Validation, dengan diberi aturan (rule) hanya variabel dengan nama out1 saja yang diterima, sedangkan variabel dengan nama lain tidak diterima (reject the input). Untuk membuat hal ini, lakukan langkah-langkah sesuai gambar berikut ini:

Gambar 20. Hanya variabel out1 saja yang bisa muncul datanya di Google Sheet, sedangkan variabel one, two, three, four tidak muncul datanya karena tipe datanya berbeda dengan variabel out1

Gambar 21. Agar hanya variabel out1 saja yang muncul, tambahkan data validation dengan cara, klik atau pilih kolom A values_0_name yang berisi nama variabel, lalu tekan tombol drop down

Gambar 22. Ketika tombol drop down di kolom A ditekan, muncul menu, pilih Data Validation, pilih Text contains, ketik "out1", pilih Advanced options, pilih Reject the input, dan terakhir klik Done

Gambar 23. Setelah validasi data diterapkan, tampak tampilan data di Google Sheet menjadi lebih baik, yaitu hanya variabel out1 saja yang ditampilkan

Catatan: untuk memperkecil ukuran data yang dikirimkan ke Google Sheet, maka format data dibuat dengan keterangan sebagai berikut:
  • Untuk data Boolean pada keempat widget, format datanya adalah X:ON atau X:OFF
  • Untuk data Integer pada keempat widget, format datanya adalah X:YY
di mana X adalah nomor widget, 1 berarti one, 2 berarti two, 3 berarti three dan 4 berarti four, 
dan YY adalah angka integer sesuai nilai pada widget.

18. Untuk lebih jelas mengenai pembuatan aplikasi Lemari Pintar ini, silahkan melihat video berikut ini:

Video pembuatan aplikasi Lemari Pintar

19. Sampai di sini pembuatan aplikasi Lemari Pintar. Untuk file program NodeMCU dan Library yang digunakan di bagian ini, silahkan bisa diunduh di link ini: Program NodeMCU dan Library 


No comments:

Post a Comment