#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include "DHTesp.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h> // tambahkan library RTC
#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6WUU2S_BL"
#define BLYNK_TEMPLATE_NAME "Monotoring and Control"
#define BLYNK_AUTH_TOKEN "8ZiZBXujgWBBszTCZKY6I_cnUqEFCpow"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int DHT_PIN = 26;
DHTesp dhtSensor;
const float GAMMA = 0.7;
const float RL10 = 50;
const int HEATER_PIN = 18;
const int COOLER_PIN = 19;
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
RTC_DS3231 rtc;
void sendSensorAndControl() {
// Read sensor data
int analogValue = analogRead(33);
float voltage = analogValue * 5 / 4095.0;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
Serial.print("Lux : ");
Serial.println(lux);
Blynk.virtualWrite(V0, lux);
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.println("Temp : " + String(data.temperature, 2) + "°C");
Serial.println("Humidity : " + String(data.humidity, 1) + "%");
Serial.println("---");
Blynk.virtualWrite(V1, data.temperature);
Blynk.virtualWrite(V2, data.humidity);
// Update OLED display
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Lux : ");
display.println(lux);
display.print("Temperature : ");
display.println(data.temperature, 2);
display.print("Humidity : ");
display.println(data.humidity, 1);
// Control logic
if (data.temperature > 25) {
// Turn on cooler
display.setCursor(0, 35);
digitalWrite(COOLER_PIN, HIGH);
digitalWrite(HEATER_PIN, LOW);
display.println(" Action ");
display.println(" Turn on Cooler");
} else if (data.temperature < 20) {
// Turn on heater
display.setCursor(0, 35);
digitalWrite(COOLER_PIN, LOW);
digitalWrite(HEATER_PIN, HIGH);
display.println(" Action ");
display.println(" Turn on Heater");
} else {
// Turn off both cooler and heater
display.setCursor(0, 35);
digitalWrite(COOLER_PIN, LOW);
digitalWrite(HEATER_PIN, LOW);
display.println(" Action ");
display.println(" None ");
}
display.display();
}
void setup() {
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
pinMode(HEATER_PIN, OUTPUT);
pinMode(COOLER_PIN, OUTPUT);
Blynk.begin(auth, ssid, pass);
timer.setInterval(1000L, sendSensorAndControl);
// Inisialisasi OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while (true) {
delay(1000); // Tunggu dan coba lagi setiap detik
}
}
delay(2000);
display.clearDisplay();
// Inisialisasi RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (true) {
delay(1000); // Tunggu dan coba lagi setiap detik
}
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("RTC lost power,");
display.println("Time set to compile time");
display.display();
delay(3000);
}
}
void loop() {
DateTime now = rtc.now();
Blynk.run();
timer.run();
displayHomeEntry(now);
delay(1000);
}
void displayHomeEntry(DateTime now) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 30);
display.print("Date: ");
display.print(now.day());
display.print("/");
display.print(now.month());
display.print("/");
display.println(now.year());
display.setCursor(0, 40);
display.print("Time: ");
display.print(now.hour());
display.print(":");
if (now.minute() < 10) {
display.print("0"); // Add leading zero if minute is less than 10
}
display.println(now.minute());
display.display();
}