Minggu, 14 Juli 2019

Memodifikasi Cartridge Canon 745 Agar Mudah Diisi Ulang

Kali ini saya membahas cara mengganti isi cartridge printer Canon MG2570 milik istri saya yang habis tinta hitamnya. Sempat beli refill cartridge (isi ulang) untuk cartridge 745 (Hitam) dan 746 (Warna) di shopee tapi masih belum sempat memasang karena tinta belum ada yang habis. Naah, kebetulan tadi pagi dipakai nge-print tugas Psikologi istri, habis tinta hitamnya. Kesempatan untuk mengganti isi tinta nih...

Awalnya kebingungan untuk membuka tutup cartridge ini, karena tutorial yang ada tidak memberikan dengan rinci cara membuka tutup cartridge ini. Awalnya saya berpikir menggunakan gerinda kecil untuk membuka tutup cartridge, tetapi begitu melihat fisik cartridge ini takutnya terkena gerinda plastik akan panas dan meleleh. Akhirnya, saya menemukan celah di atas sensor cartridge dan berpikir mungkin bisa dicongkel dari celah ini.

Gunakan cutter dicelah ini untuk membuka
Cutter diiriskan berulang kali sambil mencongkel untuk membuka
Saya menggunakan cutter yang tajam, kemudian saya iriskan berulang kali sambil dimiringkan untuk mencongkel tutup cartridge ini. Akhirnya tutup cartridge mau lepas dari cartridge case-nya.

Tutup cartridge akhirnya terbuka, terlihat spon yang habis tintanya
Selanjutnya tinggal memindahkan isi ulang ke cartridge 745 yang sudah terbuka tutupnya.

Isi ulang untuk cartridge 745
Pindahkan isi ulang ke cartridge 745
Langkah selanjutnya adalah melepas spon tinta hitam kemudian memindahkan isi ulang kedalam cartridge 745.

Spon cartridge sudah dilepas
Isi ulang sudah terpasang di cartridge
 Sebelum digunakan, lepaskan stiker bertuliskan "pull before installation" dan akan kelihatan lubang untuk pengisian ulang tinta. Bisa juga lubang pengisian tinta ditutup dengan isolasi untuk mencegah tinta kering.

Lepaskan stiker bertuliskan "pull before installation" sebelum dipakai

Pasang tinta ke dalam printer, sebelum melakukan pencetakan, terlebih dahulu lakukan deep cleaning maupun head cleaning agar hasil pencetakan menjadi optimal.

Semoga tulisan ini bermanfaat bagi anda sekalian dalam mengisi ulang cartridge 745. Cara ini juga dapat digunakan untuk mengisi ulang cartridge 746. Selamat mencoba!

Senin, 08 Juli 2019

Pasang HDD Caddy di Laptop Lenovo G50-45

Kembali lagi saya mengulas laptop kelas ekonomi saya (prosesornya AMD E1), yaitu Lenovo G50-45. Kali ini DVD drive laptop ini sudah error dimana ketika diapakai merekam data ke CD/DVD, sudah dipastikan error ketika di verify. Hari Minggu kemarin pas ke Surabaya dalam rangka melayat ke teman main dan tetangga semasa kecil meninggal dunia, iseng nyari caddy ukuran 9mm (ketebalan drive) di jakartanotebook.com untuk mengganti DVD drive. Caddy 9mm ready dicabang offline jakartanotebook.com di Surabaya Timur, langsung saja ke sana untuk membelinya. Harga caddy tersebut sekitar 55rb-an dan langsung saya tes ditempat dan cocok dengan laptop Lenovo ini.

Berikut ini langkah-langkah memasang caddy dilaptop Lenovo ini. Pertama-tama adalah membuka 3 buah sekrup dibagian cover belakang laptop.

Buka 3 buah sekrup yang dlingkari
Untuk membuka, cover belakang tinggal ditekan terus digeser kearah bawah, kemudian baru diangkat. Barulah terlihat isi dari laptop tersebut. Untuk melepas DVD drive, buka sekrup didekat stiker Windows 8.

Tampilan isi laptop, buka sekrup yang ditandai untuk melepas DVD
Setelah sekrup dibuka, ungkit dan dorong besi pengaman DVD ke arah luar, sehingga DVD drive terdorong keluar dari rumahnya.

