//lcd
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <CQRobotTDS.h> //tds
#include <OneWire.h> //suhu
#include <DallasTemperature.h> //suhu
#include <ph4502c_sensor.h> //pH
#include <NewPing.h> //jarak
#include <RTClib.h> //rtc
RTC_DS3231 rtc;
//pin terpakai sensor 32,33,25,14,12
//tombol //jangan pakai pin 26 27 34 35 36 39
#define KIRI 5
#define KANAN 13
#define ATAS 17
#define BAWAH 16
//tds
CQRobotTDS tds(12);
unsigned long timeout = 0;
float ppmcal;
//suhu
const int oneWireBus = 14;
OneWire oneWire (oneWireBus);
DallasTemperature sensors(&oneWire);
float temperatureC;
//ph
#define pH_pin 225
float ph_act=0;
unsigned long int avgval;
int buffer_arr[10],temp;
//jarak
#define trig_pin 32
#define echo_pin 33
#define jarakmax 100
// NewPing setup of pins and maximum distance
NewPing sonar(trig_pin, echo_pin, jarakmax);
float jarak;
// lcd
int lcdColumns = 16;
int lcdRows = 2;
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
int ppmAwal = 0;
int ppmBatas = 0;
int umurHari = 0;
int currentMenu = 0;
bool confirmed = false;
//aktuator //GPIO 34 35 36 39 adalah Pin khusus utuk input, saran pin 2,4,18,19,21,22,23,25,27
#include <Servo.h>
Servo servoMotor;
const int pompaSirkulasi = 4 ;
const int pompaA = 18;
const int pompaB = 19;
const int pompaAir = 2;
void setup() {
Serial.begin(115200);
// put your setup code here, to run once:
lcd.init();
lcd.clear();
lcd.backlight();
Wire.begin();
sensors.begin();//suhu
pinMode (pH_pin, INPUT); //pH
rtc.begin();
if (rtc.lostPower()) {
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
pinMode(KIRI, INPUT_PULLUP);
pinMode(KANAN, INPUT_PULLUP);
pinMode(ATAS, INPUT_PULLUP);
pinMode(BAWAH, INPUT_PULLUP);
// Inisialisasi pin relay
servoMotor.attach (23);
pinMode(pompaSirkulasi, OUTPUT);
pinMode(pompaA, OUTPUT);
pinMode(pompaB, OUTPUT);
pinMode(pompaAir, OUTPUT);
}
void loop() {
if (digitalRead(KANAN) == LOW) {
currentMenu++;
if (currentMenu > 4) {
currentMenu = 0;
}
delay(200); // Debounce delay
}
if (digitalRead(KIRI) == LOW && currentMenu == 4) {
currentMenu = 0;
delay(200); // Debounce delay
}
switch (currentMenu) {
case 0:
displayCurrentStatus();
break;
case 1:
setPPMAwal();
break;
case 2:
setPPMBatas();
break;
case 3:
setUmurHari();
break;
case 4:
confirmSettings();
break;
}
}
void displayCurrentStatus() {
//ppm
float temp = 20.0; // read temprature from a real sensor
float tdsValue = tds.update(temp);
if (timeout<millis())
{
timeout=millis() + 50;
}
ppmcal= (tdsValue - (-43333)) /146.036; // sensors calibration
//suhu
sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
//PH45
for(int i=0;i<10;i++)
{
buffer_arr[i]=analogRead(26);
delay(30);
}
for(int i=0;i<9;i++)
{
for(int j=i+1;j<10;j++)
{
if(buffer_arr[i]>buffer_arr[j])
{
temp=buffer_arr[i];
buffer_arr[i]=buffer_arr[j];
buffer_arr[j]=temp;
}
}
}
avgval=0;
for(int i=2;i<8;i++)
avgval+=buffer_arr[i];
ph_act= analogRead(pH_pin);
float volt=(float)avgval*5.0/4095/6;
float ph_act = volt / 0.5461;
//jarak
unsigned int jarak = sonar.ping_cm();
//rtc
static int jumlah = 0; // Variabel untuk menyimpan jumlah detik yang telah berlalu
static int previousSecond = -1; // Variabel untuk menyimpan detik sebelumnya, diinisialisasi dengan -1
if (confirmed) {
DateTime now = rtc.now();
int currentDay = now.second();
// Cek apakah nilai detik saat ini berbeda dengan nilai detik sebelumnya
if (currentDay != previousSecond) {
previousSecond = currentDay; // Perbarui nilai detik sebelumnya dengan detik saat ini
jumlah++; // Tambahkan 1 ke jumlah
// Jika jumlah mencapai 72(angka yg diingikan), hentikan program
if (jumlah >= umurHari + 1) {
Serial.println("Umur mencapai target. Menghentikan program.");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MASA");
lcd.setCursor(0, 1);
lcd.print("PANEN");
delay(200);
while (1); // Hentikan program dengan loop tak terbatas
}
}
int ppmToday = ppmAwal + ((ppmBatas - ppmAwal) * (jumlah - 1) / (umurHari - 1));
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PPM:");
lcd.print(ppmToday);
lcd.setCursor(0, 1);
lcd.print("Umur:");
lcd.print(jumlah);
delay(200);
//pompa
if (ppmcal < ppmToday)
{
digitalWrite(pompaA, LOW);
digitalWrite(pompaB, LOW);
}
else if (ppmcal = ppmToday )
{
digitalWrite(pompaSirkulasi, LOW);
}
else{
digitalWrite(pompaAir, LOW);
}
/////////////////////////////////////////////
if (jarak > 25 )
{
digitalWrite(pompaAir, LOW);
}
else if (jarak = 50 )
{
digitalWrite(pompaSirkulasi, LOW);
}
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Setting PPM");
lcd.setCursor(0, 1);
lcd.print("dan masa tanam");
delay(200);
}
}
void setPPMAwal() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PPM AWAL :");
lcd.setCursor(0, 1);
lcd.print(ppmAwal);
delay(200);
if (digitalRead(ATAS) == LOW) {
ppmAwal+=100;
delay(200);
}
if (digitalRead(BAWAH) == LOW) {
ppmAwal-=100;
delay(200);
}
}
void setPPMBatas() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BATAS PPM :");
lcd.setCursor(0, 1);
lcd.print(ppmBatas);
delay(200);
if (digitalRead(ATAS) == LOW) {
ppmBatas+=100;
delay(200);
}
if (digitalRead(BAWAH) == LOW) {
ppmBatas-=100;
delay(200);
}
}
void setUmurHari() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MASA TANAM :");
lcd.setCursor(0, 1);
lcd.print(umurHari);
delay(200);
if (digitalRead(ATAS) == LOW) {
umurHari++;
delay(200);
}
if (digitalRead(BAWAH) == LOW) {
umurHari--;
delay(200);
}
}
void confirmSettings() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PPM: ");
lcd.print(ppmAwal);
lcd.print("-");
lcd.print(ppmBatas);
lcd.setCursor(0, 1);
lcd.print("Masa Tanam: ");
lcd.print(umurHari);
delay(200);
if (digitalRead(KANAN) == LOW) {
confirmed = true;
currentMenu = 0;
delay(200); // Debounce delay
} else if (digitalRead(KIRI) == LOW) {
confirmed = false;
currentMenu = 0;
delay(200); // Debounce delay
}
}