4. Semakin Banyak Kontrol

Daftar Isi:

=========================================================================================



Catatan untuk NodeMCU ESP8266: agar status device-nya bisa menjadi Online, silahkan menggunakan library ArduinoIoTCloud versi 1.8.0 dan Arduino_ConnectionHandler versi 0.7.1, dan upload program secara offline (menggunakan software IDE Arduino di komputer).

Catatan untuk ESP32: agar status devicenya bisa menjadi Online, rekan-rekan bisa menggunakan Editor Arduino online (seharusnya lancar tanpa masalah). Karena memang ESP32 didukung penuh dalam pengembangan Arduino IoT Cloud, sedangkan untuk NodeMCU ESP8266 belum menjadi prioritas.

Setelah di bagian ketiga diuraikan mengenai pembuatan Kontrol ON/OFF untuk 4 dan 8 Relay, dan Kontrol Terjadwal untuk 4 Relay, serta bagaimana memanfaatkan widget Messenger untuk mengatasi keterbatasan variabel, maka di bagian keempat ini, akan dibahas bagaimana manfaat dari sinkronisasi variabel dan penggabungan Thing, yang memungkinkan untuk mengontrol lebih banyak alat. Agar memudahkan pembuatan, maka saya membagi pembahasan ini dalam 3 tahapan berikut ini:
1. Pembuatan Kontrol ON/OFF dengan Switch dan Messenger untuk 2x8 buah Relay
2. Pembuatan Kontrol ON/OFF untuk 16 buah Relay 
3. Pembuatan Kontrol Terjadwal untuk 2x8 buah Relay

Berikut ini uraian masing-masing tahapan:


=========================================================================================


1. Pembuatan Kontrol ON/OFF dengan Switch dan Messenger untuk 2x8 buah Relay 

Sering kali rasa penasaran muncul dan semakin membesar ketika keinginan tidak terlaksana 😁😁😁. Rasa penasaran inilah yang mendorong saya menulis "coba-coba" di bagian keempat ini. Intinya, saya ingin lebih banyak alat yang bisa dikontrol. Untungnya ada banyak "orang baik" di internet, yang membuat "coba-coba" saya bisa memenuhi keinginan saya. Setelah mencari-cari di internet, akhirnya saya menemukan solusi agar alat yang dikontrol bisa lebih banyak, yaitu dengan menggunakan widget Messenger, melibatkan 2 Thing, dan membuat variabel di kedua Thing tersebut sinkron.  

Untuk lebih memahami solusi yang saya maksud tersebut, perhatikan gambar berikut ini:

Gambar 1. Keinginan: saya ingin mengontrol 8 Relay dengan 8 Switch di Dashboard

Gambar 2. Ketentuan: hanya diijinkan 5 variabel/Thing untuk fitur gratis

Gambar 3. Kebetulan: ada sinkronisasi yang bisa membuat widget berisi data yang sama

Gambar 4. Kenyataan: melibatkan 2 Thing, dan widget Messenger yang disinkronisasi, 
bisa membuat 8 buah widget Switch di Dashboard terbaca oleh kedua widget Messenger

Gambar 5. Kenyataan: Karena setiap Thing (NodeMCU) memiliki variabel pembacaan kedelapan widget switch yang sama, maka masing-masing bisa digunakan untuk mengontrol 8 buah Relay

Agar lebih jelas, berikut ini langkah-langkah pembuatannya:
1. Buat akun yang baru di Arduino IoT Cloud, atau bisa juga menggunakan akun yang sudah terdaftar. Hanya saja karena aplikasi yang akan dibuat ini menggunakan 2 Thing, maka Thing yang sudah dibuat sebelumnya terpaksa harus dihapus. 

Gambar 6. Agar bisa mengontrol 2x8 Relay, dibutuhkan 2 buah Thing

2. Seperti Gambar 6 di atas, buat 2 buah Thing, beri nama Thing pertama: Kontrol1, dan nama Thing kedua: Kontrol2. Kemudian buat kedua Thing tersebut masing-masing memiliki 5 buah variabel dengan nama, tipe, ijin akses dan update policy seperti tabel berikut.

Thing: Kontrol1

Nama Variable

Tipe Variable

Ijin Akses (Permission)

Update Policy

a

bool (Basic | Boolean)

Read & Write

On Change

b

bool (Basic | Boolean)

Read & Write

On Change

c

bool (Basic | Boolean)

Read & Write

On Change

d

bool (Basic | Boolean)

Read & Write

On Change

out1

String (Basic | Character String)

Read & Write

On Change

Thing: Kontrol2

Nama Variable

Tipe Variable

Ijin Akses (Permission)

Update Policy

e

bool (Basic | Boolean)

Read & Write

On Change

f

bool (Basic | Boolean)

Read & Write

On Change

g

bool (Basic | Boolean)

Read & Write

On Change

h

bool (Basic | Boolean)

Read & Write

On Change

out2

String (Basic | Character String)

Read & Write

On Change

3. Gambar berikut menampilkan kedua Thing dengan kelima variabel sesuai tabel di atas.

Gambar 7. Pembuatan 5 variabel Cloud di Thing Kontrol1

Gambar 8. Pembuatan 5 variabel Cloud di Thing Kontrol2

4. Setelah penambahan 5 buah variabel di Thing Kontrol1 dan Thing Kontrol2 selesai, berikutnya lakukan Setup Device untuk masing-masing Thing. Jangan lupa untuk menyimpan kode Device ID dan Secret Key untuk kedua device tersebut (gunakan download the pdf). Isi pula Network di kedua Thing, sesuaikan dengan nama dan password Wi-Fi yang digunakan, serta Secret Key Device. 

5. Setelah ketiga bagian di Tab Setup terisi semua, yaitu Variabel, Associated Device, dan Network, agar kedua Thing bisa memiliki data yang sama, khususnya untuk data String out1 dan out2, maka buat kedua String tersebut saling sinkron, dengan cara, meng-klik tombol titik 3x, pilih Edit, kemudian di jendela yang muncul, di bawah nama variabel, klik tombol Sync with other Things, centang pada kedua variabel yang akan disinkronkan, kemudian tekan tombol Synchronize Variables.

Gambar 9. Buka jendela Edit untuk variabel out1 atau out2, klik tombol Sync with other Things

Gambar 10. Di Edit Syncing Group, centang variable out1 dan out2, tekan  Synchronize Variables

6. Berikutnya, klik pada Tab Sketch, kemudian tekan tombol Open Full Editor, untuk membuka Web Editor. Di halaman Web Editor, download Sketch untuk Thing Kontrol1, dan Sketch untuk Thing Kontrol2. Thing Kontrol1 seharusnya memiliki variable out1, a, b, c dan d, sedangkan Thing Kontrol2 seharusnya memiliki variabel out2, e, f, g,  dan h.

Gambar 11. Download Sketch untuk Thing Kontrol1 dengan variabel out1, a, b, c, dan d

Gambar 12. Download Sketch untuk Thing Kontrol2 dengan variable out2, e, f, g, dan h

7. Setelah kedua Sketch tersebut terdownload, ekstraks file. Di Sketch untuk Kontrol1, 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. void setup() {
  4.   pinMode(D1, OUTPUT);
  5.   pinMode(D2, OUTPUT);
  6.   pinMode(D3, OUTPUT);
  7.   pinMode(D4, OUTPUT);
  8.   pinMode(D5, OUTPUT);
  9.   pinMode(D6, OUTPUT);
  10.   pinMode(D7, OUTPUT);
  11.   pinMode(D8, OUTPUT);
  12.   digitalWrite(D1, HIGH);
  13.   digitalWrite(D2, HIGH);
  14.   digitalWrite(D3, HIGH);
  15.   digitalWrite(D4, HIGH);
  16.   digitalWrite(D5, HIGH);
  17.   digitalWrite(D6, HIGH);
  18.   digitalWrite(D7, HIGH);
  19.   digitalWrite(D8, HIGH);
  20.   Serial.begin(9600);
  21.   delay(1500);
  22.   initProperties();
  23.   ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  24.   setDebugMessageLevel(2);
  25.   ArduinoCloud.printDebugInfo();
  26. }
  27. void loop() {
  28.   ArduinoCloud.update();
  29. }
  30. void onOut1Change() {
  31.   if (out1 == "A1" || out1 == "a1" || out1 == "V" || out1 == "v") {
  32.     digitalWrite(D1, LOW);
  33.     a = true;
  34.   }
  35.   if (out1 == "A0" || out1 == "a0" || out1 == "X" || out1 == "x") {
  36.     digitalWrite(D1, HIGH);
  37.     a = false;
  38.   }
  39.   if (out1 == "B1" || out1 == "b1" || out1 == "V" || out1 == "v") {
  40.     digitalWrite(D2, LOW);
  41.     b = true;
  42.   }
  43.   if (out1 == "B0" || out1 == "b0" || out1 == "X" || out1 == "x") {
  44.     digitalWrite(D2, HIGH);
  45.     b = false;
  46.   }
  47.   if (out1 == "C1" || out1 == "c1" || out1 == "V" || out1 == "v") {
  48.     digitalWrite(D3, LOW);
  49.     c = true;
  50.   }
  51.   if (out1 == "C0" || out1 == "c0" || out1 == "X" || out1 == "x") {
  52.     digitalWrite(D3, HIGH);
  53.     c = false;
  54.   }
  55.   if (out1 == "D1" || out1 == "d1" || out1 == "V" || out1 == "v") {
  56.     digitalWrite(D4, LOW);
  57.     d = true;
  58.   }
  59.   if (out1 == "D0" || out1 == "d0" || out1 == "X" || out1 == "x") {
  60.     digitalWrite(D4, HIGH);
  61.     d = false;
  62.   }
  63.   if (out1 == "E1" || out1 == "e1" || out1 == "V" || out1 == "v") digitalWrite(D5, LOW);
  64.   if (out1 == "E0" || out1 == "e0" || out1 == "X" || out1 == "x") digitalWrite(D5, HIGH);
  65.   if (out1 == "F1" || out1 == "f1" || out1 == "V" || out1 == "v") digitalWrite(D6, LOW);
  66.   if (out1 == "F0" || out1 == "f0" || out1 == "X" || out1 == "x") digitalWrite(D6, HIGH);
  67.   if (out1 == "G1" || out1 == "g1" || out1 == "V" || out1 == "v") digitalWrite(D7, LOW);
  68.   if (out1 == "G0" || out1 == "g0" || out1 == "X" || out1 == "x") digitalWrite(D7, HIGH);
  69.   if (out1 == "H1" || out1 == "h1" || out1 == "V" || out1 == "v") digitalWrite(D8, LOW);
  70.   if (out1 == "H0" || out1 == "h0" || out1 == "X" || out1 == "x") digitalWrite(D8, HIGH);
  71. }
  72. void onAChange() {
  73.   if (a) {
  74.     digitalWrite(D1, LOW);
  75.     out1 = "A1";
  76.   } else {
  77.     digitalWrite(D1, HIGH);
  78.     out1 = "A0";
  79.   }
  80. }
  81. void onBChange() {
  82.   if (b) {
  83.     digitalWrite(D2, LOW);
  84.     out1 = "B1";
  85.   } else {
  86.     digitalWrite(D2, HIGH);
  87.     out1 = "B0";
  88.   }
  89. }
  90. void onCChange() {
  91.   if (c) {
  92.     digitalWrite(D3, LOW);
  93.     out1 = "C1";
  94.   } else {
  95.     digitalWrite(D3, HIGH);
  96.     out1 = "C0";
  97.   }
  98. }
  99. void onDChange() {
  100.   if (d) {
  101.     digitalWrite(D4, LOW);
  102.     out1 = "D1";
  103.   } else {
  104.     digitalWrite(D4, HIGH);
  105.     out1 = "D0";
  106.   }
  107. }
