Aplikasi#4. Datalogger IoT

Daftar Isi:

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


Hal yang menarik dengan IoT adalah mudahnya mengintegrasikan semua hal (things) dengan IoT. Tentunya ini juga dikarenakan besarnya dukungan teknologi dan fasilitas yang telah dibuat oleh banyak "orang-orang baik" di sekitar kita. Salah satu ide sederhana dalam memanfaatkan fasilitas yang tersedia ini adalah aplikasi Datalogger IoT. Berikut ini gambaran ide dari Datalogger IoT ini:

Gambar 1. Gambaran ide Datalogger IoT dengan 3 cara

Dari ilustrasi Gambar 1 di atas, bahwa yang menjadi Datalogger IoT di sini adalah Google Sheet. Jadi di halaman ini akan dibahas bagaimana me-"log" (menyimpan) data dari sensor yang banyak dan bervariasi itu ke Google Sheet. Google Sheet sebagai "logger" data atau perekam data. 

Mengapa Google Sheet? Karena beberapa alasan berikut ini:

  1. Google Sheet adalah software online, kita bisa membuka Google Sheet di mana saja dan kapan saja
  2. Google Sheet adalah software gratis, kita bisa membuat banyak Google Sheet, dan kapasitas penyimpanan data setiap Sheetnya cukup besar, hingga 5 juta kotak cell, yang hanya dibatasi dengan kapasitas Google Drive yang kita miliki. 
  3. Setiap kali kita menampilkan data di Google Sheet, secara otomatis data tersebut akan diberi catatan waktu, dan secara otomatis juga data tersebut tersimpan, dan bisa online sepanjang waktu, tidak peduli listrik, atau internet, atau bahkan komputer kita sering mati, data tetap tersimpan.
  4. Google Sheet memiliki banyak sekali fitur pengolahan data yang canggih, yang sangat berguna untuk banyak sekali keperluan, termasuk pembuatan datalogger ini.

Sesuai dengan ilustrasi Gambar 1 di atas, maka ada 3 cara untuk mengambil data sensor dan menampilkannya di Google Sheet, yaitu:

  1. Cara pertama: data sensor langsung dibaca NodeMCU dan ditampilkan di Google Sheet dengan bantuan Arduino IoT Cloud dan Webhook.
  2. Cara kedua: data sensor dibaca dulu dengan bantuan Arduino. Dari Arduino, data dikirimkan melalui komunikasi serial dengan sambungan RS232 (saling silang antara TX dan RX) ke NodeMCU. Kemudian dari NodeMCU, data ditampilkan di Google Sheet dengan bantuan Arduino IoT Cloud dan Webhook.
  3. Cara ketiga: data sensor dibaca dulu dengan bantuan Arduino. Tidak hanya 1 Arduino, tapi banyak Arduino, semuanya dihubungkan dengan sambungan RS-485. Menggunakan protokol Modbus, NodeMCU sebagai Master mengambil satu persatu data sensor di setiap Arduino, dan menampilkannya di Google Sheet dengan bantuan Arduino IoT Cloud dan Webhook.

Berikut ini uraian masing-masing cara di atas.


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


Cara1: Sensor => NodeMCU => Arduino IoT Cloud => Google Sheet

Sebelum membahas mengenai kode program untuk NodeMCU, kita akan membahas dulu kaki IO NodeMCU yang dapat digunakan.

Gambar 2. Diagram kaki IO NodeMCU

Mengutip data di https://randomnerdtutorials.com/esp8266-pinout-reference-gpios berikut ini daftar kaki IO NodeMCU yang bisa digunakan untuk input output digital dan analog.

Tabel 1. Daftar kaki IO NodeMCU

Kaki

Nama

Input

Output

D0

GPIO16

-

-

D1

GPIO5

OK

OK

D2

GPIO4

OK

OK

D3

GPIO0

-

OK

D4

GPIO2

-

OK

D5

GPIO14

OK

OK

D6

GPIO12

OK

OK

D7

GPIO13

OK

OK

D8

GPIO15

-

OK

RX

GPIO3

OK

-

TX

GPIO1

-

OK

A0

ADC0

ANALOG

-

Dari daftar di atas, karena RX digunakan untuk menerima data serial, maka praktis hanya 5 kaki yang bisa digunakan untuk input digital, yaitu kaki D1, D2, D5, D6 dan D7, serta 1 kaki untuk input analog, yaitu A0.

Berhubung untuk versi gratis Arduino IoT Cloud, hanya diperbolehkan menggunakan 5 buah variabel untuk satu "Thing" atau untuk satu device, maka kita akan menggunakan 4 kaki input digital (D1, D2, D5 dan D6) dengan Dip Switch sebagai alat input digitalnya, serta 1 kaki input analog (A0) dengan potensio sebagai alat input analognya. Gambar berikut ini menunjukkan gambar rangkaian pengawatannya.

Gambar 3. Pengawatan Dip Switch, Potensio dan NodeMCU

Keterangan
  • Sebenarnya hanya 4 jalur Dip Switch yang digunakan. Sekalipun gambar pengawatan di atas menggunakan 8 jalur, namun sebenarnya hanya 4 jalur saja yang digunakan. Setiap kaki di sisi bawah di keempat jalur, secara berurutan dihubungkan ke kaki D1, D2, D5 dan D6 NodeMCU, sedangkan kaki di sisi atas di keempat jalur dihubungkan ke Ground. 
  • Dip Switch saya pilih sebagai input digital di sini karena bisa memperlihatkan nilainya secara jelas sesuai posisi tuasnya: posisi di atas berarti ON (terhubung = 1), posisi di bawah berarti OFF (putus = 0). Apabila rekan-rekan tidak memiliki Dip Switch, rekan-rekan dapat menggunakan kabel. Hubungkan kaki D1, D2, D5 dan D6 dengan kabel ke Ground untuk membuat ON. Sedangkan untuk membuat OFF, lepas kabel tersebut dari Ground. 
  • Potensio saya pilih sebagai input analog di sini karena nilai analognya mudah diatur dengan hanya memutar knob-nya.

Setelah pengawatan selesai dilakukan, langkah berikutnya adalah memprogram NodeMCU. Karena kita menggunakan Arduino IoT Cloud, maka program NodeMCU ini sebagian besar sudah dibuatkan oleh Arduino IoT Cloud. Program NodeMCU untuk membuat variabel terhubung ke Cloud sudah disediakan oleh Arduino IoT Cloud, sedangkan bagian kita hanya mengisi nilai variabelnya.

Sebelum lebih jauh menjelaskan langkah-langkah pemrograman NodeMCU ini, saya perlu memberikan alasan mengapa menggunakan Arduino IoT Cloud. Berikut ini beberapa alasannya:

  1. Pembuatan program di Arduino IoT Cloud sangat-sangat mudah. Secara garis besar, kita hanya butuh 3 tahapan, yaitu: 
    • a. membuat variabel Cloud, 
    • b. memprogram NodeMCU dari kode yang dibangkitkan oleh Arduino IoT Cloud, 
    • c. menampilkan data variabel di Dashboard
  2. Arduino IoT Cloud memiliki fitur Webhook, yang bisa menghubungkan variabel Cloud ke Google Sheet tanpa kode program (no code).
  3. Banyaknya fasilitas yang luar biasa, yang membuat kita mudah untuk menghubungkan aplikasi yang kita buat dengan berbagai perangkat, baik software maupun hardware. 
  4. Cloud yang Gratis (sekalipun hanya 5 variabel Cloud untuk setiap devicenya, namun dengan menggunakan tipe data String dan widget Messenger, kita bisa menghubungkan variabel Cloud tersebut dengan banyak sekali sensor dan aktuator).
  5. dll.
Baiklah, agar saya bisa membuktikan alasan-alasan di atas, silahkan mengikuti langkah-langkah berikut ini:

1. Ketik "arduino iot cloud" di browser. Di halaman Arduino Cloud, klik pada tombol "Arduino IoT Cloud".

Gambar 4. Klik pada tombol "Arduino IoT Cloud"

2. Di halaman login, klik tombol Sign In apabila sudah memiliki akun sebelumnya. Apabila rekan-rekan belum memiliki akun, klik pada tulisan "Create One" untuk membuat akun.

Gambar 5. Klik pada tombol "Sign In" untuk login atau "Create One" apabila belum memiliki akun

3. Di halaman Sign In, masukkan username dan password, klik tombol Sign In.

Gambar 6. Masukkan username dan password, klik tombol Sign In

4. Maka terbuka halaman Things. Klik tombol Create Thing. 

Gambar 7. Tekan tombol Create Thing

5. Di halaman Thing, beri nama Thing = Cara1, dan kemudian klik tombol Add Variable

Gambar 8. Beri nama Thing = Cara1, klik tombol Add Variable

6. Di jendela Add Variable, isi Name = s1, tipe = Boolean, Variable Permission = Read Only, Variable Update Policy = Periodically, dan Every = 60 s. Klik tombol Add Variable. (Catatan: kita memilih periodically agar bisa menampilkan grafik data yang memiliki interval waktu yang sama dan seragam).

Gambar 9. Isi Name = s1, tipe = Boolean, Read Only, Periodically 60s

7. Tambahkan lagi variable kedua dengan menekan tombol Add Variable. Di jendela Add Variable yang muncul, isi Name = s2, tipe = Boolean, Variable Permission = Read Only, Variable Update Policy = Periodically, dan Every = 60 s. Klik tombol Add Variable.

Gambar 10. Isi Name = s2, tipe = Boolean, Read Only, Periodically 60s

8. Tambahkan lagi variable ketiga dengan menekan tombol Add Variable. Di jendela Add Variable yang muncul, isi Name = s3, tipe = Boolean, Variable Permission = Read Only, Variable Update Policy = Periodically, dan Every = 60 s. Klik tombol Add Variable.

Gambar 11. Isi Name = s3, tipe = Boolean, Read Only, Periodically 60s

9. Tambahkan lagi variable keempat dengan menekan tombol Add Variable. Di jendela Add Variable yang muncul, isi Name = s4, tipe = Boolean, Variable Permission = Read Only, Variable Update Policy = Periodically, dan Every = 60 s. Klik tombol Add Variable.

Gambar 12. Isi Name = s4, tipe = Boolean, Read Only, Periodically 60s

10. Tambahkan lagi variable kelima dengan menekan tombol Add Variable. Di jendela Add Variable yang muncul, isi Name = a1, tipe = Integer Number, Variable Permission = Read Only, Variable Update Policy = Periodically, dan Every = 60 s. Klik tombol Add Variable.

Gambar 13. Isi Name = a1, tipe = Integer Number, Read Only, Periodically 60s

11. Setelah 5 buah variable ditambahkan, tombol Add Variable tidak lagi bisa ditekan. Terlihat pada gambar berikut, daftar 5 buah variable Cloud yang terdiri dari 4 buah variable Boolean (s1, s2, s3, s4) dan sebuah variable Integer (a1). Berikutnya klik tombol Select Device untuk membuat variable Cloud tersebut dapat terhubung dengan NodeMCU.

Gambar 14. Terlihat 5 buah variable Cloud telah ditambahkan, berikutnya klik Select Device

12. Di jendela Associated Device, pilih Set Up New Device.

Gambar 15. Pilih Set Up New Device

13. Di jendela Setup Device, pilih Set up a 3rd party device.

Gambar 16. Pilih Set Up a 3 rd party device

14. Di jendela Setup Device, pilih ESP8266, pilih NodeMCU 1.0 (ESP-12E Module). Klik Continue.

