Bài viết
Bộ điều khiển hồ cá tự động với ESP32
🐠
Nuôi cá cảnh đòi hỏi cho ăn đúng giờ và nhiệt độ nước ổn định — hai việc dễ bị bỏ quên khi đi công tác hoặc du lịch vài ngày. Bộ điều khiển hồ cá tự động dùng ESP32 giải quyết cả hai: cho ăn tự động theo lịch bằng servo, đo nhiệt độ nước liên tục bằng cảm biến chống nước, và gửi cảnh báo qua Telegram ngay khi nhiệt độ vượt ngưỡng an toàn — tất cả có thể theo dõi từ xa qua điện thoại.
Nguyên lý hoạt động
- ESP32 giữ đồng bộ thời gian thực qua NTP (lấy giờ chuẩn từ internet), so sánh với các khung giờ cho ăn đã đặt trước (ví dụ 8:00 và 18:00 hằng ngày).
- Đến đúng giờ, servo gắn ở phễu chứa thức ăn xoay một góc nhỏ để thả một lượng thức ăn định trước, sau đó xoay về vị trí đóng.
- Cảm biến nhiệt độ chống nước DS18B20 đo nhiệt độ nước liên tục; nếu vượt quá dải an toàn (ví dụ dưới 22°C hoặc trên 30°C tùy loại cá), ESP32 gửi tin nhắn cảnh báo qua Telegram Bot API.
- Toàn bộ trạng thái (nhiệt độ hiện tại, lần cho ăn gần nhất) có thể publish qua MQTT để hiển thị trên dashboard hoặc Home Assistant.
Linh kiện
- ESP32 (có WiFi để đồng bộ NTP và gửi Telegram)
- Servo SG90 gắn ở phễu đựng thức ăn cá dạng viên
- Cảm biến nhiệt độ chống nước DS18B20 (giao tiếp 1-Wire)
- Điện trở 4.7kΩ (pull-up cho DS18B20)
- Phễu chứa thức ăn tự chế hoặc mua sẵn, có cửa xoay khớp với trục servo
- Nguồn 5V ổn định, đặt bộ điều khiển ở nơi khô ráo tránh hơi nước từ hồ
Code mẫu
#include <WiFi.h>
#include <time.h>
#include <ESP32Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <UniversalTelegramBot.h>
#include <WiFiClientSecure.h>
const char* WIFI_SSID = "ten-wifi";
const char* WIFI_PASS = "mat-khau-wifi";
const char* BOT_TOKEN = "TELEGRAM_BOT_TOKEN";
const char* CHAT_ID = "TELEGRAM_CHAT_ID";
Servo feederServo;
OneWire oneWire(4);
DallasTemperature tempSensor(&oneWire);
WiFiClientSecure secureClient;
UniversalTelegramBot bot(BOT_TOKEN, secureClient);
const int FEED_HOURS[] = {8, 18}; // cho an luc 8h va 18h moi ngay
int lastFedHour = -1;
const float TEMP_MIN = 22.0;
const float TEMP_MAX = 30.0;
bool alertSent = false;
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) delay(500);
configTime(7 * 3600, 0, "pool.ntp.org"); // GMT+7
feederServo.attach(13);
feederServo.write(0); // vi tri dong
tempSensor.begin();
secureClient.setInsecure();
}
void feedFish() {
feederServo.write(90); // mo cua tha thuc an
delay(500);
feederServo.write(0); // dong lai
bot.sendMessage(CHAT_ID, "Da cho ca an luc " + String(millis() / 1000), "");
}
void checkTemperature() {
tempSensor.requestTemperatures();
float tempC = tempSensor.getTempCByIndex(0);
if ((tempC < TEMP_MIN || tempC > TEMP_MAX) && !alertSent) {
bot.sendMessage(CHAT_ID, "CANH BAO: nhiet do ho ca la " + String(tempC) + " do C", "");
alertSent = true;
} else if (tempC >= TEMP_MIN && tempC <= TEMP_MAX) {
alertSent = false; // reset de canh bao lai neu tai bat thuong
}
}
void loop() {
struct tm timeInfo;
if (getLocalTime(&timeInfo)) {
for (int h : FEED_HOURS) {
if (timeInfo.tm_hour == h && timeInfo.tm_min == 0 && lastFedHour != h) {
feedFish();
lastFedHour = h;
}
}
}
checkTemperature();
delay(30000); // kiem tra moi 30 giay
}
Những lỗi thường gặp
- Servo bị kẹt vì thức ăn viên lọt vào khe cơ khí — thiết kế phễu sao cho khe thoát chỉ đủ rộng cho một lượng thức ăn nhỏ mỗi lần xoay, tránh viên thức ăn chèn vào bánh răng servo.
- Không đặt ngưỡng chống lặp cảnh báo khiến Telegram bị spam tin nhắn liên tục khi nhiệt độ dao động quanh ngưỡng — dùng biến
alertSentđể chỉ gửi cảnh báo một lần cho tới khi nhiệt độ về bình thường. - Đặt ESP32 quá gần mặt nước dễ hỏng do hơi ẩm hoặc nước bắn — chỉ để cảm biến DS18B20 (đã chống nước) ngâm trong hồ, còn board ESP32 đặt trên cao, khô ráo.
- Mất kết nối WiFi khi đi xa khiến không đồng bộ được giờ NTP và không cho ăn đúng lịch — cân nhắc thêm module RTC (DS3231) để giữ giờ chính xác ngay cả khi mất mạng tạm thời.
Mở rộng
Thêm cảm biến mực nước để cảnh báo khi cần châm thêm nước, gắn bơm nhỏ để tự động thay nước một phần theo lịch, hoặc dùng camera ESP32-CAM như trong bài camera giám sát ESP32-CAM để xem cá từ xa qua điện thoại.
Thẻ:#esp32#sensors#automation
Bình luận