8. Berikutnya, di Tab arduino_secrets.h, isi ssid/nama hotspot Wi-Fi, password hotspot Wi-Fi dan kode Secret Key Device untuk Kontrol1, yang dapat disalin dari file pdf atau dari Tab Secret di Web Editor. 

9. Berikutnya, sebelum meng-upload Sketch Kontrol1 di atas ke NodeMCU, pilih menu Tools, pilih Manage Libraries. Di Library Manager, pastikan 4 buah library berikut ini sudah terinstal:
  • ArduinoIoTCloud (versi 1.8.0) 
  • Arduino_ConnectionHandler (versi 0.7.1)
  • Arduino_DebugUtils-master
  • ArduinoMqttClient-master
10. Berikutnya, setelah keempat library tersebut terinstal, hubungkan NodeMCU ke port USB Komputer, kemudian atur Board dan Port di menu Tools. Setelah pengaturan Board dan Port sudah benar, upload Sketch tersebut ke NodeMCU. Setelah upload selesai, buka Serial Monitor, tunggu hingga muncul tulisan "Connected to Arduino IoT Cloud". Apabila tulisan tersebut sudah muncul di Serial Monitor, seharusnya Status Device di Tab Setup di Thing Kontrol1, menjadi Online.

11. Berikutnya lakukan hal yang sama untuk Sketch Kontrol2, yaitu hapus seluruh isi Tab program ino, dan ganti dengan program berikut ini:
  1. #include "arduino_secrets.h"
  2. #include "thingProperties.h"
  3. void setup() {
  4.   pinMode(D1, OUTPUT);
  5.   pinMode(D2, OUTPUT);
  6.   pinMode(D3, OUTPUT);
  7.   pinMode(D4, OUTPUT);
  8.   pinMode(D5, OUTPUT);
  9.   pinMode(D6, OUTPUT);
  10.   pinMode(D7, OUTPUT);
  11.   pinMode(D8, OUTPUT);
  12.   digitalWrite(D1, HIGH);
  13.   digitalWrite(D2, HIGH);
  14.   digitalWrite(D3, HIGH);
  15.   digitalWrite(D4, HIGH);
  16.   digitalWrite(D5, HIGH);
  17.   digitalWrite(D6, HIGH);
  18.   digitalWrite(D7, HIGH);
  19.   digitalWrite(D8, HIGH);
  20.   Serial.begin(9600);
  21.   delay(1500);
  22.   initProperties();
  23.   ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  24.   setDebugMessageLevel(2);
  25.   ArduinoCloud.printDebugInfo();
  26. }
  27. void loop() {
  28.   ArduinoCloud.update();
  29. }
  30. void onOut2Change() {
  31.   if (out2 == "A1" || out2 == "a1" || out2 == "V" || out2 == "v") digitalWrite(D1, LOW);
  32.   if (out2 == "A0" || out2 == "a0" || out2 == "X" || out2 == "x") digitalWrite(D1, HIGH);
  33.   if (out2 == "B1" || out2 == "b1" || out2 == "V" || out2 == "v") digitalWrite(D2, LOW);
  34.   if (out2 == "B0" || out2 == "b0" || out2 == "X" || out2 == "x") digitalWrite(D2, HIGH);
  35.   if (out2 == "C1" || out2 == "c1" || out2 == "V" || out2 == "v") digitalWrite(D3, LOW);
  36.   if (out2 == "C0" || out2 == "c0" || out2 == "X" || out2 == "x") digitalWrite(D3, HIGH);
  37.   if (out2 == "D1" || out2 == "d1" || out2 == "V" || out2 == "v") digitalWrite(D4, LOW);
  38.   if (out2 == "D0" || out2 == "d0" || out2 == "X" || out2 == "x") digitalWrite(D4, HIGH);
  39.   if (out2 == "E1" || out2 == "e1" || out2 == "V" || out2 == "v") {
  40.     digitalWrite(D5, LOW);
  41.     e = true;
  42.   }
  43.   if (out2 == "E0" || out2 == "e0" || out2 == "X" || out2 == "x") {
  44.     digitalWrite(D5, HIGH);
  45.     e = false;
  46.   }
  47.   if (out2 == "F1" || out2 == "f1" || out2 == "V" || out2 == "v") {
  48.     digitalWrite(D6, LOW);
  49.     f = true;
  50.   }
  51.   if (out2 == "F0" || out2 == "f0" || out2 == "X" || out2 == "x") {
  52.     digitalWrite(D6, HIGH);
  53.     f = false;
  54.   }
  55.   if (out2 == "G1" || out2 == "g1" || out2 == "V" || out2 == "v") {
  56.     digitalWrite(D7, LOW);
  57.     g = true;
  58.   }
  59.   if (out2 == "G0" || out2 == "g0" || out2 == "X" || out2 == "x") {
  60.     digitalWrite(D7, HIGH);
  61.     g = false;
  62.   }
  63.   if (out2 == "H1" || out2 == "h1" || out2 == "V" || out2 == "v") {
  64.     digitalWrite(D8, LOW);
  65.     h = true;
  66.   }
  67.   if (out2 == "H0" || out2 == "h0" || out2 == "X" || out2 == "x") {
  68.     digitalWrite(D8, HIGH);
  69.     h = false;
  70.   }
  71. }
  72. void onEChange() {
  73.   if (e) {
  74.     digitalWrite(D5, LOW);
  75.     out2 = "E1";
  76.   } else {
  77.     digitalWrite(D5, HIGH);
  78.     out2 = "E0";
  79.   }
  80. }
  81. void onFChange() {
  82.   if (f) {
  83.     digitalWrite(D6, LOW);
  84.     out2 = "F1";
  85.   } else {
  86.     digitalWrite(D6, HIGH);
  87.     out2 = "F0";
  88.   }
  89. }
  90. void onGChange() {
  91.   if (g) {
  92.     digitalWrite(D7, LOW);
  93.     out2 = "G1";
  94.   } else {
  95.     digitalWrite(D7, HIGH);
  96.     out2 = "G0";
  97.   }
  98. }
  99. void onHChange() {
  100.   if (h) {
  101.     digitalWrite(D8, LOW);
  102.     out2 = "H1";
  103.   } else {
  104.     digitalWrite(D8, HIGH);
  105.     out2 = "H0";
  106.   }
  107. }
12. Berikutnya, di Tab arduino_secrets.h, isi ssid/nama hotspot Wi-Fi, password hotspot Wi-Fi dan kode Secret Key untuk Device Kontrol2, yang dapat disalin dari file pdf atau dari Tab Secret di Web Editor.

13. Berikutnya, hubungkan NodeMCU kedua ke port USB Komputer, kemudian atur Board dan Port di menu Tools. Setelah pengaturan Board dan Port sudah benar, upload Sketch tersebut ke NodeMCU kedua. Setelah upload selesai, buka Serial Monitor, tunggu hingga muncul tulisan "Connected to Arduino IoT Cloud". Apabila tulisan tersebut sudah muncul di Serial Monitor, seharusnya Status Device di Tab Setup di Thing Kontrol2, menjadi Online.

14. Setelah status Device Online, maka langkah berikutnya adalah mengatur tampilan variable di Dashboard. Klik Tab Dashboards, kemudian tekan tombol Build Dashboard. Di halaman Dashboards, ganti nama Untitled menjadi Kontrol 2x8 Relay.