Gambar 17. Pilih ESP8266, pilih NodeMCU 1.0 (ESP-12E Module), klik Continue

15. Beri nama device, dalam contoh di sini, nama device telah dibuatkan dengan nama Marcellina. Klik Next.

Gambar 18. Beri nama device, klik Next

16. Muncul informasi Device ID dan Secret Key. Klik tulisan download the pdf untuk menyimpan kode Device ID dan Secret Key, karena kode ini akan diperlukan dalam pemrograman NodeMCU.

Gambar 19. Klik download the pdf untuk menyimpan kode Device ID dan Secret Key

17. Buka file pdf yang telah didownload, tampak nama device, kode Device ID dan Secret Key.

Gambar 20. Nama dan kode Device ID serta Secret Key tersimpan di file pdf
 
18. Beri tanda centang pada I saved my device ID and secret key, kemudian klik Continue.

Gambar 21. Beri centang pada I saved my device ID and secret key, klik Continue

19. Maka Setup device sudah selesai. Klik Done.

Gambar 22. Klik Done, setup device NodeMCU telah selesai.

20. Terlihat di bagian Associated Device, muncul nama device dengan tipe dan kode Device ID, hanya saja statusnya masih Offline. Agar status device bisa Online, maka device tersebut, dalam contoh di sini menggunakan NodeMCU, perlu diprogram. Program NodeMCU ini telah disediakan, klik pada Tab Sketch untuk membuka program NodeMCU.

Gambar 23. Muncul nama Device, tipe dan kode Device ID. Klik tab Sketch.

21. Halaman Sketch program terbuka. Agar sketch ini bisa didownload, klik tombol Open full editor untuk membuka halaman Editor.

Gambar 24. Klik pada tombol Open full editor untuk membuka halaman Editor

22. Di halaman Editor, klik kanan nama Sketch, pilih Download Sketch. 

Gambar 25. Klik kanan nama Sketch, pilih Download Sketch

23. Buka folder Download, klik kanan nama file Sketch, dan pilih Extract here.

Gambar 26. Klik kanan nama Sketch, pilih Extract here

24. Setelah di-Extract, buka folder hasil Extract, klik 2 kali pada file program *.ino untuk membuka kode program NodeMCU.

Gambar 27. Klik 2 kali nama file program dengan tipe *.ino

25. Di Tab program utama (*.ino), hapus semua kode programnya, dan ganti dengan kode program berikut ini. Kode program ini sebenarnya sama dengan kode program sebelumnya, hanya ada tambahan di baris 10 - 13 untuk penugasan kaki input digital pullup, dan di baris 17 - 21 untuk membaca input digital dan input analog, dan mengisikan nilainya ke variable Cloud.
  1. #include "arduino_secrets.h"
  2. #include "thingProperties.h"
  3. void setup() {
  4.   Serial.begin(9600);
  5.   delay(1500);
  6.   initProperties();
  7.   ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  8.   setDebugMessageLevel(2);
  9.   ArduinoCloud.printDebugInfo();
  10.   pinMode(D1, INPUT_PULLUP);
  11.   pinMode(D2, INPUT_PULLUP);
  12.   pinMode(D5, INPUT_PULLUP);
  13.   pinMode(D6, INPUT_PULLUP);
  14. }
  15. void loop() {
  16.   ArduinoCloud.update();
  17.   s1 = !digitalRead(D1);
  18.   s2 = !digitalRead(D2);
  19.   s3 = !digitalRead(D5);
  20.   s4 = !digitalRead(D6);
  21.   a1 = analogRead(A0);
  22. }

Gambar 28. Tambahan kode program untuk mengisi variabel Cloud dengan nilai pembacaan sensor 

26. Sebelum program di atas di-upload ke NodeMCU, isi dulu nama dan password Wi-Fi yang digunakan serta kode secret key di Tab arduino_secrets.h. Setelah ketiganya diisi, upload program tersebut ke NodeMCU. Pastikan 4 library ini sudah terinstal di Arduino IDE:
  1. ArduinoIoTCloud (versi 1.8.0)
  2. Arduino_ConnectionHandler (versi 0.7.1)
  3. Arduino_DebugUtils-master
  4. ArduinoMqttClient-master

Gambar 29. Isi nama dan password Wi-Fi serta kode secret key, kemudian upload program

27. Setelah upload program selesai, buka Serial Monitor. Tunggu hingga muncul tulisan "Connected to Arduino IoT Cloud". Apabila tulisan tersebut muncul, maka seharusnya status device di halaman Thing juga akan berubah dari offline menjadi online, yang artinya device NodeMCU telah terhubung ke Cloud.

Gambar 30. Status device di halaman Thing dari Offline menjadi Online

28. Langkah berikutnya adalah menampilkan data variabel Cloud tersebut di Dashboard. Klik pada 
Tab Dashboards, kemudian klik pada Build Dashboard.

Gambar 31. Klik Tab Dashboards, klik pada Build Dashboard

29. Di halaman Dashboards, beri nama Dashboard = Cara1.

Gambar 32. Beri nama Dashboard = Cara1

30. Klik tombol Add, pilih Things, pilih Cara1.

Gambar 33. Klik tombol Add, pilih Things, pilih Cara1

31. Muncul jendela Create widgets from Thing. Pilih  semua variable, dan klik tombol Create Widgets.

Gambar 34. Pilih semua variable, dan kemudian klik Create Widgets

32. Maka di halaman Dashboard akan muncul 5 buah widget; sebuah widget value dan 4 buah widget LED. Gunakan tool Arrange widgets untuk mengatur posisi dan ukuran kelima buah widget tersebut. 

Gambar 35. Muncul 5 buah widget sesuai dengan tipe variabel: 1 integer dan 4 boolean

33. Pastikan rangkaian NodeMCU dengan Dip Switch dan Potensio seperti Gambar 3. Berikut ini terlihat 3 buah tuas Dip Switch di posisi ON, dan tuas Dip Switch terakhir di posisi OFF.  

Gambar 36. Status device di halaman Thing dari Offline menjadi Online

34. Putar potensio dan geser keempat tuas di Dip Switch, dan perhatikan bahwa tampilan widget di Dashboard akan berubah mengikuti posisi knob Potensio dan tuas Dip Switch.

Gambar 37. Lakukan pengubahan potensio dan Dip Switch dan amati tampilan widget di Dashboard

35. Setelah data sensor (Dip Switch dan Potensio) yang dibaca NodeMCU dapat ditampilkan di widget Dashboard, maka langkah berikutnya adalah menampilkan kelima data sensor tersebut di Google Sheet dengan bantuan webhook. Dengan webhook ini, kita tidak perlu memprogram NodeMCU. Kita cukup hanya mengisi link webhook Google Sheet ke kotak yang muncul ketika tombol Set Webhook di halaman Thing kita tekan.

Gambar 38. Isikan link webhook Google Sheet di kotak Webhook URL, maka semua data variabel Cloud secara otomatis akan ditampilkan di Google Sheet

36. Untuk itu, hal yang perlu dilakukan adalah, membuat link webhook Google Sheet. Bagaimana caranya? Caranya sangat mudah, karena kebetulan sudah ada add-on gratis di Google Sheet yang bisa membuatkan link webhook dengan cara yang sangat mudah sekali. Add On tersebut adalah Webhook for Sheets. Untuk menambahkan dan menggunakan add-on tersebut, buka dulu Gmail, klik pada tombol Google Apps, pilih Sheets.

Gambar 39. Di Gmail, klik tombol Google Apps, pilih Sheets

37. Di halaman Google Sheet, tekan tombol Blank (+).

Gambar 40. Di Google Sheet, pilih Blank (+)

38. Di Sheet yang terbuka, pilih menu Extensions, pilih Add-ons, pilih Get add-ons.

Gambar 41. Pilih menu Extensions, pilih Add-ons, pilih Get add-ons

39. Di kolom pencarian add-on, ketik "webhooks", diikuti Enter, kemudian pilih Webhooks for Sheets, yang dibuat oleh Sourabh Choraria.

Gambar 42. Pilih add-on Webhooks for Sheets

40. Di halaman add-on Webhooks for Sheets, klik tombol Install, kemudian klik tombol Continue pada jendela yang muncul.

Gambar 43. Klik Install, dan kemudian klik Continue

41. Muncul permintaan akun untuk Sign in. Pilih akun yang muncul.

Gambar 44. Pilih akun untuk Sign in

42. Muncul permintaan akses ke akun yang dipilih, klik Allow

Gambar 45. Pilih Allow untuk memberi ijin akses

43. Maka add-on Webhooks for Sheet terinstal di Google Sheet pada akun yang dipilih. Klik Next.

Gambar 46. Muncul info bahwa Webhook telah terinstal, klik Next

44. Klik Done untuk menutup jendela info.

Gambar 47. Klik Done untuk menutup jendela

45. Buka kembali Google Sheet, perhatikan bahwa sekarang muncul icon Webhook di Toolbar kanan (klik tanda panah kecil di pojok kanan bawah untuk membuka Toolbar kanan)

Gambar 48. Tampak icon Webhook muncul di Toolbar kanan

46. Klik icon Webhook tersebut, maka akan terbuka langkah-langkah untuk membuat link Webhook Google Sheet. Ikuti langkah-langkah tersebut. Pertama beri nama Sheet,. Kedua enable API dengan menekan tombol Enable. Ketiga reload add-on dengan menekan tombol Refresh.

Gambar 49. Klik icon Webhook, maka muncul langkah-langkah pembuatan link webhook

47. Setelah Sheet diberi nama, berikutnya klik tombol Enable API. Di halaman Apps Script, di kolom Settings Google Apps Script API, klik tulisan Off.

Gambar 50. Klik tulisan Off di Settings Google Apps Script API

48. Geser slide ke kanan hingga tulisan Off menjadi On untuk mengijinkan aplikasi Webhook for Sheets berjalan di Google Sheet di akun yang dipilih.

Gambar 51. Buat tulisan Off menjadi On untuk mengijinkan aplikasi Webhooks for Sheets dijalankan

49. Setelah Enable API di-on-kan, langkah berikutnya adalah me-refresh add=on dengan menekan tombol Refresh. Setelah itu, klik tombol Create untuk memunculkan menu Webhook di Google Sheet.

Gambar 52. Klik tombol Refresh, kemudian klik tombol Create

50. Setelah tombol Create ditekan, akan muncul pesan di bagian bawah: "Webhook created successfully!". Klik tombol Reload Sheet yang ada di kiri browser. Tunggu beberapa saat hingga  muncul menu Webhook di samping menu Help.  

Gambar 53. Klik tombol Reload Sheet untuk memunculkan menu Webhook

51. Maka akan muncul menu Webhook. Pilih menu tersebut, dan kemudian klik pada tulisan Authorize. 

Gambar 54. Pilih menu Webhook, klik pada Authorize

52. Maka akan muncul jendela permintaan ijin otorisasi, klik tombol Continue.

Gambar 55. Klik tombol Continue untuk memberikan otorisasi

53. Pilih kembali akun yang sudah digunakan sebelumnya untuk memberikan ijin otorisasi.

Gambar 56. Pilih akun yang muncul untuk memberikan otorisasi

54. Klik tombol Allow untuk memberikan ijin otorisasi aplikasi Webhooks for Sheets berjalan.

Gambar 57. Klik tombol Allow

