Kamis, 18 April 2019

Cara Membaca Sensor Cahaya Photosensitive LDR dan Menampilkan Hasilnya via Web Server Pada ESP8266

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:

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...

Tidak ada komentar:

Posting Komentar