#include "stm32f10x.h" // Device header #include "delay.h" #include "OLED.h" #include "dht11.h" #include "Serial.h" #include "FAN.h" #define TEMP_THRESHILD 28 #define HUMI_THRESHILD 60 u8 temp,humi; int main(void) { uint32_t bufe[5]; OLED_Init(); DHT11_Init(); Fan_Init(); OLED_ShowChinese(0, 0, "温度:"); OLED_ShowChinese(94, 0, "℃"); OLED_ShowChinese(0, 16, "湿度:"); OLED_ShowString(94,16,"RH",OLED_8X16); OLED_ShowChinese(0, 32, "光照强度:"); OLED_ShowString(112,32,"LX",OLED_8X16); OLED_Update(); while(1) { if(DHT11_Read_Data(&temp,&humi) == SUCCESS) {; bufe[0]=temp; bufe[1]=humi; OLED_ShowNum(32,0,bufe[0],2,OLED_8X16); OLED_ShowNum(32,16,bufe[1],2,OLED_8X16); if(bufe[0] > TEMP_THRESHILD){ Fan_On(); }else{ Fan_Off(); } OLED_Update(); //将OLED显存数组更新到OLED屏幕 } else { OLED_ShowString(0,48,"DHT11 Error!",OLED_8X16); } Delay_ms(2000); } }温度数据保留小数点两位代码怎么修改
时间: 2025-07-14 16:03:25 浏览: 4
<think>嗯,用户现在想修改他们的STM32代码,让温度数据显示保留两位小数。我需要先理解他们现有的代码结构。看起来他们用的是DHT11传感器,读取的温度数据是整数形式的,直接显示在OLED上。问题是如何让整数变成带两位小数的浮点数。
首先,DHT11的数据输出是整数,但用户可能希望显示类似28.50这样的格式。不过,DHT11的温度分辨率是1°C,湿度是1%RH,所以实际数据可能没有小数部分。这时候需要确认用户是否真的需要小数位,或者是否可能换用更高精度的传感器,比如DHT22。如果坚持用DHT11,可能需要软件处理,比如将温度值乘以100再显示,但这样可能只是显示上的处理,并非真实数据。
接下来,用户代码中的temp变量是u8类型,也就是8位无符号整数,只能存储0到255的整数值。如果要显示小数,可能需要将temp转换为浮点数,或者用两个字节来存储整数和小数部分。但DHT11的数据手册说明其温度数据是整数,所以可能无法获取到实际的小数部分,这时候可能需要用户了解显示的小数只是模拟的,比如固定为.00,或者通过其他方式生成小数部分,比如软件模拟。
然后,代码中显示部分使用的是OLED_ShowNum函数,这个函数可能只能显示整数。所以需要找到或修改显示函数,使其能够显示浮点数。可能需要自己写一个函数,比如OLED_ShowFloat,来处理浮点数的显示,将整数部分和小数部分分开显示。
例如,如果温度是28,要显示28.00,可以将温度乘以100得到2800,然后分别显示前两位和后两位,中间加小数点。或者使用浮点数运算,将temp转换为float,再格式化为字符串。但嵌入式系统中浮点运算可能会增加代码大小和计算时间,需要考虑资源限制。
另外,用户代码中的bufe数组是uint32_t类型,存储temp和humi的值。如果要处理小数,可能需要将bufe改为浮点数组,或者用整数来存储放大后的值,比如乘以100。例如,temp是28,存储为2800,然后显示的时候分成28和00两部分。
还需要检查OLED库是否支持浮点显示。如果不支持,可能需要手动将数值转换为字符串,再使用显示字符串的函数。比如使用sprintf将浮点数格式化为字符串,然后调用OLED_ShowString函数。但sprintf在嵌入式系统中可能会占用较多资源,尤其是使用浮点格式化时,需要确保标准库支持。
可能的步骤是:将temp转换为浮点数,乘以100取整,得到整数部分和小数部分,然后分别显示。例如,temp=28,显示为28.00。这时候需要修改OLED_ShowNum的调用,分别在整数位置和小数位置显示数字,并添加小数点。
在代码中,用户现在显示的是bufe[0]作为温度,使用OLED_ShowNum显示两位整数。要显示两位小数,可能需要将bufe[0]乘以100,然后分解为整数和小数部分,或者使用浮点数运算,分解出整数和小数部分。
例如,假设温度是28,乘以100得到2800,然后显示为28.00。或者,如果用户希望有实际的小数部分,可能需要使用其他传感器,但根据问题描述,可能只是显示格式的问题。
因此,修改代码的步骤可能包括:
1. 修改temp的存储方式,从u8改为浮点数,或者使用一个整数表示放大后的值。
2. 编写或修改显示函数,以支持显示两位小数。
3. 在OLED上适当的位置显示小数点和小数部分。
例如,将温度显示部分改为:
OLED_ShowNum(32,0, temp, 2, OLED_8X16);
OLED_ShowString(48,0, ".00", OLED_8X16);
但这样只是固定显示.00,可能不符合用户需求。或者,如果温度数据可以有小数部分,比如通过其他传感器或计算,需要正确处理。
可能用户误解了DHT11的能力,需要提醒他们DHT11只能提供整数温度值,所以显示两位小数可能只是形式上的,不会有实际数据支持。这时候建议用户确认传感器精度,或者更换传感器,或者接受显示固定的小数部分。
综上所述,代码修改需要处理数据存储、浮点转换、显示函数的调整,同时考虑硬件限制和传感器能力。需要分步骤指导用户如何修改代码,并指出可能的数据精度问题。</think>根据DHT11传感器特性及代码现状,以下是分步修改方案:
$\textcolor{red}{注意}$:DHT11温度分辨率为$1^\circ C$,$\textcolor{blue}{实际无法获取小数部分}$。以下修改将固定显示`.00`小数,$\textcolor{orange}{仅为格式优化}$,$\textcolor{red}{不提升实际精度}$。若需真实小数,建议更换DHT22传感器。
$\boxed{修改步骤}$:
1. $\textcolor{green}{变量类型扩展}$:
```c
// 原变量定义(u8仅存储整数)
u8 temp,humi;
// 改为浮点型(需同步修改DHT11驱动)
float temp_f; // 增加浮点变量
```
2. $\textcolor{green}{数据转换}$:
```c
// 在数据读取后添加
if(DHT11_Read_Data(&temp,&humi) == SUCCESS) {
temp_f = temp + 0.00f; // 强制转换为浮点数
// 后续使用temp_f代替bufe[0]
```
3. $\textcolor{green}{显示函数改造}$:
```c
// 原整数显示
OLED_ShowNum(32,0,bufe[0],2,OLED_8X16);
// 改为浮点显示(需添加新函数)
OLED_ShowFloat(32, 0, temp_f, 2, 2, OLED_8X16); // 整数2位,小数2位
```
4. $\textcolor{green}{添加浮点显示函数}$(若库无现成函数):
```c
void OLED_ShowFloat(u8 x, u8 y, float num, u8 int_len, u8 frac_len, u8 size) {
uint32_t integer = (uint32_t)num;
uint32_t decimal = (num - integer) * pow(10, frac_len);
OLED_ShowNum(x, y, integer, int_len, size);
OLED_ShowChar(x + int_len*8, y, '.', size);
OLED_ShowNum(x + (int_len+1)*8, y, decimal, frac_len, size);
}
```
$\boxed{补充说明}$:
1. $\textcolor{orange}{硬件限制}$:DHT11温度寄存器仅存储$\pm40^\circ C$整数值
2. $\textcolor{orange}{精度问题}$:显示`.00`仅为视觉统一,$\textcolor{red}{实际无测量意义}$
3. $\textcolor{orange}{资源消耗}$:浮点运算会增加约$\pm1.5KB$ Flash占用
$\boxed{替代方案}$(不修改驱动):
```c
// 直接格式化显示(需sprintf支持)
char temp_str[6];
sprintf(temp_str, "%2d.00", temp);
OLED_ShowString(32, 0, temp_str, OLED_8X16);
```
$\boxed{最终效果}$:
```
温度:28.00℃
湿度:60 RH
光照强度: LX
```
阅读全文
相关推荐