55. Kembali ke Google Sheet, pilih menu Webhook kembali, tekan tulisan Authorize, maka akan muncul pesan di bawah: Authorization successfull. Reload Sheet kembali, lalu tekan tombol Next.

Gambar 58. Otorisasi sudah berhasil, reload Sheet lagi, kemudian tekan tombol Next

56. Maka link Webhook akan muncul di bawah gambar astronot. Klik 3 kali pada link tersebut dan tekan tombol Ctrl + C untuk meng-copy link.

Gambar 59. Muncul link webhook, klik 3x untuk memilih dan kemudian copy

57. Kembali ke halaman Thing di Arduino IoT Cloud, tekan tombol Set webhook di bagian bawah. Di kotak Webhook URL, tempelkan link Webhook yang telah dicopy.

Gambar 60. Klik tombol Set webhook, isikan link webhook di kotak Webhook URL

58. Setelah link Webhook diisikan, tekan tombol Set Webhook.

Gambar 61. Setelah terisi link webhook, klik tombol Set Webhook

59. Maka akan muncul tulisan Active di samping link webhook, menandakan bahwa Google Sheet telah terhubung dengan Arduino IoT Cloud. Tutup jendela dengan menekan tombol silang.

Gambar 62. Muncul tulisan Active, berarti Arduino IoT Cloud telah terhubung ke Google Sheet

60. Lakukan perubahan nilai variabel di Dashboard dengan menggeser keempat tuas Dip Switch dan memutar potensio. Perhatikan bahwa Google Sheet menampilkan data kelima variabel Cloud tersebut secara berkala setiap menit, sesuai dengan pengaturan nilai periodically di kelima variabel.

Gambar 63. Geser tuas Dip Switch dan putar potensio, lalu perhatikan tampilan di Google Sheet

61. Terlihat bahwa data yang ditampilkan di Google Sheet sangat banyak. Dengan lima buah variabel Cloud, webhook menghasilkan data sebanyak 34 kolom. Untuk menghemat pemakaian cell di Google Sheet, maka data yang tidak diperlukan sebaiknya dihapus. Tabel 2 menunjukkan kolom-kolom yang diperlukan diberi warna kuning, sedang yang tidak diperlukan tidak diberi warna. Hapus kolom data yang tidak diperlukan. Secara otomatis, begitu nama kolom dihapus, pada tampilan data berikutnya, data di kolom tersebut sudah tidak lagi dimunculkan.

Gambar 64. Hapus kolom data yang tidak diperlukan untuk menghemat pemakaian cell

Tabel 2. Kolom data yang diperlukan 

No.

Kolom

Diperlukan

No. Kolom

1

event_id

Tidak

 

2

webhook_id

Tidak

 

3

device_id

Tidak

 

4

thing_id

Tidak

 

5

values_0_id

Tidak

 

6

values_0_name

Ya

1

7

values_0_value

Ya

2

8

values_0_persist

Tidak

 

9

values_0_updated_at

Ya

3

10

values_0_created_by

Tidak

 

11

values_1_id

Tidak

 

12

values_1_name

Ya

4

13

values_1_value

Ya

5

14

values_1_persist

Tidak

 

15

values_1_updated_at

Tidak

 

16

values_1_created_by

Tidak

 

17

values_2_id

Tidak

 

18

values_2_name

Ya

6

19

values_2_value

Ya

7

20

values_2_persist

Tidak

 

21

values_2_updated_at

Tidak

 

22

values_2_created_by

Tidak

 

23

values_3_id

Tidak

 

24

values_3_name

Ya

8

25

values_3_value

Ya

9

26

values_3_persist

Tidak

 

27

values_3_updated_at

Tidak

 

28

values_3_created_by

Tidak

 

29

values_4_id

Tidak

 

30

values_4_name

Ya

10

31

values_4_value

Ya

11

32

values_4_persist

Tidak

 

33

values_4_updated_at

Tidak

 

34

values_4_created_by

Tidak

 


62. Berikut tampilan data di Google Sheet, dari yang semula 34 kolom, dibuat menjadi 11 kolom saja, sesuai dengan data yang diperlukan.

Gambar 65. Hapus kolom data yang tidak diperlukan: dari 34 kolom sekarang menjadi 11 kolom

63. Berikutnya, terlihat bahwa untuk nilai variabel Dip Switch s1, s2, s3 dan s4, Google Sheet tidak bisa menampilkan nilai False. Sebagai gantinya, nilai False tersebut ditampilkan dengan cell kosong. Untuk itu, agar data kelima variabel tersebut bisa ditampilkan di grafik, perlu dilakukan pengubahan nilai dari True menjadi 1, dan dari cell kosong menjadi 0. Untuk mengubah nilai tersebut, tambahkan sebuah kolom di setiap nilai variabel s1, s2, s3 dan s4, dan beri nama kolom secara berturut-turut Nilai_s1, Nilai_s2, Nilai_s3 dan Nilai_s4. Berikutnya, di baris kedua di keempat kolom tersebut, tambahkan formula berikut ini:

Tabel 3. Formula pengubahan nilai s1, s2, s3 dan s4 menjadi 1 atau 0 

Kolom

Cell

Formula untuk mengubah True menjadi 1 dan cell kosong menjadi 0

Nilai_s1

F2

=ARRAYFORMULA(IF((A2:A<>"")*(E2:E="")=1,0,IF(E2:E=TRUE,1,E2:E)))

Nilai_s2

I2

=ARRAYFORMULA(IF((A2:A<>"")*(H2:H="")=1,0,IF(H2:H=TRUE,1,H2:H)))

Nilai_s3

L2

=ARRAYFORMULA(IF((A2:A<>"")*(K2:K="")=1,0,IF(K2:K=TRUE,1,K2:K)))

Nilai_s4

O2

=ARRAYFORMULA(IF((A2:A<>"")*(N2:N="")=1,0,IF(N2:N=TRUE,1,N2:N)))


Gambar 66. Tambahkan kolom di setiap nilai variabel s1, s2, s3 dan s4, kemudian beri nama kolom dan tambahkan formula seperti Tabel 3

64. Berikutnya, apabila rekan-rekan perhatikan data per-baris, ternyata ada 2 baris data yang isinya sama, atau duplikasi. Untuk mengatasi masalah duplikasi ini, tambahkan sebuah Sheet. Di Sheet2 ini, di cell A1, beri formula berikut ini:

= UNIQUE(Sheet1!A:O)

Gambar 67. Tambahkan Sheet2, kemudian isi cell A1 dengan formula =UNIQUE(Sheet1A:O)

65. Berikutnya, tambahkan Sheet3 untuk menampilkan grafik kelima variabel. Karena catatan waktu kelima variabel sama, maka catatan waktu di kolom C Sheet2, ditempatkan di kolom pertama di Sheet3. Kemudian kolom kedua hingga keenam secara berturut-turut diisi dengan nilai dari kelima variabel. Untuk bisa menampilkan data seperti itu, isi cell A1 dengan formula berikut ini:

=QUERY(Sheet2!A:O,"SELECT C,B,F,I,L,O WHERE C IS NOT NULL ORDER BY C ASC LABEL C 'Waktu', B 'Nilai_a1'")

Gambar 68. Tambahkan Sheet3, dan isi cell A1 dengan formula di atas

66. Untuk menampilkan grafik nilai data vs waktu seperti Gambar 68 di atas, caranya adalah pilih dulu kolom waktu dan kolom nilai (gunakan tombol Ctrl untuk memilih lebih dari 1 kolom yang terpisah). Setelah terpilih, buka menu Insert, pilih Chart. Maka secara otomatis akan muncul grafik nilai vs waktu. Buat sebanyak 5 Chart, atur seting Chart editor seperti Tabel 4 berikut:

Tabel 4. Seting kelima Chart  

No.

Chart type

X-axis

Series

1

Line chart

Sheet3!A:A

Sheet3!B:B

2

Line chart

Sheet3!A:A

Sheet3!C:C

3

Line chart

Sheet3!A:A

Sheet3!D:D

4

Line chart

Sheet3!A:A

Sheet3!E:E

5

Line chart

Sheet3!A:A

Sheet3!F:F

67. Berikutnya, karena zona waktu di Google Sheet berbeda sebanyak 7 jam (GMT+7) dengan WIB (Waktu Indonesia Barat), maka tambahkan formula berikut ini di cell G2. Beri tambahan judul kolom: Waktu (tgl jam) di cell G1.

=ARRAYFORMULA(IF(A2:A="","",(left(A2:A,10)+mid(A2:A,12,12))+7/24)) 

 

Gambar 69.a Penambahan formula untuk membuat nilai waktu yang tepat sesuai WIB (GMT+7)

Catatan: Formula di atas akan membuat nilai waktu menjadi angka. Agar angka tersebut bisa berubah menjadi waktu tanggal dan waktu jam, pilih kolom tersebut, kemudian buka menu Format, pilih Number, pilih Date Time.


Gambar 69.b Agar waktu (tgl dan jam) bisa muncul di grafik, beri centang Treat labels as text

Gambar 69.c Pilih 2 kolom yang akan dibuat grafiknya, buka menu Insert, pilih Chart


Kelebihan & Kekurangan Cara1:
Beberapa hal yang menarik dari fitur Datalogger IoT Cara1 ini adalah:
  1. Sensor langsung terhubung ke NodeMCU, membuat waktu yang dibutuhkan untuk pembacaan sensor menjadi lebih singkat.
  2. Setiap sensor terhubung dengan satu variabel Cloud. Variabel-variabel Cloud ini bisa di-update dalam waktu bersamaan. Karena waktu update-nya bersamaan, membuat grafik yang dihasilkan memiliki basis waktu yang sama, sehingga bisa digunakan untuk membandingkan unjuk kerja semua sensor pada waktu yang sama.
  3. Dengan mengatur update data secara periodik, membuat grafik yang dihasilkan memiliki data yang seragam interval waktunya. Dalam contoh di sini digunakan interval waktu update data setiap 60 detik atau per-menit. Pengaturan waktu update data ini dilakukan di jendela Edit variabel. (Catatan: untuk mengubah interval waktu, bisa langsung dilakukan pada program NodeMCU, yaitu di Tab thingProperties.h, ubah 60 * SECONDS menjadi 10 * SECONDS misalnya, seperti ditunjukkan pada Gambar 70). 
Sedangkan kekurangan Datalogger IoT Cara1 ini adalah sebagai berikut:
  1. Sensor yang bisa dibaca dan di-log datanya terbatas hanya 5 buah untuk satu Thing (1 Thing = 1 device NodeMCU), sesuai dengan jumlah variabel Cloud yang disediakan untuk fitur gratis. Apabila membutuhkan log data lebih dari 5 sensor, maka cara yang bisa dilakukan adalah dengan membuat akun yang lebih banyak. Satu akun dapat digunakan untuk membuat 2 Thing, jadi satu akun bisa 10 sensor dengan 2 NodeMCU. Apabila membutuhkan lebih banyak lagi sensor yang di-log untuk satu Thing, maka gunakan Cara2 dan Cara3.
  2. Karena menggunakan NodeMCU ESP8266 yang hanya memiliki 1 buah kaki input analog, maka sensor analog yang bisa dibaca hanya 1 saja. Apabila memerlukan pembacaan sensor analog yang lebih dari 1, maka gunakan Cara2 dan Cara3.
  3. Dari hasil pengamatan, interval waktu update data rata-rata lebih dari 10 detik. 

Gambar 70. Pengaturan interval waktu update data bisa langsung dilakukan di program NodeMCU, di thingProperties.h


