#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define led 13
#include <Servo.h>
#include <DHT.h>
#define DHTPIN 7 //chan cam bien
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#include <RTClib.h>
RTC_DS1307 rtc;
Servo myServo;
int servoPin = 11;
// khai báo nút nhấn
int buttonPin = 10;
/* Display */
LiquidCrystal_I2C lcd(0x27, 20, 4);
byte icon_do_c[] = {
B01000,
B10100,
B10100,
B01000,
B00000,
B00000,
B00000,
B00000
};
// Keypad
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {A3, A2, A1, A0};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup() {
lcd.begin(20,4); // Khởi tạo LCD
lcd.clear();
lcd.setCursor(0,0); // Đặt con trỏ tại cột 2, dòng 0
lcd.print("FISH FEEDING SYSTEM");
lcd.setCursor(0,1);
lcd.print("A.Chuc Nang" );
lcd.setCursor(0,2);
lcd.print("B.Tinh Trang Thuc An");
lcd.setCursor(0,3);
lcd.print("C.Feeding Time Set ");
// led
pinMode(led, OUTPUT);
// đặt đèn mặc đinh tắt
digitalWrite(led, LOW);
// kết nối động cơ servo
myServo.attach(servoPin);
myServo.write(45);
// đo cảm biến
Serial.begin(9600);
dht.begin();
pinMode(buttonPin, INPUT);
}
void displayWelcomeScreen() {
lcd.clear();
lcd.setCursor(0,0); // Đặt con trỏ tại cột 2, dòng 0
lcd.print("FISH FEEDING SYSTEM");
lcd.setCursor(0,1);
lcd.print("A.Chuc Nang" );
lcd.setCursor(0,2);
lcd.print("B.Tinh Trang Thuc An");
lcd.setCursor(0,3);
lcd.print("C.Feeding Time Set ");
}
void loop() {
// Kiểm tra nếu nhấn phím 1 trên keypad
char key = keypad.getKey();
if (key == 'A') {
lcd.clear(); // Xóa nội dung trên LCD
lcd.setCursor(0, 0); // Đặt con trỏ tại cột 0, dòng 0
lcd.print("1.Thoi Gian Sang/Tat ");
lcd.setCursor(0,1);
lcd.print("2.Bat Den");
lcd.setCursor(0,2);
lcd.print("3.Tat Den");
lcd.setCursor(0,3);
lcd.print("4.Cho Ca An");
while(true) {
key = keypad.getKey();
if (key == 'D') {
displayWelcomeScreen();
break;
}
if (key == '1'){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("1.1Min");
lcd.setCursor(0,1);
lcd.print("2.10Min");
lcd.setCursor(0,2);
lcd.print("3.30Min");
lcd.setCursor(0,3);
lcd.print("4.1H");
lcd.setCursor(10,0);
lcd.print("5.12H");
lcd.setCursor(10,1);
lcd.print("6.1Day");
lcd.setCursor(10,2);
lcd.print("7.5Day");
lcd.setCursor(10,3);
lcd.print("8.30Day");
// key 1 cai dat giowf
while(true) {
char key = keypad.getKey();
if (key == '1') {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Setup Thanh Cong");
lcd.setCursor(0,1);
lcd.print("Nhan Nut 'D' Ba Lan ");
lcd.setCursor(0,2);
lcd.print("De Thoat ");
digitalWrite(led, HIGH);
unsigned long startTime = millis(); // Lưu thời gian bắt đầu
while (millis() - startTime < 1000) { // Chờ 1 giây
key = keypad.getKey();
if (key == 'D') {
displayWelcomeScreen();
break;
}
}
digitalWrite(led, LOW); // Tắt LED sau 1 giây
} else if (key == '2') {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Setup Thanh Cong");
lcd.setCursor(0,1);
lcd.print("Nhan Nut 'D' Ba Lan ");
lcd.setCursor(0,2);
lcd.print("De Thoat ");
digitalWrite(led, HIGH);
unsigned long startTime = millis(); // Lưu thời gian bắt đầu
while (millis() - startTime < 5000) { // Chờ 5 giây
key = keypad.getKey();
if (key == 'D') {
displayWelcomeScreen();
break;
}
}
digitalWrite(led, LOW); // Tắt LED sau 5 giây
} else if (key == 'D') {
displayWelcomeScreen();
break;
}
}
}
if (key == '2') {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Den duoc bat");
lcd.setCursor(0,1);
lcd.print("Nhan 'D' De Thoat");
digitalWrite(led, HIGH);
break;
}
if (key == '3'){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Den duoc tat");
lcd.setCursor(0,1);
lcd.print("Nhan 'D' De Thoat");
digitalWrite(led, LOW);
break;
}
if (key == '4') {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Dang Cho Ca An");
lcd.setCursor(0,1);
lcd.print("Nhan 'D' De Dung");
myServo.write(45);
}
}
}
if (key == 'D') {
displayWelcomeScreen();
}
// dkhien cam bien
if (key == 'B') {
lcd.clear();
// Đọc dữ liệu từ cảm biến DHT
float do_am = dht.readHumidity();
float nhiet_do = dht.readTemperature();
if (isnan(do_am) || isnan(nhiet_do)) {
Serial.println("Khong doc duoc tu cam bien!");
return;
}
Serial.print("Nhiet Do: ");
Serial.print(nhiet_do);
Serial.println("°C");
Serial.print("Do Am: ");
Serial.print(do_am);
Serial.println("%");
// Đọc thời gian từ module DS1307
DateTime now = rtc.now();
int gio = now.hour();
int phut = now.minute();
int giay = now.second();
// Hiển thị nhiệt độ, độ ẩm và thời gian lên LCD
lcd.setCursor(0, 0);
lcd.print("Nhiet Do: ");
lcd.print(nhiet_do);
lcd.setCursor(16, 0);
lcd.print("( C)");
lcd.createChar(0, icon_do_c);
lcd.setCursor(17, 0);
lcd.write(0);
lcd.setCursor(0, 1);
lcd.print("Do Am: ");
lcd.print(do_am);
lcd.setCursor(14, 1);
lcd.print("(%)");
lcd.setCursor(0, 2);
lcd.print("Thoi gian: ");
if (gio < 10) lcd.print("0");
lcd.print(gio);
lcd.print(":");
if (phut < 10) lcd.print("0");
lcd.print(phut);
lcd.print(":");
if (giay < 10) lcd.print("0");
lcd.print(giay);
lcd.setCursor(0, 3);
lcd.print("Nhan 'D' De Thoat");
}
if (key == 'C') {
lcd.clear(); // Xóa nội dung trên LCD
lcd.setCursor(0, 0); // Đặt con trỏ tại cột 0, dòng 0
lcd.print("1. 4 Lan (5s/lan)");
lcd.setCursor(0,1);
lcd.print("2. 2 Lan (1p/Lan)");
lcd.setCursor(0,2);
lcd.print("3. 2 Lan (12H/Lan)");
lcd.setCursor(0,3);
lcd.print("4. 3 Lan (6H/Lan)");
while(true) {
key = keypad.getKey();
if (key == 'D') {
displayWelcomeScreen();
break;
}
if (key == '1'){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Nhan 'D' De Dung");
int dung_cho_an = 0;
while (dung_cho_an < 4) {
// Xoay servo về 0 độ
myServo.write(90);
delay(5000); // Dừng 1 giây
// Xoay servo đến 45 độ
myServo.write(45);
delay(2000); // Chạy 1 giây
dung_cho_an += 1;
// kiểm tra nút D đc nahasn k
if (key == 'D') {
break; // Thoát khỏi vòng lặp trong
}
}
}
if (key == '2'){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Nhan 'D' De Dung");
int dung_cho_an = 0;
while (dung_cho_an < 2) {
// Xoay servo về 0 độ
myServo.write(90);
delay(60000); // Dừng 1p
// Xoay servo đến 45 độ
myServo.write(45);
delay(2000); // Chạy 1 giây
dung_cho_an += 1;
// kiểm tra nút D đc nahasn k
if (key == 'D') {
break; // Thoát khỏi vòng lặp trong
}
}
}
// tuong tự
}
}
// Đọc trạng thái của nút nhấn
if (digitalRead(buttonPin) == LOW) {
// Nút nhấn được bấm
myServo.write(90); // Xoay động cơ 30 độ
}
if (digitalRead(buttonPin) == HIGH) {
myServo.write(45);
}
lcd.display(); // Hiển thị nội dung trên LCD
}