不干了!!!收

This commit is contained in:
2026-02-26 14:26:55 +08:00
parent 1fc85589c6
commit d185f63856
7 changed files with 583 additions and 114 deletions

View File

@@ -89,12 +89,21 @@ uint8_t AHT30_Init(I2C_HandleTypeDef *hi2c) {
elog_d(AHT30_TAG, "开始初始化AHT30传感器");
// 等待传感器上电稳定
osDelay(50);
osDelay(100);
// 读取初始状态
// 读取初始状态最多重试3次
uint8_t status;
if (AHT30_ReadBytes(&status, 1)) {
elog_d(AHT30_TAG, "AHT30初始状态: 0x%02X", status);
uint8_t retry = 0;
for (retry = 0; retry < 3; retry++) {
if (AHT30_ReadBytes(&status, 1)) {
elog_d(AHT30_TAG, "AHT30初始状态: 0x%02X", status);
break;
}
osDelay(10); // 重试间隔
}
if (retry >= 3) {
elog_e(AHT30_TAG, "读取AHT30初始状态失败");
return 0;
}
// 检查校准使能位,如果未启用则执行复位校准

View File

@@ -2,7 +2,7 @@
// 全局变量(零点偏移值、标定系数)
int32_t hx711_zero_offset = 0; // 零点偏移空载时的AD值
float hx711_scale = 0.002762; // 标定系数(重量/AD差值
float hx711_scale = 1.0f; // 标定系数(重量/AD差值
// #################### 基础函数 ####################
void delay_us(uint32_t us) {
@@ -13,7 +13,8 @@ void delay_us(uint32_t us) {
}
// 初始化HX711引脚SCK输出DOUT输入
void HX711_Init(void) {
// 初始化SCK引脚为低电平
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET);
}
// 读取单次AD原始数据gain增益选择
int32_t HX711_ReadData(uint8_t gain) {

View File

@@ -20,6 +20,10 @@ extern uint8_t Request_Water(uint8_t cmd);
// 系统模式设置函数声明定义在freertos.c中
extern void Set_System_Mode(uint8_t mode);
// 定时喂食配置函数声明定义在freertos.c中
extern void Update_Feed_Config(const char *feed_times_json, uint16_t single_weight);
extern uint16_t Get_Single_Feed_Weight(void);
/* ================= 配置 ================= */
#define WIFI_TX_BUF_SIZE 512
@@ -585,8 +589,15 @@ void wifi_task_mqtt(void *argument) {
elog_i(TAG, "处理control主题消息");
if (strstr(msg.payload, "feed")) {
elog_i(TAG, "执行喂食动作");
// 根据配置的单次喂食重量计算份数每份10克
uint16_t single_weight = Get_Single_Feed_Weight();
uint8_t feed_amount = single_weight / 10;
if (feed_amount < 1) {
feed_amount = 1; // 至少喂食1份
}
elog_i(TAG, "远程喂食重量: %dg, 计算份数: %d", single_weight, feed_amount);
// 调用远程喂食函数
if (Request_Feed(FEED_CMD_REMOTE, 90, 1)) {
if (Request_Feed(FEED_CMD_REMOTE, 90, feed_amount)) {
elog_i(TAG, "远程喂食请求已提交");
} else {
elog_w(TAG, "喂食进行中,无法接受新命令");
@@ -644,10 +655,71 @@ void wifi_task_mqtt(void *argument) {
}
/* ===== config主题 ===== */
/**
{
"feedTimes": [
"02:00",
"02:04"
],
"singleFeedWeight": 50
}
*/
else if (strcmp(msg.topic, "petfeeder/config") == 0) {
elog_i(TAG, "处理config主题消息");
elog_i(TAG, "更新配置参数");
// 其他配置参数更新逻辑
// 解析JSON配置
char *feed_times_start = strstr(msg.payload, "\"feedTimes\"");
char *single_weight_start = strstr(msg.payload, "\"singleFeedWeight\"");
if (feed_times_start && single_weight_start) {
// 提取feedTimes数组字符串
char *bracket_start = strstr(feed_times_start, "[");
char *bracket_end = strstr(feed_times_start, "]");
if (bracket_start && bracket_end && bracket_end > bracket_start) {
// 计算数组字符串长度
size_t array_len = bracket_end - bracket_start + 1;
char feed_times_array[256] = {0};
if (array_len < sizeof(feed_times_array)) {
strncpy(feed_times_array, bracket_start, array_len);
feed_times_array[array_len] = '\0';
// 提取singleFeedWeight值
char *colon = strstr(single_weight_start, ":");
if (colon) {
// 跳过冒号和可能的空格
char *value_start = colon + 1;
while (*value_start == ' ' || *value_start == '\t') {
value_start++;
}
// 解析数字
uint16_t single_weight = 0;
if (sscanf(value_start, "%hu", &single_weight) == 1) {
elog_i(TAG, "解析到配置: feedTimes=%s, singleFeedWeight=%d",
feed_times_array, single_weight);
// 调用更新函数
Update_Feed_Config(feed_times_array, single_weight);
elog_i(TAG, "喂食配置更新完成");
} else {
elog_w(TAG, "解析singleFeedWeight失败");
}
} else {
elog_w(TAG, "找不到singleFeedWeight的冒号");
}
} else {
elog_w(TAG, "feedTimes数组太长超出缓冲区");
}
} else {
elog_w(TAG, "找不到feedTimes数组的括号");
}
} else {
elog_w(TAG, "JSON格式错误缺少feedTimes或singleFeedWeight字段");
}
}
} else {
elog_w(TAG, "MQTT消息解析失败");