#include <WiFi.h>
//#include <NTPClient.h>
#include <WiFiUdp.h>
#include <LiquidCrystal_I2C.h>
//Setting Port Sensor
LiquidCrystal_I2C lcd(0x27, 20, 4); // I2C address 0x27, 20 column and 4 rows
//WiFiUDP ntpUDP;
//NTPClient timeClient(ntpUDP, "1.ntp.maxindo.net.id");
// Variabel Untuk Koneksi Wifi
//char auth[] = "9q5M6iu9W_o1EixQB-037irYDrtoq5aX";
const char *ssid = "Kantor PCNU"; //Nama Wifi
const char *password = "satuabadnu"; // pass wifi
// Variabel untuk menyimpan status tombol
#define RXD2 16
#define TXD2 17
#define BTN1 5
#define BTN2 12
#define BTN3 4
#define BTN4 15
#define RCh1 25
#define RCh2 26
#define RCh3 32
#define RCh4 33
#define LEDMERAH 18
#define LEDBIRU 19
#define buzzer 27
// Variabel untuk mengontrol menu
byte arrow[] = {0x08,0x0C,0x0E,0x1F,0x1F,0x0E,0x0C,0x08};
String elemen1[2]={"Auto","Off "};
char logic[2]={0,1};
char buff[50];
int a=1;
int aidx=1,bidx=1,cidx=1,didx=1;
int set_mode,sampling_data=0,Tegangan=0;
int set_biaya=10;
int set_logic1,set_logic2,set_logic3,set_logic4;
float input_1 =1352.0,total,biayaSET;
unsigned long int timesampling,timerRTC,previous=0,bfr=0;
int interval_1=500,val =1000;
bool condition = LOW;
float tegangan;
float arus;
float frekuensi;
float power_faktor;
float energi;
float daya;
bool lcdbersih =false;
bool bounce = false;
//Fungsi Millis Untuk Tombol
unsigned long TimeTambah = 0;
unsigned long TimeKurang = 0;
const unsigned long debounceDelay = 50;
enum MenuUtama{Mode,Monitoring,RelayStatus,Tambah}; //Daftar menu
int buttonUpState = 0;
int buttonDownState = 0;
int buttonSelectState = 0;
int buttonBackState = 0;
void setup()
{
//koneksi ke internet
Serial.begin(9600);
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED)
{
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
// Mulai koneksi NTP
//timeClient.begin();
//Menghidupkan LCD
lcd.init();
lcd.backlight();
// Mengatur Input
pinMode(15,INPUT_PULLUP);
pinMode(12,INPUT_PULLUP);
pinMode(4,INPUT_PULLUP);
pinMode(5,INPUT_PULLUP);
// Mengatur Output
pinMode(25,OUTPUT);
pinMode(26,OUTPUT);
pinMode(32,OUTPUT);
pinMode(33,OUTPUT);
pinMode(18,OUTPUT);
pinMode(19,OUTPUT);
pinMode(27,OUTPUT);
tarif_listrik();
}
void loop()
{
//baca_input();
menu();
//waktu_internet();
}
void baca_input()
{
int buttonUpState= digitalRead(BTN4);
int buttonDownState=digitalRead(BTN2);
int buttonSelectState=digitalRead(BTN1);
int buttonBackState = digitalRead(BTN3);
}
void tarif_listrik()
{
while(1)
{
if(!digitalRead(BTN4) && (millis() - TimeTambah) > debounceDelay){lcd.clear();TimeTambah = millis();break;}
if(!digitalRead(BTN2) && (millis() - TimeTambah) > debounceDelay){set_biaya+=10;lcdbersih = false;TimeTambah = millis();}
if(!digitalRead(BTN3) && (millis() - TimeTambah) > debounceDelay){set_biaya-=10;lcdbersih = false;TimeTambah = millis();}
if(set_biaya>10000){lcd.clear();set_biaya=10;}
if(set_biaya<10){lcd.clear();set_biaya=10000;}
if (set_biaya == 90 || set_biaya == 990 || set_biaya == 9990) {if (!lcdbersih) {lcd.clear();lcdbersih = true;}} // Mengatur penanda menjadi true setelah membersihkan
String biayaString = formatRibuan(set_biaya);
lcd.setCursor(2,0);
lcd.print("Masukan Biaya :");
lcd.setCursor(4,1);
lcd.print("Rp.");
lcd.setCursor(7,1);
lcd.print(biayaString);
}
}
void menu ()
{
tampilan_sensor();
if(!digitalRead(BTN4)){
lcd.clear();
while(1){
if(!digitalRead(BTN3)){ a++; delay(170);}
if(!digitalRead(BTN2)){ a--; delay(170);}
if(!digitalRead(BTN1)){a=1;lcd.clear();delay(75);break;}
if(a>7) {a=1;}
if(a<1) {a=7;}
Serial.println(a);
switch(a){
case 1 :
lcd.setCursor(1,0);
lcd.print("1.Kalibrasi ");
lcd.createChar(0,arrow);
lcd.setCursor(0,0);
lcd.write(0);
lcd.setCursor(0,1);
lcd.print(" 2.Safe Mode");
lcd.setCursor(0,2);
lcd.print(" 3.Rumus KWh");
lcd.setCursor(0,3);
lcd.print(" 4.Biaya");
if(!digitalRead(BTN4)){
lcd.clear();
delay(50);
while(1){
if(!digitalRead(BTN4)){aidx=1;lcd.clear();delay(75);break;}
if(!digitalRead(BTN2)){aidx++;delay(175);}
if(aidx>3){aidx=1;}
switch(aidx){
case 1 :
lcd.createChar(0,arrow);
lcd.setCursor(0,0);
lcd.write(0);
lcd.setCursor(1,0);
lcd.print("1.Tegangan");
lcd.setCursor(0,1);
lcd.print(" 2.Arus");
lcd.setCursor(0,2);
lcd.print(" 3.Reset");
if(!digitalRead(BTN1)){
lcd.clear();
delay(50);
while(1){
if(!digitalRead(BTN4)){lcd.clear();delay(50);break;}
if(!digitalRead(BTN2)){Tegangan++;delay(100);}
if(Tegangan>50){Tegangan=0;}
if(!digitalRead(BTN3)){Tegangan--;delay(100);}
if(Tegangan<0){Tegangan=50;}
lcd.setCursor(2,0);
lcd.print("Masukan Nilai:");
lcd.setCursor(6,1);
sprintf(buff,"%3d V",Tegangan);
lcd.print(buff);
}
}
break;
case 2 :
lcd.createChar(0,arrow);
lcd.setCursor(0,1);
lcd.write(0);
lcd.setCursor(0,0);
lcd.print(" 1.Tegangan");
lcd.setCursor(1,1);
lcd.print("2.Arus");
lcd.setCursor(0,2);
lcd.print(" 3.Reset");
break;
case 3 :
lcd.createChar(0,arrow);
lcd.setCursor(0,2);
lcd.write(0);
lcd.setCursor(0,0);
lcd.print(" 1.Tegangan");
lcd.setCursor(0,1);
lcd.print(" 2.Arus");
lcd.setCursor(1,2);
lcd.print("3.Reset");
if(!digitalRead(BTN1)){
lcd.clear();
delay(50);
while(1){
if(!digitalRead(BTN4)){lcd.clear();delay(500);lcd.setCursor(1,0);lcd.print("Reset Succesfully");delay(1000);lcd.clear();break;}
lcd.setCursor(4,1);
lcd.print("Reset Energi");
energi = energi - energi;
}
}
break;
}
}
}
break;
case 2 :
lcd.setCursor(0,0);
lcd.print(" 1.Kalibrasi");
lcd.createChar(0,arrow);
lcd.setCursor(0,1);
lcd.write(0);
lcd.setCursor(1,1);
lcd.print("2.Safe Mode");
lcd.setCursor(0,2);
lcd.print(" 3.Rumus KWh");
lcd.setCursor(0,3);
lcd.print(" 4.Biaya");
if(!digitalRead(BTN1)){
lcd.clear();
delay(50);
while(1){
if(!digitalRead(BTN4)){bidx=1;lcd.clear();delay(175);digitalWrite(buzzer,LOW);digitalWrite(LEDMERAH,LOW);break;}
if(!digitalRead(BTN2)){bidx++;delay(170);}
if(bidx>2){bidx=1;}
switch(bidx){
case 1 :
if(!digitalRead(BTN1)){set_biaya+=0.1;delay(100);}
if(!digitalRead(BTN3)){set_biaya-=0.1;delay(100);}
if(set_biaya>10.0){set_biaya=1.0;}
if(set_biaya<1.0){set_biaya=10.0;}
lcd.createChar(0,arrow);
lcd.setCursor(0,0);
lcd.write(0);
lcd.setCursor(1,0);
lcd.print("Set Biaya :");
lcd.setCursor(12,0);
lcd.print(set_biaya,2);
lcd.setCursor(0,1);
lcd.print(" Mode:");
lcd.setCursor(6,1);
lcd.print(elemen1[set_mode]);
break;
case 2 :
if(!digitalRead(BTN1)){set_mode++;delay(100);}
if(set_mode>1){set_mode=0;}
lcd.createChar(0,arrow);
lcd.setCursor(0,1);
lcd.write(0);
lcd.setCursor(0,0);
lcd.print(" Set Biaya :");
lcd.setCursor(12,0);
lcd.print(set_biaya,2);
lcd.setCursor(1,1);
lcd.print("Mode:");
lcd.setCursor(6,1);
lcd.print(elemen1[set_mode]);
if(!digitalRead(BTN3)){
lcd.clear();
delay(50);
while(1){
if(!digitalRead(BTN4)){lcd.clear();delay(175);break;}
if(!digitalRead(BTN2)){didx++;delay(170);}
if(didx>4){didx=1;}
switch(didx){
case 1:
if(!digitalRead(BTN1)){set_logic1++;delay(170);}
if(set_logic1>1){set_logic1=0;}
lcd.createChar(0,arrow);
lcd.setCursor(0,0);
lcd.write(0);
lcd.setCursor(1,0);
lcd.print("RCh1:");
lcd.setCursor(6,0);
sprintf(buff,"%d",set_logic1);
lcd.print(buff);
lcd.setCursor(0,1);
lcd.print(" RCh2:");
lcd.setCursor(6,1);
sprintf(buff,"%d",set_logic2);
lcd.print(buff);
lcd.setCursor(0,2);
lcd.print(" RCh3:");
lcd.setCursor(6,2);
sprintf(buff,"%d",set_logic3);
lcd.print(buff);
lcd.setCursor(0,3);
lcd.print(" RCh4:");
lcd.setCursor(6,3);
sprintf(buff,"%d",set_logic4);
lcd.print(buff);
break;
case 2:
if(!digitalRead(BTN1)){set_logic2++;delay(170);}
if(set_logic2>1){set_logic2=0;}
lcd.createChar(0,arrow);
lcd.setCursor(0,1);
lcd.write(0);
lcd.setCursor(0,0);
lcd.print(" RCh1:");
lcd.setCursor(6,0);
sprintf(buff,"%d",set_logic1);
lcd.print(buff);
lcd.setCursor(1,1);
lcd.print("RCh2:");
lcd.setCursor(6,1);
sprintf(buff,"%d",set_logic2);
lcd.print(buff);
lcd.setCursor(0,2);
lcd.print(" RCh3:");
lcd.setCursor(6,2);
sprintf(buff,"%d",set_logic3);
lcd.print(buff);
lcd.setCursor(0,3);
lcd.print(" RCh4:");
lcd.setCursor(6,3);
sprintf(buff,"%d",set_logic4);
lcd.print(buff);
break;
case 3:
if(!digitalRead(BTN1)){set_logic3++;delay(170);}
if(set_logic3>1){set_logic3=0;}
lcd.createChar(0,arrow);
lcd.setCursor(0,2);
lcd.write(0);
lcd.setCursor(0,0);
lcd.print(" RCh1:");
lcd.setCursor(6,0);
sprintf(buff,"%d",set_logic1);
lcd.print(buff);
lcd.setCursor(0,1);
lcd.print(" RCh2:");
lcd.setCursor(6,1);
sprintf(buff,"%d",set_logic2);
lcd.print(buff);
lcd.setCursor(1,2);
lcd.print("RCh3:");
lcd.setCursor(6,2);
sprintf(buff,"%d",set_logic3);
lcd.print(buff);
lcd.setCursor(0,3);
lcd.print(" RCh4:");
lcd.setCursor(6,3);
sprintf(buff,"%d",set_logic4);
lcd.print(buff);
break;
case 4:
if(!digitalRead(BTN1)){set_logic4++;delay(170);}
if(set_logic4>1){set_logic4=0;}
lcd.createChar(0,arrow);
lcd.setCursor(0,3);
lcd.write(0);
lcd.setCursor(0,0);
lcd.print(" RCh1:");
lcd.setCursor(6,0);
sprintf(buff,"%d",set_logic1);
lcd.print(buff);
lcd.setCursor(0,1);
lcd.print(" RCh2:");
lcd.setCursor(6,1);
sprintf(buff,"%d",set_logic2);
lcd.print(buff);
lcd.setCursor(0,2);
lcd.print(" RCh3:");
lcd.setCursor(6,2);
sprintf(buff,"%d",set_logic3);
lcd.print(buff);
lcd.setCursor(1,3);
lcd.print("RCh4:");
lcd.setCursor(6,3);
sprintf(buff,"%d",set_logic4);
lcd.print(buff);
break;
}
}
}
break;
}
}
}
break;
case 3 :
lcd.setCursor(0,0);
lcd.print(" 1.Kalibrasi");
lcd.createChar(0,arrow);
lcd.setCursor(0,2);
lcd.write(0);
lcd.setCursor(0,1);
lcd.print(" 2.Safe Mode");
lcd.setCursor(1,2);
lcd.print("3.Rumus KWh");
lcd.setCursor(0,3);
lcd.print(" 4.Biaya");
if(!digitalRead(BTN1)){
lcd.clear();
delay(50);
while(1){
if(!digitalRead(BTN4)){lcd.clear();delay(175);break;}
switch(cidx){
case 1 :
if(!digitalRead(BTN1)){
lcd.clear();
delay(300);
while(1){
if(!digitalRead(BTN4)){break;lcd.clear();delay(150);}
if(!digitalRead(BTN1)){input_1+=1.0;delay(175);}
if(!digitalRead(BTN3)){input_1-=0.1;delay(175);}
if(input_1>1500.0){input_1=1200.0;}
if(input_1<1200.0){input_1=1500.0;}
lcd.setCursor(4,0);
lcd.print("Harga KWh:");
lcd.setCursor(5,1);
lcd.print(input_1,1);
}
}
total = energi * (input_1/1000);
lcd.setCursor(3,0);
lcd.print("KWh x Harga");
lcd.setCursor(0,1);
lcd.print("Harga Rp.");
lcd.setCursor(9,1);
lcd.print(total);
lcd.setCursor(0,2);
lcd.print("KWh:"); // Diganti fungsi pembacaan energi.
lcd.setCursor(4,2);
lcd.print(energi); // Diganti fungsi pembacaan energi.
break;
}
}
}
break;
case 4 :
lcd.setCursor(0,0);
lcd.print(" 1.Kalibrasi");
lcd.createChar(0,arrow);
lcd.setCursor(0,3);
lcd.write(0);
lcd.setCursor(0,1);
lcd.print(" 2.Safe Mode");
lcd.setCursor(0,2);
lcd.print(" 3.Rumus KWh");
lcd.setCursor(1,3);
lcd.print("4.Biaya");
if(!digitalRead(BTN1)){
lcd.clear();
delay(50);
while(1){
if(!digitalRead(BTN4)){lcd.clear();delay(75);break;}
lcd.setCursor(1,1);
lcd.print("Kalkulasi Harga:");
lcd.setCursor(3,2);
lcd.print("Rp." );
lcd.setCursor(6,2);
lcd.print(total);
}
}
break;
case 5 :
lcd.clear();
delay(75);
break;
break;
case 6 :
if(!digitalRead(BTN1)){
lcd.clear();
delay(50);
while(1){
if(!digitalRead(BTN4)){lcd.clear();delay(170);break;}
if(!digitalRead(BTN2)){sampling_data++;delay(170);}
if(!digitalRead(BTN3)){sampling_data--;delay(170);}
if(sampling_data>23){sampling_data=0;}
if(sampling_data<0){sampling_data=23;}
lcd.setCursor(1,0);
lcd.print("Set Sampling Data");
lcd.setCursor(6,1);
sprintf(buff,"%2d Jam",sampling_data);
lcd.print(buff);
}
}
lcd.createChar(0,arrow);
lcd.setCursor(0,0);
lcd.write(0);
lcd.setCursor(1,0);
lcd.print("5.Sampling Data");
lcd.setCursor(0,1);
lcd.print(" 6.Tambah");
break;
case 7 :
if(!digitalRead(BTN4)){lcd.clear();delay(75);break;}
lcd.createChar(0,arrow);
lcd.setCursor(0,1);
lcd.write(0);
lcd.setCursor(0,0);
lcd.print(" 5.Sampling Data");
lcd.setCursor(1,1);
lcd.print("6.Tambah ");
lcd.setCursor(0,2);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print(" ");
break;
}
}
}
}
void waktu_internet()
{
//timeClient.update(); // Perbarui waktu dari server NTP
// Tambahkan offset GMT+7 (7 * 3600 detik)
//time_t localTime = timeClient.getEpochTime() + (7 * 3600);
// Ubah ke dalam bentuk waktu terstruktur (struct tm)
//struct tm * timeinfo;
//timeinfo = localtime(&localTime);
// Periksa apakah sudah waktunya untuk memperbarui LCD
//if (millis() - lastUpdateTime >= updateInterval) {
// Format waktu untuk ditampilkan di LCD
//char timeStr[9]; // 8 karakter untuk jam, menit, detik, dan null terminator
//sprintf(timeStr, "%02d:%02d:%02d", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
// Serial.printf( "%02d:%02d:%02d", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
// Tampilkan waktu di LCD
//lcd.setCursor(6,0);
//lcd.print(timeStr);
// lastUpdateTime = millis(); // Perbarui waktu terakhir pembaruan
}
void tampilan_sensor()
{
//indikator_mendekati();
//indikator_habis();
lcd.setCursor(6,0);
lcd.print("10:30 AM");
lcd.setCursor(0,1);
lcd.print("F:");
lcd.setCursor(2,1);
lcd.print(frekuensi,1);
lcd.setCursor(0,2);
lcd.print("V:");
lcd.setCursor(2,2);
lcd.print(tegangan,1);
lcd.setCursor(0,3);
lcd.print("I:");
lcd.setCursor(2,3);
lcd.print(arus);
lcd.setCursor(11,1);
lcd.print("P:");
lcd.setCursor(13,1);
lcd.print(daya,3);
lcd.setCursor(11,2);
lcd.print("E:");
lcd.setCursor(13,2);
lcd.print(energi,3);
lcd.setCursor(11,3);
lcd.print("Mode:");
lcd.print(elemen1[set_mode]);
}
void kirim_data()
{
}
void input_tambah()
{
while(1){
digitalWrite(buzzer,LOW);
digitalWrite(LEDMERAH,LOW);
if(!digitalRead(BTN4)){lcd.clear();break;}
if(digitalRead(BTN2)==0 && (millis() - TimeTambah) > debounceDelay){set_biaya+=10;}
if(!digitalRead(BTN3)&& (millis() - TimeTambah) > debounceDelay){set_biaya-=10;}
if(!digitalRead(BTN1) && (millis() - TimeTambah) > debounceDelay){a++; }
if(a>1){a=0;}
if(set_biaya>10.0){set_biaya=1.0;}
if(set_biaya<1.0){set_biaya=10.0;}
lcd.setCursor(2,0);
lcd.print("Tambah Biaya ?");
lcd.setCursor(4,1);
lcd.print("Rp.");
lcd.setCursor(7,1);
lcd.print(set_biaya,0);
TimeTambah = millis();
}
}
void tampilkanMenu()
{
}
void prosesMenu()
{
// Lakukan sesuatu berdasarkan menu yang dipilih
// Misalnya, tampilkan pesan atau lakukan aksi tertentu
}
//Memberi Titik Pada Angka Ribuat
String formatRibuan(int angka) {
String formattedString = String(angka);
int length = formattedString.length();
// Sisipkan titik setiap tiga digit dari belakang
for (int i = length - 3; i > 0; i -= 3) {
formattedString = formattedString.substring(0, i) + "." + formattedString.substring(i);
}
return formattedString;
}
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
btn4:1.l
btn4:2.l
btn4:1.r
btn4:2.r
btn5:1.l
btn5:2.l
btn5:1.r
btn5:2.r
led1:A
led1:C
relay1:VCC
relay1:GND
relay1:IN
relay1:NC
relay1:COM
relay1:NO
relay4:VCC
relay4:GND
relay4:IN
relay4:NC
relay4:COM
relay4:NO
relay5:VCC
relay5:GND
relay5:IN
relay5:NC
relay5:COM
relay5:NO
relay6:VCC
relay6:GND
relay6:IN
relay6:NC
relay6:COM
relay6:NO
led2:A
led2:C
led3:A
led3:C
led4:A
led4:C
bz1:1
bz1:2