#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include "LiquidCrystal_I2C.h"
#include "DHT.h"
#include <ESP32Servo.h>
#include <RTClib.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
RTC_DS1307 rtc;
#define relayPin 18
#define relay2Pin 19
#define ldrPin 35
#define DHT_PIN 15
#define DHTTYPE DHT22
#define LED_PIN 33
DHT dht(DHT_PIN, DHT22);
LiquidCrystal_I2C lcd(0x27, 20, 4);
LiquidCrystal_I2C lcd2(0x27, 20, 4);
#include "FC28.h"
#define SensorFC28_Pin 34
float soil_moisture;
FC28Sensor mySensor;
const float gama = 0.7;
const float rl10 = 50;
float temp, hum, lux;
String soilStatus, luxStatus;
void readRTC(void *parameter) {
while (1) {
DateTime now = rtc.now();
int tahun = now.year() % 100;
Serial.println("Tanggal : " + String(now.day()) + "/" + String(now.month()) + "/" + String(tahun));
Serial.println("Waktu : " + String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second()));
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void readDHT(void *parameter) {
while (1) {
hum = dht.readHumidity();
temp = dht.readTemperature();
// Kontrol relay berdasarkan suhu
if (temp < 13) {
digitalWrite(relay2Pin, LOW); // Relay dan LED mati jika suhu di bawah 13 derajat
} else {
digitalWrite(relay2Pin, HIGH); // Relay dan LED menyala jika suhu di atas 13 derajat
}
vTaskDelay(2000 / portTICK_PERIOD_MS); // DHT22 memiliki laju sampling 0.5 Hz
}
}
void readLDR(void *parameter) {
while (1) {
int ldrValue = analogRead(ldrPin);
ldrValue = map(ldrValue, 4095, 0, 1024, 0);
float ldrVoltage = ldrValue / 1024.0 * 5;
float ldrResistance = 2000 * ldrVoltage / (1 - ldrVoltage / 5);
lux = pow(rl10 * 1e3 * pow(10, gama) / ldrResistance, (1 / gama));
luxStatus = lux < 1440 ? "Rendah" : "Tinggi";
if (lux < 1440) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void readSoilMoisture(void *parameter) {
while (1) {
soil_moisture = mySensor.getSoilMoisture();
soilStatus = soil_moisture < 33.33 ? "Kering" : soil_moisture > 66.66 ? "Basah" : "Normal";
if (soil_moisture < 33.33) {
digitalWrite(relayPin, HIGH);
} else {
digitalWrite(relayPin, LOW);
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void lcdDisplay(void *parameter) {
while (1) {
lcd.setCursor(0, 0);
lcd.print("Tanah :");
lcd.setCursor(13, 0);
lcd.print(soilStatus);
lcd.setCursor(0, 1);
lcd.print("Kecerahan : ");
lcd.setCursor(13, 1);
lcd.print(luxStatus);
lcd.setCursor(0, 2);
lcd.print("Suhu :");
lcd.setCursor(13, 2);
lcd.print(temp);
lcd.setCursor(19, 2);
lcd.print("C");
lcd.setCursor(0, 3);
lcd.print("Kelembaban :");
lcd.setCursor(13, 3);
lcd.print(hum);
lcd.setCursor(19, 3);
lcd.print("%");
Serial.println("Tanah : " + soilStatus);
Serial.println("Kecerahan : " + luxStatus);
Serial.println("Suhu : " + String(temp) + " C");
Serial.println("Kelembaban : " + String(hum) + " %");
Serial.println("--------------");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void setup() {
Serial.begin(9600);
Serial.flush();
pinMode(ldrPin, INPUT);
pinMode(DHT_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(relayPin, OUTPUT);
pinMode(relay2Pin, OUTPUT); // Pin relay baru
mySensor.initFC28Sensor(115200, SensorFC28_Pin);
Wire.begin();
if (!rtc.begin()) {
Serial.println("RTC Not Connected");
lcd.setCursor(0, 0);
lcd.print("RTC Not Connect");
while (1);
}
Serial.println("Smart Farming System");
dht.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("WELCOME");
lcd.setCursor(0, 1);
lcd.print("SMART FARMING");
lcd.setCursor(0, 2);
lcd.print("MONITORING SYSTEM");
lcd.setCursor(0, 3);
lcd.print("TI-3B");
delay(2000);
lcd.clear();
xTaskCreatePinnedToCore(lcdDisplay, "lcdDisplay", 2048, NULL, 1, NULL, 0);
xTaskCreatePinnedToCore(readRTC, "readRTC", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(readDHT, "readDHT", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(readLDR, "readLDR", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(readSoilMoisture, "readSoilMoisture", 2048, NULL, 1, NULL, 1);
}
void loop() {
}