From d9af7ec0f2d5cf57a8b59fdad156a93e35e6866a Mon Sep 17 00:00:00 2001 From: helei Date: Sat, 22 Aug 2026 10:15:04 +0800 Subject: [PATCH] =?UTF-8?q?V1.5:=20OLED=E5=B8=A6=E7=A7=A4=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E6=9C=AB=E8=A1=8C=E6=98=BE=E7=A4=BA=E9=87=8D=E9=87=8F?= =?UTF-8?q?/=E8=AF=BB=E5=8F=96=E5=A4=B1=E8=B4=A5=E5=8E=9F=E5=9B=A0;?= =?UTF-8?q?=E6=96=AD=E7=94=B5=E9=A2=84=E8=AD=A6=E6=97=B6OLED=E5=85=B3?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=BB=91=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- V1.5/STM32F103_App1/HardWare/ADC/adc.c | 2 ++ .../HardWare/FEED_SCALE/feed_scale.c | 11 ++++++- .../HardWare/FEED_SCALE/feed_scale.h | 5 +++ V1.5/STM32F103_App1/HardWare/OLED/oled.c | 6 ++++ V1.5/STM32F103_App1/HardWare/OLED/oled.h | 1 + .../HardWare/SYSINIT/app_loop.c | 33 +++++++++++++++---- V1.5/鐗堟湰璇存槑.md | 3 ++ 7 files changed, 53 insertions(+), 8 deletions(-) diff --git a/V1.5/STM32F103_App1/HardWare/ADC/adc.c b/V1.5/STM32F103_App1/HardWare/ADC/adc.c index cb577a0..e5215c4 100644 --- a/V1.5/STM32F103_App1/HardWare/ADC/adc.c +++ b/V1.5/STM32F103_App1/HardWare/ADC/adc.c @@ -1,5 +1,6 @@ #include "adc.h" #include "hlw8032.h" +#include "oled.h" #include "main.h" #include "network.h" #include "led.h" @@ -74,6 +75,7 @@ void update_batter(void) } powoff = 1; log_info("> 电量低: %d%%", (int)batter_valtage); + oled_off(); /* 屏幕黑屏(省电+避免残影) */ hlw8032_save(); /* 本地记录:电量、断电原因(都很快) */ reset_log_power_loss(); HAL_Delay(800); /* OK 后再留 800ms 让报文上空口 */ diff --git a/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c b/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c index ff2671d..1d5dc20 100644 --- a/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c +++ b/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c @@ -157,6 +157,12 @@ static int feed_scale_report_weight(const char *header) 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; /* 加载产品模式:EEPROM 空白时用编译宏做默认值 */ @@ -359,7 +365,10 @@ void feedScaleProcess(void) /* 读取 485 返回 */ len = feed_scale_read_frame(rx_buf, sizeof(rx_buf)); 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_weight = cur_weight > zero_weight ? (cur_weight - zero_weight) : 0; /* 净重 */ if (!first_query_reported) { diff --git a/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.h b/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.h index 3efa751..b99620f 100644 --- a/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.h +++ b/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.h @@ -20,6 +20,11 @@ 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, /* 空闲 */ diff --git a/V1.5/STM32F103_App1/HardWare/OLED/oled.c b/V1.5/STM32F103_App1/HardWare/OLED/oled.c index 56a7a26..7527e97 100644 --- a/V1.5/STM32F103_App1/HardWare/OLED/oled.c +++ b/V1.5/STM32F103_App1/HardWare/OLED/oled.c @@ -99,6 +99,12 @@ static void lcd_address(uint8_t page, uint8_t column) oled_write(0, (page & 0x0f)); /* 列地址低 4 位 */ } +/*==== 关显示(黑屏,断电预警时调用)====*/ +void oled_off(void) +{ + oled_write(0, 0xAE); /* display off */ +} + /*==== 全屏清屏 ====*/ void oled_clear(void) { diff --git a/V1.5/STM32F103_App1/HardWare/OLED/oled.h b/V1.5/STM32F103_App1/HardWare/OLED/oled.h index 65f82cf..824a465 100644 --- a/V1.5/STM32F103_App1/HardWare/OLED/oled.h +++ b/V1.5/STM32F103_App1/HardWare/OLED/oled.h @@ -11,6 +11,7 @@ void oled_init(void); /* GPIO + 屏幕初始化(app_init 调用) */ 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_xoff(uint8_t px); /* 在当前列基础上右移 px 像素(防烧屏偏移用) */ void oled_print(const char *gbk_str); /* 从当前位置显示 GBK 字符串 */ diff --git a/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c b/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c index 9d81d0a..fcea955 100644 --- a/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c +++ b/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c @@ -272,13 +272,32 @@ static void oled_home_refresh(uint32_t up_ms) oled_locate(2, 0); oled_xoff(xoff); oled_print_line(""); } - /* R3: 开关状态 */ - 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); + /* R3: 带秤模式显示重量(读不到显示原因),无秤模式显示开关状态 */ + if (g_feed_scale_on) { + if (feedScaleGetLastErr() == 0 && + (HAL_GetTick() - feedScaleGetLastOkTick()) < 40000u) { + snprintf(buf, sizeof(buf), "重量:%.1fKG", + (double)(feedScaleGetWeight() / 10.0f)); + } 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 { /*---- 未联网界面:联网进度 ----*/ net_ui_phase_t ph = g_net_ui_phase; diff --git a/V1.5/鐗堟湰璇存槑.md b/V1.5/鐗堟湰璇存槑.md index b445ad3..13a9f2f 100644 --- a/V1.5/鐗堟湰璇存槑.md +++ b/V1.5/鐗堟湰璇存槑.md @@ -176,3 +176,6 @@ 3 娆¢兘澶辫触涔熺収甯稿啓璁板綍澶嶄綅锛堜笉鍥犲彂閫佸け璐ヤ涪鏂數璁板綍锛 - 鍘绘帀鐢佃兘搴曟暟 1kWh 鏈哄埗锛堢敤鎴风‘璁ゅ钩鍙板彲姝e父鏄剧ず灏忔暟鍊硷級 - 鏂板钃濈墮 ENCLR 鍛戒护锛氱疮璁$數鑳芥竻闆讹紙RAM+EEPROM 鍚屾锛屾棤闇閲嶅惎锛 +- OLED 甯︾Г妯″紡绗 3 琛屾敼鏄剧ず閲嶉噺锛坄閲嶉噺:xx.xKG`锛夛紝璇讳笉鍒版椂鏄剧ず鍘熷洜 + 锛堟棤搴旂瓟/甯х煭/CRC閿/绉ゅ紓甯稿抚/绔欏彿涓嶇锛夛紱鏃犵Г妯″紡浠嶆樉绀哄紑鍏崇姸鎬 +- 鏂數棰勮鏃 OLED 鍏虫樉绀猴紙0xAE 榛戝睆锛岀渷鐢+閬垮厤娈嬪奖锛