#define BLYNK_TEMPLATE_ID "TMPL6DaEM2tLr"
#define BLYNK_TEMPLATE_NAME "GREENTERA"
#define BLYNK_AUTH_TOKEN "ttKTHmfOr25YTcUeASBlS53zrvLAbuKN"
#define BLYNK_PRINT Serial
#include <Wire.h>
#include <WiFi.h>
#include <DHT.h>
#include <BlynkSimpleEsp32.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ESP32Servo.h>
#include <RTClib.h>
char auth[] = "ttKTHmfOr25YTcUeASBlS53zrvLAbuKN";
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
#define DHTPIN 14
#define DHTTYPE DHT22
#define RELAYPIN 4
#define SERVO_PIN 13
#define SERVO_PIN2 2
#define BUZZERPIN 5
#define LED1 25
#define LED2 33
#define LED3 32
#define LED4 12
#define LED5 27
#define LED6 26
#define LED7 5
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
DHT dht(DHTPIN, DHTTYPE);
const int servoPin = 18;
Servo servo_Kipas;
Servo servo_Pakan;
RTC_DS1307 rtc;
int currentMode = 1; // 0: Mode 2, 1: Mode 1
BLYNK_CONNECTED() {
digitalWrite(RELAYPIN, HIGH);
// servo_Kipas.write(0);
}
BLYNK_WRITE(V3) {
currentMode = param.asInt();
Mode_ke(currentMode);
}
BLYNK_READ(V1) {
kirim_Sensor();
}
BLYNK_READ(V2) {
kirim_Sensor();
}
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
void setup() {
kirim_Sensor();
dht.begin();
Serial.begin(9600);
servo_Kipas.attach(SERVO_PIN);
servo_Pakan.attach(SERVO_PIN2);
if(!rtc.begin()){
Serial.println("Connecting to RTC");
while (1);
} Serial.println("RTC connected!");
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("failed to start SSD1306 OLED"));
while (1);
}
kata_Awal();
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
Blynk.begin(auth, ssid, pass);
pinMode(RELAYPIN, OUTPUT);
pinMode(BUZZERPIN, OUTPUT);
// pinMode(SERVO_PIN, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
pinMode(LED7, OUTPUT);
// Serial.print("STATE SKRNG dri SETUP : ");
Serial.print(currentMode);
// RTC.adjust(DateTime(2024,01,3,5,10,30));
servo_Kipas.write(0);
servo_Pakan.write(180);
delay(1000);
}
void loop() {
kirim_Sensor();
Blynk.run();
DateTime now = rtc.now();
int year = now.year();
int hourr = now.hour();
int minutee = now.minute();
int secondd = now.second();
// int year = now.year();
// int year = now.year();
Serial.print("Tahun : ");
Serial.println(year);
Serial.print("Jam : ");
Serial.println(hourr);
Serial.print("Menit : ");
Serial.println(minutee);
Serial.print("Detik : ");
Serial.println(secondd);
// Serial.print("Tahun : ");
// Serial.println(year);
if(currentMode == 1){
Mode_ke(1);
// PEMBERIAN PAKAN OTOMATIS BERDASARKAN WAKTU (PAGI, SIANG , MALAM)
// Saya mengasumsikan satu servo sebagai penggerak pakan dimana servo ditempelkan pada
// boto atau wadah ringan dan ketika sudut tertentu pakannya akan jatuh melalui lobang2 pada botol
if (now.hour() == 7 && now.minute() == 5 && now.second() == 0){
Serial.println("Jadwal pemberian pakan pagi hari");
servo_Pakan.write(90);
delay(3000);
servo_Pakan.write(0);
Serial.println("Pakan sudah diberikan");
}
else if (now.hour() == 12 && now.minute() == 10 && now.second() == 0){
Serial.println("Jadwal pemberian pakan siang hari");
servo_Pakan.write(90);
delay(3000);
servo_Pakan.write(0);
Serial.println("Pakan sudah diberikan");
}
else if (now.hour() == 7 && now.minute() == 20 && now.second() == 0){
Serial.println("Jadwal pemberian pakan malam hari");
servo_Pakan.write(90);
delay(3000);
servo_Pakan.write(0);
Serial.println("Pakan sudah diberikan");
}
// Pakan END
// Mematikan lampu utama (NO) pada relay ketika sudah malam (istirahat) bagi
// peliharaan di terrarium/paludarium dan untuk tanaman itu sendiri.
// Pada malam hari hanya menghidupkan lampu (NC) lampu secondary yang saya asumsikan memiliki
// tingkat kecerahan lebih kecil dari pada lampu utama .
// Sayangnya mode mematikan lampu ini belum bisa bekerja dengan benar
// if (now.hour() == 21 && now.minute() == 22 && now.second() == 0){
// digitalWrite(RELAYPIN, LOW);
// Serial.println("Mematikan Lampu Utama");
// // delay(500);
// Serial.println("Menghidupkan Lampu Secondary");
// // delay(200);
// }
// else if (now.hour() == 21 && now.minute() == 22 && now.second() == 30) { // Kembali menghidupkan Relay dan lampu utama ketika pagi hari
// digitalWrite(RELAYPIN, HIGH);
// Serial.println("Menghidupkan Lampu Utama");
// // delay(500);
// Serial.println("Mematikan Lampu Secondary");
// // delay(200);
// }
}
else{
Mode_ke(2);
}
}
void kata_Awal() {
float t = dht.readTemperature();
float h = dht.readHumidity();
oled.clearDisplay();
oled.setTextColor(WHITE);
oled.setCursor(0, 2);
oled.print("Temperature :");
oled.setCursor(80, 2);
oled.print(t);
oled.setCursor(115, 2);
oled.print("C");
oled.setCursor(0, 20);
oled.print("Humidity :");
oled.setCursor(80, 20);
oled.print(h);
oled.setCursor(115, 20);
oled.print("%");
oled.setCursor(0, 40);
oled.print("HAVE A GREAT DAY!");
// oled.print(year);
oled.display();
delay(1000);
}
void kirim_Sensor() {
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(h) || isnan(t)) {
Serial.println("Gagal membaca data dari sensor DHT");
return;
}
Blynk.virtualWrite(V0, t);
Blynk.virtualWrite(V1, h);
}
void Mode_ke(int mode) {
kirim_Sensor();
float temp = dht.readTemperature();
float hum = dht.readHumidity();
if (mode == 1) {
kirim_Sensor();
oled.clearDisplay();
digitalWrite(RELAYPIN, HIGH);
// servo_Kipas.write(90);
oled.setTextColor(WHITE);
oled.setCursor(2, 2);
oled.print("Temperature : ");
oled.setCursor(80, 2);
oled.print(dht.readTemperature());
oled.setCursor(115, 2);
oled.print("C");
oled.setCursor(2, 20);
oled.print("Humidity : ");
oled.setCursor(80, 20);
oled.print(dht.readHumidity());
oled.setCursor(0, 50);
oled.println("Automatic Mode : ON");
oled.display();
// Serial.print("STATE SKRNG : ");
Serial.println(currentMode);
if (temp >= 24 && temp < 28) {
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, LOW);
servo_Kipas.write(0);
} else if (temp >= 28) {
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, HIGH);
digitalWrite(RELAYPIN, HIGH);
servo_Kipas.write(140);
} else {
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
servo_Kipas.write(0);
// delay(200);
}
if (hum >= 60 && hum <= 80){
digitalWrite(LED4, LOW);
digitalWrite(LED5, HIGH);
digitalWrite(LED6, LOW);
}
else if(hum > 80){
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, HIGH);
}
else{
digitalWrite(LED4, HIGH);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
}
// Menyalakan buzzer ketika suhu dan humidity sudah benar - benar melewati
// batas aman
if (temp >= 34 && hum <= 30){
tone(BUZZERPIN, 1000, 500);
delay(200);
tone(BUZZERPIN, 500, 1000);
delay(500);
}
// delay(200);
} else if (mode == 2) {
kirim_Sensor();
oled.clearDisplay();
servo_Kipas.write(0);
servo_Pakan.write(0);
digitalWrite(RELAYPIN, LOW);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
oled.setTextColor(WHITE);
oled.setCursor(2, 2);
oled.print("Temperature : ");
oled.setCursor(80, 2);
oled.print(temp);
oled.setCursor(115, 2);
oled.print("C");
oled.setCursor(2, 20);
oled.print("Humidity : ");
oled.setCursor(80, 20);
oled.print(hum);
oled.setCursor(0, 40);
oled.println("Automatic Mode : OFF");
oled.display();
// Serial.print("STATE SKRNG dri mode 2 : ");
Serial.println(currentMode);
delay(200);
}
}
// Servo pin _ SErvo VOLT , else Relay - led bolam utama .