求教DHT11数据显示在OLED上

2019-03-23 15:41发布

求教各位大佬,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);

}


此帖出自小平头技术问答
11条回答
dcexpert
1楼 · 2019-03-24 02:03.采纳回答
/ sprintf(Strtemp,"%d",&tempeture);

tempeture不需要加&,这就变成取地址了。
曹伟1993
2楼-- · 2019-03-24 02:15
你通过串口输出的应该是数据,你输出一个地址干嘛?在C语言中&是取地址符号,你输出的是地址,当然不对呀
反倒是fdsf
3楼-- · 2019-03-24 03:37
 精彩回答 2  元偷偷看……
反倒是fdsf
4楼-- · 2019-03-24 06:14
曹伟1993 发表于 2018-7-26 08:57
你通过串口输出的应该是数据,你输出一个地址干嘛?在C语言中&是取地址符号,你输出的是地址,当然不对呀

改过之后输出就变成0了
dcexpert
5楼-- · 2019-03-24 10:34
反倒是fdsf 发表于 2018-7-26 09:35
改过之后输出就变成0了,

那说明没有读取到数据。
反倒是fdsf
6楼-- · 2019-03-24 13:48
 精彩回答 2  元偷偷看……
曹伟1993
7楼-- · 2019-03-24 18:52
反倒是fdsf 发表于 2018-7-26 09:35
改过之后输出就变成0了,

改过之后变成0了,说明你这个传感器根本没有取到温度,或者说取到的温度出错了,你再仔细看看是哪的问题吧

一周热门 更多>