15. Berikutnya klik tombol Add, pilih Tab Things, pilih Kontrol1, dan kemudian tekan tombol Create Widgets, maka secara otomatis muncul sebuah widget Messenger untuk variabel String out1, dan 4 buah Switch untuk variabel Boolean a, b, c dan d. 

Gambar 13. Menambahkan widget pada Dashboard untuk Kontrol1 dengan klik Add, pilih Things

16. Ulangi cara yang sama untuk penambahan widget pada Dashboard untuk Kontrol2, maka secara otomatis muncul sebuah widget Messenger untuk variabel String out2, dan 4 buah Switch untuk variabel Boolean e, f, g dan h.

Gambar 14. Menambahkan widget untuk Kontrol2 pada Dashboard dengan klik Add, pilih Things

17. Berikutnya, atur posisi dan ukuran widget-widget tersebut dengan Tool Arrange widgets. Buat tampilan seperti berikut.

Gambar 15. Atur posisi dan ukuran kesepuluh widget sesuai gambar di atas

18. Apabila kedua Device sudah online, lakukan pengubahan pada kedelapan Switch, dan perhatikan tampilan pada kedua widget Messenger, serta pada 2 Modul Relay yang masing-masing terhubung dengan NodeMCU. Seharusnya ketika Switch a di-ON-kan, maka baik di Modul Relay pertama, maupun Modul Relay kedua, Relay di urutan pertama hidup, dan muncul tulisan A1 di kedua widget Messenger. Ketika Switch b di-ON-kan, maka Relay di urutan kedua hidup, dan muncul tulisan B1 di kedua widget Messenger. Ketika Switch a di-OFF-kan, maka Relay di urutan pertama mati, muncul tulisan A0 di kedua widget Messenger. Ketika Switch b di-OFF-kan, maka Relay di urutan kedua mati, dan muncul tulisan B0 di kedua widget Messenger. demikian seterusnya.

19. Di samping pengaturan melalui kedelapan Switch, pengaturan hidup mati 2x8 Relay dapat dilakukan dengan mengetikkan kode input berikut ini ke kotak input salah satu widget Messenger.

- ketik v: semua Relay ON.
- ketik x: semua Relay OFF.
- ketik a1: Relay1 ON.
- ketik a0: Relay1 OFF.
- ketik b1: Relay2 ON.
- ketik b0: Relay2 OFF.
- ketik c1: Relay3 ON.
- ketik c0: Relay3 OFF.
- ketik d1: Relay4 ON.
- ketik d0: Relay4 OFF.
- ketik e1: Relay5 ON.
- ketik e0: Relay5 OFF.
- ketik f1: Relay6 ON.
- ketik f0: Relay6 OFF.
- ketik g1: Relay7 ON.
- ketik g0: Relay7 OFF.
- ketik h1: Relay8 ON.
- ketik h0: Relay8 OFF.  

20. Karena kedua widget Messenger memiliki data yang sama (karena dibuat sinkron), agar terkesan lebih sederhana, hilangkan (delete) salah satu widget Messenger. Sekalipun tidak ada widgetnya, namun di balik layar, variabel yang dihilangkan widgetnya tersebut tetap dapat menerima dan mengirim data.

Gambar 16. Hilangkan salah satu widget Messenger untuk menyederhanakan tampilan Dashboard

21. Klik tombol Show Mobile Layout, buat tampilan di HP yang memudahkan pengguna untuk melakukan kontrol, baik dengan bantuan 8 buah Switch maupun dengan widget Messenger. 

Gambar 17. Atur widget di Show Mobile Layout untuk tampilan Dashboard di HP

22. Berikut ini foto Kontrol ON/OFF untuk 2x8 buah Relay, yang diatur dari Dashboad di halaman web.

Gambar 18(a). Pengaturan kedelapan Switch akan menghidup/matikan 2x8 Relay 

Gambar 18(b). Menyalakan semua Relay dengan mengetikkan "v" ke kotak input widget Messenger

Gambar 18(c). Pengaturan dari Dashboard di web untuk 2 buah Modul Relay berhasil dilakukan

23. Berikut ini foto Kontrol ON/OFF untuk 2x8 buah Relay, yang diatur dari Dashboad di HP.
Gambar 19(a). Pengaturan dua buah Modul Relay dari tampilan Dashboard di HP

Gambar 19(b). Pengaturan dua buah Modul Relay dari tampilan Dashboard di HP

Gambar 19(c). Pengaturan dua buah Modul Relay dari tampilan Dashboard di HP

24. Agar lebih jelas, berikut ini video pembuatan Kontrol ON/OFF untuk 2x8 buah Relay dengan Arduino IoT Cloud dan NodeMCU.

Video Pembuatan Kontrol ON/OFF 2x8 Relay dengan NodeMCU dan Arduino IoT Cloud

25. Sampai di sini pembahasan mengenai pembuatan Kontrol ON/OFF untuk 2x8 buah Relay. Tahapan berikutnya, akan dijelaskan bagaimana membuat Kontrol ON/OFF untuk 16 buah Relay. Untuk file program NodeMCU dan Library yang digunakan di bagian ini, silahkan bisa diunduh di bawah, di bagian File Download.


=========================================================================================


2. Pembuatan Kontrol ON/OFF untuk 16 buah Relay

Mungkin rekan-rekan bertanya, apa bedanya Kontrol ON/OFF untuk 2x8 buah Relay yang diuraikan di bagian awal di atas, dengan Kontrol ON/OFF untuk 16 buah Relay di bagian ini? Bukankah keduanya sama-sama untuk mengontrol 16 buah Relay? Betul sekali rekan-rekan, sama-sama untuk mengontrol 16 buah Relay. Hanya ada perbedaan, yaitu untuk 2x8, saya menggunakan 2 buah Modul Relay 8 channel, di mana kondisi dari Modul Relay 8 channel yang pertama, adalah sama dengan (sinkron) dengan kondisi dari Modul Relay 8 channel kedua. Apabila ada 4 buah Relay yang dihidupkan di Modul Relay yang pertama, maka di Modul Relay kedua, keempat Relay dengan posisi yang sama, juga akan hidup. Jadi untuk 2x8, sebenarnya hanya 8 Relay yang diatur kondisinya, sedangkan 8 Relay yang lain, kondisinya mengikuti kondisi kedelapan Relay yang pertama. Berbeda dengan di bagian ini, di Kontrol 16 buah Relay ini, setiap Relay dapat diatur kondisinya secara terpisah. 

Langsung saja, agar lebih jelas, kita buat dulu aplikasinya. Berikut ini langkah-langkahnya:
1. Mula-mula, buat akun yang baru, kemudian buat 2 buah Thing, beri nama Thing pertama: Kontrol1, dan nama Thing kedua: Kontrol2

Gambar 20. Buat 2 buah Thing, beri nama Kontrol1 dan Kontrol2

2. Di halaman Tab Setup Thing Kontrol1, tambahkan 2 buah variable. Beri nama variabel pertama: outa dan variabel kedua: outb. Buat keduanya memiliki tipe data yang sama, yaitu tipe String. Untuk Permission variabel outa, pilih Read&Write, sedangkan untuk Permission variabel outb pilih Read Only. Untuk Update Policy, buat keduanya On Change. Ulangi hal yang sama untuk Thing Kontrol2, beri nama variabel outc dan outd. Lebih jelasnya lihat Tabel berikut:

Thing: Kontrol1

Nama Variable

Tipe Variable

Ijin Akses (Permission)

Update Policy

outa

String (Basic | Character String)

Read & Write

On Change

outb

String (Basic | Character String)

Read Only

On Change

Thing: Kontrol2

Nama Variable

Tipe Variable

Ijin Akses (Permission)

Update Policy

outc

String (Basic | Character String)

Read & Write

On Change

outd

String (Basic | Character String)

Read Only

On Change

 

Gambar 21(a). Buat 2 buah variabel di Thing Kontrol1, outa (Read&Write) dan outb (Read Only)

Gambar 21(b). Buat 2 buah variabel di Thing Kontrol2, outc (Read&Write) dan outd (Read Only)

3. Setelah penambahan variabel di kedua Thing selesai, berikutnya lakukan Setup Device untuk masing-masing Thing. Jangan lupa untuk menyimpan kode Device ID dan Secret Key (gunakan download the pdf). Isi pula Network di kedua Thing, sesuaikan dengan nama dan password Wi-Fi yang digunakan, serta Secret Key masing-masing Device. 

4. Setelah Cloud Variabel, Associated Device, dan Network di Tab Setup terisi semua, langkah berikutnya adalah membuat variabel outa di Thing Kontrol1 dan outc di Thing Kontrol2 saling sinkron. Untuk membuat keduanya saling sinkron, Edit variabel outa (atau bisa juga variabel outc), dengan meng-klik tombol titik 3x, pilih Edit. Di jendela yang muncul, di bawah nama variabel, klik tombol Sync with other Things, centang variabel outa dan outc yang akan disinkronkan, kemudian tekan tombol Synchronize Variables.

Gambar 22. Edit variabel, centang pada variabel outa dan outc, klik Synchronize variables

5. Setelah membuat variabel outa dan outc menjadi sinkron, berikutnya, klik Tab Sketch, dan kemudian klik tombol Open Full Editor untuk membuka Web Editor. Di Web Editor yang terbuka, download Sketch untuk Kontrol1 dan Kontrol2. Pastikan di Sketch Kontrol1, variabel yang dibangkitkan adalah outa dan outb, sedangkan di Sketch Kontrol2, variabel yang dibangkitkan outc dan outd.

Gambar 23(a). Di Web Editor, download Sketch untuk Thing Kontrol1 dengan variabel outa dan outb

