/*
Nama : Maulana Agus Setiawan
NIM : 2209106024
Program ini untuk mengendalikan sistem penyiraman tanaman otomatis
menggunakan ESP32-S3 dengan kemampuan penyiraman secara otomatis
dalam interval tertentu dan juga dukungan penyiraman manual
melalui tombol.
Program ini sudah menggabungkan Interrupt dan juga Timer
Untuk mengubah waktu penyiraman dan interval tiap penyiraman dapat
diubah pada variable `autoInterval` dan `wateringDuration`
ex : mengubah interval setiap 5 menit & durasi menyiram selama
10 detik
const unsigned long autoInterval = 5 * 60 * 1000UL;
const unsigned long wateringDuration = 10000;
Sekian hehe :D
*/
#include <ESP32Servo.h>
const int ledPins[] = {1, 2, 42};
const int servoPins = 41;
const int btnPins = 40;
const unsigned long autoInterval = 5000;
const unsigned long wateringDuration = 5000;
volatile bool manualMode = false;
volatile unsigned long manualStartTime = 0;
volatile bool btnPressed = false;
unsigned long lastAutoWateringTime = millis();
unsigned long wateringStartTime = 0;
bool isWatering = false;
Servo pumpServo;
void IRAM_ATTR buttonISR() {
btnPressed = true;
}
void ledPattern() {
for(int i = 0; i < 3; i++) {
digitalWrite(ledPins[i], HIGH);
delay(50);
digitalWrite(ledPins[i], LOW);
delay(50);
}
}
void setup() {
Serial.begin(115200);
Serial.println("========= Sistem Penyiraman tanaman otomatis =========");
for(int i = 0; i < 3; i++){
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW);
}
pinMode(btnPins, INPUT_PULLUP);
pumpServo.attach(servoPins);
pumpServo.write(0);
attachInterrupt(digitalPinToInterrupt(btnPins), buttonISR, FALLING);
}
void loop() {
unsigned long currentMillis = millis();
if (btnPressed) {
btnPressed = false;
// debounce 300ms
static unsigned long lastPressTime = 0;
if (currentMillis - lastPressTime > 300) {
lastPressTime = currentMillis;
manualMode = true;
isWatering = true;
manualStartTime = currentMillis;
Serial.println("____________________");
Serial.println("Mode manual dimulai.");
Serial.println("____________________");
}
}
static unsigned long lastDebugTime = 0;
if(currentMillis - lastDebugTime >= 1000) {
lastDebugTime = currentMillis;
Serial.print("Status: ");
Serial.print(isWatering ? "Menyiram" : "Tidak menyiram");
Serial.print(", Mode: ");
Serial.print(manualMode ? "Manual" : "Otomatis");
Serial.print(", Servo: ");
Serial.print(pumpServo.read());
Serial.print(", Button: ");
Serial.println(digitalRead(btnPins));
}
if (manualMode) {
pumpServo.write(90);
ledPattern();
if (currentMillis - manualStartTime >= wateringDuration) {
manualMode = false;
pumpServo.write(0);
digitalWrite(ledPins[0], LOW);
Serial.println("____________________");
Serial.println("Mode manual selesai.");
Serial.println("____________________");
lastAutoWateringTime = currentMillis;
}
}
else {
if (isWatering) {
pumpServo.write(90);
ledPattern();
if (currentMillis - wateringStartTime >= wateringDuration) {
isWatering = false;
pumpServo.write(0);
digitalWrite(ledPins[0], LOW);
Serial.println("Penyiraman otomatis selesai.");
lastAutoWateringTime = currentMillis;
}
}
else if (currentMillis - lastAutoWateringTime >= autoInterval) {
isWatering = true;
wateringStartTime = currentMillis;
pumpServo.write(90);
ledPattern();
Serial.println("Penyiraman otomatis dimulai.");
}
}
}
Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1