求教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 21:48
是不是你硬件的问题呀,数据传输的引脚需要一个上拉才能完成数据的正常交换,你看看你硬件是不是有上拉
反倒是fdsf
3楼-- · 2019-03-25 00:44
 精彩回答 2  元偷偷看……
曹伟1993
4楼-- · 2019-03-25 06:33
反倒是fdsf 发表于 2018-7-28 09:31
是的,确实是硬件问题,谢谢拉

不用客气的,相互帮忙是应该的,我以前在这上面提问 也有好多论坛好友帮忙, 有问题就提出来,总有人会的
反倒是fdsf
5楼-- · 2019-03-25 06:42
曹伟1993 发表于 2018-7-30 20:11
不用客气的,相互帮忙是应该的,我以前在这上面提问 也有好多论坛好友帮忙, 有问题就提出来,总有人会的

恩恩说的是呢

一周热门 更多>