shuichan_new/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.h

79 lines
2.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 */