Gambar 23(b). Di Web Editor, download Sketch untuk Thing Kontrol2 dengan variable outc dan outd

6. Setelah kedua Sketch tersebut terdownload, ekstraks file. Di Sketch untuk Kontrol1, 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. String a = ".0";
  4. String b = ".0";
  5. String c = ".0";
  6. String d = ".0";
  7. String e = ".0";
  8. String f = ".0";
  9. String g = ".0";
  10. String h = ".0";
  11. String i = ".0";
  12. String j = ".0";
  13. String k = ".0";
  14. String l = ".0";
  15. String m = ".0";
  16. String n = ".0";
  17. String o = ".0";
  18. String p = ".0";
  19. void setup() {
  20.   pinMode(D1, OUTPUT);
  21.   pinMode(D2, OUTPUT);
  22.   pinMode(D3, OUTPUT);
  23.   pinMode(D4, OUTPUT);
  24.   pinMode(D5, OUTPUT);
  25.   pinMode(D6, OUTPUT);
  26.   pinMode(D7, OUTPUT);
  27.   pinMode(D8, OUTPUT);
  28.   digitalWrite(D1, HIGH);
  29.   digitalWrite(D2, HIGH);
  30.   digitalWrite(D3, HIGH);
  31.   digitalWrite(D4, HIGH);
  32.   digitalWrite(D5, HIGH);
  33.   digitalWrite(D6, HIGH);
  34.   digitalWrite(D7, HIGH);
  35.   digitalWrite(D8, HIGH);
  36.   Serial.begin(9600);
  37.   delay(1500);
  38.   initProperties();
  39.   ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  40.   setDebugMessageLevel(2);
  41.   ArduinoCloud.printDebugInfo();
  42. }
  43. void loop() {
  44.   ArduinoCloud.update();
  45. }
  46. void onOutaChange() {
  47.   if (outa == "A1" || outa == "a1" || outa == "V" || outa == "v") {
  48.     digitalWrite(D1, LOW);
  49.     a = "1";
  50.   }
  51.   if (outa == "A0" || outa == "a0" || outa == "X" || outa == "x") {
  52.     digitalWrite(D1, HIGH);
  53.     a = "0";
  54.   }
  55.   if (outa == "B1" || outa == "b1" || outa == "V" || outa == "v") {
  56.     digitalWrite(D2, LOW);
  57.     b = ".1";
  58.   }
  59.   if (outa == "B0" || outa == "b0" || outa == "X" || outa == "x") {
  60.     digitalWrite(D2, HIGH);
  61.     b = ".0";
  62.   }
  63.   if (outa == "C1" || outa == "c1" || outa == "V" || outa == "v") {
  64.     digitalWrite(D3, LOW);
  65.     c = ".1";
  66.   }
  67.   if (outa == "C0" || outa == "c0" || outa == "X" || outa == "x") {
  68.     digitalWrite(D3, HIGH);
  69.     c = ".0";
  70.   }
  71.   if (outa == "D1" || outa == "d1" || outa == "V" || outa == "v") {
  72.     digitalWrite(D4, LOW);
  73.     d = ".1";
  74.   }
  75.   if (outa == "D0" || outa == "d0" || outa == "X" || outa == "x") {
  76.     digitalWrite(D4, HIGH);
  77.     d = ".0";
  78.   }
  79.   if (outa == "E1" || outa == "e1" || outa == "V" || outa == "v") {
  80.     digitalWrite(D5, LOW);
  81.     e = ".1";
  82.   }
  83.   if (outa == "E0" || outa == "e0" || outa == "X" || outa == "x") {
  84.     digitalWrite(D5, HIGH);
  85.     e = ".0";
  86.   }
  87.   if (outa == "F1" || outa == "f1" || outa == "V" || outa == "v") {
  88.     digitalWrite(D6, LOW);
  89.     f = ".1";
  90.   }
  91.   if (outa == "F0" || outa == "f0" || outa == "X" || outa == "x") {
  92.     digitalWrite(D6, HIGH);
  93.     f = ".0";
  94.   }
  95.   if (outa == "G1" || outa == "g1" || outa == "V" || outa == "v") {
  96.     digitalWrite(D7, LOW);
  97.     g = ".1";
  98.   }
  99.   if (outa == "G0" || outa == "g0" || outa == "X" || outa == "x") {
  100.     digitalWrite(D7, HIGH);
  101.     g = ".0";
  102.   }
  103.   if (outa == "H1" || outa == "h1" || outa == "V" || outa == "v") {
  104.     digitalWrite(D8, LOW);
  105.     h = ".1";
  106.   }
  107.   if (outa == "H0" || outa == "h0" || outa == "X" || outa == "x") {
  108.     digitalWrite(D8, HIGH);
  109.     h = ".0";
  110.   }
  111.   if (outa == "I1" || outa == "i1" || outa == "V" || outa == "v") {
  112.     i = "-1";
  113.   }
  114.   if (outa == "I0" || outa == "i0" || outa == "X" || outa == "x") {
  115.     i = "-0";
  116.   }
  117.   if (outa == "J1" || outa == "j1" || outa == "V" || outa == "v") {
  118.     j = ".1";
  119.   }
  120.   if (outa == "J0" || outa == "j0" || outa == "X" || outa == "x") {
  121.     j = ".0";
  122.   }
  123.   if (outa == "K1" || outa == "k1" || outa == "V" || outa == "v") {
  124.     k = ".1";
  125.   }
  126.   if (outa == "K0" || outa == "k0" || outa == "X" || outa == "x") {
  127.     k = ".0";
  128.   }
  129.   if (outa == "L1" || outa == "l1" || outa == "V" || outa == "v") {
  130.     l = ".1";
  131.   }
  132.   if (outa == "L0" || outa == "l0" || outa == "X" || outa == "x") {
  133.     l = ".0";
  134.   }
  135.   if (outa == "M1" || outa == "m1" || outa == "V" || outa == "v") {
  136.     m = ".1";
  137.   }
  138.   if (outa == "M0" || outa == "m0" || outa == "X" || outa == "x") {
  139.     m = ".0";
  140.   }
  141.   if (outa == "N1" || outa == "n1" || outa == "V" || outa == "v") {
  142.     n = ".1";
  143.   }
  144.   if (outa == "N0" || outa == "n0" || outa == "X" || outa == "x") {
  145.     n = ".0";
  146.   }
  147.   if (outa == "O1" || outa == "o1" || outa == "V" || outa == "v") {
  148.     o = ".1";
  149.   }
  150.   if (outa == "O0" || outa == "o0" || outa == "X" || outa == "x") {
  151.     o = ".0";
  152.   }
  153.   if (outa == "P1" || outa == "p1" || outa == "V" || outa == "v") {
  154.     p = ".1";
  155.   }
  156.   if (outa == "P0" || outa == "p0" || outa == "X" || outa == "x") {
  157.     p = ".0";
  158.   }
  159.   outb = a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p;
  160. }

7. Berikutnya, di Tab arduino_secrets.h, isi ssid/nama hotspot Wi-Fi, password hotspot Wi-Fi dan kode Secret Key Device untuk Kontrol1, yang dapat disalin dari file pdf atau dari Tab Secret di Web Editor. 

8. Berikutnya, sebelum meng-upload Sketch Kontrol1 di atas ke NodeMCU, pilih menu Tools, pilih Manage Libraries. Di Library Manager, pastikan 4 buah library berikut ini sudah terinstal:
  • ArduinoIoTCloud (versi 1.8.0) 
  • Arduino_ConnectionHandler (versi 0.7.1)
  • Arduino_DebugUtils-master
  • ArduinoMqttClient-master
9. Berikutnya, setelah keempat library tersebut terinstal, hubungkan NodeMCU ke port USB Komputer, kemudian atur Board dan Port di menu Tools. Setelah pengaturan Board dan Port sudah benar, upload Sketch tersebut ke NodeMCU. Setelah upload selesai, buka Serial Monitor, tunggu hingga muncul tulisan "Connected to Arduino IoT Cloud". Apabila tulisan tersebut sudah muncul di Serial Monitor, seharusnya Status Device di Tab Setup di Thing Kontrol1, menjadi Online.

