求教各位大佬,DHT11数据怎么显示在OLED上,我的思路是通过sprintf()函数将DHT11采集的温度,湿度数据转化为字符串输出,然后在用OLED显示字符串的函数进行显示,然而最后显示出来的数据是536876020.(OLED部分函数是正确的),基本操作代码以粘贴到下面。
//显示字符串
void OLED_ShowStr(u8 x,u8 y,u8 ch[],u8 TextSize)
{
u8 c,i;
u8 j=0;
switch(TextSize)
{
case 1:
{
while(ch[j] != ' ')
{
c = ch[j]-32;
if(x>126)
{
x=0;
y++;
}
OLED_SetPos(x,y);
for(i=0;i<6;i++)
{
WriteDat(F6x8[c][i]);
}
x += 6;
j++;
}
}break;
case 2:
{
while(ch[j] != ' ')
{
c = ch[j]-32;
if(x>120)
{
x=0;
y++;
}
OLED_SetPos(x,y);
for(i=0;i<8;i++)
{
WriteDat(F8x16[(16*c+i)]);
}
OLED_SetPos(x,y+1);
for(i=0;i<8;i++)
{
WriteDat(F8x16[(16*c+i+8)]);
}
x +=8;
j++;
}
}break;
}
}
/************************************************DHT11模块代码*************************************************************/
#include "dht11.h"
#include "delay.h"
//初始化DHT11的IO,并返回相应信号
u8 DHT11_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_11);
DHT11_Rst();
return DHT11_Check();
}
//复位DHT11
void DHT11_Rst(void)
{
DHT11_IO_OUT();
DHT11_DQ_OUT() = 0;
delay_ms(20);
DHT11_DQ_OUT() = 1;
delay_us(30);
}
//检测DHT11输出是否存在响应
//返回值 0:存在
// 1:不存在
u8 DHT11_Check(void)
{
u8 retry = 0;
DHT11_IO_IN();
while(DHT11_DQ_IN() && retry<100)
{
retry++;
delay_us(1);
}
if(retry>100) return(1);
else retry = 0;
while(!DHT11_DQ_IN() && retry<100)
{
retry++;
delay_us(1);
}
if(retry>100) return(1);
else return(0);
}
//DHT11读一个位
//返回值0或1
u8 DHT11_Read_Bit(void)
{
u8 retry=0;
DHT11_IO_IN();
while(DHT11_DQ_IN() &&retry<100)
{
retry++;
delay_us(1);
}
retry=0;
while(!DHT11_DQ_IN() && retry<100)
{
retry=0;
delay_us(1);
}
delay_us(40);
if(DHT11_DQ_IN()) return 1;
else return 0;
}
//DHT11读一个字节
//返回一个8位的数据
u8 DHT11_Read_Byte(void)
{
u8 i;
u8 dat=0;
for(i=0;i<8;i++)
{
dat<<=1;
dat |=DHT11_Read_Bit();
}
return dat;
}
//读40位数据进行校验
void DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 buf[5],i;
DHT11_Rst();
if(DHT11_Check() == 0)
{
for(i=0;i<5;i++)
{
buf[i] = DHT11_Read_Byte();
}
if(buf[0]+buf[1]+buf[2]+buf[3]==buf[4])
{
*humi=buf[0];
*temp=buf[2];
}
}
}
/*********************************************************/
while(1)
{
OLED_ShowStr(2,5,(u8*)"tempeture:",1);
DHT11_Read_Data(&tempeture,&humity);
sprintf(Strtemp,"%d",&tempeture);
OLED_ShowStr(10,7,Strtemp,1);
delay_ms(5000);
}
此帖出自
小平头技术问答
tempeture不需要加&,这就变成取地址了。
改过之后输出就变成0了
那说明没有读取到数据。
改过之后变成0了,说明你这个传感器根本没有取到温度,或者说取到的温度出错了,你再仔细看看是哪的问题吧
一周热门 更多>