/**
* Title: IRRIOT Smart Irrigation Device
* Author: Marco León
* Company: IRRIOT, Inc.
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22
#define RELAY1 6
#define RELAY2 5
#define RELAY3 4
#define RELAY4 3
#define MODE_BUTTON_PIN 8
// Thresholds
float maxTemperatureThreshold = 30.0;
float minHumidityThreshold = 40.0;
// Operation Modes
enum OperationMode { SCHEDULE_DRIVEN, CONTROLLER_DRIVEN };
OperationMode currentMode = SCHEDULE_DRIVEN;
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS1307 rtc;
unsigned long lastSendTime = 0;
const unsigned long sendInterval = 1000; // 120 sec
int deviceId = 1001;
unsigned long lastLoop = 0;
const unsigned long loopInterval = 1000;
int lastButtonState = HIGH;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;
int lastSecond = -1;
String getModeName(OperationMode mode) {
switch (mode) {
case SCHEDULE_DRIVEN: return "SCHEDULE";
case CONTROLLER_DRIVEN: return "CONTROLLER";
default: return "UNKNOWN";
}
}
void setup() {
Serial.begin(115200);
Serial.println("IRRIOT, Inc. - Smart Irrigation Device");
Serial.println("Developer: Marco León");
dht.begin();
lcd.init();
lcd.backlight();
rtc.begin();
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(RELAY3, OUTPUT);
pinMode(RELAY4, OUTPUT);
pinMode(MODE_BUTTON_PIN, INPUT_PULLUP);
lcd.setCursor(2, 0); lcd.print("SMART FARMING");
delay(2000);
lcd.clear();
}
void loop() {
int reading = digitalRead(MODE_BUTTON_PIN);
if (reading == LOW && lastButtonState == HIGH && millis() - lastDebounceTime > debounceDelay) {
currentMode = static_cast<OperationMode>((currentMode + 1) % 3);
Serial.print("Mode changed to: ");
Serial.println(getModeName(currentMode));
lastDebounceTime = millis();
}
lastButtonState = reading;
if (millis() - lastLoop >= loopInterval) {
lastLoop = millis();
DateTime now = rtc.now();
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Update time display only if second changed
if (now.second() != lastSecond) {
lastSecond = now.second();
lcd.setCursor(0, 0);
lcd.print("Time: ");
if (now.hour() < 10) lcd.print("0"); lcd.print(now.hour()); lcd.print(":");
if (now.minute() < 10) lcd.print("0"); lcd.print(now.minute()); lcd.print(":");
if (now.second() < 10) lcd.print("0"); lcd.print(now.second());
lcd.print(" ");
lcd.setCursor(13, 0);
lcd.print("MODE:");
lcd.print(getModeName(currentMode));
lcd.print(" ");
}
// Display temperature and humidity
lcd.setCursor(0, 3);
lcd.print("Temp:"); lcd.print(temperature); lcd.print("C ");
lcd.print("H:"); lcd.print(humidity); lcd.print("% ");
// Relay control
switch (currentMode) {
case SCHEDULE_DRIVEN:
controlBySchedule(now);
break;
case CONTROLLER_DRIVEN:
if (temperature > maxTemperatureThreshold || humidity < minHumidityThreshold)
controlBySchedule(now);
else
deactivateAllRelays();
break;
}
// Estado a consola y envío periódico simulado
if (millis() - lastSendTime >= sendInterval) {
sendDeviceStatus(now, temperature, humidity);
lastSendTime = millis();
}
}
}
void controlBySchedule(DateTime now) {
int sec = now.second();
digitalWrite(RELAY1, (sec >= 0 && sec <= 14));
digitalWrite(RELAY2, (sec >= 15 && sec <= 29));
digitalWrite(RELAY3, (sec >= 30 && sec <= 44));
digitalWrite(RELAY4, (sec >= 45 && sec <= 59));
lcd.setCursor(0, 1);
lcd.print("V1:"); lcd.print(digitalRead(RELAY1) ? "ON " : "OFF");
lcd.print(" V2:"); lcd.print(digitalRead(RELAY2) ? "ON " : "OFF");
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print("V3:"); lcd.print(digitalRead(RELAY3) ? "ON " : "OFF");
lcd.print(" V4:"); lcd.print(digitalRead(RELAY4) ? "ON " : "OFF");
lcd.print(" ");
}
void deactivateAllRelays() {
digitalWrite(RELAY1, LOW);
digitalWrite(RELAY2, LOW);
digitalWrite(RELAY3, LOW);
digitalWrite(RELAY4, LOW);
}
void sendDeviceStatus(DateTime now, float temperature, float humidity) {
Serial.println("--- Device Status Update ---");
Serial.print("deviceId: "); Serial.println(deviceId);
Serial.print("mode: "); Serial.println(getModeName(currentMode));
Serial.print("Temp: "); Serial.println(temperature);
Serial.print("Humidity: "); Serial.println(humidity);
Serial.print("Time: ");
Serial.print(now.year()); Serial.print("/");
Serial.print(now.month()); Serial.print("/");
Serial.print(now.day()); Serial.print(" ");
Serial.print(now.hour()); Serial.print(":");
Serial.print(now.minute()); Serial.print(":");
Serial.println(now.second());
Serial.println();
}