10. Berikutnya lakukan hal yang sama untuk Sketch Kontrol2, yaitu hapus seluruh isi Tab program ino, dan ganti dengan program berikut ini:
    1. #include "arduino_secrets.h"
    2. #include "thingProperties.h"
    3. String a = ".0";
    4. String b = ".0";
    5. String c = ".0";
    6. String d = ".0";
    7. String e = ".0";
    8. String f = ".0";
    9. String g = ".0";
    10. String h = ".0";
    11. String i = ".0";
    12. String j = ".0";
    13. String k = ".0";
    14. String l = ".0";
    15. String m = ".0";
    16. String n = ".0";
    17. String o = ".0";
    18. String p = ".0";
    19. void setup() {
    20.   pinMode(D1, OUTPUT);
    21.   pinMode(D2, OUTPUT);
    22.   pinMode(D3, OUTPUT);
    23.   pinMode(D4, OUTPUT);
    24.   pinMode(D5, OUTPUT);
    25.   pinMode(D6, OUTPUT);
    26.   pinMode(D7, OUTPUT);
    27.   pinMode(D8, OUTPUT);
    28.   digitalWrite(D1, HIGH);
    29.   digitalWrite(D2, HIGH);
    30.   digitalWrite(D3, HIGH);
    31.   digitalWrite(D4, HIGH);
    32.   digitalWrite(D5, HIGH);
    33.   digitalWrite(D6, HIGH);
    34.   digitalWrite(D7, HIGH);
    35.   digitalWrite(D8, HIGH);
    36.   Serial.begin(9600);
    37.   delay(1500);
    38.   initProperties();
    39.   ArduinoCloud.begin(ArduinoIoTPreferredConnection);
    40.   setDebugMessageLevel(2);
    41.   ArduinoCloud.printDebugInfo();
    42. }
    43. void loop() {
    44.   ArduinoCloud.update();
    45. }
    46. void onOutcChange() {
    47.   if (outc == "A1" || outc == "a1" || outc == "V" || outc == "v") {
    48.     a = "1";
    49.   }
    50.   if (outc == "A0" || outc == "a0" || outc == "X" || outc == "x") {
    51.     a = "0";
    52.   }
    53.   if (outc == "B1" || outc == "b1" || outc == "V" || outc == "v") {
    54.     b = ".1";
    55.   }
    56.   if (outc == "B0" || outc == "b0" || outc == "X" || outc == "x") {
    57.     b = ".0";
    58.   }
    59.   if (outc == "C1" || outc == "c1" || outc == "V" || outc == "v") {
    60.     c = ".1";
    61.   }
    62.   if (outc == "C0" || outc == "c0" || outc == "X" || outc == "x") {
    63.     c = ".0";
    64.   }
    65.   if (outc == "D1" || outc == "d1" || outc == "V" || outc == "v") {
    66.     d = ".1";
    67.   }
    68.   if (outc == "D0" || outc == "d0" || outc == "X" || outc == "x") {
    69.     d = ".0";
    70.   }
    71.   if (outc == "E1" || outc == "e1" || outc == "V" || outc == "v") {
    72.     e = ".1";
    73.   }
    74.   if (outc == "E0" || outc == "e0" || outc == "X" || outc == "x") {
    75.     e = ".0";
    76.   }
    77.   if (outc == "F1" || outc == "f1" || outc == "V" || outc == "v") {
    78.     f = ".1";
    79.   }
    80.   if (outc == "F0" || outc == "f0" || outc == "X" || outc == "x") {
    81.     f = ".0";
    82.   }
    83.   if (outc == "G1" || outc == "g1" || outc == "V" || outc == "v") {
    84.     g = ".1";
    85.   }
    86.   if (outc == "G0" || outc == "g0" || outc == "X" || outc == "x") {
    87.     g = ".0";
    88.   }
    89.   if (outc == "H1" || outc == "h1" || outc == "V" || outc == "v") {
    90.     h = ".1";
    91.   }
    92.   if (outc == "H0" || outc == "h0" || outc == "X" || outc == "x") {
    93.     h = ".0";
    94.   }
    95.   if (outc == "I1" || outc == "i1" || outc == "V" || outc == "v") {
    96.     digitalWrite(D1, LOW);
    97.     i = "-1";
    98.   }
    99.   if (outc == "I0" || outc == "i0" || outc == "X" || outc == "x") {
    100.     digitalWrite(D1, HIGH);
    101.     i = "-0";
    102.   }
    103.   if (outc == "J1" || outc == "j1" || outc == "V" || outc == "v") {
    104.     digitalWrite(D2, LOW);
    105.     j = ".1";
    106.   }
    107.   if (outc == "J0" || outc == "j0" || outc == "X" || outc == "x") {
    108.     digitalWrite(D2, HIGH);
    109.     j = ".0";
    110.   }
    111.   if (outc == "K1" || outc == "k1" || outc == "V" || outc == "v") {
    112.     digitalWrite(D3, LOW);
    113.     k = ".1";
    114.   }
    115.   if (outc == "K0" || outc == "k0" || outc == "X" || outc == "x") {
    116.     digitalWrite(D3, HIGH);
    117.     k = ".0";
    118.   }
    119.   if (outc == "L1" || outc == "l1" || outc == "V" || outc == "v") {
    120.     digitalWrite(D4, LOW);
    121.     l = ".1";
    122.   }
    123.   if (outc == "L0" || outc == "l0" || outc == "X" || outc == "x") {
    124.     digitalWrite(D4, HIGH);
    125.     l = ".0";
    126.   }
    127.   if (outc == "M1" || outc == "m1" || outc == "V" || outc == "v") {
    128.     digitalWrite(D5, LOW);
    129.     m = ".1";
    130.   }
    131.   if (outc == "M0" || outc == "m0" || outc == "X" || outc == "x") {
    132.     digitalWrite(D5, HIGH);
    133.     m = ".0";
    134.   }
    135.   if (outc == "N1" || outc == "n1" || outc == "V" || outc == "v") {
    136.     digitalWrite(D6, LOW);
    137.     n = ".1";
    138.   }
    139.   if (outc == "N0" || outc == "n0" || outc == "X" || outc == "x") {
    140.     digitalWrite(D6, HIGH);
    141.     n = ".0";
    142.   }
    143.   if (outc == "O1" || outc == "o1" || outc == "V" || outc == "v") {
    144.     digitalWrite(D7, LOW);
    145.     o = ".1";
    146.   }
    147.   if (outc == "O0" || outc == "o0" || outc == "X" || outc == "x") {
    148.     digitalWrite(D7, HIGH);
    149.     o = ".0";
    150.   }
    151.   if (outc == "P1" || outc == "p1" || outc == "V" || outc == "v") {
    152.     digitalWrite(D8, LOW);
    153.     p = ".1";
    154.   }
    155.   if (outc == "P0" || outc == "p0" || outc == "X" || outc == "x") {
    156.     digitalWrite(D8, HIGH);
    157.     p = ".0";
    158.   }  
    159.   outd = a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p;
    160. }

11. Berikutnya, di Tab arduino_secrets.h, isi ssid/nama hotspot Wi-Fi, password hotspot Wi-Fi dan kode Secret Key untuk Device Kontrol2, yang dapat disalin dari file pdf atau dari Tab Secret di Web Editor.

12. Berikutnya, hubungkan NodeMCU kedua ke port USB Komputer, kemudian atur Board dan Port di menu Tools. Setelah pengaturan Board dan Port sudah benar, upload Sketch tersebut ke NodeMCU kedua. Setelah upload selesai, buka Serial Monitor, tunggu hingga muncul tulisan "Connected to Arduino IoT Cloud". Apabila tulisan tersebut sudah muncul di Serial Monitor, seharusnya Status Device di Tab Setup di Thing Kontrol2, menjadi Online.

13. Setelah status Device Online, maka langkah berikutnya adalah mengatur tampilan variable di Dashboard. Klik Tab Dashboards, kemudian tekan tombol Build Dashboard. Di halaman Dashboards, ganti nama Untitled menjadi Kontrol 16 Relay.

14. Berikutnya klik tombol Add, pilih Tab Things, pilih Kontrol1, dan kemudian tekan tombol Create Widgets, maka secara otomatis muncul 2 buah widget Messenger untuk variabel String outa dan outb. Widget Messenger outa memiliki kotak input dan output, sedangkan Widget Messenger outb hanya memiliki kotak output.

Gambar 24(a). Di Dashboard, klik Add, pilih Things, pilih Kontrol1, klik Create Widgets

Gambar 24(b). Muncul 2 buah widget Messenger: outa (dengan kotak input) dan outb

Catatan: widget Messenger dengan kotak input berfungsi untuk mengirimkan kontrol ke Device, sekaligus menampilkan kode input yang dikirimkan dan catatan waktunya, sedangkan widget Messenger tanpa kotak input, difungsikan untuk menampilkan keseluruhan kondisi dari semua Relay.

15. Ulangi cara yang sama untuk penambahan widget pada Dashboard untuk Kontrol2, maka secara otomatis muncul 2 buah widget Messenger untuk variabel String outc dan outd. Widget Messenger outc memiliki kotak input dan output, sedangkan Widget Messenger outd hanya memiliki kotak output.

Gambar 25(a). Di Dashboard, klik Add, pilih Things, pilih Kontrol2, klik Create Widgets

Gambar 25(b). Muncul tambahan 2 buah widget Messenger: outc (dengan kotak input) dan outd

16. Berikutnya, atur posisi dan ukuran widget-widget tersebut dengan Tool Arrange widgets. Buat tampilan seperti berikut.

Gambar 26. Atur posisi dan ukuran keempat widget Messenger dengan Tool Arrange widgets

17. Apabila kedua Device sudah online, ketikkan kode input "v" ke salah satu widget Messenger yang memiliki kotak input (bisa outa atau outc), dan kemudian tekan Enter, maka semua Relay akan ON. Ketikkan kode input "x" diikuti Enter, maka semua Relay akan OFF. Lebih detil kode input dan hasilnya dapat dilihat di daftar berikut:

- ketik v: semua Relay ON.
- ketik x: semua Relay OFF.
- ketik a1: Relay1 di Modul1 ON.
- ketik a0: Relay1 di Modul1 OFF.
- ketik b1: Relay2 di Modul1 ON.
- ketik b0: Relay2 di Modul1 OFF.
- ketik c1: Relay3 di Modul1 ON.
- ketik c0: Relay3 di Modul1 OFF.
- ketik d1: Relay4 di Modul1 ON.
- ketik d0: Relay4 di Modul1 OFF.
- ketik e1: Relay5 di Modul1 ON.
- ketik e0: Relay5 di Modul1 OFF.
- ketik f1: Relay6 di Modul1 ON.
- ketik f0: Relay6 di Modul1 OFF.
- ketik g1: Relay7 di Modul1 ON.
- ketik g0: Relay7 di Modul1 OFF.
- ketik h1: Relay8 di Modul1 ON.
- ketik h0: Relay8 di Modul1 OFF. 
- ketik i1: Relay1 di Modul2 ON.
- ketik i0: Relay1 di Modul2 OFF.
- ketik j1: Relay2 di Modul2 ON.
- ketik j0: Relay2 di Modul2 OFF.
- ketik k1: Relay3 di Modul2 ON.
- ketik k0: Relay3 di Modul2 OFF.
- ketik l1: Relay4 di Modul2 ON.
- ketik l0: Relay4 di Modul2 OFF.
- ketik m1: Relay5 di Modul2 ON.
- ketik m0: Relay5 di Modul2 OFF.
- ketik n1: Relay6 di Modul2 ON.
- ketik n0: Relay6 di Modul2 OFF.
- ketik o1: Relay7 di Modul2 ON.
- ketik o0: Relay7 di Modul2 OFF.
- ketik p1: Relay8 di Modul2 ON.
- ketik p0: Relay8 di Modul2 OFF.   
 
