在发送连续值时,如何在OLED显示器中显示值而不会使整个文本闪烁?

How to display values in a OLED Display without the entire text blinking when continuous values are being sent?

提问人:min_een 提问时间:11/2/2023 最后编辑:PMFmin_een 更新时间:11/2/2023 访问量:93

问:

我正在尝试显示我使用STM32微控制器从NTC温度传感器读取的值,并将其写入OLED显示器。但是,当我不断发送值时,整个文本和值会不断闪烁,而不仅仅是值。我只希望更新的值闪烁,而支持文本(如“温度 NTC1:”)不闪烁。

这是我在下面尝试的代码,我在 while 循环中尝试过,我使用了本网站的显示库:https://controllerstech.com/oled-display-using-i2c-stm32/

char tempStr[32];  ///16
                            SSD1306_Init (); // initialize the display
                        SSD1306_Clear();  // Clear the screen
                        SSD1306_GotoXY(10, 10);  // Adjust Y position for the first temperature value
                    snprintf(tempStr, sizeof(tempStr),"Temp NTC1: %.2f °C" , temperature_ntc1);  // Format NTC1 temperature value to string and store in tempStr array
                    SSD1306_Puts(tempStr, &Font_7x10, SSD1306_COLOR_WHITE);    //Print/ Display NTC1 temperature
                    SSD1306_GotoXY(10, 30);  //Adjust the Y position for the second temperature value
                    snprintf(tempStr, sizeof(tempStr),"Temp NTC2: %.2f °C" , temperature_ntc2); //Format NTC2 temperature
                    SSD1306_Puts(tempStr, &Font_7x10, SSD1306_COLOR_WHITE); //Print/ Display NTC2 temperature
                    SSD1306_UpdateScreen(); //Update the display by sending buffer data to controller
                    HAL_Delay(5000);

我尝试在 while 循环(下面给出的代码)之外将这个特定的字符串作为静态文本提供,但是当发送新值时,整个文本仍然会闪烁。

我真正想要的是“Temp NTC1:和Temp NTC2:”保持静态,当新值更新时,读数值每秒闪烁一次。

char staticText1[] = "Temp NTC1: ";
char staticText2[] = "Temp NTC2: ";
char tempStr1[32];
char tempStr2[32];

SSD1306_Init();   // Initialize OLED

while (1)
{
    // .temperature calculation code for NTC1 ...

    // Format NTC1 temperature value
    snprintf(tempStr1, sizeof(tempStr1), "%.2f °C", temperature_ntc1);

    // ... temperature calculation code for NTC2 ...

    // Format NTC2 temperature value
    snprintf(tempStr2, sizeof(tempStr2), "%.2f °C", temperature_ntc2);

    SSD1306_Clear();  // Clear the entire screen

    // Display static text for NTC1
    SSD1306_GotoXY(10, 10);
    SSD1306_Puts(staticText1, &Font_7x10, SSD1306_COLOR_WHITE);

    // Display NTC1 temperature value
    SSD1306_GotoXY(10 + strlen(staticText1) * 7, 10);
    SSD1306_Puts(tempStr1, &Font_7x10, SSD1306_COLOR_WHITE);

    // Display static text for NTC2
    SSD1306_GotoXY(10, 30);
    SSD1306_Puts(staticText2, &Font_7x10, SSD1306_COLOR_WHITE);

    // Display NTC2 temperature value
    SSD1306_GotoXY(10 + strlen(staticText2) * 7, 30);
    SSD1306_Puts(tempStr2, &Font_7x10, SSD1306_COLOR_WHITE);

    SSD1306_UpdateScreen();

    HAL_Delay(1000);  // Update the values every second
}
C STM32 微控制器 硬件 显示器

评论

0赞 Mike Nakis 11/2/2023
此函数的文档在哪里?SSD1306_Clear()
0赞 AKX 11/2/2023
@MikeNakis 您可以从 OP 的链接下载 ZIP;为方便起见,此处转载。gist.github.com/akx/bc563420a8950443e5490c5ba14eb876
0赞 Mike Nakis 11/2/2023
@AKX谢谢,与此同时,我看到了你的回答,而你所发现的正是我所怀疑的。干得好。

答:

1赞 wek 11/2/2023 #1

删除此内容

SSD1306_Clear();  // Clear the entire screen

从循环;把它放在循环之前。

1赞 AKX 11/2/2023 #2

查看SSD1306库的源代码(为方便起见,在此 Gist 中转载)实现为SSD1306_Clear

void SSD1306_Clear (void)
{
    SSD1306_Fill (0);
    SSD1306_UpdateScreen();
}

但是,您不希望立即将内部(现已清除)缓冲区更新到屏幕(这会导致闪烁)。

用一个替换你的电话,你就可以开始了。SSD1306_Clear();SSD1306_Fill(0);

评论

0赞 hcheung 11/3/2023
虽然这被OP接受为答案,但我赞成@wek的答案,因为它比这个更好。如果 OP 的显示是 128 像素 x 8 行显示,SSD1306_Fill(0) 会将 128*8=1024 字节的 0 写入显示存储器,通过相对较慢的 I2C 接口,这是不必要的,也是浪费时间的。
0赞 AKX 11/3/2023
@hcheung 当您调用 UpdateScreen、afaics 时,该库始终通过 I2C 将整个屏幕缓冲区从 MCU 内存转储到屏幕。
0赞 min_een 11/15/2023
@AKX您认为显示库中存在问题?使用更新功能?因为我最近注意到 NTC1 和 NTC2 正在读取和显示相同的值。但是,没有显示代码的相同代码在 PuTTY 中有效,我正在读取 2 个不同的值。可能是什么问题?
0赞 AKX 11/15/2023
@Sherbeen TBH,没有。我认为你应该仔细查看你自己的绘图代码,以确保你不会意外地使用相同的值。(例如,在一根可绘制的绳子前面加上前缀,另一根前缀为 in 以确保......ABsprintf