67. Agar lebih jelas mengenai pembuatan Datalogger IoT Cara1, silahkan melihat video berikut ini:

Video pembuatan Datalogger IoT Cara1

68. Sampai di sini pembuatan Datalogger IoT Cara1 selesai. Untuk file program NodeMCU, dan Library yang digunakan di bagian ini, silahkan bisa diunduh di bagian terakhir dari tulisan di halaman ini.

Catatan Perbaikan:
1. Ketika koneksi antara NodeMCU dengan Arduino IoT Cloud terputus, penyambungannya kembali sering kali tidak dibarengi dengan koneksi webhook ke Google Sheet. Apabila sampai beberapa waktu, Google Sheet tidak meng-update tampilan datanya, padahal data di Dashboard Arduino IoT Cloud sudah ter-update dengan data terbaru, maka atasi masalah ini dengan menghapus link webhook di halaman Thing, dan isi kembali dengan link yang sama.
2. Ketika Google Sheet terhubung kembali dengan Arduino IoT Cloud, sering kali data yang baru ditampilkan di baris paling bawah, sehingga muncul baris kosong di tengah-tengah antara data lama dengan data yang baru. Untuk mengatasi masalah ini, hapus semua baris yang kosong. Rekan-rekan tidak perlu menekan tombol Add 1000, karena baris yang paling bawah secara otomatis akan bertambah sendiri ketika muncul data baru.



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



Cara2: Banyak Sensor => Arduino => NodeMCU => Arduino IoT Cloud => Google Sheet

Kelemahan dari Datalogger IoT Cara1 di atas adalah terbatasnya jumlah sensor yang bisa dibaca dan di-log. Pertama, karena NodeMCU hanya memiliki 1 kaki input analog, maka sensor analog yang bisa dibaca juga hanya bisa 1 sensor. Kedua, karena fitur gratis Arduino IoT Cloud hanya memberikan 5 buah variabel Cloud saja, maka sensor yang bisa di-log datanya juga hanya bisa 5 buah sensor saja.

Untuk mengatasi keterbatasan jumlah sensor ini, maka di Cara2 ini dilakukan 2 solusi berikut ini:

  1. Untuk mengatasi keterbatasan akibat kaki input Analog yang dimiliki NodeMCU (hanya 1 kaki), maka di Cara2 ini, ditambahkan sebuah Arduino Nano yang memiliki kaki input analog sebanyak 8 buah (bisa juga Arduino Uno, hanya saja jumlah kaki input analog Arduino Uno lebih sedikit, yaitu hanya 6 buah), dan jumlah kaki input digital sebanyak 12 buah, di luar kaki RX dan TX (kaki RX dan TX dikhususkan untuk komunikasi serial). Jadi di Cara2 ini, semua sensor akan dihubungkan ke Arduino, sedangkan antara Arduino dengan NodeMCU akan dihubungkan melalui komunikasi serial (Sebenarnya bisa juga melalui komunikasi lain, seperti I2C, atau SPI, tetapi agar bisa disimulasikan dengan software Proteus, maka saya memilih melalui komunikasi serial, yang diterapkan dengan bantuan COMPIM).
  2. Untuk mengatasi keterbatasan akibat fitur gratis yang hanya bisa 5 buah variabel, maka di Cara2 ini akan digunakan sebuah variabel bertipe data String. Jadi apabila di Cara1, 1 variabel digunakan untuk menampung data 1 sensor saja, maka di Cara2 ini, satu variabel akan digunakan untuk menampung data semua sensor. Dengan variabel bertipe String, sensor-sensor yang ditampung datanya bisa diberi nama yang berbeda. Hal ini bisa dilakukan, karena dengan tipe data String kita bisa menghasilkan kombinasi karakter yang tak terhingga, yang bisa digunakan untuk menamai setiap variabel yang ditampung beserta dengan pengisian nilai datanya. Di samping itu, tersedia widget Messenger, yang menjadi default widget untuk tipe data String. Dengan widget Messenger ini, kita bisa menampilkan data dari Cloud yang disertai dengan catatan waktunya.

Untuk mendapatkan gambaran atas kedua solusi di atas, berikut ini gambar pengawatan rangkaian antara NodeMCU dengan Arduino Nano, yang akan digunakan untuk me-log 10 buah sensor, yang terdiri dari:

    1. Sensor Suhu DS18B20
    2. Sensor Ultrasonik GUR03
    3. Dip Switch 10 jalur
    4. Sensor Jarak Infrared GP2Y0A02YK
    5. Potensio 10k
    6. Sensor Kelembaban HIH-5030
    7. Sensor Suhu MCP9800
    8. Sensor Cahaya LDR
    9. Sensor Suhu NTC 10k
    10. Sensor Suhu LM35 

Gambar 71. Rangkaian Cara 2: NodeMCU dan Arduino Nano untuk log data 10 sensor

Berhubung saya tidak memiliki sebagian besar komponen pada rangkaian Gambar 71 di atas, maka sebagai solusinya, saya akan menggunakan simulasi Proteus. Proteus memiliki semua komponen tersebut kecuali satu, yaitu NodeMCU. Untuk mengatasi masalah ini, kita akan menggabungkan hardware NodeMCU dengan software Proteus. Agar NodeMCU bisa terhubung dengan Proteus, kita gunakan bantuan komponen COMPIM, yang merupakan emulator port serial. Dengan menggunakan COMPIM dan komunikasi serial, kita dapat membuat hardware NodeMCU terhubung dengan simulasi Arduino Nano di Proteus. Gambar skematik Proteus berikut ini menunjukkan solusi tersebut.

Gambar 72. Gambar skematik Proteus untuk rangkaian Cara2: NodeMCU dihubungkan dengan Arduino Nano melalui COMPIM (File Proteus ini dapat diunduh di bagian akhir halaman ini)

Terlihat di Gambar 72 di atas, di pojok kanan atas, terdapat komponen COMPIM, yang akan menghubungkan NodeMCU dengan Arduino Nano melalui komunikasi serial. Jadi tugas Arduino Nano di sini adalah membaca semua sensor yang dihubungkan ke kaki inputnya, dan mengirimkan data pembacaan sensor tersebut ke NodeMCU melalui komunikasi serial. Berikutnya oleh NodeMCU, data pembacaan sensor tersebut dikirimkan ke Cloud (Arduino IoT Cloud) melalui koneksi Wi-Fi. 

Baiklah, agar rekan-rekan bisa memahami lebih jelas, mari kita buat Datalogger IoT Cara2 ini. Ada 3 tahapan pembuatan, dengan rincian sebagai berikut:
  1. Tahap 1: Sensor dibaca oleh Arduino Nano dan ditampilkan di Serial Monitor.
  2. Tahap 2: Data sensor diterima oleh NodeMCU dan ditampilkan di Arduino IoT Cloud
  3. Tahap 3: Arduino IoT Cloud dengan Webhook mengirimkan data ke Google Sheet 
Berikut ini langkah pembuatan masing-masing tahap:

Tahap 1. Data Sensor di Serial Monitor

1. Diinginkan untuk bisa membaca data sensor dan menampilkan datanya di Serial Monitor. Berikut ini kode program Arduino Nano (ATmega328) untuk membaca 10 sensor dan menampilkannya di Serial Monitor (Virtual Terminal) dengan rangkaian sesuai Gambar 72 di atas.
  1. #include "microDS18B20.h"
  2. #include "NewPing.h"
  3. #include "SharpIR.h"
  4. #include "MCP9800.h"
  5. #include "GyverNTC.h"
  6. #define trig 3
  7. #define echo 3
  8. #define maks 200
  9. MicroDS18B20<2> ds;
  10. NewPing sonar(trig, echo, maks);
  11. SharpIR gp2(SharpIR::GP2Y0A02YK0F, A0);
  12. MCP9800 mcp;
  13. GyverNTC ntc(6, 10000, 3435, 25, 10000);
  14. int a1 = 0;  //DS18B20
  15. int b1 = 0;  //GUR03
  16. int c = 0;
  17. int c1 = 0;  //Dip Switch
  18. int d1 = 0;  //GP2Y0A02YK
  19. int e1 = 0;  //Potensio
  20. int f1 = 0;  //HIH5030
  21. int g1 = 0;  //MCP9800
  22. int h1 = 0;  //LDR
  23. int i1 = 0;  //NTC
  24. int j1 = 0;  //LM35
  25. void setup() {
  26.   Serial.begin(9600);
  27.   mcp.begin();
  28.   mcp.writeConfig(ADC_RES_12BITS);
  29.   for (int n = 0; n < 10; n++) {
  30.     pinMode(n + 4, INPUT_PULLUP);
  31.   }
  32.   delay(1000);
  33. }
  34. void loop() {
  35.   ds.requestTemp();
  36.   int w = ds.getRaw();
  37.   int a = DS_rawToFloat(w);
  38.   delay(100);
  39.   int b = sonar.ping_cm();
  40.   for (int n = 0; n < 10; n++) {
  41.     bitWrite(c, n, digitalRead(n + 4));
  42.   }
  43.   int d = gp2.getDistance();
  44.   int e = map(analogRead(A1), 0, 1023, 0, 100);
  45.   int x = analogRead(A2);
  46.   int f = (x / 1024.0 - 0.1515) / 0.00636 + 1;
  47.   int g = mcp.readTempC16(AMBIENT) / 16.0;
  48.   int h = int(analogRead(A3) * 0.489);
  49.   int i = ntc.getTempAverage();
  50.   int j = int(analogRead(A7) * 0.489);
  51.   if (a != a1) {
  52.     Serial.print('a');
  53.     Serial.println(a);
  54.     a1 = a;
  55.   }
  56.   if (b != b1) {
  57.     Serial.print('b');
  58.     Serial.println(b);
  59.     b1 = b;
  60.   }
  61.   if (c != c1) {
  62.     Serial.print('c');
  63.     Serial.println(c);
  64.     c1 = c;
  65.   }
  66.   if (d != d1) {
  67.     Serial.print('d');
  68.     Serial.println(d);
  69.     d1 = d;
  70.   }
  71.   if (e != e1) {
  72.     Serial.print('e');
  73.     Serial.println(e);
  74.     e1 = e;
  75.   }
  76.   if (f != f1) {
  77.     Serial.print('f');
  78.     Serial.println(f);
  79.     f1 = f;
  80.   }
  81.   if (g != g1) {
  82.     Serial.print('g');
  83.     Serial.println(g);
  84.     g1 = g;
  85.   }
  86.   if (h != h1) {
  87.     Serial.print('h');
  88.     Serial.println(h);
  89.     h1 = h;
  90.   }
  91.   if (i != i1) {
  92.     Serial.print('i');
  93.     Serial.println(i);
  94.     i1 = i;
  95.   }
  96.   if (j != j1) {
  97.     Serial.print('j');
  98.     Serial.println(j);
  99.     j1 = j;
  100.   }
  101. }

