#define wokwi
#include <LiquidCrystal.h>
#define RSPin 23
#define EnablePin 22
#define DS4 21
#define DS5 19
#define DS6 18
#define DS7 5
#define LCDColumns 20
#define LCDRows 4
LiquidCrystal lcd(RSPin, EnablePin,DS4,DS5,DS6,DS7);
#ifdef wokwi
#define BLYNK_TEMPLATE_ID "TMPL4-n8Y0nMa"
#define BLYNK_TEMPLATE_NAME "Quickstart Template"
#define BLYNK_AUTH_TOKEN "QJJucdz-2NyI5NBitGj3VJrPVSFJ82Lq"
#define BLYNK_PRINT Serial
#else
#define BLYNK_TEMPLATE_ID "TMPLRqI0MdZa"
#define BLYNK_TEMPLATE_NAME "Led demo"
#define BLYNK_AUTH_TOKEN "wjqvCqWSWjglUjuvPznzdk-20FMK6-so"
#define BLYNK_PRINT Serial
#endif
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHTesp.h> //Library untuk DHT
char auth[] = BLYNK_AUTH_TOKEN ; //Auth Token
#ifdef wokwi
char ssid[] = "Wokwi-GUEST"; //nama hotspot yang digunakan
char pass[] = ""; //password hotspot yang digunakan
#else
char ssid[] = "UPCM628EC4"; //nama hotspot yang digunakan
char pass[] = "pxpWbvhcn6ds"; //password hotspot yang digunakan
#endif
const int DHT_PIN = 15;
int value0, value1, value2, value3, value6;
byte LED_R = 26;
byte LED_Y = 27;
byte LED_G = 14;
byte LED_B = 12;
unsigned long timer0 = 0;
unsigned long timer1 = 0;
unsigned long timer2 = 0;
int tim1,tim2;
int ReCnctFlag,ReCnctCount;
int RunH = -1;
DHTesp dht;
BlynkTimer timer;
BlynkTimer timerR;
//function untuk pengiriman sensor
void sendSensor()
{
TempAndHumidity data = dht.getTempAndHumidity();
//menampilkan temperature pada Serial monitor
/*Serial.print(millis());
Serial.print(" % Temperature: ");
Serial.print(data.temperature);
Serial.print("C ");
Serial.print(" % Kelembaban: ");
Serial.print(data.humidity);
Serial.println("% ");
*/
lcd.setCursor(4,0);
lcd.print(" ");
lcd.setCursor(15,0);
lcd.print(" ");
lcd.setCursor(4,0);
lcd.print(data.temperature);
lcd.setCursor(15,0);
lcd.print(data.humidity);
Blynk.virtualWrite(V4, data.temperature); //mengirimkan data temperatur ke Virtual pin VO di Blynk Cloud
Blynk.virtualWrite(V5, data.humidity); //mengirimkan data kelemaban ke Virtual pin V1 di Blynk Cloud
}
BLYNK_WRITE(V7)
{
tim1 = param.asInt();
Serial.println(tim1);
}
BLYNK_WRITE(V8)
{
tim1 = param.asInt();
Serial.println(tim2);
}
BLYNK_WRITE(V0)
{
value0 = param.asInt();
digitalWrite(LED_R, value0);
Blynk.virtualWrite(V7, value0);
timer0 = millis();
}
BLYNK_WRITE(V1)
{
value1 = param.asInt();
digitalWrite(LED_Y, value1);
Blynk.virtualWrite(V8, value1);
timer0 = millis();
}
BLYNK_WRITE(V2)
{
value2 = param.asInt();
digitalWrite(LED_G, value2);
Blynk.virtualWrite(V9, value2);
if (value2 == HIGH)
#ifdef wokwi
timer1 = millis() + tim1 * 1000;
#else
timer1 = millis() + tim1 * 1000 * 60;
#endif
else
timer1 = 0;
}
BLYNK_WRITE(V3)
{
value3 = param.asInt();
digitalWrite(LED_B, value3);
Blynk.virtualWrite(V10, value3);
if (value3 == HIGH)
#ifdef wokwi
timer2 = millis() + tim2 * 1000;
#else
timer2 = millis() + tim2 * 1000 * 60;
#endif
else
timer2 = 0;
/*#ifdef wokwi
Blynk.disconnect();
#endif
*/
}
/*BLYNK_WRITE(V6)
{
value6 = param.asInt();
digitalWrite(LED_R, value6);
Blynk.virtualWrite(V7, value6);
Blynk.virtualWrite(V0, value6);
digitalWrite(LED_Y, value6);
Blynk.virtualWrite(V8, value6);
Blynk.virtualWrite(V1, value6);
digitalWrite(LED_G, value6);
Blynk.virtualWrite(V9, value6);
Blynk.virtualWrite(V2, value6);
digitalWrite(LED_B, value6);
Blynk.virtualWrite(V10, value6);
Blynk.virtualWrite(V3, value6);
}
void cekAllLed(){
if(value0 == 1 && value1 == 1 && value2 == 1 && value3 == 1){
Blynk.virtualWrite(V6, 1);
}
else{
Blynk.virtualWrite(V6, 0);
}
// if(value0 == 0 && value1 == 0 && value2 == 0 && value3 == 0){
// Blynk.virtualWrite(V6, 0);
// }
}
*/
void setup()
{
// Debug console
lcd.begin(LCDColumns, LCDRows); //Configure the LCD
lcd.setCursor(14,3);
lcd.print("Re");
lcd.setCursor(0,0);
lcd.print("Tem");
lcd.setCursor(11,0);
lcd.print("Hum");
lcd.setCursor(0,1);
lcd.print("Tim1");
lcd.setCursor(10,1);
lcd.print("Tim2");
Serial.begin(115200); //serial monitor menggunakan bautrate 9600
#ifdef wokwi
dht.setup(DHT_PIN, DHTesp::DHT22);
#else
dht.setup(DHT_PIN, DHTesp::DHT11);
#endif
pinMode(LED_R, OUTPUT);
pinMode(LED_Y, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
digitalWrite(LED_R, LOW);
digitalWrite(LED_Y, LOW);
digitalWrite(LED_G, LOW);
digitalWrite(LED_B, LOW);
Blynk.begin(auth, ssid, pass); //memulai Blynk
Blynk.virtualWrite(V0, LOW);
Blynk.virtualWrite(V1, LOW);
Blynk.virtualWrite(V2, LOW);
Blynk.virtualWrite(V3, LOW);
timer.setInterval(5000, sendSensor); //Mengaktifkan timer untuk pengiriman data 1000ms
Blynk.logEvent("restart");
}
void loop()
{
#ifdef wokwi
if (RunH != millis()/1000/10){
RunH = millis()/1000/10;
#else
if (RunH != millis()/1000/3600){
RunH = millis()/1000/3600;
#endif
lcd.setCursor(1,2);
lcd.print(RunH);
lcd.print(" ");
Blynk.virtualWrite(V6, RunH);
};
if (timer0 !=0 and timer0 < millis() - 1000)
{
Serial.println("T1");
timer0 = 0;
digitalWrite(LED_R, LOW);
Blynk.virtualWrite(V0, LOW);
digitalWrite(LED_Y, LOW);
Blynk.virtualWrite(V1, LOW);
}
if (timer1 !=0)
{
lcd.setCursor(5,1);
lcd.print((timer1-millis())/1000);
lcd.print(" ");
if ( timer1 < millis())
{
Serial.println("T1");
Serial.print(millis());
Serial.print(" ");
Serial.println(timer1);
timer1 = 0;
digitalWrite(LED_G, LOW);
Blynk.virtualWrite(V2, LOW);
lcd.setCursor(5,1);
lcd.print(" ");
}
}
if (timer2 !=0)
{
lcd.setCursor(15,1);
lcd.print((timer2-millis())/1000);
lcd.print(" ");
if ( timer2 < millis())
{
Serial.println("T2");
Serial.print(millis());
Serial.print(" ");
Serial.println(timer2);
timer2 = 0;
digitalWrite(LED_B, LOW);
Blynk.virtualWrite(V3, LOW);
lcd.setCursor(15,1);
lcd.print(" ");
}
}
//Blynk.run(); //menjalankan blynk
//timer.run(); //menjalankan timer
timer.run();
if (Blynk.connected()) { // If connected run as normal
//Serial.print(".");
//digitalWrite(LED_B, HIGH);
lcd.setCursor(0,3);
lcd.print("Connected * ");
delay(500);
Blynk.run();
//digitalWrite(LED_B, LOW);
lcd.setCursor(0,3);
lcd.print("Connected ");
delay(500);
} else if (ReCnctFlag == 0) { // If NOT connected and not already trying to reconnect, set timer to try to reconnect in 30 seconds
#ifdef wokwi
if (ReCnctCount==2) ESP.restart();
#else
if (ReCnctCount==10) ESP.restart();
#endif
ReCnctFlag = 1; // Set reconnection Flag
Serial.println("Starting reconnection timer in 10 seconds...");
lcd.setCursor(0,3);
lcd.print("reconnection ");
timer.setTimeout(10000L, []() { // Lambda Reconnection Timer Function
ReCnctFlag = 0; // Reset reconnection Flag
ReCnctCount++; // Increment reconnection Counter
Serial.println();
Serial.print("Attempting reconnection #");
Serial.println(ReCnctCount);
lcd.setCursor(16,3);
lcd.print(" ");
lcd.setCursor(16,3);
lcd.print(ReCnctCount);
Blynk.connect(); // Try to reconnect to the server
}); // END Timer Function
}
delay(500);
}