Menghemat Listrik dengan Arduino / NodeMCU

9 minutes read (About 1289 words)

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.

img

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:

  1. Ketika awal alat Arduino / NodeMCU hidup, ambil informasi waktu menggunakan NTP Client.
  2. Kalibrasi waktu sampai waktunya benar-benar berhasil disinkronisasi dengan cara:
  3. 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.
img

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

Script untuk Mengambil Lokasi User di Browser