#include <GyverTM1637.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
const int trig = 13;
const int echo = 12;
#define OX 34
#define RELAY1 14
#define RELAYOX 25
#define RELAYFeed 15
#define LED_R1 26
#define LED_R2 27
#define LED_OX1 16
#define LED_OX2 17
#define CLK 18
#define DIO 19
#define Bz 32
GyverTM1637 disp(CLK,DIO);
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
Serial.begin(115200);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
pinMode(LED_R1, OUTPUT);
pinMode(LED_R2, OUTPUT);
pinMode(LED_OX1, OUTPUT);
pinMode(LED_OX2, OUTPUT);
disp.clear();
disp.brightness(7);
disp.point(1);
rtc.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Distance : ");
lcd.setCursor(0,1);
lcd.print("Oxygen :");
lcd.setCursor(0,2);
lcd.print ("Relay : ");
lcd.setCursor(0,3);
lcd.print ("Feed : ");
delay(4000);
}
void loop() {
water_level();
Serial.println("");
OXYGEN();
Serial.println("");
dispTime();
dispSec();
Timenow();
delay(5000);
}
void water_level(){ //ฟังก์ชันตรวจระดับน้ำ
long duration, distance;
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
duration = pulseIn(echo, HIGH);
distance = duration * 0.034 / 2;
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
lcd.setCursor(12,0);
lcd.print(" ");
lcd.setCursor(12,0);
lcd.print(distance);
lcd.setCursor(15,0);
lcd.print(" CM");
if (distance > 20) {
digitalWrite(RELAY1, HIGH);
Serial.println("Relaywater ON");
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_R1, LOW);
lcd.setCursor(9,2);
lcd.print ("Dis");
tone(Bz, 1000 );
}
else {
digitalWrite(RELAY1, LOW);
Serial.println("Relaywater OFF");
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_R2, LOW);
lcd.setCursor(9,2);
lcd.print (" ");
noTone(Bz);
}
delay(1000);
}
void OXYGEN(){ //ฟังก์ชันตรวจ Oxygenในน้ำ
int potValue = analogRead(OX);
float oxygenLevel = map(potValue, 0, 4095, 0, 15);
Serial.print("Oxygen Level: ");
Serial.print(oxygenLevel);
Serial.println(" mg/L");
lcd.setCursor(9,1);
lcd.print(" ");
lcd.setCursor(9,1);
lcd.print(oxygenLevel);
lcd.setCursor(13,1);
lcd.print("mg/L");
if (oxygenLevel < 7) {
digitalWrite(RELAYOX, HIGH);
Serial.println("Relayoxygen ON");
lcd.setCursor(13,2);
lcd.print ("OX");
digitalWrite(LED_OX2, HIGH);
digitalWrite(LED_OX1, LOW);
tone(Bz, 1000 );
}
else {
digitalWrite(RELAYOX, LOW);
Serial.println("Relayoxygen OFF");
lcd.setCursor(13,2);
lcd.print (" ");
digitalWrite(LED_OX1, HIGH);
digitalWrite(LED_OX2, LOW);
noTone(Bz);
}
}
void dispSec(void){ //จุดทศนิยมบนจอบอกเวลา
disp.point(1);
delay(1000);
disp.point(0);
delay(1000);
}
void dispTime (void){ //ดึงเวลา ชั่วโมง เเละ นาที เเสดงบนจอ
DateTime now=rtc.now();
byte hrs=now.hour();
byte mins=now.minute();
disp.displayClock(hrs,mins);
}
void Timenow(){ //ฟังก์ชันให้อาหารตามเวลา
DateTime now = rtc.now(); // รับเวลาปัจจุบันจาก RTC
int currentMinute = (now.hour() * 60) + now.minute(); // คำนวณเวลาปัจจุบันเป็นนาที
// กำหนดเวลาที่ต้องการให้อาหารปลา
const int feedTimeMorning = 11 * 60 + 53; // 8:00 น.
const int feedTimeEvening = 18 * 60; // 18:00 น.
// ตรวจสอบเวลาให้อาหารปลา
if (currentMinute == feedTimeMorning || currentMinute == feedTimeEvening) {
Serial.println("กำลังให้อาหารปลา");
digitalWrite(RELAYFeed, HIGH);
lcd.setCursor(16,2);
lcd.print ("Feed");
lcd.setCursor(16,2);
lcd.print (" ");
Serial.println("RelayFeed ON");
lcd.setCursor(8,3);
lcd.print ("Feeding");
tone(Bz, 1000 );
delay(5000);
Serial.println("หยุดให้อาหารปลา");
digitalWrite(RELAYFeed, LOW);
Serial.println("RelayFeed OFF");
noTone(Bz);
lcd.setCursor(8,3);
lcd.print(" ");
delay(60000);
}
delay(1000);
}