Dorong ke arah luar besi pengaman DVD drive untuk melepasnya
DVD drive berhasil dilepas
Setelah DVD terlepas, barulah memasang HDD atau SSD 2.5" ke caddy tersebut dan pindahkan besi pengaman dari DVD ke caddy untuk mengencangkan dan mengamankan caddy didalam rumahnya.

HDD 80GB terpasang pada caddy
Selanjutnya masukkan caddy tersebut ke rumah DVD dan pasang sekrup pada besi pengaman tersebut (lihat gambar kedua dari atas) dan tutup kembali cover belakang laptop, jangan lupa pasang 3 buah sekrupnya (lihat gambar pertama dari atas).

Nyalakan laptop, kemudian tekan tombol Fn + F2 untuk masuk ke dalam BIOS laptop. Pada gambar dibawah, HDD Fujitsu 80GB terdeteksi sebagai Hard Disk 2 di BIOS.

HDD Fujitsu 80G terdeteksi di BIOS

Kalau anda ingin memasang OS Windows di HDD didalam caddy, maka jangan lupa mengatur posisi HDD caddy tersebut sebagai 1st Boot (HDD yang di-booting pertama kali), bila anda tidak melakukannya, dijamin Windows installer akan menampilkan pesan kesalahan terus. Serta rubah Boot Mode menjadi Legacy Support agar mendukung OS non EFI.

Atur HDD yang baru sebagai 1st Boot bila akan dipasang OS Windows

Semoga tulisan ini bermanfaat bagi anda sekalian dalam mengganti DVD drive di laptop anda untuk menambah harddisk pada laptop anda.

Senin, 24 Juni 2019

Mengganti ZIF Harddisk Laptop HP Elitebook 2510p

Kembali saya mengulas lagi laptop lama saya, yaitu HP seri EliteBook 2510p yang teramat bandel. Tanggal 12 Juni 2019 yang lalu, pas lagi browsing di Shopee, akhirnya menemukan konverter mSATA to ZIF Drive seharga 34rb dan harga mSATA 128GB yang sudah turun harga jadi sekitar 280rb-an langsung saja saya pesan.

Isi pesanan, konverter mSATA ke ZIF dan mSATA 128GB
Akhirnya tanggal 22 Juni 2019 pesanan saya tiba dengan selamat ditangan. Baru ada waktu untuk uji coba keesokan harinya. Foto-foto serta penjelasan cara mengganti ZIF HDD ke ZIF mSATA bisa dilihat dibawah ini:

Unboxing konverter mSATA to ZIF dan mSATA 128GB
Sekarang waktunya memasang mSATA 128GB ke konverter, cara memasang mirip dengan memasang RAM pada laptop, yaitu dimasukkan dengan miring ke slot mSATA kemudian ditekan tidur ke bawah. Selanjutnya pasang kedua baut untuk menahan mSATA pada posisi tidur.

Masukkan mSATA dengan memiringkan ke slot mSATA di konverter
mSATA 128GB sudah terpasang di konverter
Langkah selanjutnya adalah melepas ZIF HDD dari laptop kemudian menggantinya dengan mSATA konverter yang sudah terpasang mSATA 128GB. Langkah pertama adalah membuka kompartemen harddisk dengan membuka dua buah baut pengunci kompartemen.

Buka kompartemen ZIF HDD dengan membuka dua buah baut penguncinya
Langkah kedua adalah membuka dua buah baut pengunci ribbon cable HDD ke mainboard laptop (pada PCB warna putih), kemudian ungkit PCB warna putih hingga terlepas konektor ribbon cable dari mainboard laptop. Jangan lupa, buka juga dua buah baut pengunci ZIF HDD yang berada disamping HDD dan angkat besi pengunci. Selanjutnya angkat ZIF HDD dengan cara mengungkit dari bawah pada gambar diatas.

ZIF HDD berhasil dilepas dari kompartemennya
Perbandingan ZIF HDD dengan konverter mSATA to ZIF
Langkah ketiga adalah memindahkan ribbon cable dari ZIF HDD ke konverter mSATA ke ZIF. Cara mencopot ribbon cable ada tinggal ditarik secara pelan-pelan, maka ribbon cable akan lepas dengan sendirinya. Selanjutnya cara memasang ribbon cable tersebut ke konverter mSATA ke ZIF dan jangan sampai terbalik dalam memasang ribbon cable yang mengakibatkan konverter dan mSATA tidak akan terdeteksi oleh BIOS. Pasang ribbon cable seperti gambar dibawah ini:

