V1.5: OLED带秤模式末行显示重量/读取失败原因;断电预警时OLED关显示黑屏
This commit is contained in:
parent
9fe6cc0b27
commit
d9af7ec0f2
|
|
@ -1,5 +1,6 @@
|
||||||
#include "adc.h"
|
#include "adc.h"
|
||||||
#include "hlw8032.h"
|
#include "hlw8032.h"
|
||||||
|
#include "oled.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "led.h"
|
#include "led.h"
|
||||||
|
|
@ -74,6 +75,7 @@ void update_batter(void)
|
||||||
}
|
}
|
||||||
powoff = 1;
|
powoff = 1;
|
||||||
log_info("> 电量低: %d%%", (int)batter_valtage);
|
log_info("> 电量低: %d%%", (int)batter_valtage);
|
||||||
|
oled_off(); /* ÆÁÄ»ºÚÆÁ£¨Ê¡µç+±ÜÃâ²ÐÓ°£© */
|
||||||
hlw8032_save(); /* 本地记录:电量、断电原因(都很快) */
|
hlw8032_save(); /* 本地记录:电量、断电原因(都很快) */
|
||||||
reset_log_power_loss();
|
reset_log_power_loss();
|
||||||
HAL_Delay(800); /* OK 后再留 800ms 让报文上空口 */
|
HAL_Delay(800); /* OK 后再留 800ms 让报文上空口 */
|
||||||
|
|
|
||||||
|
|
@ -157,6 +157,12 @@ static int feed_scale_report_weight(const char *header)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t s_last_ok_tick = 0;
|
||||||
|
static int s_last_err = 1; /* 上电默认"无应答" */
|
||||||
|
|
||||||
|
int feedScaleGetLastErr(void) { return s_last_err; }
|
||||||
|
uint32_t feedScaleGetLastOkTick(void) { return s_last_ok_tick; }
|
||||||
|
|
||||||
uint8_t g_feed_scale_on = 0;
|
uint8_t g_feed_scale_on = 0;
|
||||||
|
|
||||||
/* 加载产品模式:EEPROM 空白时用编译宏做默认值 */
|
/* 加载产品模式:EEPROM 空白时用编译宏做默认值 */
|
||||||
|
|
@ -359,7 +365,10 @@ void feedScaleProcess(void)
|
||||||
/* 读取 485 返回 */
|
/* 读取 485 返回 */
|
||||||
len = feed_scale_read_frame(rx_buf, sizeof(rx_buf));
|
len = feed_scale_read_frame(rx_buf, sizeof(rx_buf));
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
if (feed_scale_parse_weight(rx_buf, len, &cur_weight) == 0) {
|
int prc = feed_scale_parse_weight(rx_buf, len, &cur_weight);
|
||||||
|
s_last_err = (prc == 0) ? 0 : (prc == -1 ? 2 : (prc == -2 ? 3 : (prc == -4 ? 4 : 5)));
|
||||||
|
if (prc == 0) s_last_ok_tick = HAL_GetTick();
|
||||||
|
if (prc == 0) {
|
||||||
last_raw_weight = cur_weight; /* 保存原始毛重 */
|
last_raw_weight = cur_weight; /* 保存原始毛重 */
|
||||||
last_weight = cur_weight > zero_weight ? (cur_weight - zero_weight) : 0; /* 净重 */
|
last_weight = cur_weight > zero_weight ? (cur_weight - zero_weight) : 0; /* 净重 */
|
||||||
if (!first_query_reported) {
|
if (!first_query_reported) {
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,11 @@ void feed_scale_set_mode(uint8_t on); /* д EEPROM
|
||||||
|
|
||||||
#define FEED_SCALE_MODE_ADDR 172 /* EEPROM 产品模式字节(164~171 为电能累计脉冲) */
|
#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 {
|
typedef enum {
|
||||||
FEED_IDLE = 0, /* 空闲 */
|
FEED_IDLE = 0, /* 空闲 */
|
||||||
|
|
|
||||||
|
|
@ -99,6 +99,12 @@ static void lcd_address(uint8_t page, uint8_t column)
|
||||||
oled_write(0, (page & 0x0f)); /* 列地址低 4 位 */
|
oled_write(0, (page & 0x0f)); /* 列地址低 4 位 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*==== 关显示(黑屏,断电预警时调用)====*/
|
||||||
|
void oled_off(void)
|
||||||
|
{
|
||||||
|
oled_write(0, 0xAE); /* display off */
|
||||||
|
}
|
||||||
|
|
||||||
/*==== 全屏清屏 ====*/
|
/*==== 全屏清屏 ====*/
|
||||||
void oled_clear(void)
|
void oled_clear(void)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
void oled_init(void); /* GPIO + 屏幕初始化(app_init 调用) */
|
void oled_init(void); /* GPIO + 屏幕初始化(app_init 调用) */
|
||||||
void oled_clear(void); /* 全屏清屏 */
|
void oled_clear(void); /* 全屏清屏 */
|
||||||
|
void oled_off(void); /* 关显示(0xAE),黑屏,断电前调用 */
|
||||||
void oled_locate(uint8_t row, uint8_t col8); /* 定位:row 0~3,col8 为 8 像素单位 0~15 */
|
void oled_locate(uint8_t row, uint8_t col8); /* 定位:row 0~3,col8 为 8 像素单位 0~15 */
|
||||||
void oled_xoff(uint8_t px); /* 在当前列基础上右移 px 像素(防烧屏偏移用) */
|
void oled_xoff(uint8_t px); /* 在当前列基础上右移 px 像素(防烧屏偏移用) */
|
||||||
void oled_print(const char *gbk_str); /* 从当前位置显示 GBK 字符串 */
|
void oled_print(const char *gbk_str); /* 从当前位置显示 GBK 字符串 */
|
||||||
|
|
|
||||||
|
|
@ -272,13 +272,32 @@ static void oled_home_refresh(uint32_t up_ms)
|
||||||
oled_locate(2, 0); oled_xoff(xoff); oled_print_line("");
|
oled_locate(2, 0); oled_xoff(xoff); oled_print_line("");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* R3: 开关状态 */
|
/* R3: 带秤模式显示重量(读不到显示原因),无秤模式显示开关状态 */
|
||||||
snprintf(buf, sizeof(buf), "开关:%s%s%s%s",
|
if (g_feed_scale_on) {
|
||||||
MqttInfoStr.Relay_State[1] ? "开" : "关",
|
if (feedScaleGetLastErr() == 0 &&
|
||||||
MqttInfoStr.Relay_State[2] ? "开" : "关",
|
(HAL_GetTick() - feedScaleGetLastOkTick()) < 40000u) {
|
||||||
MqttInfoStr.Relay_State[3] ? "开" : "关",
|
snprintf(buf, sizeof(buf), "重量:%.1fKG",
|
||||||
MqttInfoStr.Relay_State[4] ? "开" : "关");
|
(double)(feedScaleGetWeight() / 10.0f));
|
||||||
oled_locate(3, 0); oled_xoff(xoff); oled_print_line(buf);
|
} else {
|
||||||
|
const char *reason;
|
||||||
|
switch (feedScaleGetLastErr()) {
|
||||||
|
case 2: reason = "帧短"; break;
|
||||||
|
case 3: reason = "CRC错"; break;
|
||||||
|
case 4: reason = "秤异常帧"; break;
|
||||||
|
case 5: reason = "站号不符"; break;
|
||||||
|
default: reason = "无应答"; break;
|
||||||
|
}
|
||||||
|
snprintf(buf, sizeof(buf), "重量:%s", reason);
|
||||||
|
}
|
||||||
|
oled_locate(3, 0); oled_xoff(xoff); oled_print_line(buf);
|
||||||
|
} else {
|
||||||
|
snprintf(buf, sizeof(buf), "开关:%s%s%s%s",
|
||||||
|
MqttInfoStr.Relay_State[1] ? "开" : "关",
|
||||||
|
MqttInfoStr.Relay_State[2] ? "开" : "关",
|
||||||
|
MqttInfoStr.Relay_State[3] ? "开" : "关",
|
||||||
|
MqttInfoStr.Relay_State[4] ? "开" : "关");
|
||||||
|
oled_locate(3, 0); oled_xoff(xoff); oled_print_line(buf);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/*---- 未联网界面:联网进度 ----*/
|
/*---- 未联网界面:联网进度 ----*/
|
||||||
net_ui_phase_t ph = g_net_ui_phase;
|
net_ui_phase_t ph = g_net_ui_phase;
|
||||||
|
|
|
||||||
|
|
@ -176,3 +176,6 @@
|
||||||
3 次都失败也照常写记录复位(不因发送失败丢断电记录)
|
3 次都失败也照常写记录复位(不因发送失败丢断电记录)
|
||||||
- 去掉电能底数 1kWh 机制(用户确认平台可正常显示小数值)
|
- 去掉电能底数 1kWh 机制(用户确认平台可正常显示小数值)
|
||||||
- 新增蓝牙 ENCLR 命令:累计电能清零(RAM+EEPROM 同步,无需重启)
|
- 新增蓝牙 ENCLR 命令:累计电能清零(RAM+EEPROM 同步,无需重启)
|
||||||
|
- OLED 带秤模式第 3 行改显示重量(`重量:xx.xKG`),读不到时显示原因
|
||||||
|
(无应答/帧短/CRC错/秤异常帧/站号不符);无秤模式仍显示开关状态
|
||||||
|
- 断电预警时 OLED 关显示(0xAE 黑屏,省电+避免残影)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue