79 lines
2.7 KiB
C
79 lines
2.7 KiB
C
#ifndef __FEED_SCALE_H
|
||
#define __FEED_SCALE_H
|
||
|
||
#include "main.h"
|
||
#include <stdint.h>
|
||
|
||
/* 单次投喂量有效范围: 0 ~ 500.0 KG, 内部以 0.1 KG 为单位保存 */
|
||
#define FEED_SCALE_ONCEWT_MIN 1 /* 0.1 KG */
|
||
#define FEED_SCALE_ONCEWT_MAX 5000 /* 500.0 KG */
|
||
#define FEED_SCALE_WEIGHT_MAX 5000 /* 500.0 KG */
|
||
|
||
/* 产品形态运行时可切换:EEPROM(偏移172) 存 0/1,空白(0xFF) 时用
|
||
* main.h 的 PRODUCT_WITH_FEED_SCALE 编译宏做默认值。
|
||
* 1=接入磅秤(智能水产投料机),称重定量自动投喂;
|
||
* 0=不接磅秤(基础四路继电器),feeding 指令直接控制继电器 1。
|
||
* 蓝牙命令 SCALE 查询,SCALE0/SCALE1 切换(写入后自动重启生效) */
|
||
extern uint8_t g_feed_scale_on;
|
||
void feed_scale_load_mode(void); /* app_init 早期调用,加载产品模式 */
|
||
void feed_scale_set_mode(uint8_t on); /* 写 EEPROM 并更新全局(重启后完全生效) */
|
||
|
||
#define FEED_SCALE_MODE_ADDR 172 /* EEPROM 产品模式字节(164~171 为电能累计脉冲) */
|
||
|
||
/* 485 读秤状态(OLED 显示用):
|
||
* 0=正常有数据 1=一直无应答 2=帧过短 3=CRC错 4=秤异常帧 5=站号/功能码不符 */
|
||
int feedScaleGetLastErr(void);
|
||
uint32_t feedScaleGetLastOkTick(void); /* 最后一次有效重量的时刻 */
|
||
|
||
/* 投喂状态 */
|
||
typedef enum {
|
||
FEED_IDLE = 0, /* 空闲 */
|
||
FEED_RUNNING, /* 投喂中: 继电器吸合,正在读485 */
|
||
FEED_DONE, /* 投喂完成 */
|
||
FEED_ERROR /* 异常结束(485失联/重量反而增加等) */
|
||
} FeedScaleState;
|
||
|
||
/* 喂料秤模块 API */
|
||
void feedScaleInit(void);
|
||
void feedScaleProcess(void);
|
||
|
||
/* 触发/停止投喂 */
|
||
void feedScaleStart(uint16_t once_wt_100g);
|
||
void feedScaleStop(void);
|
||
|
||
/* 设置/获取单次投喂量(0.1KG 单位),设置后持久化到 EEPROM */
|
||
void feedScaleSetOnceWeight(uint16_t once_wt_100g);
|
||
uint16_t feedScaleGetOnceWeight(void);
|
||
|
||
/* 设置秤去皮重量(0.1KG 单位),并持久化到 EEPROM */
|
||
void feedScaleSetZero(uint16_t zero_100g);
|
||
|
||
/* 获取当前/最近一次解析出的重量(0.1KG 单位) */
|
||
uint16_t feedScaleGetWeight(void);
|
||
|
||
/* 获取最近一次 485 原始毛重(未去皮,0.1KG 单位) */
|
||
uint16_t feedScaleGetRawWeight(void);
|
||
|
||
/* 获取当前去皮重量(0.1KG 单位) */
|
||
uint16_t feedScaleGetZero(void);
|
||
|
||
/* 获取投喂状态 */
|
||
FeedScaleState feedScaleGetState(void);
|
||
|
||
/* 获取已减少重量(0.1KG 单位),投喂结束后有效 */
|
||
uint16_t feedScaleGetReduced(void);
|
||
|
||
/* 485 轮询间隔: 空闲 30s, 投喂中 1s */
|
||
/*===== HR_IN 缺料检测(V1.7.0 新板新增): 红外对管接 PA8, 下拉输入 =====
|
||
* 低电平=有料; 传感器不接时下拉也是低, 不影响投料;
|
||
* 高电平=缺料 -> 停止投料并关闭继电器1(只记日志, 不上报) */
|
||
#define HR_IN_PIN GPIO_PIN_8
|
||
#define HR_IN_PORT GPIOA
|
||
#define HR_EMPTY_LEVEL GPIO_PIN_SET /* 缺料电平=高 */
|
||
#define HR_DEBOUNCE_CNT 50 /* app_task 10ms 周期调用, 连续50次高(≈500ms)才判缺料 */
|
||
|
||
#define FEED_SCALE_QUERY_IDLE_MS 30000u
|
||
#define FEED_SCALE_QUERY_RUN_MS 1000u
|
||
|
||
#endif /* __FEED_SCALE_H */
|