#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Deklarasi pin dan objek
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS3231 rtc;
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define ONE_WIRE_BUS 14
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#define TDS_PIN 35 // Pin analog untuk sensor TDS
const float TDS_FACTOR = 0.5; // Faktor konversi untuk sensor TDS
float voltage, tdsValue;
float calibration_value = 21.34;
int analogPin = 34; // Pin analog untuk pH sensor
float ph_act;
// Deklarasi pin untuk relay
#define RELAY1_PIN 25
#define RELAY2_PIN 26
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
dht.begin();
sensors.begin();
Wire.begin();
// Inisialisasi pin relay sebagai output
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
// Pastikan relay mati pada awal
digitalWrite(RELAY1_PIN, LOW);
digitalWrite(RELAY2_PIN, LOW);
// Splash Screen
lcd.clear();
lcd.setCursor(0, 1);
lcd.print(" Smart Farming ");
lcd.setCursor(0, 2);
lcd.print(" Hydroponics IoT ");
delay(1000);
lcd.clear();
// Display initializing with loading dots
lcd.setCursor(0, 1);
lcd.print(" Initializing");
for (int i = 0; i < 3; i++) {
delay(750);
lcd.print(" .");
}
if (!rtc.begin()) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Couldn't find RTC");
while (1)
;
}
if (rtc.lostPower()) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RTC lost power");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Set RTC to compile time
}
}
void loop() {
DateTime now = rtc.now();
float humidity = dht.readHumidity();
float tempDHT = dht.readTemperature();
sensors.requestTemperatures();
float tempDS = sensors.getTempCByIndex(0);
int analogValue = analogRead(analogPin);
float voltage = analogValue * (3.3 / 4095.0);
ph_act = -5.70 * voltage + calibration_value;
// Membaca data TDS
int tdsAnalog = analogRead(TDS_PIN);
voltage = tdsAnalog * (3.3 / 4095.0);
tdsValue = (voltage * 1000) / TDS_FACTOR;
bool relay1State = (tempDHT > 30.0);
bool relay2State = (tempDS > 25.0);
digitalWrite(RELAY1_PIN, relay1State ? HIGH : LOW); // Kontrol relay 1
digitalWrite(RELAY2_PIN, relay2State ? HIGH : LOW); // Kontrol relay 2
// Tampilkan tanggal, waktu, suhu, kelembaban, nilai pH, dan TDS
lcd.clear();
// Baris 1: Tanggal dan Waktu
lcd.setCursor(0, 0);
lcd.print(now.day(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
lcd.print(" ");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
// Baris 2: Suhu dari DHT dan Kelembaban
lcd.setCursor(0, 1);
lcd.print("T=");
lcd.print(tempDHT);
lcd.print("*C H=");
lcd.print(humidity);
lcd.print("%");
// Baris 3: Suhu dari DS18B20 dan pH
lcd.setCursor(0, 2);
lcd.print("TW=");
lcd.print(tempDS);
lcd.print("*C PPM=");
lcd.print(tdsValue);
// Baris 4: Nilai TDS
lcd.setCursor(0, 3);
lcd.print("PH=");
lcd.print(ph_act);
lcd.print(" R1:");
lcd.print(relay1State ? "ON" : "OF");
lcd.print(" R2:");
lcd.print(relay2State ? "ON" : "OF");
// Logika kontrol relay berdasarkan suhu
if (tempDHT > 30.0) {
digitalWrite(RELAY1_PIN, HIGH); // Nyalakan relay 1 jika suhu DHT lebih dari 30°C
} else {
digitalWrite(RELAY1_PIN, LOW); // Matikan relay 1 jika suhu DHT 30°C atau kurang
}
if (tempDS > 25.0) {
digitalWrite(RELAY2_PIN, HIGH); // Nyalakan relay 2 jika suhu DS18B20 lebih dari 25°C
} else {
digitalWrite(RELAY2_PIN, LOW); // Matikan relay 2 jika suhu DS18B20 25°C atau kurang
}
delay(2000);
}Loading
ds18b20
ds18b20