Ribbon cable dipindahkan ke konverter mSATA to ZIF
Langkah keempat adalah memasang konverter mSATA to ZIF  Selanjutnya memasang ribbon cable tersebut ke konverter mSATA ke ZIF yang sudah terpasang mSATA 128GB dan ribbon cable ke kompartemen harddisk. Setelah itu tutup kembali kompatermen harddisk. Cara memasangnya seperti gambar dibawah:

Konverter mSATA to ZIF terpasang dikompartemen harddisk
Langkah kelima adalah mengecek apakah mSATA 128GB terdeteksi oleh BIOS laptop. Komputer hampir mirip dengan manusia, kadang harus penyesuaian terlebih dahulu. Sama seperti kendala yang saya hadapi, awalnya laptop tidak mendeteksi mSATA 128GB, setelah beberapa kali mematikan dan menghidupkan laptop, barulah mSATA terdeteksi. Selanjutnya saya menghidupkan laptop dengan menggunakan CD recovery buatan saya sendiri untuk mengecek apakah mSATA terdeteksi dan siap dipakai. Saya menggunakan aplikasi Paragon Partition Manager 9.0 untuk mengecek kondisi mSATA.

mSATA 128GB terdeteksi, siap untuk digunakan dan dipartisi
Langkah keenam adalah mempartisi mSATA untuk memanajemen dalam menyimpan data serta memudahkan dalam memasang Sistem Operasi favorit anda.

Sebagai tambahan, konverter ini sebenarnya diperuntukkan untuk perangkat Apple iPod yang menggunakan harddisk ZIF 1.8", tetapi konverter ini juga bisa digunakan pada laptop yang menggunakan ZIF drive juga.

Semoga tulisan ini bermanfaat bagi anda sekalian dalam memperbarui harddisk pada komputer/laptop anda.

Kamis, 20 Juni 2019

Mendesain Mazda VanTrend Jadi Model Pickup

Browsing-browsing diinternet tentang Mazda VanTrend, eh dapet brosur tentang mobil ini, ternyata mobil ini ada yang modelnya seperti pickup UT Australia. Tetapi sampai saat ini belum pernah ketemu satupun sama Mazda VanTrend model UT ini, yang ada hanya model station wagon saja.

Iseng-iseng cari foto mobil Mazda VanTrend, dengan modal seadanya dikomputer coba-coba saja memodifikasi mobil ini, dan akhirnyaaaa.... Taraaaa... Jadi deh... Tapi sebelumnya minta maaf juga buat si pemilik mobil yang jadi percontohan ini karena saya dapet foto mobil ini dari mbah Google.

Modifan saya belum begitu sempurna lhooo, maklum masih newbie dibidang editing gambar di Adobe Photoshop dan baru tadi malam iseng ngedit-nya.. Berikut ini penampakannya..


Modif atas tetap mempertahankan ukuran asli bingkai dan kaca segitiga di pintu kedua samping kiri-kanan, sedangkan modif bawah ukuran bingkai dan kaca dipotong untuk mengurangi dimensi kabin.

Spesifikasi modifikasi:

1. Kaca segitiga dipintu kedua samping kiri-kanan dipotong dan dipindahkan ke jendela pintu kedua samping kiri-kanan.

2. Pintu bagasi dipotong menjadi dua bagian, atas dan bawah:
- Bagian bawah digunakan untuk penutup bak belakang.
- Bagian atas digunakan sebagai penutup belakang jok pengemudi. Rencana penutup belakang jok pengemudi tetap mempertahankan engsel, sehingga penutup bisa dibuka tetapi hanya bisa dibuka dari dalam kabin saja.

3. Kaca segitiga bisa dibuat tetap (fixed) atau bisa dibuka menggunakan mekanisme engsel dan pengunci seperti kaca belakang Suzuki Jimny atau Honda Civic Wonder SB3.

Semoga gambaran modifikasi ini bermaanfaat, jika ada ide yang lebih kreatif dan membangun dapat komentar di postingan ini..

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

Senin, 15 April 2019

Cara Membaca Sensor Suhu DHT11 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 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:

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