基于STM32与influxDB的电力监控系统-4
一、目标:
修复基于STM32与influxDB的电力监控系统-3中的bug
二、问题:
面切换逻辑和显示逻辑存在一个小的bug。当第四次按下KEY1时,g_current_page
会从2变为0(PAGE_DATA),但是显示逻辑没有正确处理这种情况。主要问题在于各个页面的first_display
静态变量没有在页面切换时重置。
三、具体修改
/*** @brief 显示数据页面* @param current_rms: 电流RMS值* @param voltage_rms: 电压RMS值* @param current_value: 电流计算值* @param voltage_value: 电压计算值* @retval 无*/
void display_data_page(float current_rms, float voltage_rms, float current_value, float voltage_value)
{static uint8_t prev_page = 0xFF; /* 前一个页面 *//* 如果页面发生变化,重新显示静态内容 */if (prev_page != PAGE_DATA){/* 清除数据区域 */lcd_fill(0, 50, 239, 200, WHITE);/* 显示电流传感器信息 */lcd_show_string(30, 60, 200, 12, 12, "CURRENT SENSOR:", BLUE);lcd_show_string(30, 75, 200, 12, 12, "ADC_CH0_RMS:", BLUE);lcd_show_string(30, 90, 200, 12, 12, "CURRENT: 0.000A", BLUE);/* 显示电压传感器信息 */lcd_show_string(30, 110, 200, 12, 12, "VOLTAGE SENSOR:", BLUE);lcd_show_string(30, 125, 200, 12, 12, "ADC_CH1_RMS:", BLUE);lcd_show_string(30, 140, 200, 12, 12, "VOLTAGE: 000.0V", BLUE);/* 显示页面标识 */lcd_show_string(100, 180, 200, 16, 16, "DATA PAGE", RED);prev_page = PAGE_DATA;}/* 显示ADC RMS值 */lcd_fill(102, 75, 150, 87, WHITE);lcd_show_xnum(102, 75, (uint16_t)current_rms, 4, 12, 0, BLUE);lcd_fill(102, 125, 150, 137, WHITE);lcd_show_xnum(102, 125, (uint16_t)voltage_rms, 4, 12, 0, BLUE);/* 显示电流值 */lcd_fill(78, 90, 150, 102, WHITE);if (current_value < 10.0f) /* 显示格式: X.XXX A */{lcd_show_xnum(78, 90, (uint16_t)current_value, 1, 12, 0, BLUE); /* 整数部分 */float decimal_current = (current_value - (uint16_t)current_value) * 1000; /* 小数部分 */lcd_show_xnum(90, 90, (uint16_t)decimal_current, 3, 12, 0X80, BLUE); /* 小数部分 */lcd_show_string(114, 90, 200, 12, 12, "A", BLUE);}/* 显示电压值 */lcd_fill(78, 140, 150, 152, WHITE);if (voltage_value < 1000.0f) /* 显示格式: XXX.X V */{lcd_show_xnum(78, 140, (uint16_t)voltage_value, 3, 12, 0, BLUE); /* 整数部分 */float decimal_voltage = (voltage_value - (uint16_t)voltage_value) * 10; /* 小数部分 */lcd_show_xnum(102, 140, (uint16_t)decimal_voltage, 1, 12, 0X80, BLUE); /* 小数部分 */lcd_show_string(114, 140, 200, 12, 12, "V", BLUE);}
}/*** @brief 优化后的波形页面显示* @param 无* @retval 无*/
void display_wave_page_optimized(void)
{static uint8_t prev_page = 0xFF; /* 前一个页面 *//* 如果页面发生变化,重新显示静态内容 */if (prev_page != PAGE_WAVE){/* 清除波形区域 */lcd_fill(0, 50, 239, 200, WHITE);/* 绘制电流波形区域 */lcd_draw_rectangle(WAVE_OFFSET_X, WAVE_OFFSET_Y, WAVE_OFFSET_X + WAVE_WIDTH, WAVE_OFFSET_Y + WAVE_HEIGHT, BLACK);lcd_show_string(WAVE_OFFSET_X + 5, WAVE_OFFSET_Y + 5, 100, 12, 12, "CURRENT (CH0)", RED);/* 绘制电压波形区域 */lcd_draw_rectangle(WAVE_OFFSET_X, WAVE_OFFSET_Y + WAVE_HEIGHT + 10, WAVE_OFFSET_X + WAVE_WIDTH, WAVE_OFFSET_Y + 2 * WAVE_HEIGHT + 10, BLACK);lcd_show_string(WAVE_OFFSET_X + 5, WAVE_OFFSET_Y + WAVE_HEIGHT + 15, 100, 12, 12, "VOLTAGE (CH1)", GREEN);/* 显示页面标识 */lcd_show_string(100, 190, 200, 16, 16, "WAVE PAGE", RED);prev_page = PAGE_WAVE;}/* 绘制波形 */draw_waveform_optimized(WAVE_OFFSET_X + 2, WAVE_OFFSET_Y + 15, WAVE_WIDTH - 4, WAVE_HEIGHT - 20, g_wave_buffer[0], RED);draw_waveform_optimized(WAVE_OFFSET_X + 2, WAVE_OFFSET_Y + WAVE_HEIGHT + 25, WAVE_WIDTH - 4, WAVE_HEIGHT - 20, g_wave_buffer[1], GREEN);
}/*** @brief 显示FATFS页面* @param 无* @retval 无*/
void display_fatfs_page(void)
{static uint8_t prev_page = 0xFF; /* 前一个页面 */uint32_t total, free;/* 如果页面发生变化,重新显示静态内容 */if (prev_page != PAGE_FATFS){lcd_fill(0, 50, 239, 200, WHITE);lcd_show_string(30, 60, 200, 16, 16, "FATFS FILE SYSTEM", RED);prev_page = PAGE_FATFS;}/* 获取SD卡容量信息 */if (exfuns_get_free("0", &total, &free) == 0){lcd_show_string(30, 80, 200, 16, 16, "SD Card Status: OK", BLUE);lcd_show_string(30, 100, 200, 16, 16, "SD Total Size: MB", BLUE);lcd_show_string(30, 120, 200, 16, 16, "SD Free Size: MB", BLUE);lcd_show_num(30 + 13 * 8, 100, total >> 10, 5, 16, BLUE); /* 显示SD卡总容量 MB */lcd_show_num(30 + 13 * 8, 120, free >> 10, 5, 16, BLUE); /* 显示SD卡剩余容量 MB */}else{lcd_show_string(30, 80, 200, 16, 16, "SD Card Status: ERROR", RED);}/* 显示页面标识 */lcd_show_string(100, 180, 200, 16, 16, "FATFS PAGE", RED);
}
四、主要修改内容
-
移除了原来的
first_display
静态变量,改用prev_page
来跟踪前一个页面 -
添加了页面变化检测:当检测到页面变化时(
prev_page != current_page
),重新绘制页面的静态内容 -
确保每次切换到新页面时都会重新初始化显示,包括第四次按下KEY1回到数据页面时