STM32与DHT11温湿度传感器结合OLED的实战项目教程(含详细代码)

#创作灵感  #STM32 #温湿度传感器 #dht11 #OLED        

        昨天刚解决了ST-Link固件升级的“小插曲”,今天我又迫不及待地投入到新的学习旅程中啦,这次的目标是STM32搭配温湿度传感器(也就是DHT11)的项目。对于初入嵌入式开发领域的小伙伴来说,DHT11温湿度传感器就像是开启硬件学习大门的“钥匙”,是入门阶段接触到的第一个基础硬件。经过一段时间的摸索和实践,我终于有了一些心得,下面我就把我的学习成果和大家分享一下,希望能给正在学习这个传感器的朋友们一些参考和启发。

1、硬件准备

在开始之前,我们需要准备以下硬件组件:

  • STM32开发板:我选择的是STM32F103C8T6,它具有强大的处理能力和丰富的外设接口,非常适合此类项目。

  • DHT11温湿度传感器:这是一个常用的数字温湿度传感器,能够同时测量温度和湿度,价格低廉且易于使用。

  • OLED显示屏:我使用的是0.96英寸的I2C接口OLED显示屏,它具有高对比度和低功耗的特点,非常适合用于显示温湿度数据。

  • 面包板和杜邦线:用于连接各个硬件组件。

  • 电源:为整个系统提供稳定的电源。

    2、软件设计

    开发环境搭建

    我使用的是Keil uVision 5开发环境,它提供了完善的代码编辑、编译和调试功能。在开始编程之前,确保你已经安装了STM32的标准外设库,这将大大简化硬件操作的编程复杂度。

    DHT11温湿度传感器驱动程序

    初始化

    首先,我们需要初始化STM32的GPIO引脚,将其配置为输入/输出模式,以适配DHT11的单总线通信方式。

  • u8 DHT11_Init(void)
    {	 
     	GPIO_InitTypeDef  GPIO_InitStructure;
     	
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能PG端口时钟
    	
     	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;				 //PG11端口配置
     	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
     	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     	GPIO_Init(GPIOA, &GPIO_InitStructure);				 //初始化IO口
     	GPIO_SetBits(GPIOA,GPIO_Pin_11);						 //PG11 输出高
    			     
    	DHT11_Rst();  //复位DHT11
    	return DHT11_Check();//等待DHT11的回应
    } 
    数据读取

    接下来,我们需要编写代码来读取DHT11发送的温湿度数据。DHT11在接收到启动信号后,会通过单总线发送40位数据。

    u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
    {        
     	u8 buf[5];
    	u8 i;
    	DHT11_Rst();
    	if(DHT11_Check()==0)
    	{
    		for(i=0;i<5;i++)//读取40位数据
    		{
    			buf[i]=DHT11_Read_Byte();
    		}
    		if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
    		{
    			*humi=buf[0];
    			*temp=buf[2];
    		}
    	}else return 1;
    	return 0;	    
    }
    显示屏初始化

    接下来,我们需要初始化OLED显示屏,设置其显示模式、对比度等参数。

    void OLED_Init(void)
    {
    	OLED_GPIO_Init();			//先调用底层的端口初始化
    	
    	/*写入一系列的命令,对OLED进行初始化配置*/
    	OLED_WriteCommand(0xAE);	//设置显示开启/关闭,0xAE关闭,0xAF开启
    	
    	OLED_WriteCommand(0xD5);	//设置显示时钟分频比/振荡器频率
    	OLED_WriteCommand(0x80);	//0x00~0xFF
    	
    	OLED_WriteCommand(0xA8);	//设置多路复用率
    	OLED_WriteCommand(0x3F);	//0x0E~0x3F
    	
    	OLED_WriteCommand(0xD3);	//设置显示偏移
    	OLED_WriteCommand(0x00);	//0x00~0x7F
    	
    	OLED_WriteCommand(0x40);	//设置显示开始行,0x40~0x7F
    	
    	OLED_WriteCommand(0xA1);	//设置左右方向,0xA1正常,0xA0左右反置
    	
    	OLED_WriteCommand(0xC8);	//设置上下方向,0xC8正常,0xC0上下反置
    
    	OLED_WriteCommand(0xDA);	//设置COM引脚硬件配置
    	OLED_WriteCommand(0x12);
    	
    	OLED_WriteCommand(0x81);	//设置对比度
    	OLED_WriteCommand(0xCF);	//0x00~0xFF
    
    	OLED_WriteCommand(0xD9);	//设置预充电周期
    	OLED_WriteCommand(0xF1);
    
    	OLED_WriteCommand(0xDB);	//设置VCOMH取消选择级别
    	OLED_WriteCommand(0x30);
    
    	OLED_WriteCommand(0xA4);	//设置整个显示打开/关闭
    
    	OLED_WriteCommand(0xA6);	//设置正常/反色显示,0xA6正常,0xA7反色
    
    	OLED_WriteCommand(0x8D);	//设置充电泵
    	OLED_WriteCommand(0x14);
    
    	OLED_WriteCommand(0xAF);	//开启显示
    	
    	OLED_Clear();				//清空显存数组
    	OLED_Update();				//更新显示,清屏,防止初始化后未显示内容时花屏
    }

    主程序

    在主程序中,我们首先进行硬件初始化,然后进入主循环,定时采集温湿度数据并显示在OLED屏幕上。

    	 int main(void)
    {
         uint32_t bufe[5];
    	 OLED_Init();
    	 DHT11_Init();
        OLED_ShowChinese(0, 0, "温度:");
    	OLED_ShowChinese(94, 0, "℃");
    	OLED_ShowChinese(0, 16, "湿度:");
    	OLED_ShowString(94,16,"RH",OLED_8X16);
    	OLED_Update();
    
    	while(1)
    	{
    		
    		DHT11_Read_Data(&temp,&humi);
    	  bufe[0]=temp;
    		bufe[1]=humi;
    	
    		
    		OLED_ShowNum(47,0,bufe[0],2,OLED_8X16);
    		OLED_ShowNum(47,16,bufe[1],2,OLED_8X16);
    		OLED_Update();
    		fmq(temp,humi);
    
    		 printf("temp=%d  , humi=%d RH\r\n",temp,humi);
    
    	}
    }

       3、成果展示

      4、总结与展望

  •          通过这次对STM32和DHT11温湿度传感器的学习,我不仅成功搭建了一个简单的温湿度监测系统,还对嵌入式开发有了更深入的理解。这个过程虽然遇到了一些挑战,但每一次的调试和优化都让我收获满满。希望我的分享能够帮助到同样在学习这条路上摸索的你。如果你有任何问题或者更好的建议,欢迎随时交流,让我们一起在嵌入式开发的道路上不断进步!

    (有需要代码的私 )

    作者:小何~~

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32与DHT11温湿度传感器结合OLED的实战项目教程(含详细代码)

    发表回复