#include <Wire.h>
#include <RTClib.h>
#include <Servo.h>
#include <HX711.h>
// 定义 HX711 称重模块的引脚
const int LOADCELL_DOUT_PIN = 3;
const int LOADCELL_CLK_PIN = 2;
// 舵机连接的引脚
const int SERVO_PIN = 11;
// 定义每餐喂食的重量
const int FEED_AMOUNT = 20; // 单位为克
// 定义食物盘子的重量
const int PLATE_WEIGHT = 50; // 单位为克
// 创建 DS1307 对象
RTC_DS1307 rtc;
// 创建舵机对象
Servo servo;
// 创建 HX711 对象
HX711 scale;
void setup() {
Serial.begin(9600); // 初始化串行通信
Wire.begin();
// 初始化 DS1307 时钟模块
rtc.begin();
// 初始化舵机
servo.attach(SERVO_PIN);
// 初始化 HX711 称重模块
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_CLK_PIN);
}
void loop() {
DateTime now = rtc.now();
// 打印当前时间
Serial.print("当前时间:");
Serial.print(now.year());
Serial.print("-");
printDigits(now.month());
Serial.print("-");
printDigits(now.day());
Serial.print(" ");
printDigits(now.hour());
Serial.print(":");
printDigits(now.minute());
Serial.print(":");
printDigits(now.second());
Serial.println();
delay(1000); // 每秒更新一次时间
if ((now.hour() == 10 && now.minute() == 0 && now.second() == 0) ||
(now.hour() == 14 && now.minute() == 0 && now.second() == 0) ||
(now.hour() == 12 && now.minute() == 40 && now.second() == 55)) {
feedPet();
}
//delay(10000); // 等待一段时间再检查时间(避免频繁触发)
}
//打印时间
void printDigits(int digits) {
if (digits < 10) {
Serial.print("0");
}
Serial.print(digits);
}
//喂食
void feedPet() {
// 检查食物重量是否低于喂食量
int foodWeight = scale.get_units() * 5000 / 2100 - PLATE_WEIGHT;
Serial.println(foodWeight);
if (foodWeight < FEED_AMOUNT) {
// 打开投喂口
servo.write(30);
// 等待食物重量达到喂食量
while (foodWeight < FEED_AMOUNT) {
foodWeight = scale.get_units() * 5000 / 2100 - PLATE_WEIGHT;
delay(100);
}
// 关闭投喂口
servo.write(90);
}
}