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 DHT11 dan hasilnya (suhu dan kelembaban) dapat ditampilkan di Web Server maupun diunggah ke pangkalan data Firebase milik Google Inc.
Sensor DHT11 |
DHT-11 merupakan sebuah sensor untuk mengukur suhu dan kelembaban 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 DHT11 dengan NodeMCU ESP8266.
Menghubungkan sensor DHT-11 ke NodeMCU ESP8266 |
Sebelum menggunakan sensor DHT11 ini, pastikan anda mengunduh library agar dapat memprogram sensor ini didalam Arduino IDE. Suhu dapat ditampilkan dalam satuan Celcius maupun Fahrenheit, kalau kelembaban dalam bentuk persentase.
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, suhu minimal untuk mematikan AC, suhu maksimal untuk menyalakan AC serta frekuensi pengecekan suhu dilakukan tiap berapa menit dikendalikan dari aplikasi Android.
2. NodeMCU ESP8266 membaca info dari database agar tahu kapan mematikan dan menyalakan AC serta frekuensi melakukan pengecekan suhu 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 AC serta frekuensi melakukan pengecekan suhu 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 "DHT.h" // Memasukan library sensor DHT11
3: #include <FirebaseArduino.h> // Memasukkan library Firebase
4: #define DHTTYPE DHT11 // Tipe sensor yang dipakai DHT 11
5: #define WIFI_SSID "ANWAREZ96" // Sesuaikan dengan Nama WiFi AP anda
6: #define WIFI_PASS "anwarez96" // Password WiFi AP anda
7: #define FIREBASE_HOST "smarthome-8eb1f.firebaseio.com" // Sesuaikan dengan host database Firebase anda
8: #define FIREBASE_AUTH "lmE1mv5usDmPBFYD5Nl1u6GwT8bQsUeB42iYKrXX" // Sesuaikan dengan Authentic Key database Firebase anda
9: #define LEDTImeOut 1000 // Set nyala mati lampu LED 1000ms
10: /* Definisikan semua variabel di tabel sensor_suhu/ruang_tamu yang ada didatabase Firebase (Sesuaikan dengan isi dari database anda) */
11: int sensor_suhu_ruang_tamu_min=0;
12: int sensor_suhu_ruang_tamu_max=0;
13: int sensor_suhu_ruang_tamu_suhu=0;
14: int sensor_suhu_ruang_tamu_kelembaban=0;
15: int sensor_suhu_ruang_tamu_recheck=0;
16: String sensor_suhu_ruang_tamu_status_ac="OTO";
17: // Jalankan server pada port 80
18: WiFiServer server(80);
19: // DHT Sensor pada pin 5 di NodeMCU (lihat NodeMCU pin mapping)
20: const int DHTPin = 5; // Diboard tertulis D1
21: // Inisialisasi library DHTpin
22: DHT dht(DHTPin, DHTTYPE);
23: void baca_suhu_ruang_tamu() {
24: /* Baca isi database sensor_suhu/ruang_tamu untuk mendapatkan data ruang_tamu (Sesuaikan dengan database anda) */
25: FirebaseObject sensor_suhu = Firebase.get("/sensor_suhu/ruang_tamu");
26: // Cek, apakah pengambilan database ruang_tamu dari Firebase sukses
27: if (Firebase.success())
28: {
29: /* Jika SUKSES, kerjakan proses dibawah ini */
30: // Rubah object Firebase menjadi Object JSON
31: JsonObject& sensor_suhu_ruang_tamu = sensor_suhu.getJsonVariant();
32: // Lakukan iterasi untuk memparsing nama key serta isinya dari tabel ruang_tamu
33: for (JsonObject::iterator it=sensor_suhu_ruang_tamu.begin(); it!=sensor_suhu_ruang_tamu.end(); ++it)
34: {
35: String keys = it->key; // Simpan nama key dari table ruang_tamu
36: // Ambil nama key "recheck" yang digunakan untuk memperbarui tiap berapa menit suhu dicek dan diunggah ke database
37: if (keys.equals("recheck")) {
38: // Simpan nilai dari nama key "recheck"
39: keys = it->value.as<char*>();
40: // Simpan ke variabel sensor_suhu_ruang_tamu_recheck dan rubah ke Integer
41: sensor_suhu_ruang_tamu_recheck = keys.toInt();
42: // Tampilkan pesan ke Serial Monitor (Buat DEBUG)
43: Serial.print("Recheck suhu setiap: ");
44: Serial.print(sensor_suhu_ruang_tamu_recheck);
45: Serial.println(" menit.");
46: }
47: // Ambil nama key "suhu_min" yang digunakan untuk mematikan AC bila suhu mencapai suhu minimum
48: if (keys.equals("suhu_min")) {
49: // Simpan nilai dari nama key "suhu_min"
50: keys = it->value.as<char*>();
51: // Simpan ke variabel sensor_suhu_ruang_tamu_min dan rubah ke Integer
52: sensor_suhu_ruang_tamu_min = keys.toInt();
53: // Tampilkan pesan ke Serial Monitor (Buat DEBUG)
54: Serial.print("Suhu minimum matikan AC: ");
55: Serial.print(sensor_suhu_ruang_tamu_min);
56: Serial.println("* Celcius.");
57: }
58: // Ambil nama key "suhu_max" yang digunakan untuk menyalakan AC bila suhu mencapai suhu maksimum
59: if (keys.equals("suhu_max")) {
60: // Simpan nilai dari nama key "suhu_max"
61: keys = it->value.as<char*>();
62: // Simpan ke variabel sensor_suhu_ruang_tamu_max dan rubah ke Integer
63: sensor_suhu_ruang_tamu_max = keys.toInt();
64: // Tampilkan pesan ke Serial Monitor (Buat DEBUG)
65: Serial.print("Suhu maksimum menyalakan AC: ");
66: Serial.print(sensor_suhu_ruang_tamu_max);
67: Serial.println("* Celcius.");
68: }
69: // Ambil nama key "status_ac" yang digunakan untuk setelan AC, apakah otomatis, selalu on atau selalu off
70: if (keys.equals("status_ac")) {
71: // Simpan nilai dari nama key "status_ac"
72: keys = it->value.as<char*>();
73: // Simpan ke variabel sensor_suhu_ruang_tamu_status_ac
74: sensor_suhu_ruang_tamu_status_ac = keys;
75: // Tampilkan pesan ke Serial Monitor (Buat DEBUG)
76: Serial.print("Status pengaktifan AC: ");
77: Serial.println(sensor_suhu_ruang_tamu_status_ac);
78: }
79: }
80: }
81: else
82: {
83: Serial.println("Gagal mengambil data ruang_tamu dari Firebase!");
84: }
85: }
86: void setup() {
87: Serial.begin(9600);
88: pinMode(D4, OUTPUT); // D4 adalah LED dekat antenna pada NodeMCU
89: delay(20);
90: dht.begin();
91: /* Tampilkan kegunaan dari program ini */
92: Serial.println("BOARD-1: Untuk mengecek suhu dan otomatis menyalakan dan mematikan AC");
93: Serial.println("Data suhu diunggah ke database Firebase");
94: Serial.println("(C)2019, @nWaREZ"); Serial.println();
95: // Menghubungkan ke WiFi
96: Serial.print("Menghubungkan ke jaringan "); Serial.print(WIFI_SSID);
97: WiFi.begin(WIFI_SSID, WIFI_PASS);
98: // Syarat kondisi pengkoneksian
99: while (WiFi.status() != WL_CONNECTED) {
100: delay(300);
101: Serial.print(".");
102: }
103: Serial.println(" Terhubung!");
104: // Menghubungkan ke Firebase
105: Serial.print("Menghubungkan ke Firebase "); Serial.print(FIREBASE_HOST); Serial.print("... ");
106: Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
107: // Cek, apakah sambungan ke Firebase berhasil
108: if (!Firebase.failed())
109: { Serial.println("Terhubung!"); }
110: else
111: { Serial.println("Gagal!"); }
112: // Server Web dinyalakan
113: server.begin();
114: Serial.println("Server Web Suhu dan Kelembaban siap digunakan!");
115: Serial.println("Alamat IP untuk melihat suhu dan kelembaban: ");
116: // Penulisan alamat IP
117: Serial.print("http://");
118: // Alamat IP server NodeMCU
119: Serial.print(WiFi.localIP()); Serial.println("/");
120: }
121: void loop() {
122: // LED dinyalakan berkedip-kedip biar terlihat ada tanda-tanda kehidupan di NodeMCU
123: digitalWrite(D4, LOW); // LED menyala bila LOW
124: delay(LEDTImeOut);
125: digitalWrite(D4, HIGH);
126: delay(LEDTImeOut);
127: // Panggil fungsi baca_suhu_ruang_tamu() untuk membaca suhu ruang tamu dari Firebase
128: baca_suhu_ruang_tamu();
129: // Pembacaan sensor juga bisa sampai 2 detik 'lama' (sensornya sangat lambat)
130: float h = dht.readHumidity();
131: // Baca suhu sebagai Celsius (default)
132: float t = dht.readTemperature();
133: // Baca suhu sebagai Fahrenheit (apakah Fahrenheit = benar)
134: float f = dht.readTemperature(true);
135: // Periksa apakah ada yang membaca gagal dan keluar lebih awal (coba lagi)
136: if (isnan(h) || isnan(t) || isnan(f))
137: {
138: Serial.print("Gagal membaca dari sensor "); Serial.print(DHTTYPE); Serial.println("!");
139: }
140: // Jika sukses
141: else
142: {
143: // Tampilkan pesan ke Serial Monitor (Buat DEBUG)
144: Serial.print("Kelembaban : ");
145: Serial.print(h);
146: Serial.println("%");
147: // Simpan data kelembaban kedalam /sensor_suhu/ruang_tamu/kelembaban untuk menyimpan suhu aktual sekarang
148: Firebase.setInt("/sensor_suhu/ruang_tamu/kelembaban",h);
149: // Tampilkan pesan ke Serial Monitor (Buat DEBUG)
150: Serial.print("Suhu : ");
151: Serial.print(t);
152: Serial.print(" *C; ");
153: // Simpan data suhu celcius kedalam /sensor_suhu/ruang_tamu/suhu untuk menyimpan suhu aktual sekarang
154: Firebase.setInt("/sensor_suhu/ruang_tamu/suhu",t);
155: Serial.print(f);
156: Serial.println(" *F.");
157: }
158: // Cek apakah status_ac diset otomatis?
159: if (sensor_suhu_ruang_tamu_status_ac.equals("OTO"))
160: {
161: // Cek apakah suhu sensor saat ini melewati suhu_max (berarti menyalakan AC otomatis)
162: if (t >= sensor_suhu_ruang_tamu_max)
163: {
164: // LAKUKAN PENYALAAN AC DISINI
165: Serial.println("Menyalakan AC...");
166: }
167: // Cek apakah suhu sensor saat ini sama atau dibawah suhu_mix (berarti mematikan AC otomatis)
168: if (t <= sensor_suhu_ruang_tamu_min)
169: {
170: // LAKUKAN PEMADAMAN AC DISINI
171: Serial.println("Mematikan AC...");
172: }
173: }
174: // Cek apakah status_ac diset ON (menyala terus)?
175: if (sensor_cahaya_teras_depan_status_lampu.equals("ON"))
176: {
177: // LAKUKAN PENYALAAN AC DISINI
178: Serial.println("Menyalakan AC...");
179: }
180: // Cek apakah status_lampu diset OFF (mati terus)?
181: if (sensor_cahaya_teras_depan_status_lampu.equals("OFF"))
182: {
183: // LAKUKAN PEMADAMAN AC DISINI
184: Serial.println("Mematikan AC...");
185: }
186: // Mengecek jika ada client web browser mengunjungi halaman web ini
187: WiFiClient client = server.available();
188: // Menuliskan dalam format HTML
189: client.println("HTTP/1.1 200 OK");client.println("Content-Type: text/html");
190: client.println("Connection: close");client.println();
191: // Halaman web untuk menampilkan suhu dan kelembaban dan direfresh sesuai /sensor_suhu/ruang_tamu/recheck
192: // Suhu dan kelembaban akan dicek jika halaman web direfresh
193: client.println("<!DOCTYPE HTML>");
194: client.println("<html>");
195: client.print("<meta http-equiv=\"refresh\" content=\""); client.print(sensor_suhu_ruang_tamu_recheck*60); client.println("\"/>"); // Lakukan refresh laman web sesuai isi dari /sensor_suhu/ruang_tamu/recheck
196: client.println("<head></head><body>");
197: /* AWAL dari timer JavaScript */
198: client.println("<script>");
199: client.println("function startTimer(duration, display) {");
200: client.println(" var timer = duration, minutes, seconds;");
201: client.println(" setInterval(function () {");
202: client.println(" minutes = parseInt(timer / 60, 10);");
203: client.println(" seconds = parseInt(timer % 60, 10);");
204: client.println(" minutes = minutes < 10 ? \"0\" + minutes : minutes;");
205: client.println(" seconds = seconds < 10 ? \"0\" + seconds : seconds;");
206: client.println(" display.textContent = minutes + \" menit \" + seconds + \" detik\";");
207: client.println(" if (--timer < 0) {");
208: client.println(" timer = duration;");
209: client.println(" }");
210: client.println(" }, 1000);");
211: client.println("}");
212: client.println(" ");
213: client.println("window.onload = function () {");
214: client.print(" var Menit = 60 * "); client.print(sensor_suhu_ruang_tamu_recheck); client.println(", display = document.querySelector('#time');");
215: client.println(" startTimer(Menit, display);");
216: client.println("};");
217: client.println("</script>");
218: /* AWAL dari timer JavaScript */
219: client.println("<h1>Web Server NodeMCU ESP8266 - Suhu dan Kelembaban Sensor DHT11</h1><h3>Suhu dalam Celcius: ");
220: client.println(t); // Temperatur Celsius
221: client.println("*C</h3><h3>Suhu dalam Fahrenheit: ");
222: client.println(f); // Temperatur Fahrenheit
223: client.println("*F</h3><h3>Kelembaban: ");
224: client.println(h); // Prosentase kelembaban
225: client.println("%</h3><h3>");
226: // Tampilkan timernya
227: //client.print("<div>Halaman ini akan diperbarui dalam waktu <span id=\"time\">00:00</span> menit!</div>");
228: client.print("Halaman ini akan diperbarui dalam waktu <span id=\"time\">00 menit 00 detik</span>!");
229: client.println("<br><br>(C)2019, @nWaREZ.<br>http://anwarez96.blogspot.com");
230: client.println("</body></html>");
231: // Set delay untuk pengecekan ulang sebanyak sensor_suhu_ruang_tamu_recheck * 1 menit dalam ms dikurangi delay lampu LED
232: delay((sensor_suhu_ruang_tamu_recheck*60000)-(2*LEDTImeOut));
233: }
Seluruh berkas dan program yang dibutuhkan untuk pembuatan program ini dapat diunduh disini.
Selamat mencoba dan berkreasi...
Error compiling for board NodeMCU 1.0 (ESP-12E Module)
BalasHapusgimana mas ?
Pesan error compiling nya apa?
Hapuserornya compling for board NodeMCU.gimana mas?
BalasHapusCek di Arduino IDE nya, ganti board nya menjadi NodeMCU atau yang sejenisnya..
Hapus