Keterangan

  1. Program di atas hanya akan mengirimkan data sensor ke Serial Monitor apabila data sensor tersebut berubah.
  2. Untuk mengetahui nilai sensor apa yang dikirimkan, setiap nilai sensor diberi huruf awalan, yang hurufnya mengikuti urutan berikut ini:
    • a untuk DS18B20
    • b untuk GUR03
    • c untuk Dip Switch 10 jalur
    • d untuk GP2Y0A02YK
    • e untuk Potensio
    • f untuk HIH5030
    • g untuk MCP9800
    • h untuk LDR
    • i untuk NTC
    • j untuk LM35
  3. Khusus untuk sensor LDR, karena menyesuaikan dengan nilai Voltmeter, di mana nilainya antara 0 - 5V, maka nilai ini dikalikan dengan 100 agar tidak menghilangkan angka penting. 
  4. Kode program dan juga library yang dibutuhkan dalam program ini, dapat rekan-rekan unduh di bagian akhir tulisan di halaman ini.

            2. Sebelum menekan tombol Run untuk menjalankan simulasi Proteus, atur dulu seting komponen ATmega328. Klik 2 kali pada komponen ATmega328 hingga muncul jendela Edit Component. Atur nilai yang diberi tanda sesuai dengan gambar berikut.

            Gambar 73. Atur komponen ATmega328 sesuai gambar di atas agar simulasi berjalan dengan baik

            3. Jalankan simulasi dengan menekan tombol Run. Lakukan perubahan nilai sensor dengan menekan tombol Up/Down, dan perhatikan nilai yang ditampilkan Serial Monitor (Virtual Terminal).

            Gambar 74. Lakukan pengubahan nilai sensor dan perhatikan tampilan data di Virtual Terminal

            4. Sampai di sini Tahap 1 pembacaan sensor oleh Arduino Nano dan pengiriman datanya ke Serial Monitor telah selesai.


            Tahap 2. Data Sensor di Arduino IoT Cloud

            1. Setelah data sensor berhasil dibaca dan ditampilkan di Serial Monitor, berikutnya buat agar data sensor tersebut dapat ditampilkan di Arduino IoT Cloud. Buka halaman Arduino IoT Cloud. Sign In dengan akun yang telah dibuat sebelumnya, atau kalau belum memiliki akun, klik Create One untuk membuat akun yang baru. 

            Gambar 75. Isi nama dan password, dan klik Sign In untuk masuk - apabila belum memiliki akun nama dan password, klik Create One untuk membuat baru

            2. Di halaman Things yang terbuka, klik tombol Create untuk membuat Thing yang baru.

            Gambar 76. Tekan tombol Create untuk membuat Thing yang baru

            3. Beri nama Thing = Cara2. Klik tombol Add variable untuk menambahkan variabel.

            Gambar 77. Beri nama Thing dan klik tombol Add variable

            4. Di jendela Add variable, isi Name = var, Data Type = Character String, Variable Permission = Read Only, Variable Update Policy = On Change. Klik Add Variable.

            Gambar 78. Isi Name = var, Data Type = Character String, Variable Permission = Read Only, Variable Update Policy = On Change

            5. Setelah menambahkan variabel di Arduino IoT Cloud, berikutnya hubungkan variabel Cloud tersebut dengan hardware NodeMCU. Untuk itu, klik tombol Select Device.

            Gambar 79. Klik tombol Select Device

            6. Di jendela Associate Device, klik tombol Set Up New Device. 

            Gambar 80. Klik tombol Set Up New Device

            7. Di jendela Setup Device, pilih Set Up a 3rd Party Device.

            Gambar 81. Pilih Set Up a 3rd Party Device 

            8. Pilih Device Type = ESP8266 dan Model = NodeMCU 1.0 (ESP-12E Module), klik tombol Continue. 

            Gambar 82. Pilih Device Type = ESP8266 dan Model = NodeMCU 1.0

            9. Arduino IoT Cloud akan memberikan nama device (nama tersebut bisa kita ganti). Klik tombol Next.

            Gambar 83. Arduino IoT Cloud memberikan nama device

            10. Setelah nama Device, Arduino IoT Cloud juga memberikan kode device ID dan Secret Key. Karena ketiga hal tersebut nantinya diperlukan untuk program NodeMCU, simpan ketiganya dengan cara meng-klik tulisan download the pdf.

            Gambar 84. Klik tulisan download the pdf untuk menyimpan data device

            11. Contoh isi download the pdf, terlihat datanya berisi nama device, device id dan secret key.

            Gambar 85. Contoh isi download the pdf

            12. Setelah mengunduh data device, di bagian bawah jendela, centang tulisan I saved my device ... Kemudian tekan tombol Continue.

            Gambar 86. Beri centang tulisan I saved my device ... dan klik Continue

            13. Maka Setup Device selesai. Klik Done.

            Gambar 87. Setup Device telah selesai.

            14. Tampak di halaman Thing, di bagian Associated Device, muncul nama device, ID device, tipe device dan status device. Terlihat bahwa statusnya masih Offline, yang berarti NodeMCU belum terhubung dengan variable Cloud. Untuk menghubungkan NodeMCU ini dengan variabel Cloud, NodeMCU harus diprogram dengan Sketch yang dibangkitkan oleh Arduino IoT Cloud. Untuk itu klik Tab Sketch.

            Gambar 88. Klik Tab Sketch untuk membuka halaman Sketch

            15. Agar Sketch dapat di-unduh, di halaman Sketch, klik pada tombol Open full editor. 

            Gambar 89. Klik tombol Open full editor

            16. Di halaman Editor, klik kanan nama Sketch, pilih Download Sketch. 

            Gambar 90. Klik kanan nama Sketch, pilih Download Sketch

            17. Ekstrak file download, dan kemudian klik 2 kali file program bertipe *.ino.

            Gambar 91. Ekstrak file, dan kemudian klik 2 kali file bertipe ino 

            18. Di software Arduino IDE yang terbuka, hapus program di Tab *.ino, dan gantikan dengan kode program di bawah gambar ini.

            Gambar 92. Hapus isi program di Tab *.ino, dan tempelkan program di bawah ini:

            1. #include "arduino_secrets.h"
            2. #include "thingProperties.h"
            3. void setup() {
            4.   Serial.begin(9600);
            5.   delay(1500);
            6.   initProperties();
            7.   ArduinoCloud.begin(ArduinoIoTPreferredConnection);
            8.   setDebugMessageLevel(2);
            9.   ArduinoCloud.printDebugInfo();
            10. }
            11. void loop() {
            12.   ArduinoCloud.update();
            13.   if (Serial.available() > 0) {
            14.     String data = Serial.readStringUntil('\n');
            15.     var = data;
            16.   }
            17. }

            19. Sebelum program di atas di-upload ke NodeMCU, isi dulu nama dan password Wi-Fi yang digunakan serta kode secret key di Tab arduino_secrets.h. Setelah ketiganya diisi, upload program tersebut ke NodeMCU. Pastikan 4 library ini sudah terinstal di Arduino IDE:
            1. ArduinoIoTCloud (versi 1.8.0)
            2. Arduino_ConnectionHandler (versi 0.7.1)
            3. Arduino_DebugUtils-master
            4. ArduinoMqttClient-master
            20. Setelah upload program selesai, buka Serial Monitor. Tunggu hingga muncul tulisan "Connected to Arduino IoT Cloud". Apabila tulisan tersebut muncul, ini berarti NodeMCU telah terhubung ke variabel Cloud, atau dengan kata lain device sudah Online. 

            Gambar 93. Upload program ke NodeMCU. Setelah selesai, buka Serial Monitor. Tunggu hingga tulisan Connected to Arduino IoT Cloud

            21. Buka halaman Thing Cara2, seharusnya status device sudah berubah menjadi Online. 

            Gambar 94. Setelah terhubung ke Cloud, seharusnya status device = Online

            22. Setelah device menjadi Online, langkah berikutnya adalah menampilkan variabel Cloud yang berisi data sensor di Dashboard. Untuk membuat Dashboard, klik Tab Dashboards. Di halaman Dashboards, klik tombol Create.

            Gambar 95. Klik Tab Dashboards, klik tombol Create

            23. Di halaman Dashboard, beri nama Dashboard = Cara2. Kemudian tekan tombol Add, pilih Things, pilih Cara2.

            Gambar 96. Di halaman Dashboard, beri nama Cara2, klik Add, pilih Things, pilih Cara2

            24. Muncul jendela Create widgets from Thing. Klik tombol Create Widgets.

            Gambar 97. Klik tombol Create Widgets di jendela yang muncul

            25. Setelah widget Messenger (default widget untuk tipe data String) muncul di Dashboard, maka Arduino IoT Cloud siap untuk menampilkan data sensor. Untuk bisa membuat data sensor tertampil di Dashboard, pastikan NodeMCU masih terhubung dengan komputer. Buka Device Manager untuk melihat port COM yang digunakan NodeMCU. Berikutnya, karena Arduino Nano disimulasikan dengan Proteus, maka tambahkan COMPIM untuk menghubungkan Arduino Nano di Proteus dengan hardware NodeMCU (file rangkaian Proteus ini dapat rekan-rekan unduh di bagian akhir dari tulisan di halaman ini). Klik 2 kali COMPIM, dan isi Physical Port dengan COM yang digunakan NodeMCU. Dalam contoh di sini, COM yang digunakan oleh NodeMCU adalah COM 9. Atur juga Physical dan Virtual Baud rate ke 9600.

            Gambar 98. Tambahkan COMPIM di rangkaian Gambar 72, dan isi Port dengan COM yang digunakan NodeMCU (file Proteus dapat rekan-rekan unduh di bagian terakhir dari halaman ini)

            26. Jalankan Proteus, dan lakukan pengubahan nilai sensor. Perhatikan nilai yang tampil di Virtual Terminal, nilainya sama seperti yang ditampilkan di widget Messenger di Dashboard Arduino IoT Cloud. Tampak bahwa nilai yang ditampilkan tersebut diberi huruf awalan dari a sampai j, yang sesuai dengan urutan sensor.

            Gambar 99. Nilai sensor ditampilkan di Serial Monitor dan widget Messenger, dengan diberi huruf awalan a - j, sesuai nomor urutan sensor


            Tahap 3. Data Sensor di Google Sheet

            1. Setelah data sensor berhasil tampil di Dashboard Arduino IoT Cloud, maka tahap berikutnya adalah menampilkan data sensor tersebut di Google Sheet. Langkah pembuatannya sangat mudah, karena bantuan webhook. Buka Google Sheet, kemudian munculkan link webhook dengan bantuan Add-on Webhooks for Sheets. Setelah link webhook diperoleh, tempelkan link tersebut di kotak isian Set Webhook di halaman Thing Cara2.

            2. Setelah link webhook Active, lakukan pengubahan nilai sensor di Proteus. Jangan lupa untuk tetap menghubungkan NodeMCU ke komputer, dan koneksi Wi-Fi ke NodeMCU tetap berjalan. Gambar berikut menunjukkan tampilan Google Sheet ketika nilai sensor di Proteus diubah-ubah. 

            Gambar 100. Nilai Sensor di Proteus ditampilkan di Google Sheet

            3. Karena terlalu banyak datanya, maka untuk menghemat pemakaian cell, hapus kolom data A - F. 

            Gambar 101. Hapus kolom data A - F

            4. Berikutnya, hapus juga kolom B dan D, dan sisakan kolom dengan judul kolom = values_0_value, yang berisi nilai sensor, dan values_0_updated_at yang berisi catatan waktu.

            Gambar 102. Hapus semua kolom, kecuali kolom values_0_value dan values_0_updated_at

            5. Setelah tersisa 2 kolom, tambahkan 4 buah kolom baru, dan beri judul kolom berturut-turut: "kode", "nilai", "angka", dan "waktu (detik). Tempatkan 2 kolom pertama di kiri values_0_updated_at, dan 2 kolom yang lain di kanan values_0_updated_at, seperti gambar berikut ini.

            Gambar 103. Tambahkan 4 kolom untuk menampilkan data nilai sensor dan waktu (detik)

            6. Di kolom kode, di baris kedua, isi cell tersebut dengan formula berikut:

            = arrayformula(if(A2:A="","",left(A2:A,1)))

            Gambar 104. Isi cell di baris kedua di kolom kode dengan formula untuk mengambil huruf awal

            7. Di kolom nilai, di baris kedua, isi cell tersebut dengan formula berikut:

            = arrayformula(if(A2:A="","",value(right(A2:A,len(A2:A)-1))))

            Gambar 105. Isi cell di baris kedua di kolom nilai dengan formula untuk mengambil nilai sensor

            8. Di kolom angka, di baris kedua, isi cell tersebut dengan formula berikut:

            = arrayformula(if(D2:D="","",value(left(D2:D,10)+mid(D2:D,12,12))))

            Gambar 106. Isi cell di baris kedua di kolom angka dengan formula untuk mengubah catatan waktu (timestamp) menjadi nilai waktu dalam angka

            9. Di kolom waktu (detik), di baris kedua, isi cell tersebut dengan formula berikut:

            = arrayformula(if(E2:E="","",round((E2:E-$E$2)*100000)))

            Gambar 107. Isi cell di baris kedua di kolom waktu (detik) dengan formula untuk mendapatkan nilai waktu dalam detik yang waktunya dimulai dari data pertama

            10. Terpisah 1 kolom dengan kolom waktu (detik), yaitu di kolom H dan I, buat daftar nama sensor dengan labelnya, dari label a sampai j, dengan urutan seperti ditunjukkan gambar berikut ini:

            Gambar 108. Buat daftar nama sensor dengan labelnya, untuk keperluan menampilkan nama sensor dengan mengacu pada kode/label menggunakan fungsi vlookup

            11. Di kolom G, beri judul kolom = sensor. Di baris kedua, isi cell dengan formula berikut:

            = arrayformula(if(B2:B="","",vlookup(B2:B,$H$2:$I$11,2,TRUE)))

            Gambar 109. Tampilkan nama sensor berdasarkan kode/label dengan fungsi vlookup

            12. Berikutnya, tambahkan Sheet2. Di cell A1, pilih menu Data, klik pada Data validation.

            Gambar 110. Tambahkan Sheet2. Di cell A1, isi dengan Data validation

            13. Di Data validation rules, klik tombol Add rule.

            Gambar 111. Klik tombol Add rule di Data validation 

            14. Di kolom Criteria, pilih Dropdown (from a range).

            Gambar 112. Pilih Dropdown (from a range) di kolom Criteria

            15. Klik tombol kotak-kotak untuk menampilkan kotak isian data range.

            Gambar 113. Klik tombol kotak-kotak untuk menampilkan isian data range

            16. Isi data range = Sheet1!I2:I11, klik OK.

            Gambar114. Isi data range dengan daftar nama sensor, klik OK

            17. Maka muncul drop down pilihan nama sensor di cell A1 Sheet2, klik Done.

            Gambar 115. Terlihat drop down pilihan nama sensor di cell A1, klik Done

            18. Dengan drop down nama sensor ini, diinginkan bisa menampilkan data sensor dan grafiknya sesuai pilihan.

            Gambar 116. Tombol drop down menampilkan daftar nama sensor yang bisa dipilih

            19. Di cell A2, isi dengan formula berikut ini:

            = QUERY(Sheet1!A:G,"SELECT G,F,C,D WHERE G = '"&A1&"' ORDER BY F ASC")

            Gambar 117. Dengan menggunakan fungsi Query, kita bisa menampilkan data dari Sheet1 yang terkait dengan nama sensor yang kita pilih 

            20. Setelah data waktu dan nilai bisa ditampilkan berdasarkan pilihan sensor, langkah berikutnya adalah menampilkan grafik. Untuk itu pilih kolom B dan C.

            Gambar 118. Pilih kolom B dan C

            21. Sementara kolom B dan C masih dipilih, buka menu Insert, pilih Chart.

            Gambar 119. Insert Chart

            22. Maka muncul grafik nilai vs waktu (detik).

            Gambar 120. Muncul grafik data sensor GUR03

            23. Di drop down A1, pilih sensor LDR, maka muncul grafik data sensor LDR.

            Gambar 121. Tampilan data dan grafik untuk sensor LDR

            24. Di drop down A1, pilih sensor NTC, maka muncul grafik data sensor NTC.

            Gambar 122. Tampilan data dan grafik untuk sensor NTC

            25. Di drop down A1, pilih sensor LM35, maka muncul grafik data sensor LM35.

            Gambar 123. Tampilan data dan grafik untuk sensor LM35


            Kelebihan & Kekurangan Cara2:
            Beberapa hal yang menarik dari fitur Datalogger IoT Cara2 ini adalah:
            1. Sensor yang dibaca dan di-log datanya bisa lebih dari 5 sensor, yaitu mengikuti jumlah kaki IO Arduino yang digunakan. Dalam contoh di sini ada 10 sensor yang dibaca dan ditampilkan nilainya.
            2. Arduino Uno memiliki 6 buah kaki input analog, Arduino Nano memilik 8 buah kaki input analog, dan Arduino Mega memiliki 16 buah input analog. Dengan Cara2 ini kita bisa membaca dan me-log lebih banyak sensor analog.
            Sedangkan kekurangan Datalogger IoT Cara2 ini adalah sebagai berikut:
            1. Sensor tidak langsung terhubung ke NodeMCU, tetapi melalui Arduino, membuat waktu yang dibutuhkan untuk pembacaan sensor menjadi lebih lama.
            2. Semua data sensor dihubungkan ke satu variabel Cloud. Karena hanya satu variabel Cloud, maka semua data sensor hanya bisa ditampilkan satu persatu secara bergantian. Karena waktu update-nya berbeda, membuat grafik yang dihasilkan tidak memiliki basis waktu yang sama, sehingga tidak dapat digunakan untuk membandingkan unjuk kerja semua sensor pada waktu yang sama.
            3. Dari hasil pengamatan, interval waktu update data rata-rata lebih dari 30 detik. 

            26. Agar lebih jelas mengenai pembuatan Datalogger IoT Cara1, silahkan melihat video berikut ini:

            Video pembuatan Datalogger IoT Cara2

            27. Sampai di sini pembuatan Datalogger IoT Cara2 selesai. Untuk file program NodeMCU, dan Library yang digunakan di bagian ini, silahkan bisa diunduh di bagian terakhir dari tulisan di halaman ini.

            Catatan Perbaikan:
            1. Ketika koneksi antara NodeMCU dengan Arduino IoT Cloud terputus, penyambungannya kembali sering kali tidak dibarengi dengan koneksi webhook ke Google Sheet. Apabila sampai beberapa waktu, Google Sheet tidak meng-update tampilan datanya, padahal data di Dashboard Arduino IoT Cloud sudah ter-update dengan data terbaru, maka atasi masalah ini dengan menghapus link webhook di halaman Thing, dan isi kembali dengan link yang sama.
            2. Ketika Google Sheet terhubung kembali dengan Arduino IoT Cloud, sering kali data yang baru ditampilkan di baris paling bawah, sehingga muncul baris kosong di tengah-tengah antara data lama dengan data yang baru. Untuk mengatasi masalah ini, hapus semua baris yang kosong. Rekan-rekan tidak perlu menekan tombol Add 1000, karena baris yang paling bawah secara otomatis akan bertambah sendiri ketika muncul data baru.



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



            Cara3: Lebih banyak Sensor + Banyak Arduino + NodeMCU + Arduino IoT Cloud + Google Sheet

            Kelemahan dari Cara2 adalah sensor harus berada dekat dengan Arduino Nano. Apabila rekan-rekan memiliki beberapa sensor yang tersebar di tempat yang berbeda dan terpisah cukup jauh, maka solusi yang tepat adalah menggunakan RS-485. Di samping bisa menjangkau sensor-sensor yang berada di tempat yang terpisah jauh (bisa lebih dari 1 km), juga dengan RS-485 dan protokol Modbus, kita bisa menghubungkan tidak hanya 1 Arduino, tetapi bisa sampai 31 Arduino. Apabila setiap Arduino digunakan untuk membaca 10 sensor, maka sensor yang bisa di-log datanya akan bisa sebanyak 31 x 10 = 310 sensor. 

            Pada dasarnya langkah-langkah pembuatannya hampir sama seperti Cara1 dan Cara2 di atas, hanya saja di sini ditambahkan komunikasi Modbus, dengan sambungan RS-485. Agar saya tidak repot membuat rangkaian yang baru, saya menggunakan rangkaian Datalogger yang saya gunakan untuk terhubung dengan HMI Haiwell. Rekan-rekan dapat melihat cara pembuatan Datalogger tersebut di blog saya ini: Datalogger dengan HMI Haiwell, atau di video yang saya buat ini: https://youtu.be/zbJc58jAiq8

            Kalau di Datalogger dengan HMI Haiwell, sebagai Master Modbus adalah HMI Haiwell. Sedangkan di Datalogger IoT ini sebagai Master Modbus adalah NodeMCU. Berhubung Proteus tidak memiliki komponen NodeMCU, maka terpaksa NodeMCU di sini saya simulasikan dengan ATmega328. Sementara untuk koneksi Wi-Fi-nya, tetap menggunakan hardware NodeMCU. Jadi seolah-olah NodeMCU memiliki 2 badan, badan yang soft ada di Proteus (berupa komponen ATmega328), sedang badan yang hard (yang riil) terhubung ke komputer. Badan yang soft untuk komunikasi Modbus, sedang badan yang hard untuk koneksi ke Wi-Fi. Antara badan yang soft dan badan yang hard, itu terhubung dengan COMPIM. Lebih jelasnya perhatikan gambar berikut ini:

            Gambar 124. Rangkaian Datalogger IoT Cara3 dengan komunikasi Modbus dan sambungan RS-485

            Bandingkan Gambar 124 di atas dengan Gambar 8 di blog ini: Datalogger dengan HMI Haiwell. Jadi perbedaannya ada pada komponen U4, yang saya tambahkan untuk mensimulasikan NodeMCU. Simulasi NodeMCU ini digunakan agar bisa menjadi Master Modbus, yang juga dihubungkan ke hardware NodeMCU melalui COMPIM agar bisa terkoneksi dengan Wi-Fi (Catatan: Bagi rekan-rekan yang bingung dengan penjelasan saya ini, silahkan menulis pertanyaan di komentar). 

            Dengan menggunakan rangkaian Gambar 124 di atas, berikut ini langkah-langkah pembuatan Datalogger IoT Cara3, yang saya bagi menjadi 3 tahapan berikut ini:
            1. Tahap 1: Sensor-sensor dibaca oleh ketiga Arduino Nano dan ditampilkan di Serial Monitor (Virtual Terminal) yang terhubung ke COMPIM NodeMCU melalui komuniikas Modbus.
            2. Tahap 2: Data sensor diterima oleh NodeMCU dan ditampilkan di Arduino IoT Cloud
            3. Tahap 3: Arduino IoT Cloud dengan bantuan Webhook mengirimkan data ke Google Sheet 
            Berikut ini langkah pembuatan masing-masing tahap:

            Tahap 1. Data banyak Sensor di Serial Monitor

            1. Diinginkan untuk membaca data sensor-sensor di ketiga Arduino, melalui komunikasi Modbus dan kemudian menampilkan datanya di Serial Monitor. Agar pembuatan tampilan datanya di Google Sheet nantinya menjadi mudah, maka kita perlu lakukan pengaturan sebagai berikut:
            • Ketiga Arduino (U1, U2, U3) di rangkaian Gambar 124 dibuat menjadi Slave, dengan nomor ID secara berturut-turut sesuai urutannya adalah 1,2 dan 3.
            • Semua data sensor di atas ditempatkan di memori Input Register. Untuk menghemat waktu pembacaan, 3 data sensor dibaca sekaligus dalam 1 kali pembacaan. 
            • Agar bisa diketahui, sensor apa yang sedang dibaca, ditambahkan kode grup sensor di awal data. Jadi setiap kali pembacaan, tidak hanya 3 data sensor yang dibaca, tetapi juga ID grup sensor sekaligus dibaca. Sebagai contoh data yang dibaca (lihat Gambar 125): 3;180;670;132, di mana angka 3 adalah kode ID grup sensor, sedangkan 180;670;132 adalah 3 data sensor. Berikut ini kode ID grup sensor dengan 3 nama sensor yang menjadi anggotanya.
            Tabel 5. Format data sensor dengan ID grup

            Kode ID grup

            Data sensor 1

            Data sensor 2

            Data sensor 3

            1

            LDR

            NTC

            SRF

            2

            TC1

            TC2

            MPX

            3

            DHT t

            DHT h

            SHT t

            4

            SHT h

            TH2 t

            TH2 h



            2. Secara berturut-turut, berikut ini program untuk ketiga Slave (U1, U2, U3) dan Master (U4) pada rangkaian Gambar 124 di atas.

            1.1 Program untuk Arduino Slave1: 
            1. #include "ModbusRTU.h"
            2. #include "GyverNTC.h"
            3. #include "NewPing.h"
            4. GyverNTC therm(1, 10000, 3435, 25, 10000);
            5. ModbusRTU mb;
            6. #define TRG 8
            7. #define ECH 9
            8. #define MAKS 200
            9. NewPing sonar(TRG, ECH, MAKS);
            10. unsigned long skr = 0;
            11. void setup() {
            12.   Serial.begin(9600);
            13.   mb.begin(&Serial);
            14.   mb.setBaudrate(9600);
            15.   mb.slave(1);    //slave ID
            16.   mb.addIreg(0);  //sensor ID
            17.   mb.addIreg(1);  //sensor1
            18.   mb.addIreg(2);  //sensor2
            19.   mb.addIreg(3);  //sensor3
            20.   mb.Ireg(0, 1);
            21.   delay(1000);
            22. }
            23. void loop() {
            24.   if (millis() - skr > 1000) {
            25.     int ldr = analogRead(A0) * 5.0 / 1023.0 * 100;
            26.     mb.Ireg(1, ldr);
            27.     int ntc = therm.getTempAverage() * 10;
            28.     mb.Ireg(2, ntc);
            29.     int srf = sonar.ping_cm() * 10;
            30.     mb.Ireg(3, srf);
            31.     skr = millis();
            32.     mb.task();
            33.   }
            34. }

            1.2 Program untuk Arduino Slave2: 
            1. #include "ModbusRTU.h"
            2. #include "SPI.h"
            3. #include "GyverMAX6675.h"
            4. #include "Adafruit_MAX31855.h"
            5. #define DT 8
            6. #define CK 9
            7. #define SS 10
            8. #define CLK 11
            9. #define DO 12
            10. #define CS 13
            11. GyverMAX6675<CK, DT, SS> sensor;
            12. Adafruit_MAX31855 thermo(CLK, CS, DO);
            13. ModbusRTU mb;
            14. int t = 0;
            15. unsigned long skr = 0;
            16. void setup() {
            17.   Serial.begin(9600);
            18.   mb.begin(&Serial);
            19.   mb.setBaudrate(9600);
            20.   mb.slave(2);    //slave ID
            21.   mb.addIreg(0);  //sensorID
            22.   mb.addIreg(1);  //sensor1
            23.   mb.addIreg(2);  //sensor2
            24.   mb.addIreg(3);  //sensor3
            25.   mb.Ireg(0, 2);
            26.   delay(1000);
            27. }
            28. void loop() {
            29.   if (millis() - skr > 1000) {
            30.     if (sensor.readTemp()) {
            31.       t = sensor.getTemp() * 10;
            32.       mb.Ireg(1, t);
            33.     }
            34.     int c = thermo.readCelsius() * 10;
            35.     mb.Ireg(2, c);
            36.     int a = analogRead(A0);
            37.     int p = ((a * .00481 / 5) + .094) / .009 * 10;
            38.     mb.Ireg(3, p);
            39.     skr = millis();
            40.     mb.task();
            41.   }
            42. }

            1.3 Program untuk Arduino Slave3:
            1. #include "ModbusRTU.h"
            2. #include "DHT.h"
            3. #include "sht_7x.h"
            4. #include "TH02.h"
            5. #include "Wire.h"
            6. DHT dht(8, DHT11);
            7. SHT_7x sht(9, 10);  //(sck,data)
            8. TH02 th02(0x40);
            9. ModbusRTU mb;
            10. int16_t temp, rh;
            11. unsigned long skr = 0;
            12. void setup() {
            13.   Serial.begin(9600);
            14.   sht.init();
            15.   dht.begin();
            16.   Wire.begin();
            17.   mb.begin(&Serial);
            18.   mb.setBaudrate(9600);
            19.   mb.slave(3);    //slave ID
            20.   mb.addIreg(0);  //sensorID
            21.   mb.addIreg(1);  //sensor1a
            22.   mb.addIreg(2);  //sensor1b
            23.   mb.addIreg(3);  //sensor2a
            24.   mb.addIreg(4);  //sensorID
            25.   mb.addIreg(5);  //sensor2b
            26.   mb.addIreg(6);  //sensor3a
            27.   mb.addIreg(7);  //sensor3b
            28.   mb.Ireg(0, 3);
            29.   mb.Ireg(4, 4);
            30.   delay(1000);
            31. }
            32. void loop() {
            33.   if (millis() - skr > 1000) {
            34.     int t1 = dht.readTemperature() * 10;
            35.     mb.Ireg(1, t1);
            36.     int h1 = dht.readHumidity() * 10;
            37.     mb.Ireg(2, h1);
            38.     int t2 = sht.getTemperature() * 10;
            39.     mb.Ireg(3, t2);
            40.     int h2 = sht.getHumidity() * 10;
            41.     mb.Ireg(5, h2);
            42.     th02.startTempConv();
            43.     delay(50);
            44.     temp = th02.getConversionValue();
            45.     int t3 = th02.getLastRawTemp() / 100.0 * 10;
            46.     mb.Ireg(6, t3);
            47.     th02.startRHConv();
            48.     delay(50);
            49.     rh = th02.getConversionValue();
            50.     int h3 = th02.getLastRawRH() / 100.0 * 10;
            51.     mb.Ireg(7, h3);
            52.     skr = millis();
            53.     mb.task();
            54.   }
            55. }

            1.4 Program untuk Master NodeMCU (disimulasikan dengan ATmega328):  

            1. #include <ModbusRTU.h>
            2. #include <SoftwareSerial.h>
            3. SoftwareSerial S(2, 3);
            4. ModbusRTU mb;
            5. uint16_t Ireg[10];
            6. unsigned long skr = 0;
            7. int cacah = 0;
            8. void setup() {
            9.   Serial.begin(9600);
            10.   S.begin(9600);
            11.   mb.begin(&S);
            12.   mb.setBaudrate(9600);
            13.   mb.master();
            14.   mb.readIreg(1, 0, Ireg, 1);
            15.   while (mb.slave()) {
            16.     mb.task();
            17.     delay(10);
            18.   }
            19.   delay(1000);
            20. }
            21. void loop() {
            22.   if (millis() - skr > 1000) {
            23.     cacah = cacah + 1;
            24.     if (cacah > 4) cacah = 1;
            25.     switch (cacah) {
            26.       case 1:
            27.         logdata(1, 0, 4);
            28.         break;
            29.       case 2:
            30.         logdata(2, 0, 4);
            31.         break;
            32.       case 3:
            33.         logdata(3, 0, 4);
            34.         break;
            35.       case 4:
            36.         logdata(3, 4, 4);
            37.         break;
            38.     }
            39.     skr = millis();
            40.   }
            41. }
            42. void logdata(int id, int alamat, int jumlah) {
            43.   while (cacah != Ireg[0]) {
            44.     mb.readIreg(id, alamat, Ireg, jumlah);
            45.     while (mb.slave()) {
            46.       mb.task();
            47.       delay(10);
            48.     }
            49.   }
            50.   for (int i = 0; i < (jumlah - 1); i++) {
            51.     Serial.print(Ireg[i]);
            52.     Serial.print(';');
            53.   }
            54.   Serial.println(Ireg[jumlah - 1]);
            55. }

            Keterangan:

            1. Program untuk Arduino Slave1 memerlukan tambahan library modbus-esp8266, GyverNTC, dan NewPing, yang dapat diunduh di bagian akhir dari tulisan di halaman ini. 
            2. Program untuk Arduino Slave2 memerlukan tambahan library modbus-esp8266, SPI, GyverMAX6675, dan Adafruit_MAX31855 yang dapat diunduh di bagian akhir dari tulisan di halaman ini.
            3. Program untuk Arduino Slave3 memerlukan tambahan library modbus-esp8266, DHT, sht_7x, TH02, dan Wire yang dapat diunduh di bagian akhir dari tulisan di halaman ini.
            4. Semua kode program dan rangkaian yang digunakan untuk simulasi Datalogger IoT Cara3 di Proteus ini dapat diunduh di bagian akhir dari tulisan di halaman ini.

            3. Berikut ini hasil simulasi komunikasi Modbus antara Master (U4) dengan ketiga Slave (U1, U2, U3), yang menampilkan data sensor di ketiga Slave dengan format data sesuai Tabel 5 di atas.

            Gambar 125. Serial Monitor (Virtual Terminal) menampilkan data sensor di ketiga Arduino

            4. Sampai di sini Tahap 1 pembacaan sensor oleh Master melalui komunikasi Modbus dan pengiriman datanya ke Serial Monitor telah selesai.


            Tahap 2. Data Sensor di Arduino IoT Cloud

            1. Tahap 2 di sini sama persis dengan Tahap 2 untuk Cara2. Gunakan variabel Cloud yang sama dan device Thing yang sama dengan Cara2. Begitu pula untuk program device NodeMCU-nya, gunakan program yang sama seperti di langkah no. 18. Pastikan status device NodeMCU Online.

            2. Setelah device Online, langkah berikutnya jalankan Proteus, sementara NodeMCU terhubung ke komputer. Pastikan port COM yang ada di COMPIM adalah port yang sama yang digunakan oleh NodeMCU. Untuk mengetahui port COM yang digunakan oleh NodeMCU, buka Device Manager. Setelah Proteus dijalankan, buka Dashboard Arduino IoT Cloud. Perhatikan tampilan data di Virtual Terminal dan bandingkan dengan data di widget Messenger.

            Gambar 126. Widget Messenger di Dashboard Arduino IoT Cloud menampilkan data yang sama dengan data di Virtual Terminal Proteus


            Tahap 3. Data Sensor di Google Sheet

            1. Setelah data sensor berhasil tampil di Dashboard Arduino IoT Cloud, maka tahap berikutnya adalah menampilkan data sensor tersebut di Google Sheet. Buka Google Sheet yang baru, kemudian munculkan link webhook dengan bantuan Add-on Webhooks for Sheets. Setelah link webhook diperoleh, tempelkan link tersebut di kotak isian Set Webhook di halaman Thing (gunakan Thing Cara2).

            2. Setelah link webhook Active, lakukan pengubahan nilai sensor di Proteus. Jangan lupa untuk tetap menghubungkan NodeMCU ke komputer, dan pastikan koneksi Wi-Fi NodeMCU tetap berjalan. Gambar berikut menunjukkan tampilan data sensor di Google Sheet. 

            Gambar 127. Google Sheet menampilkan data sensor dari rangkaian di Proteus dengan bantuan NodeMCU dan webhook Arduino IoT Cloud

            3. Untuk menghemat pemakaian cell Google Sheet, hapus kolom A-F. 

            Gambar 128. Hapus kolom A-F

            4. Hapus juga kolom B dan D, sehingga hanya tersisa kolom values_0_value dan values_0_updated_at

            Gambar 129. Hapus lagi kolom sehingga hanya tersisa 2 kolom

            5. Setelah tinggal 2 kolom, berikutnya di baris pertama, buat 14 judul kolom secara berturut-turut: angka, waktu (detik), LDR, NTC. SRF. TC1. TC2, MPX, DHT1, DHT2, SHT1, SHT2, TH1, dan TH2. Kemudian di baris kedua, di bawah judul kolom angka, isi dengan formula berikut:

            =ARRAYFORMULA(if(B2:B="","",VALUE(LEFT(B2:B,10)+MID(B2:B,12,12))))

            Gambar 130. Menambahkan formula untuk mendapatkan nilai waktu dari String values_0_updated_at

            6. Di baris kedua, di bawah judul kolom waktu (detik), isi dengan formula berikut:

            =ARRAYFORMULA(if(C2:C="","",round((C2:C-$C$2)*100000)))

            Gambar 131. Menambahkan formula untuk mendapatkan waktu dalam detik dari satu pembacaan ke pembacaan berikutnya yang dimulai dari pembacaan pertama

            7. Di baris kedua, di bawah judul kolom LDR, isi dengan formula berikut:

            =ARRAYFORMULA(if(left(A2:A,1)="1",split(right(A2:A,len(A2:A)-2),";"),""))

            Gambar 132. Menambahkan formula untuk mengambil data sensor dengan ID grup = 1, dan memisahkannya di 3 kolom: LDR, NTC dan SRF

            8. Di baris kedua, di bawah judul kolom TC1, isi dengan formula berikut:

            =ARRAYFORMULA(if(left(A2:A,1)="2",split(right(A2:A,len(A2:A)-2),";"),""))

            Gambar 133. Menambahkan formula untuk mengambil data sensor dengan ID grup = 2, dan memisahkannya di 3 kolom: TC1, TC2 dan MPX

            9. Di baris kedua, di bawah judul kolom DHT1, isi dengan formula berikut:

            =ARRAYFORMULA(if(left(A2:A,1)="3",split(right(A2:A,len(A2:A)-2),";"),""))

            Gambar 134. Menambahkan formula untuk mengambil data sensor dengan ID grup = 3, dan memisahkannya di 3 kolom: DHT-1, DHT-2 dan SHT-1

            10. Di baris kedua, di bawah judul kolom SHT2, isi dengan formula berikut:

            =ARRAYFORMULA(if(left(A2:A,1)="4",split(right(A2:A,len(A2:A)-2),";"),""))

            Gambar 135. Menambahkan formula untuk mengambil data sensor dengan ID grup = 4, dan memisahkannya di 3 kolom: SHT-2, TH-1, TH-2

            11. Berikutnya di kolom Q dan R, ketik daftar nama sensor dan kolom yang digunakan. Daftar nama ini akan dimunculkan di Sheet2, yang digunakan untuk memilih sensor apa yang akan ditampilkan datanya.

            Gambar 136. Menambahkan daftar nama sensor dan kolom yang digunakan

            12. Berikutnya tambahkan Sheet baru. Di Sheet2 ini, di cell A1, buat tombol dropdown pilihan sensor. Gunakan Data Validation di menu Data, tambahkan sebuah rule, beri Criteria = Dropdown (from a range), kemudian isi data range dengan nama-nama sensor yang ada di Sheet1.

            Gambar 137. Menambahkan dropdown untuk memilih sensor yang akan ditampilkan datanya

            13. Berikutnya di cell B1, diinginkan untuk bisa menampilkan kolom dari sensor yang dipilih, untuk itu isi dengan formula berikut ini:

            =VLOOKUP(A1,Sheet1!Q2:R13,2,FALSE)

            Gambar 138. Menambahkan formula untuk menampilkan kolom di Sheet1 sesuai sensor yang dipilih

            14. Berikutnya di cell A2, diinginkan untuk bisa menampilkan semua data dari Sheet1 yang terkait dengan sensor yang dipilih, untuk itu gunakan formula berikut ini:

            =QUERY(Sheet1!A:P,"SELECT B,D," & B1 & " WHERE "& B1 & " IS NOT NULL ORDER BY D ASC")

            Gambar 139. Menambahkan formula untuk menampilkan kolom di Sheet1 sesuai sensor yang dipilih

            15. Berikutnya diinginkan untuk bisa menampilkan nilai yang sebenarnya dari setiap sensor. Di program Arduino, semua data sensor telah dikalikan dengan 10 (kecuali untuk sensor LDR dikalikan dengan 100), untuk membuat pengiriman data dalam bentuk angka bulat (integer). Untuk mendapatkan nilai sensor yang sebenarnya, di D3, isi dengan formula berikut ini:

            =arrayformula(if(C3:C="","",if(B1="E",C3:C/100,C3:C/10)))

            Gambar 140. Untuk mendapatkan nilai sensor yang sebenarnya, nilai sensor dibagi 10 (kecuali untuk nilai sensor LDR yang harus dibagi 100)

            16. Berikutnya, untuk menampilkan grafik sensor, pilih kolom B dan kolom D, kemudian buka menu Insert, pilih Chart. Klik 2 kali pada Chart hingga muncul Chart editor. Di Chart editor, pilih Chart type = Line Chart, dan beri centang pada Use column B as labels.

            Gambar 141. Pilih kolom B dan D, buka menu Insert, pilih Chart, di Chart editor, pilih Line Chart, beri centang pada Use column B as labels

            17. Berikut ini berturut-turut tampilan grafik semua sensor:

            Gambar 142.a Data dan grafik sensor LDR

            Gambar 142.b Data dan grafik sensor NTC

            Gambar 142.c Data dan grafik sensor SRF

            Gambar 142.d Data dan grafik sensor TC1

            Gambar 142.e Data dan grafik sensor TC2

            Gambar 142.f Data dan grafik sensor MPX

            Gambar 142.g Data dan grafik sensor DHT data suhu

            Gambar 142.h Data dan grafik sensor DHT data kelembaban

            Gambar 142.i Data dan grafik sensor SHT data suhu

            Gambar 142.j Data dan grafik sensor SHT data kelembaban

            Gambar 142.k Data dan grafik sensor TH2 data suhu

            Gambar 142.l Data dan grafik sensor TH2 data kelembaban

            Kelebihan & Kekurangan Cara3:
            Beberapa hal yang menarik dari fitur Datalogger IoT Cara3 ini adalah:
            1. Dengan protokol Modbus dan sambungan RS-485, sensor yang dibaca bisa lebih banyak. Secara perhitungan, jika ada 31 buah Arduino dihubungkan dengan Datalogger IoT ini melalui Modbus, dengan masing-masing Arduino membaca 10 buah sensor, maka ada 310 sensor yang bisa dibaca dan ditampilkan di Google Sheet, baik sensor digital maupun analog.
            2. Dengan protokol Modbus dan sambungan RS-485, sensor-sensor yang berada di tempat yang terpisah jauh (bisa lebih dari 1 km) bisa dijangkau.
            Sedangkan kekurangan Datalogger IoT Cara3 ini adalah sebagai berikut:
            1. Sensor tidak langsung terhubung ke NodeMCU, tetapi melalui Arduino, dan tidak hanya 1 Arduino, tetapi banyak Arduino, yang harus dipanggil secara berurutan oleh NodeMCU sebagai Master, membuat waktu yang dibutuhkan untuk pembacaan sensor menjadi sangat lama (lebih lama dari Cara2).
            2. Semua data sensor dihubungkan ke satu variabel Cloud. Karena hanya satu variabel Cloud, maka semua data sensor hanya bisa ditampilkan satu persatu secara bergantian. Karena waktu update-nya berbeda, membuat grafik yang dihasilkan tidak memiliki basis waktu yang sama, sehingga tidak dapat digunakan untuk membandingkan unjuk kerja semua sensor pada waktu yang sama.

            Pertanyaan Penting:
            Di Datalogger Cara3 ini, saya membuat NodeMCU disimulasikan sebagian di Proteus untuk menangani komunikasi Modbus, dan sebagian lagi secara riil hardware untuk bisa terhubung dengan Arduino IoT Cloud. Lalu bagaimana apabila Datalogger IoT Cara3 ini ingin diterapkan secara riil hardware, tidak menggunakan simulasi Proteus? Maka jawabannya adalah gabungkan program untuk Master (U4) dengan program untuk NodeMCU terhubung ke variabel Cloud. Lebih jelasnya rekan-rekan bisa melihat pada file terlampir di bagian bawah ini, dengan file bernama NodeMCU_Cara3_Gabung.rar. Oya, jangan lupa untuk menambahkan nama dan password Wi-Fi serta kode secret key di Tab program arduino_secrets.h, serta kode device ID di Tab program thingProperties.h. Gunakan kaki D1 NodeMCU untuk terhubung dengan kaki RO MAX485, dan kaki D2 NodeMCU untuk terhubung dengan kaki DI MAX485. Apabila masih bingung dengan keterangan ini, silahkan menulis pertanyaan di komentar.
             
            18. Agar lebih jelas mengenai pembuatan Datalogger IoT Cara3, silahkan melihat video berikut ini:

            Video pembuatan Datalogger IoT Cara3

            19. Sampai di sini pembuatan Datalogger IoT Cara3 selesai. Untuk file program NodeMCU, dan Library yang digunakan di bagian ini, silahkan bisa diunduh di bagian terakhir dari tulisan di halaman ini.

            Catatan Perbaikan:
            1. Ketika koneksi antara NodeMCU dengan Arduino IoT Cloud terputus, penyambungannya kembali sering kali tidak dibarengi dengan koneksi webhook ke Google Sheet. Apabila sampai beberapa waktu, Google Sheet tidak meng-update tampilan datanya, padahal data di Dashboard Arduino IoT Cloud sudah ter-update dengan data terbaru, maka atasi masalah ini dengan menghapus link webhook di halaman Thing, dan isi kembali dengan link yang sama.
            2. Ketika Google Sheet terhubung kembali dengan Arduino IoT Cloud, sering kali data yang baru ditampilkan di baris paling bawah, sehingga muncul baris kosong di tengah-tengah antara data lama dengan data yang baru. Untuk mengatasi masalah ini, hapus semua baris yang kosong. Rekan-rekan tidak perlu menekan tombol Add 1000, karena baris yang paling bawah secara otomatis akan bertambah sendiri ketika muncul data baru.
            3. Dari hasil pengamatan, interval waktu update data rata-rata lebih dari 50 detik. 

            File Download: File Datalogger IoT

            No comments:

            Post a Comment