#创作灵感 #STM32 #温湿度传感器 #dht11 #OLED
今天的学习内容是在昨天的dht11基础上,添加一个蜂鸣器模块。蜂鸣器模块则是一个非常实用的扩展,可以用来实现简单的报警功能。
1、硬件准备
在开始之前,我们需要准备以下硬件组件:
STM32开发板:我选择的是STM32F103C8T6,它具有强大的处理能力和丰富的外设接口,非常适合此类项目。
DHT11温湿度传感器:这是一个常用的数字温湿度传感器,能够同时测量温度和湿度,价格低廉且易于使用。
OLED显示屏:我使用的是0.96英寸的I2C接口OLED显示屏,它具有高对比度和低功耗的特点,非常适合用于显示温湿度数据。
蜂鸣器:一个简单的有源蜂鸣器模块,用于实现报警功能。
面包板和杜邦线:用于连接各个硬件组件。
电源:为整个系统提供稳定的电源。
硬件连接
DHT11与STM32的连接
DHT11的连接非常简单,它只需要一个GPIO引脚与STM32相连。以下是具体的连接方式:
-
VCC:连接到STM32的3.3V电源。
-
GND:连接到STM32的地。
-
DATA:连接到STM32的一个GPIO引脚。
OLED显示屏与STM32的连接
OLED显示屏通过I2C接口与STM32相连,具体连接如下:
-
VCC:连接到STM32的3.3V电源。
-
GND:连接到STM32的地。
-
SCL:连接到STM32的I2C时钟线引脚。
-
SDA:连接到STM32的I2C数据线引脚。
蜂鸣器与STM32的连接
蜂鸣器模块的连接也非常简单:
-
VCC:连接到STM32的3.3V电源。
-
GND:连接到STM32的地。
-
信号引脚:连接到STM32的一个GPIO引脚,用于控制蜂鸣器的开关。
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(); //更新显示,清屏,防止初始化后未显示内容时花屏
}
蜂鸣器初始化
void mfq_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
主程序
在主程序中,我们首先进行硬件初始化,然后进入主循环,定时采集温湿度数据并显示在OLED屏幕上。
int main(void)
{
uint32_t bufe[5];
OLED_Init();
mfq_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、成果展示
四、总结
通过这次学习,我不仅成功地将蜂鸣器模块集成到了之前的温湿度监测系统中,还实现了简单的报警功能。这个过程不仅让我对STM32的GPIO控制有了更深入的理解,还让我学会了如何将多个硬件模块协同工作。希望我的分享能够帮助到同样在学习这条路上摸索的你。如果你有任何问题或者更好的建议,欢迎随时交流,让我们一起在嵌入式开发的道路上不断进步!
希望这篇文章对你有帮助!如果有任何需要调整或补充的地方,请随时告诉我。
(需要代码的私)