Ada banyak cara untuk mengurangi beban biaya listrik, salah satunya adalah mematikan alat listrik yang tidak digunakan. Misalnya saja seperti dispenser yang dimatikan ketika malam hari. Lampu ketika ruangan hendak ditinggalkan dan lain sebagainya. Namun, terkadang kita lupa mematikan alat-alat itu sehingga biaya listrik kadang kecolongan hanya karena kekhilafan kita. Sehingga kita perlu mengatasi permasalahan human error tersebut dengan menggunakan komputasi semacam Arduino ataupun NodeMCU.
Arduino merupakan microcontroller yang dapat kita program dengan berbagai alur logika, integrasi dengan sensor dan alat-alat kelistrikan lainnya. Sebagai contoh, Saya saat menulis ini telah berhasil menggunakan NodeMCU v3 untuk mengatur jadwal hidupnya dispenser dirumah Saya.
Saya hanya membuat alur logika sederhana sebagai berikut:
- Ketika awal alat Arduino / NodeMCU hidup, ambil informasi waktu menggunakan NTP Client.
- Kalibrasi waktu sampai waktunya benar-benar berhasil disinkronisasi dengan cara:
- Pengecekan jam, apakah jam berada >= jam 22 atau kurang <= 5, jika iya dispenser mati, jika tidak maka dispenser hidup.
Kemudian untuk susunan komponennya Saya buat seperti dibawah ini. Karena di software Fritzing tidak ada tampilan untuk AC Power, bagian battre 9V ini adalah ilustrasi dari listrik AC rumahan dengan LED adalah dispenser.
Perhitungan Biaya Listrik
Golongan tarif listrik | Batas daya | Biaya pemakaian |
---|---|---|
R-1/TR | 0 – 450 VA | Rp 169/kWh |
R-1/TR | 451 – 900 VA | Rp 274/kWh |
R-1M/TR | 451 – 900 VA | Rp 1.352/kWh |
R-1/TR | 901 – 1.300 VA | Rp 1.444,70/kWh |
R-1/TR | 1.301 – 2.200 VA | Rp 1.444,70/kWh |
R-2/TR | 2.201 VA – 5.500 VA | Rp 1.444,70/kWh |
R-3/TR | > 5.501 VA | Rp 1.444,70/kWh |
B-1/TR | 0 – 450 VA | Rp 254/kWh |
B-1/TR | 451 – 900 VA | Rp 420/kWh |
B-1/TR | 901 – 1.300 VA | Rp 966/kWh |
B-1/TR | 1.301 – 5.500 VA | Rp 1.100/kWh |
B-2/TR | 5.501 VA – 200 kVA | Rp 1.444,70/kWh |
B-3/TM | > 200 kVA | Rp 1.114,74/kWh |
I-1/TR | 0 – 450 VA | Rp 160/kWh |
I-1/TR | 450 – 900 VA | Rp 315/kWh |
I-1/TR | 900 – 1.300 VA | Rp 930/kWh |
I-1/TR | 1.301 – 2.200 VA | Rp 960/kWh |
I-1/TR | 3.500 – 14.000 VA | Rp 1.112/kWh |
I-2/TR | 14.001 – 200 kVA | Rp 972/kWh |
I-3P/TM | > 200 kVA | Rp 1.114,74/kWh |
I-3/TM | > 200 kVA | Rp 1.114,74/kWh |
I-4/TT | > 2.000 kVA | Rp 996,74/kWh |
P-1/TR | 0 – 450 VA | Rp 575/kWh |
P-1/TR | 451 – 900 VA | Rp 600/kWh |
P-1/TR | 1.300 VA | Rp 1.049/kWh |
P-1/TR | 2.200 – 5.500 VA | Rp 1.076/kWh |
P-1/TR | 5.501 – 200 kVA | Rp 1.444,70/kWh |
P-2/TR | > 200 kVA | Rp 1.035,78/kWh |
Jika dispenser memiliki daya 300 watt, misalnya hidup tiap 20 menit sekali tiap jam (memanaskan/mendinginkan) dan sisanya dalam keadaan idle. Maka setiap hari waktu operasional dispenser sebanyak 20 x 24 = 480 menit atau 8 jam
. Kalau semisal biaya per kWh untuk 1300 VA sesuai tabel diatas adalah Rp 1444,70 maka biaya yang dikeluarkan untuk 8 jam operasional dispenser adalah Rp 3.467,28 per hari atau setara Rp 104.018,4. Dihitung dengan cara:
Daya Harian :
Wh = 300W * 8 jam = 2400 Wh
kWh = 2400Wh / 1000 = 2.4 kWh
Daya Bulanan (30 hari):
kWh = 2.4 * 30 = 72 kWh
Biaya = 72*1444.7 = Rp 104.018,4
Kalau kita gunakan metode ini, maka kita kurangi waktu operasionalnya dari 24 jam (operasional + idle) menjadi 16 jam. Hitungannya pun jadi lain:
Diketahui:
Dispenser 300W
Operasional 20 menit / jam
Waktu total 16 jam
waktu operasional : 20 * 16 = 320 menit atau 4 jam
Daya Harian :
Wh = 300W * 4 jam = 1200 Wh
kWh = 1200Wh / 1000 = 1.2 kWh
Daya Bulanan (30 hari):
kWh = 1.2 * 30 = 36 kWh
Biaya = 36*1444.7 = Rp 52.009,2
Sesuai teoritis bisa menghemat 50% walaupun hanya mengurangi jam hidupnya dispenser dari 24 jam ke 16 jam saja.
Definisi Library dan beberapa Konstanta
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <math.h>
Beberapa library yang dibutuhkan diantaranya NTPClient
untuk sinkronisasi waktu, ESP8266WiFi
untuk konektivitas dengan WiFi, WiFiUdp
untuk koneksi protocol UDP, dan terakhir math
untuk keperluan hitungan matematis.
const char* ssid = "SSID WIFINYA";
const char* password = "PASSWORD WIFINYA";
Konstanta diatas untuk koneksi ke WiFi.
const long utcOffsetInSeconds = 3600*7; // UTC+7 alias Asia/Jakarta
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
Beberapa konstanta juga diperlukan untuk konfigurasi waktu/NTP. utcOffsetInSeconds
adalah offset waktu dari UTC, karena Waktu Indonesia Barat berjarak 7 jam lebih awal dibandingkan UTC, maka kita hitung dengan 3600 (1 jam dalam detik) x 7. Untuk variabel daysOfTheWeek
adalah array of string dari nama-nama hari dalam seminggu.
const int relay = 5; // NodeMCU v3 artinya di D1
Untuk konfigurasi Relay yang digunakan untuk saklar listriknya dapat diatur sesuai kebutuhan.
Bagian Setup
Serial.begin(115200);
WiFi.begin(ssid, password);
Konfigurasi supaya Serialnya sesuai Baudrate yang diinginkan. Atur wifi supaya bisa terkoneksi dengan jaringan yang sudah ditentukan.
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
timeClient.begin();
delay(1000);
Atur supaya arduino / nodemcu supaya menunggu sampai wifi terkoneksi. Jika sudah terkoneksi maka barulah timeClient.begin()
yang merupakan NTPClient yang sudah kita atur sebelumnya. Intinya, jangan sampai inisialisasi NTP dilakukan sebelum wifi terkoneksi karena NTP memerlukan internet untuk mengambilnya dari pool server. Kemudian delay 1 detik supaya data dari NTP selesai terkirim.
Serial.println ( "begin time verification" );
int verification = 0;
while(verification != timeClient.getHours()){
Serial.print("Verification value:");
Serial.println(verification);
Serial.print("Now:");
Serial.println(timeClient.getHours());
timeClient.update();
verification = round((verification + timeClient.getHours())/2.0);
}
Serial.print("OK!");
Bagian ini memang tambahan dari saya. Terkadang proses sinkronisasi dengan NTP Server perlu waktu yang tidak menentu sehingga saya membuat algoritma untuk memverifikasi bahwa waktu lokal sudah tersinkronkan dengan waktu NTP server. Caranya cukup mudah yaitu menggunakan rata-rata dan pembulatan dari jam NTP.
Lebih mudah jika kita misalkan waktu lokal / variabel verification = 0
sedangkan waktu NTP menunjukkan pukul 18.00 yang artinya jamnya bernilai 18. Nilai iterasinya jadi seperti ini:
Iterasi | Verification | NTP | round(rata-rata) |
---|---|---|---|
1 | 0 | 18 | 9 |
2 | 9 | 18 | 14 |
3 | 14 | 18 | 16 |
4 | 16 | 18 | 17 |
5 | 17 | 18 | 18 |
Bagian Loop
Interval Loop saya buat setiap 5 detik. Pada dasarnya, setiap kali loop hanya diperlukan 2 hal:
a. Update waktu NTP
Update waktu dapat dilakukan dengan memanggil method update
pada variabel NTPClient yang sudah kita definisikan. Misalnya timeClient.update();
b. Pengecekan sekarang waktunya pas jam berapa?
Ambil jam dengan method getHours()
. Jika sudah, cocokan dengan logika yang Anda inginkan. Saya membuat supaya dispenser mati ketika sudah jam 22.00 sampai pukul 05.59 dengan cara ini:
int jam =timeClient.getHours();
if(jam >= 22 || jam <= 5){
pinMode(relay, INPUT); // mati
}else{
pinMode(relay, OUTPUT); // hidup
}
Code diatas untuk NodeMCU sedangkan untuk Arduino gunakan pinMode(relay, OUTPUT)
di fungsi setup dan atur hidup-matinya dengan digitalWrite(relay, LOW)
untuk mati dan digitalWrite(relay, HIGH)
untuk hidup.
Kode lengkapnya:
NodeMCU
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <math.h>
const char* ssid = "SSID WIFINYA";
const char* password = "PASSWORD WIFINYA";
const long utcOffsetInSeconds = 3600*7; // UTC+7 alias Asia/Jakarta
const int relay = 5; // NodeMCU v3 artinya di D1
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
timeClient.begin();
delay(1000);
Serial.println ( "begin time verification" );
int verification = 0;
while(verification != timeClient.getHours()){
Serial.print("Verification value:");
Serial.println(verification);
Serial.print("Now:");
Serial.println(timeClient.getHours());
timeClient.update();
verification = round((verification + timeClient.getHours())/2.0);
}
Serial.print("OK!");
}
void loop() {
timeClient.update();
Serial.println();
Serial.print(daysOfTheWeek[timeClient.getDay()]);
Serial.print(", ");
Serial.print(timeClient.getHours());
Serial.print(":");
Serial.print(timeClient.getMinutes());
Serial.print(":");
Serial.println(timeClient.getSeconds());
int jam =timeClient.getHours();
if(jam >= 22 || jam <= 5){
pinMode(relay, INPUT);
}else{
pinMode(relay, OUTPUT);
}
delay(5000);
}
Arduino
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <math.h>
const char* ssid = "SSID WIFINYA";
const char* password = "PASSWORD WIFINYA";
const long utcOffsetInSeconds = 3600*7; // UTC+7 alias Asia/Jakarta
const int relay = 5; // NodeMCU v3 artinya di D1
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
timeClient.begin();
delay(1000);
Serial.println ( "begin time verification" );
int verification = 0;
while(verification != timeClient.getHours()){
Serial.print("Verification value:");
Serial.println(verification);
Serial.print("Now:");
Serial.println(timeClient.getHours());
timeClient.update();
verification = round((verification + timeClient.getHours())/2.0);
}
Serial.print("OK!");
pinMode(relay, OUTPUT);
}
void loop() {
timeClient.update();
Serial.println();
Serial.print(daysOfTheWeek[timeClient.getDay()]);
Serial.print(", ");
Serial.print(timeClient.getHours());
Serial.print(":");
Serial.print(timeClient.getMinutes());
Serial.print(":");
Serial.println(timeClient.getSeconds());
int jam =timeClient.getHours();
if(jam >= 22 || jam <= 5){
digitalWrite(relay, LOW);
}else{
digitalWrite(relay, HIGH)
}
delay(5000);
}
Semoga Bermanfaat