18. Karena widget Messenger outa dan outc memiliki data yang sama (karena dibuat sinkron), dan juga widget Messenger outb dan outd juga menampilkan data yang sama, maka agar terkesan lebih ringkas dan sederhana, hilangkan (delete) widget Messenger outc dan outd. Sekalipun tidak ada widgetnya, namun di balik layar, baik variabel outc maupun variabel outd di Cloud tetap dapat menerima data dari Device, dan untuk variabel outc tetap dapat mengirim data ke widget outa di Dashboard. 

Gambar 27(a). Menghapus widget Messenger outd, karena datanya sama dengan outb

Gambar 27(b). Menghapus widget Messenger outc, karena datanya sama dengan outa

19. Klik tombol Show Mobile Layout, buat tampilan di HP yang memudahkan pengguna untuk memasukkan kode input di kotak input widget Messenger outa dan untuk melihat hasil keseluruhan kondisi Relay di widget Messenger outb. 

Gambar 28. Tampilan di HP, Widget Messenger outb ditempatkan di atas outa

20. Berikut ini foto Kontrol ON/OFF untuk 16 buah Relay, yang diatur dari Dashboad di halaman web.

Gambar 29(a). Menyalakan semua Relay dengan mengetikkan kode input "v"

Gambar 29(b). Menyalakan Relay di a, b, g, h, k, l, m, n

Gambar 29(c). Menyalakan Relay di b, d, f, h, i, k, m, o

21. Berikut ini foto Kontrol ON/OFF untuk 16 buah Relay, yang diatur dari Dashboad di HP.

Gambar 30(a). Menyalakan semua Relay dengan mengetikkan kode "v" di HP

Gambar 30(b). Menyalakan Relay di a, c, e, g, i, k, m, o

Gambar 30(c). Menyalakan Relay di a, b, e, f, g, h, i, o

22. Agar lebih jelas, berikut ini video pembuatan Kontrol ON/OFF untuk 2x8 buah Relay dengan Arduino IoT Cloud dan NodeMCU.

Video Pembuatan Kontrol ON/OFF 16 Relay dengan NodeMCU dan Arduino IoT Cloud

23. Sampai di sini pembahasan mengenai pembuatan Kontrol ON/OFF untuk 16 buah Relay. Tahapan berikutnya, akan dijelaskan bagaimana membuat Kontrol Terjadwal untuk 2x8 buah Relay. Untuk file program NodeMCU dan Library yang digunakan di bagian ini, silahkan bisa diunduh di bawah, di bagian File Download.


=========================================================================================


3. Pembuatan Kontrol Terjadwal untuk 2x8 buah Relay

Berikut ini 2 hal yang saya peroleh dari pembuatan semakin banyak kontrol di Arduino IoT Cloud ini, khususnya untuk penggunaan fitur gratis:
  1. Untuk membuat alat kontrol yang lebih banyak, solusi terbaik adalah menggunakan widget Messenger yang memiliki tipe data String, sehingga memiliki banyak sekali kemungkinan kombinasi karakter yang bisa dijadikan sebagai kode untuk input maupun output.
  2. Untuk membuat sebuah Device atau sebuah Thing bisa mengakomodasi lebih banyak variabel di Cloud, yang bisa ditampilkan di widget, maka solusi yang menurut saya terbaik adalah menggabungkan 2 buah Thing, masing-masing Thing menggunakan widget Messenger, kemudian kedua widget Messenger tersebut dibuat sinkron, sehingga kedua widget Messenger tersebut selalu berisi data yang sama.
Dua hal tersebut akan saya terapkan di sini untuk menghasilkan Kontrol Terjadwal untuk 2x8 buah Relay. Berikut ini langkah-langkah pembuatannya:
1. Mula-mula, buat akun yang baru, kemudian buat 2 buah Thing, beri nama Thing pertama: Kontrol1, dan nama Thing kedua: Kontrol2

Gambar 31. Buat 2 buah Thing, beri nama Kontrol1 dan Kontrol2

2. Di masing-masing Thing, tambahkan 5 buah variable sesuai Tabel berikut: 

Thing: Kontrol1

Nama Variable

Tipe Variable

Ijin Akses (Permission)

Update Policy

a

CloudSchedule (Time | Schedule)

Read & Write

On Change

b

CloudSchedule (Time | Schedule)

Read & Write

On Change

c

CloudSchedule (Time | Schedule)

Read & Write

On Change

d

CloudSchedule (Time | Schedule)

Read & Write

On Change

out1

String (Basic | Character String)

Read & Write

On Change

Thing: Kontrol2

Nama Variable

Tipe Variable

Ijin Akses (Permission)

Update Policy

e

CloudSchedule (Time | Schedule)

Read & Write

On Change

f

CloudSchedule (Time | Schedule)

Read & Write

On Change

g

CloudSchedule (Time | Schedule)

Read & Write

On Change

h

CloudSchedule (Time | Schedule)

Read & Write

On Change

out2

String (Basic | Character String)

Read & Write

On Change


Gambar 32(a). Tambahkan variabel a, b, c, d dan out1 di Thing Kontrol1

Gambar 32(b). Tambahkan variabel e, f, g, h dan out2 di Thing Kontrol2

3. Setelah penambahan variabel di kedua Thing selesai, berikutnya lakukan Setup Device untuk masing-masing Thing. Jangan lupa untuk menyimpan kode Device ID dan Secret Key (gunakan download the pdf). Isi pula Network di kedua Thing, sesuaikan dengan nama dan password Wi-Fi yang digunakan, serta Secret Key masing-masing Device. 

4. Setelah Cloud Variabel, Associated Device, dan Network di Tab Setup terisi semua, langkah berikutnya adalah membuat variabel out1 di Thing Kontrol1 dan out2 di Thing Kontrol2 saling sinkron. Untuk membuat keduanya saling sinkron, Edit variabel out1 (atau bisa juga variabel out2), dengan meng-klik tombol titik 3x, pilih Edit. Di jendela yang muncul, di bawah nama variabel, klik tombol Sync with other Things, centang variabel out1 dan out2 yang akan disinkronkan, kemudian tekan tombol Synchronize Variables.

Gambar 33(a). Di variabel out2 (atau out1), klik tombol titik 3x, pilih Edit

Gambar 33(b). Di jendela Edit variable, klik Sync with other Things, centang out1 dan out2,    kemudian klik tombol Synchronize variables

5. Setelah membuat variabel out1 dan out2 menjadi sinkron, berikutnya, klik Tab Sketch, dan kemudian klik tombol Open Full Editor untuk membuka Web Editor. Di Web Editor yang terbuka, download Sketch untuk Kontrol1 dan Kontrol2. Pastikan di Sketch Kontrol1, variabel yang dibangkitkan adalah variabel a, b, c, d dan out1, sedangkan di Sketch Kontrol2, variabel yang dibangkitkan adalah variabel e, f, g, h dan out2.

Gambar 34(a). Download Sketch Thing Kontrol1 dari Web Editor

Gambar 34(b). Download Sketch Thing Kontrol2 dari Web Editor

