Kali ini penulis mendapat tugas dari dosen untuk membuat perangkat IoT
dengan menggunakan chip ESP8266 yang diprogram menggunakan Arduino IDE.
Nah, kali ini penulis mencoba memprogram NodeMCU ESP8266 dihubungkan
dengan sensor Photo Sensitive LDR dan hasilnya dapat ditampilkan
di Web Server maupun diunggah ke pangkalan data Firebase milik Google Inc.
Sensor Photosensitive LDR |
Photosensitive LDR merupakan sebuah sensor untuk mengukur itensitas cahaya yang
dapat digunakan untuk berbagai macam tujuan. Sensor ini membutuhkan
tegangan sebesar 3.3V yang didukung oleh modul ESP8266. Berikut ini
gambar cara menghubungkan sensor photosensitive LDR dengan NodeMCU ESP8266.
Selanjutnya adalah membuat pangkalan data pada Firebase untuk menyimpan
hasil dari sensor ini, silahkan anda rubah dan sesuaikan dengan
keinginan anda bentuk dari database Firebase ini. Jangan lupa juga untuk
mengunduh library Firebase agar anda dapat melakukan pembacaan
maupun penulisan data Firebase pada Arduino IDE dan pada perangkat
NodeMCU ESP8266.
Struktur database yang digunakan pada Firebase |
Ide dari program ini sebagai berikut:
1. Direncanakan, itensitas cahaya maksimal untuk mematikan lampu, itensitas minimal untuk
menyalakan lampu serta frekuensi pengecekan itensitas cahaya dilakukan tiap berapa
menit dikendalikan dari aplikasi Android.
2. NodeMCU ESP8266 membaca info dari database agar tahu kapan mematikan dan menyalakan lampu serta frekuensi melakukan pengecekan itensitas cahaya untuk diunggah ke Firebase maupun ditampilkan di Web Server. Alamat IP dari Web Server ini bersifat lokal saja (dalam satu AP).
Berikut ini kode sumber lengkap beserta penjelasannya:2. NodeMCU ESP8266 membaca info dari database agar tahu kapan mematikan dan menyalakan lampu serta frekuensi melakukan pengecekan itensitas cahaya untuk diunggah ke Firebase maupun ditampilkan di Web Server. Alamat IP dari Web Server ini bersifat lokal saja (dalam satu AP).
1: #include <ESP8266WiFi.h> // Memasukan library ESP8266
2: #include <FirebaseArduino.h> // Memasukkan library Firebase
3: #define WIFI_SSID "ANWAREZ96" // Sesuaikan dengan Nama WiFi AP anda
4: #define WIFI_PASS "anwarez96" // Password WiFi AP anda
5: #define FIREBASE_HOST "smarthome-8eb1f.firebaseio.com" // Sesuaikan dengan host database Firebase anda
6: #define FIREBASE_AUTH "lmE1mv5usDmPBFYD5Nl1u6GwT8bQsUeB42iYKrXX" // Sesuaikan dengan Authentic Key database Firebase anda
7: #define LEDTImeOut 1000 // Set nyala mati lampu LED 1000ms
8: /* Definisikan semua variabel di tabel sensor_cahaya/teras_depan yang ada didatabase Firebase (Sesuaikan dengan isi dari database anda) */
9: int sensor_cahaya_teras_depan_min=0;
10: int sensor_cahaya_teras_depan_max=0;
11: int sensor_cahaya_teras_depan_cahaya=0;
12: int sensor_cahaya_teras_depan_recheck=0;
13: String sensor_cahaya_teras_depan_status_lampu="OTO";
14: // Jalankan server pada port 80
15: WiFiServer server(80);
16: // Digital output sensor LDR pada pin 5 di NodeMCU (lihat NodeMCU pin mapping)
17: const int DigitalLDRPin = 5; // Diboard tertulis D1, untuk menangkap output digital dari sensor LDR
18: // Analog output sensor LDR pada pin A0 di NodeMCU (lihat NodeMCU pin mapping)
19: const int AnalogLDRPin = A0; // Diboard tertulis A0, untuk menangkap output analog dari sensor LDR
20: /* Fungsi untuk membaca database sensor_cahaya/teras_depan */
21: void baca_cahaya_teras_depan() {
22: /* Baca isi database sensor_cahaya_teras_depan untuk mendapatkan data teras_depan
23: (Sesuaikan dengan isi dari database anda) */
24: FirebaseObject sensor_cahaya = Firebase.get("/sensor_cahaya/teras_depan");
25: // Cek, apakah pengambilan database teras_depan dari Firebase sukses
26: if (Firebase.success())
27: {
28: /* Jika SUKSES, kerjakan proses dibawah ini */
29: // Rubah object Firebase menjadi Object JSON
30: JsonObject& sensor_cahaya_teras_depan = sensor_cahaya.getJsonVariant();
31: // Lakukan iterasi untuk memparsing nama key serta isinya dari tabel teras_depan
32: for (JsonObject::iterator it=sensor_cahaya_teras_depan.begin(); it!=sensor_cahaya_teras_depan.end(); ++it)
33: {
34: String keys = it->key; // Simpan nama key dari table teras_Depan
35: // Ambil nama key "recheck" yang digunakan untuk memperbarui tiap berapa menit itensitas cahaya dicek dan diunggah ke database
36: if (keys.equals("recheck")) {
37: // Simpan nilai dari nama key "recheck"
38: keys = it->value.as<char*>();
39: // Simpan ke variabel sensor_suhu_ruang_tamu_recheck dan rubah ke Integer
40: sensor_cahaya_teras_depan_recheck = keys.toInt();
41: // Tampilkan pesan ke Serial Monitor (Buat DEBUG)
42: Serial.print("Recheck itensitas cahaya setiap: "); Serial.print(sensor_cahaya_teras_depan_recheck); Serial.println(" menit.");
43: }
44: // Ambil nama key "cahaya_min" yang digunakan untuk mnyalakan lampu bila itensitas cahaya mencapai minimum
45: if (keys.equals("cahaya_min")) {
46: // Simpan nilai dari nama key "cahaya_min"
47: keys = it->value.as<char*>();
48: // Simpan ke variabel sensor_cahaya_teras_depan_min dan rubah ke Integer
49: sensor_cahaya_teras_depan_min = keys.toInt();
50: // Tampilkan pesan ke Serial Monitor (Buat DEBUG)
51: Serial.print("Itensitas cahaya minimum menyalakan lampu: "); Serial.println(sensor_cahaya_teras_depan_min);
52: }
53: // Ambil nama key "cahaya_max" yang digunakan untuk mematikan lampu bila itensitas cahaya mencapai maksimum
54: if (keys.equals("cahaya_max")) {
55: // Simpan nilai dari nama key "cahaya_max"
56: keys = it->value.as<char*>();
57: // Simpan ke variabel sensor_cahaya_teras_depan_max dan rubah ke Integer
58: sensor_cahaya_teras_depan_max = keys.toInt();
59: // Tampilkan pesan ke Serial Monitor (Buat DEBUG)
60: Serial.print("Intensitas cahaya maksimum mematikan lampu: "); Serial.println(sensor_cahaya_teras_depan_max);
61: }
62: // Ambil nama key "status_lampu" yang digunakan untuk setelan lampu, apakah otomatis, selalu on atau selalu off
63: if (keys.equals("status_lampu")) {
64: // Simpan nilai dari nama key "status_ac"
65: keys = it->value.as<char*>();
66: // Simpan ke variabel sensor_cahaya_teras_depan_status_lampu
67: sensor_cahaya_teras_depan_status_lampu = keys;
68: // Tampilkan pesan ke Serial Monitor (Buat DEBUG)
69: Serial.print("Status pengaktifan lampu: "); Serial.println(sensor_cahaya_teras_depan_status_lampu);
70: }
71: }
72: }
73: else
74: {
75: Serial.println("Gagal mengambil data teras_depan dari Firebase!");
76: }
77: }
78: void setup() {
79: Serial.begin(9600);
80: pinMode(D4, OUTPUT); // D4 adalah LED dekat antenna pada NodeMCU
81: pinMode(DigitalLDRPin, INPUT); // Inisialisasi D1 sebagai input digital untuk menangkap output digital dari sensor LDR
82: pinMode(AnalogLDRPin, INPUT); // Inisialisasi A0 sebagai input analog untuk menangkap output analog dari sensor LDR
83: delay(20);
84: /* Tampilkan kegunaan dari program ini */
85: Serial.println("BOARD-2: Untuk mengecek itensitas cahaya dan otomatis menyalakan dan mematikan lampu");
86: Serial.println("Data itensitas cahaya diunggah ke database Firebase");
87: Serial.println("(C)2019, @nWaREZ"); Serial.println();
88: // Menghubungkan ke WiFi
89: Serial.print("Menghubungkan ke jaringan "); Serial.print(WIFI_SSID);
90: WiFi.begin(WIFI_SSID, WIFI_PASS);
91: // Syarat kondisi pengkoneksian
92: while (WiFi.status() != WL_CONNECTED) {
93: delay(300);
94: Serial.print(".");
95: }
96: Serial.println(" Terhubung!");
97: // Menghubungkan ke Firebase
98: Serial.print("Menghubungkan ke Firebase "); Serial.print(FIREBASE_HOST); Serial.print("... ");
99: Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
100: // Cek, apakah sambungan ke Firebase berhasil
101: if (!Firebase.failed())
102: { Serial.println("Terhubung!"); }
103: else
104: { Serial.println("Gagal!"); }
105: // Server Web dinyalakan
106: server.begin(); Serial.println("Server Web Itensitas Cahaya siap digunakan!");
107: Serial.println("Alamat IP untuk melihat itensitas cahaya: ");
108: // Penulisan alamat IP
109: Serial.print("http://");
110: // Alamat IP server NodeMCU
111: Serial.print(WiFi.localIP()); Serial.println("/");
112: }
113: void loop() {
114: // LED dinyalakan berkedip-kedip biar terlihat ada tanda-tanda kehidupan di NodeMCU
115: digitalWrite(D4, LOW); // LED menyala bila LOW
116: delay(LEDTImeOut);
117: digitalWrite(D4, HIGH);
118: delay(LEDTImeOut);
119: // Panggil fungsi baca_cahaya_teras_depan() untuk membaca suhu ruang tamu dari Firebase
120: baca_cahaya_teras_depan();
121: // Pembacaan itensitas cahaya dari sensor LDR dan simpan ke variabel sensor_cahaya_teras_depan_cahaya
122: //sensor_cahaya_teras_depan_cahaya = digitalRead(DigitalLDRPin); // Untuk Digital
123: sensor_cahaya_teras_depan_cahaya = analogRead(AnalogLDRPin); // Untuk Analog
124: // Tampilkan hasilnya sebagai pesan ke Serial Monitor (Buat DEBUG)
125: Serial.print("Itensitas cahaya: "); Serial.println(sensor_cahaya_teras_depan_cahaya);
126: // Simpan data suhu celcius kedalam /sensor_suhu/ruang_tamu/suhu untuk menyimpan suhu aktual sekarang
127: Firebase.setInt("/sensor_cahaya/teras_depan/cahaya",sensor_cahaya_teras_depan_cahaya);
128: // Cek apakah status_lampu diset otomatis?
129: if (sensor_cahaya_teras_depan_status_lampu.equals("OTO"))
130: {
131: // Cek apakah itensitas cahaya sensor saat ini melewati cahaya_max //(berarti menyalakan AC otomatis)
132: if (sensor_cahaya_teras_depan_cahaya >= sensor_cahaya_teras_depan_max)
133: {
134: // LAKUKAN PENYALAAN LAMPU DISINI
135: Serial.println("Menyalakan lampu...");
136: }
137: // Cek apakah itensitas cahaya sensor saat ini sama atau dibawah cahaya_max // (berarti mematikan AC otomatis)
138: if (sensor_cahaya_teras_depan_cahaya <= sensor_cahaya_teras_depan_min)
139: {
140: // LAKUKAN PEMADAMAN LAMPU DISINI
141: Serial.println("Mematikan lampu...");
142: }
143: }
144: // Cek apakah status_lampu diset ON (menyala terus)?
145: if (sensor_cahaya_teras_depan_status_lampu.equals("ON"))
146: {
147: // LAKUKAN PENYALAAN LAMPU DISINI
148: Serial.println("Menyalakan lampu...");
149: }
150: // Cek apakah status_lampu diset OFF (mati terus)?
151: if (sensor_cahaya_teras_depan_status_lampu.equals("OFF"))
152: {
153: // LAKUKAN PEMADAMAN LAMPU DISINI
154: Serial.println("Mematikan lampu...");
155: }
156: // Mengecek jika ada client web browser mengunjungi halaman web ini
157: WiFiClient client = server.available();
158: // Menuliskan dalam format HTML
159: client.println("HTTP/1.1 200 OK");client.println("Content-Type: text/html");
160: client.println("Connection: close");client.println();
161: // Halaman web untuk menampilkan itensitas cahaya dan direfresh sesuai /sensor_cahaya/teras_depan/recheck
162: // Suhu dan kelembaban akan dicek jika halaman web direfresh
163: client.println("<!DOCTYPE HTML>");
164: client.println("<html>");
165: client.print("<meta http-equiv=\"refresh\" content=\""); client.print(sensor_cahaya_teras_depan_recheck*60); client.println("\"/>"); // Lakukan refresh laman web sesuai isi dari /sensor_cahaya/teras_depan/recheck
166: client.println("<head></head><body>");
167: /* AWAL dari timer JavaScript */
168: client.println("<script>");
169: client.println("function startTimer(duration, display) {");
170: client.println(" var timer = duration, minutes, seconds;");
171: client.println(" setInterval(function () {");
172: client.println(" minutes = parseInt(timer / 60, 10);");
173: client.println(" seconds = parseInt(timer % 60, 10);");
174: client.println(" minutes = minutes < 10 ? \"0\" + minutes : minutes;");
175: client.println(" seconds = seconds < 10 ? \"0\" + seconds : seconds;");
176: client.println(" display.textContent = minutes + \" menit \" + seconds + \" detik\";");
177: client.println(" if (--timer < 0) {");
178: client.println(" timer = duration;");
179: client.println(" }");
180: client.println(" }, 1000);");
181: client.println("}");
182: client.println(" ");
183: client.println("window.onload = function () {");
184: client.print(" var Menit = 60 * "); client.print(sensor_cahaya_teras_depan_recheck); client.println(", display = document.querySelector('#time');");
185: client.println(" startTimer(Menit, display);");
186: client.println("};");
187: client.println("</script>");
188: /* AWAL dari timer JavaScript */
189: client.println("<h1>Web Server NodeMCU ESP8266 - Itensitas Cahaya Sensor LDR</h1><h3>Nilai itensitas cahaya: ");
190: client.println(sensor_cahaya_teras_depan_cahaya); // Tampilkan nilai Itensitas Cahaya
191: client.println("</h3><h3>");
192: // Tampilkan timernya
193: //client.print("<div>Halaman ini akan diperbarui dalam waktu <span id=\"time\">00:00</span> menit!</div>");
194: client.print("Halaman ini akan diperbarui dalam waktu <span id=\"time\">00 menit 00 detik</span>!");
195: client.println("<br><br>(C)2019, @nWaREZ.<br>http://anwarez96.blogspot.com");
196: client.println("</body></html>");
197: // Set delay untuk pengecekan ulang sebanyak sensor_cahaya_teras_depan_cahaya_recheck * 1 menit dalam ms dikurangi delay lampu LED
198: delay((sensor_cahaya_teras_depan_cahaya_recheck*60000)-(2*LEDTImeOut));
199: }
Seluruh berkas dan program yang dibutuhkan untuk pembuatan program ini dapat diunduh disini.
Selamat mencoba dan berkreasi...