6. Setelah kedua Sketch tersebut terdownload, ekstraks file. Di Sketch untuk Kontrol1, 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. String out = "T";
  4. String outa = "0";
  5. String outb = "0";
  6. String outc = "0";
  7. String outd = "0";
  8. String oute = "0";
  9. String outf = "0";
  10. String outg = "0";
  11. String outh = "0";
  12. String tambahB = "0000";
  13. bool terjadwal = true;
  14. void setup() {
  15.   pinMode(D1, OUTPUT);
  16.   pinMode(D2, OUTPUT);
  17.   pinMode(D3, OUTPUT);
  18.   pinMode(D4, OUTPUT);
  19.   pinMode(D5, OUTPUT);
  20.   pinMode(D6, OUTPUT);
  21.   pinMode(D7, OUTPUT);
  22.   pinMode(D8, OUTPUT);
  23.   digitalWrite(D1, HIGH);
  24.   digitalWrite(D2, HIGH);
  25.   digitalWrite(D3, HIGH);
  26.   digitalWrite(D4, HIGH);
  27.   digitalWrite(D5, HIGH);
  28.   digitalWrite(D6, HIGH);
  29.   digitalWrite(D7, HIGH);
  30.   digitalWrite(D8, HIGH);
  31.   Serial.begin(9600);
  32.   delay(1500);
  33.   initProperties();
  34.   ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  35.   setDebugMessageLevel(2);
  36.   ArduinoCloud.printDebugInfo();
  37. }
  38. void loop() {
  39.   ArduinoCloud.update();
  40.   if (terjadwal) {
  41.     if (a.isActive()) {
  42.       digitalWrite(D1, LOW);
  43.       outa = "1";
  44.     } else {
  45.       digitalWrite(D1, HIGH);
  46.       outa = "0";
  47.     }
  48.     if (b.isActive()) {
  49.       digitalWrite(D2, LOW);
  50.       outb = "1";
  51.     } else {
  52.       digitalWrite(D2, HIGH);
  53.       outb = "0";
  54.     }
  55.     if (c.isActive()) {
  56.       digitalWrite(D3, LOW);
  57.       outc = "1";
  58.     } else {
  59.       digitalWrite(D3, HIGH);
  60.       outc = "0";
  61.     }
  62.     if (d.isActive()) {
  63.       digitalWrite(D4, LOW);
  64.       outd = "1";
  65.     } else {
  66.       digitalWrite(D4, HIGH);
  67.       outd = "0";
  68.     }
  69.   }
  70.   out1 = "A" + outa + outb + outc + outd + tambahB + out;
  71. }
  72. void onOut1Change() {
  73.   if (out1 == "T" || out1 == "t") {
  74.     terjadwal = true;
  75.     out = "T";
  76.   }
  77.   if (out1 == "M" || out1 == "m") {
  78.     terjadwal = false;
  79.     out = "M";
  80.   }
  81.   if (terjadwal) {
  82.     if (out1.charAt(0) == 'A') {
  83.       if (out1.charAt(1) == '1') digitalWrite(D1, LOW);
  84.       if (out1.charAt(1) == '0') digitalWrite(D1, HIGH);
  85.       if (out1.charAt(2) == '1') digitalWrite(D2, LOW);
  86.       if (out1.charAt(2) == '0') digitalWrite(D2, HIGH);
  87.       if (out1.charAt(3) == '1') digitalWrite(D3, LOW);
  88.       if (out1.charAt(3) == '0') digitalWrite(D3, HIGH);
  89.       if (out1.charAt(4) == '1') digitalWrite(D4, LOW);
  90.       if (out1.charAt(4) == '0') digitalWrite(D4, HIGH);
  91.     }
  92.     if (out1.charAt(0) == 'B') {
  93.       tambahB = out1.substring(5, 9);
  94.       if (out1.charAt(5) == '1') digitalWrite(D5, LOW);
  95.       if (out1.charAt(5) == '0') digitalWrite(D5, HIGH);
  96.       if (out1.charAt(6) == '1') digitalWrite(D6, LOW);
  97.       if (out1.charAt(6) == '0') digitalWrite(D6, HIGH);
  98.       if (out1.charAt(7) == '1') digitalWrite(D7, LOW);
  99.       if (out1.charAt(7) == '0') digitalWrite(D7, HIGH);
  100.       if (out1.charAt(8) == '1') digitalWrite(D8, LOW);
  101.       if (out1.charAt(8) == '0') digitalWrite(D8, HIGH);
  102.     }
  103.   } else {
  104.     if (out1 == "A1" || out1 == "a1" || out1 == "V" || out1 == "v") {
  105.       digitalWrite(D1, LOW);
  106.       outa = "1";
  107.     }
  108.     if (out1 == "A0" || out1 == "a0" || out1 == "X" || out1 == "x") {
  109.       digitalWrite(D1, HIGH);
  110.       outa = "0";
  111.     }
  112.     if (out1 == "B1" || out1 == "b1" || out1 == "V" || out1 == "v") {
  113.       digitalWrite(D2, LOW);
  114.       outb = "1";
  115.     }
  116.     if (out1 == "B0" || out1 == "b0" || out1 == "X" || out1 == "x") {
  117.       digitalWrite(D2, HIGH);
  118.       outb = "0";
  119.     }
  120.     if (out1 == "C1" || out1 == "c1" || out1 == "V" || out1 == "v") {
  121.       digitalWrite(D3, LOW);
  122.       outc = "1";
  123.     }
  124.     if (out1 == "C0" || out1 == "c0" || out1 == "X" || out1 == "x") {
  125.       digitalWrite(D3, HIGH);
  126.       outc = "0";
  127.     }
  128.     if (out1 == "D1" || out1 == "d1" || out1 == "V" || out1 == "v") {
  129.       digitalWrite(D4, LOW);
  130.       outd = "1";
  131.     }
  132.     if (out1 == "D0" || out1 == "d0" || out1 == "X" || out1 == "x") {
  133.       digitalWrite(D4, HIGH);
  134.       outd = "0";
  135.     }
  136.     if (out1 == "E1" || out1 == "e1" || out1 == "V" || out1 == "v") {
  137.       digitalWrite(D5, LOW);
  138.       oute = "1";
  139.     }
  140.     if (out1 == "E0" || out1 == "e0" || out1 == "X" || out1 == "x") {
  141.       digitalWrite(D5, HIGH);
  142.       oute = "0";
  143.     }
  144.     if (out1 == "F1" || out1 == "f1" || out1 == "V" || out1 == "v") {
  145.       digitalWrite(D6, LOW);
  146.       outf = "1";
  147.     }
  148.     if (out1 == "F0" || out1 == "f0" || out1 == "X" || out1 == "x") {
  149.       digitalWrite(D6, HIGH);
  150.       outf = "0";
  151.     }
  152.     if (out1 == "G1" || out1 == "g1" || out1 == "V" || out1 == "v") {
  153.       digitalWrite(D7, LOW);
  154.       outg = "1";
  155.     }
  156.     if (out1 == "G0" || out1 == "g0" || out1 == "X" || out1 == "x") {
  157.       digitalWrite(D7, HIGH);
  158.       outg = "0";
  159.     }
  160.     if (out1 == "H1" || out1 == "h1" || out1 == "V" || out1 == "v") {
  161.       digitalWrite(D8, LOW);
  162.       outh = "1";
  163.     }
  164.     if (out1 == "H0" || out1 == "h0" || out1 == "X" || out1 == "x") {
  165.       digitalWrite(D8, HIGH);
  166.       outh = "0";
  167.     }
  168.     tambahB = oute + outf + outg + outh;
  169.   }
  170. }
  171. void onAChange() {
  172. }
  173. void onBChange() {
  174. }
  175. void onCChange() {
  176. }
  177. void onDChange() {
  178. }

7. Berikutnya, di Tab arduino_secrets.h, isi ssid/nama hotspot Wi-Fi, password hotspot Wi-Fi dan kode Secret Key Device untuk Kontrol1, yang dapat disalin dari file pdf atau dari Tab Secret di Web Editor.

8. Berikutnya, sebelum meng-upload Sketch Kontrol1 di atas ke NodeMCU, pilih menu Tools, pilih Manage Libraries. Di Library Manager, pastikan 4 buah library berikut ini sudah terinstal:
  • ArduinoIoTCloud (versi 1.8.0) 
  • Arduino_ConnectionHandler (versi 0.7.1) 
  • Arduino_DebugUtils-master
  • ArduinoMqttClient-master
9. Berikutnya, setelah keempat library tersebut terinstal, hubungkan NodeMCU ke port USB Komputer, kemudian atur Board dan Port di menu Tools. Setelah pengaturan Board dan Port sudah benar, upload Sketch tersebut ke NodeMCU. Setelah upload selesai, buka Serial Monitor, tunggu hingga muncul tulisan "Connected to Arduino IoT Cloud". Apabila tulisan tersebut sudah muncul di Serial Monitor, seharusnya Status Device di Tab Setup di Thing Kontrol1, menjadi Online.

10. Berikutnya lakukan hal yang sama untuk Sketch Kontrol2, yaitu hapus seluruh isi Tab program ino, dan ganti dengan program berikut ini:
  1. #include "arduino_secrets.h"
  2. #include "thingProperties.h"
  3. String out = "T";
  4. String outa = "0";
  5. String outb = "0";
  6. String outc = "0";
  7. String outd = "0";
  8. String oute = "0";
  9. String outf = "0";
  10. String outg = "0";
  11. String outh = "0";
  12. String tambahA = "0000";
  13. bool terjadwal = true;
  14. void setup() {
  15.   pinMode(D1, OUTPUT);
  16.   pinMode(D2, OUTPUT);
  17.   pinMode(D3, OUTPUT);
  18.   pinMode(D4, OUTPUT);
  19.   pinMode(D5, OUTPUT);
  20.   pinMode(D6, OUTPUT);
  21.   pinMode(D7, OUTPUT);
  22.   pinMode(D8, OUTPUT);
  23.   digitalWrite(D1, HIGH);
  24.   digitalWrite(D2, HIGH);
  25.   digitalWrite(D3, HIGH);
  26.   digitalWrite(D4, HIGH);
  27.   digitalWrite(D5, HIGH);
  28.   digitalWrite(D6, HIGH);
  29.   digitalWrite(D7, HIGH);
  30.   digitalWrite(D8, HIGH);
  31.   Serial.begin(9600);
  32.   delay(1500);
  33.   initProperties();
  34.   ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  35.   setDebugMessageLevel(2);
  36.   ArduinoCloud.printDebugInfo();
  37. }
  38. void loop() {
  39.   ArduinoCloud.update();
  40.   if (terjadwal) {
  41.     if (e.isActive()) {
  42.       digitalWrite(D5, LOW);
  43.       oute = "1";
  44.     } else {
  45.       digitalWrite(D5, HIGH);
  46.       oute = "0";
  47.     }
  48.     if (f.isActive()) {
  49.       digitalWrite(D6, LOW);
  50.       outf = "1";
  51.     } else {
  52.       digitalWrite(D6, HIGH);
  53.       outf = "0";
  54.     }
  55.     if (g.isActive()) {
  56.       digitalWrite(D7, LOW);
  57.       outg = "1";
  58.     } else {
  59.       digitalWrite(D7, HIGH);
  60.       outg = "0";
  61.     }
  62.     if (h.isActive()) {
  63.       digitalWrite(D8, LOW);
  64.       outh = "1";
  65.     } else {
  66.       digitalWrite(D8, HIGH);
  67.       outh = "0";
  68.     }
  69.   }
  70.   out2 = "B" + tambahA + oute + outf + outg + outh + out;
  71. }
  72. void onOut2Change() {
  73.   if (out2.charAt(9) == 'T') {
  74.     terjadwal = true;
  75.     out = "T";
  76.   }
  77.   if (out2.charAt(9) == 'M') {
  78.     terjadwal = false;
  79.     out = "M";
  80.   }
  81.   if (terjadwal) {
  82.     if (out2.charAt(0) == 'A') {
  83.       tambahA = out2.substring(1, 5);
  84.       if (out2.charAt(1) == '1') digitalWrite(D1, LOW);
  85.       if (out2.charAt(1) == '0') digitalWrite(D1, HIGH);
  86.       if (out2.charAt(2) == '1') digitalWrite(D2, LOW);
  87.       if (out2.charAt(2) == '0') digitalWrite(D2, HIGH);
  88.       if (out2.charAt(3) == '1') digitalWrite(D3, LOW);
  89.       if (out2.charAt(3) == '0') digitalWrite(D3, HIGH);
  90.       if (out2.charAt(4) == '1') digitalWrite(D4, LOW);
  91.       if (out2.charAt(4) == '0') digitalWrite(D4, HIGH);
  92.     }
  93.     if (out2.charAt(0) == 'B') {
  94.       if (out2.charAt(5) == '1') digitalWrite(D5, LOW);
  95.       if (out2.charAt(5) == '0') digitalWrite(D5, HIGH);
  96.       if (out2.charAt(6) == '1') digitalWrite(D6, LOW);
  97.       if (out2.charAt(6) == '0') digitalWrite(D6, HIGH);
  98.       if (out2.charAt(7) == '1') digitalWrite(D7, LOW);
  99.       if (out2.charAt(7) == '0') digitalWrite(D7, HIGH);
  100.       if (out2.charAt(8) == '1') digitalWrite(D8, LOW);
  101.       if (out2.charAt(8) == '0') digitalWrite(D8, HIGH);
  102.     }
  103.   } else {
  104.     if (out2.charAt(1) == '1') digitalWrite(D1, LOW);
  105.     if (out2.charAt(1) == '0') digitalWrite(D1, HIGH);
  106.     if (out2.charAt(2) == '1') digitalWrite(D2, LOW);
  107.     if (out2.charAt(2) == '0') digitalWrite(D2, HIGH);
  108.     if (out2.charAt(3) == '1') digitalWrite(D3, LOW);
  109.     if (out2.charAt(3) == '0') digitalWrite(D3, HIGH);
  110.     if (out2.charAt(4) == '1') digitalWrite(D4, LOW);
  111.     if (out2.charAt(4) == '0') digitalWrite(D4, HIGH);
  112.     if (out2.charAt(5) == '1') digitalWrite(D5, LOW);
  113.     if (out2.charAt(5) == '0') digitalWrite(D5, HIGH);
  114.     if (out2.charAt(6) == '1') digitalWrite(D6, LOW);
  115.     if (out2.charAt(6) == '0') digitalWrite(D6, HIGH);
  116.     if (out2.charAt(7) == '1') digitalWrite(D7, LOW);
  117.     if (out2.charAt(7) == '0') digitalWrite(D7, HIGH);
  118.     if (out2.charAt(8) == '1') digitalWrite(D8, LOW);
  119.     if (out2.charAt(8) == '0') digitalWrite(D8, HIGH);
  120.   }
  121. }
  122. void onEChange() {
  123. }
  124. void onFChange() {
  125. }
  126. void onGChange() {
  127. }
  128. void onHChange() {
  129. }

11. Berikutnya, di Tab arduino_secrets.h, isi ssid/nama hotspot Wi-Fi, password hotspot Wi-Fi dan kode Secret Key untuk Device Kontrol2, yang dapat disalin dari file pdf atau dari Tab Secret di Web Editor.

12. Berikutnya, hubungkan NodeMCU kedua ke port USB Komputer, kemudian atur Board dan Port di menu Tools. Setelah pengaturan Board dan Port sudah benar, upload Sketch tersebut ke NodeMCU kedua. Setelah upload selesai, buka Serial Monitor, tunggu hingga muncul tulisan "Connected to Arduino IoT Cloud". Apabila tulisan tersebut sudah muncul di Serial Monitor, seharusnya Status Device di Tab Setup di Thing Kontrol2, menjadi Online.

13. Setelah status Device Online, maka langkah berikutnya adalah mengatur tampilan variable di Dashboard. Klik Tab Dashboards, kemudian tekan tombol Build Dashboard. Di halaman Dashboards, ganti nama Untitled menjadi Kontrol Terjadwal 2x8 Relay.

14. Berikutnya klik tombol Add, pilih Tab Things, pilih Kontrol1, dan kemudian tekan tombol Create Widgets, maka secara otomatis muncul 4 buah widget Scheduler untuk variabel a, b, c dan d, serta sebuah widget Messenger untuk variabel String out1. 

Gambar 35(a). Klik Add, pilih Tab Things, pilih Kontrol1, tekan tombol Create Widgets

Gambar 35(b). Muncul sebuah widget Messenger out1 dan 4 buah widget Scheduler (a, b, c dan d)

15. Ulangi cara yang sama untuk penambahan widget pada Dashboard untuk Kontrol2, maka secara otomatis muncul 4 buah widget Scheduler untuk variabel e, f, g dan h, serta sebuah widget Messenger untuk variabel String out2. 

Gambar 36(a). Klik Add, pilih Tab Things, pilih Kontrol2, tekan tombol Create Widgets

Gambar 36(b). Muncul widget Messenger out2 dan 4 buah widget Scheduler (e, f, g dan h)

16. Karena widget Messenger out1 dan out2 memiliki data yang sama (karena dibuat sinkron), maka agar lebih praktis, hapus widget Messenger out2 (tetapi jangan menghapus out1). Sekalipun tidak ada widgetnya, namun di balik layar, variabel out2 di Cloud tetap dapat terhubung dengan Device NodeMCU dan widget Messenger out1 di Dashboard. 

Gambar 37. Hapus widget Messenger out2, karena datanya sama dengan out1

17. Klik tombol Show Mobile Layout, buat tampilan di HP yang memudahkan pengguna untuk memasukkan kode input di kotak input widget Messenger out1 dan mengatur seting jadwal waktu di kedelapan widget Scheduler. 

Gambar 38. Lakukan penataan posisi dan ukuran widget menggunakan Tool Arrange widgets

18. Tambahkan widget Sticky Note di baris terakhir. Di Widget Settings untuk Sticky Note, di Content visibility, pilih Paragraph Only, klik tombol Done, kemudian isi Sticky Note dengan teks berikut ini:

- ketik t: mode Terjadwal ON.
- ketik m: mode Manual ON.
- ketik v: semua Relay ON.
- ketik x: semua Relay OFF.
- ketik a1: Relay1 ON.
- ketik a0: Relay1 OFF.
- ketik b1: Relay2 ON.
- ketik b0: Relay2 OFF.
- ketik c1: Relay3 ON.
- ketik c0: Relay3 OFF.
- ketik d1: Relay4 ON.
- ketik d0: Relay4 OFF.
- ketik e1: Relay5 ON.
- ketik e0: Relay5 OFF.
- ketik f1: Relay6 ON.
- ketik f0: Relay6 OFF.
- ketik g1: Relay7 ON.
- ketik g0: Relay7 OFF.
- ketik h1: Relay8 ON.
- ketik h0: Relay8 OFF.   

19. Berikut ini foto Kontrol Terjadwal untuk 2x8 Relay, yang diatur dari Dashboad di halaman web.

Gambar 39(a). Semua Relay di kedua Modul Relay hidup sesuai jadwal

Gambar 39(b). Di samping terjadwal, semua Relay juga dapat dihidup/matikan secara manual

Gambar 39(c). Pengubahan dari mode terjadwal ke mode manual dapat dilakukan dengan mudah

20. Berikut ini foto Kontrol Terjadwal untuk 2x8 Relay, yang diatur dari Dashboad di HP.

Gambar 40(a). Semua Relay dapat dihidupkan sesuai jadwal yang dapat diatur dari HP

Gambar 40(b). Di samping terjadwal, semua Relay juga dapat dihidupkan secara langsung dari HP

Gambar 40(c). Pengubahan dari mode terjadwal ke mode manual dapat dilakukan dengan mudah

21. Agar lebih jelas, berikut ini video pembuatan Kontrol Terjadwal untuk 2x8 Relay dengan Arduino IoT Cloud dan NodeMCU.

Video Pembuatan Kontrol Terjadwal 2x8 Relay dengan NodeMCU dan Arduino IoT Cloud

22. Sampai di sini pembahasan mengenai pembuatan Kontrol Terjadwal untuk 2x8 Relay. Tahapan berikutnya, akan dijelaskan bagaimana membuat Kontrol yang lebih banyak dan di mana-mana menggunakan bantuan Webhook. Untuk file program NodeMCU dan Library yang digunakan di bagian ini, silahkan bisa diunduh di bawah, di bagian File Download.


=========================================================================================


File Download:

  1. File download ON/OFF 2x8 Relay: kontrol2x8relay
  2. File download ON/OFF 16 Relay: kontrol16relay
  3. File download Terjadwal 2x8 Relay: terjadwal2x8relay




No comments:

Post a Comment