STM32项目设计:基于STM32的DHT11、MQ-2、光照强度检测

该项目使用STM32F103C8T6微控制器,结合DHT11温湿度传感器、MQ-2烟雾传感器和光敏电阻模块,实现环境温湿度、烟雾浓度和光照强度的实时监测。数据通过0.96英寸OLED液晶屏显示,并具备超限蜂鸣器报警功能。源码包括I2C通信和数据处理部分,实现了温湿度、烟雾浓度及光照强度的检测和显示。
摘要由CSDN通过智能技术生成

一、项目功能概述

1、通过DHT11温湿度模块检测温湿度
2、通过MQ-2烟雾传感器检测烟雾
3、通过光敏电阻模块检测光照强度
4、oled液晶屏显示实时检测到的数据
5、超限蜂鸣器报警
在这里插入图片描述

源码下载地址: 基于STM32的DHT11、MQ-2、光照强度检测

二、材料选择

1、主控 STM32F103C8T6
本人是自己制作的最小系统版,主要目的省钱!!!!
在这里插入图片描述
2、DHT11温湿度模块
在这里插入图片描述
3、MQ-2烟雾传感器模块
在这里插入图片描述
4、光敏电阻模块

在这里插入图片描述
5、0.96 OLED液晶屏
在这里插入图片描述
6、蜂鸣器模块
在这里插入图片描述

三、原理图设计

1、DHT11连接图
在这里插入图片描述
2、OLED液晶模块连接图
在这里插入图片描述
3、MQ-2硬件连接图
在这里插入图片描述
4、光敏电阻模块硬件连接图
在这里插入图片描述
5、蜂鸣器模块硬件连接图
在这里插入图片描述

四、成品展示

1、上电界面
由于相机刷新率比较快,拍屏幕会有闪!!!
在这里插入图片描述
2、开来台灯后,光照强度数值明显提升!!!
在这里插入图片描述
剩下的温湿度和烟雾浓度就不贴图片了,没法直观表示数据更新!!!

五、源码设计

OLED.c

#include "oled.h"
#include "codetab.h"
#include "main.h"
#include "string.h"
#include "i2c.h"
#include "./usart/bsp_debug_usart.h"
#include "dht11.h"
#include "key.h"
#include "bsp_led.h"
#define IIC_SCK_0  GPIOA->BRR=0X0080       // 设置sck接口到PA7   置零
#define IIC_SCK_1  GPIOA->BSRR=0X0080      //置位
#define IIC_SDA_0  GPIOB->BRR=0X0001       // 设置SDA接口到PB0    置零
#define IIC_SDA_1  GPIOB->BSRR=0X0001      // 复位

char mStrVol[20];
char mStrCul[20];

char mStrtemp[20];

char mStrhum[20];

char mStrSpeed[20];

char mStrDirec[20];
uint16_t mVolValue;
uint16_t mCulValue;


extern uint8_t shidu ;
extern uint8_t wendu;
extern uint16_t value1;
extern uint16_t value2;

unsigned int GetDeltaTicks(unsigned int tickcount)
{
	unsigned int now = GetTickCount();
	return 	now >= tickcount ? (now - tickcount) : (0xFFFFFFFF - tickcount + now);
}
void I2C_GPIO_Config(void)

{
    GPIO_InitTypeDef GPIO_InitStructure;
	__HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    GPIO_InitStructure.Pin = GPIO_PIN_7 ; 
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD; 
    GPIO_InitStructure.Pull = GPIO_PULLUP;
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);//SCL引脚初始化
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7 ,GPIO_PIN_SET);
	
	
	GPIO_InitStructure.Pin = GPIO_PIN_0 ;
	 HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);//SDA引脚初始化
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0 ,GPIO_PIN_SET);
}

void delay_us(unsigned int _us_time)
{       
  unsigned char x=0;
  for(;_us_time>0;_us_time--)
  {
    x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
	  x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
	  x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
  }
}


void delay_ms(unsigned int _ms_time)
{
	unsigned int i,j;
	for(i=0;i<_ms_time;i++)
	{
		for(j=0;j<900;j++)
		{;}
	}
}

const unsigned char  OLED_init_cmd[25]=
{
  /*0xae,0X00,0X10,0x40,0X81,0XCF,0xff,0xa1,0xa4,
  0xA6,0xc8,0xa8,0x3F,0xd5,0x80,0xd3,0x00,0XDA,0X12,
  0x8d,0x14,0xdb,0x40,0X20,0X02,0xd9,0xf1,0xAF*/
       0xAE,//关闭显示
       0xD5,//设置时钟分频因子,震荡频率
       0x80,  //[3:0],分频因子;[7:4],震荡频率

       0xA8,//设置驱动路数
       0X3F,//默认0X3F(1/64)
       0xD3,//设置显示偏移
       0X00,//默认为0
       0x40,//设置显示开始行 [5:0],行数.                              
       0x8D,//电荷泵设置
       0x14,//bit2,开启/关闭
       0x20,//设置内存地址模式
       0x02,//[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
       0xA1,//段重定义设置,bit0:0,0->0;1,0->127;
       0xC8,//设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
       0xDA,//设置COM硬件引脚配置
       0x12,//[5:4]配置            
       0x81,//对比度设置
       0xEF,//1~255;默认0X7F (亮度设置,越大越亮)
       0xD9,//设置预充电周期
       0xf1,//[3:0],PHASE 1;[7:4],PHASE 2;
       0xDB,//设置VCOMH 电压倍率
       0x30,//[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
       0xA4,//全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
       0xA6,//设置显示方式;bit0:1,反相显示;0,正常显示        
       0xAF,//开启显示     
};



/*****************************************
字节数据发送函数
函数原型:void IIC_write(unsigned char date);
功能:将数据date发送出去,可以是地址,也可以是数据
******************************************/
void IIC_write(unsigned char date)
{
	unsigned char i, temp;
	temp = date;		
	for(i=0; i<8; i++)//传送数据长度为8
	{	IIC_SCK_0;
		
        if ((temp&0x80)==0)//判断发送位
            IIC_SDA_0;
        else IIC_SDA_1;
		temp = temp << 1;
		delay_us(1);			  
		IIC_SCK_1;
		delay_us(1);
		
	}
	IIC_SCK_0;
	delay_us(1);
	IIC_SDA_1;
	delay_us(1);
	IIC_SCK_1;
	delay_us(1);
	IIC_SCK_0;
	delay_us(1);
	

}


/*************************************************************************
功能:启动I2C总线,即发送I2C起始条件。SCL为高电平期间,SDA出现下降沿
**************************************************************************/
void IIC_start()
{
	IIC_SDA_1;
	delay_us(1);
	IIC_SCK_1;
	delay_us(1);				   //所有操作结束释放SCL	
	IIC_SDA_0;
	delay_us(3);
	IIC_SCK_0;
	
    IIC_write(0x78);
        
}


/*************************************************************************
功能:结束I2C总线,即发送I2C结束条件。SCL为高电平期间,SDA出现上升沿
**************************************************************************/
void IIC_stop()
{
	IIC_SDA_0;
	delay_us(1);
	IIC_SCK_1;
	delay_us(3);
	IIC_SDA_1;
	
}

void OLED_send_cmd(unsigned char o_command)
{

	IIC_start();
	IIC_write(0x00); 
	IIC_write(o_command);
	IIC_stop();

}

void OLED_send_data(unsigned char o_data)
{ 
	IIC_start();
	IIC_write(0x40);
	IIC_write(o_data);
	IIC_stop();
}
void Column_set(unsigned char column)
{
	OLED_send_cmd(0x10|(column>>4));    //设置列地址高位
	OLED_send_cmd(0x00|(column&0x0f));   //设置列地址低位  
	 
}
void Page_set(unsigned char page)
{
	OLED_send_cmd(0xb0+page);
}

void OLED_clear(void)
{
	unsigned char page,column;
	for(page=0;page<8;page++)             //page loop
	  { 
		  Page_set(page);
		  Column_set(0);	  
		  for(column=0;column<128;column++)	//column loop
			{
			  OLED_send_data(0x00);
			}
	  }
}


void OLED_full(void)
{
	unsigned char page,column;
	for(page=0;page<8;page++)             //page loop
	  { 
		Page_set(page);
		Column_set(0);	  
	for(column=0;column<128;column++)	//column loop
		  {
			OLED_send_data(0xff);
		  }
	  }
}


void OLED_init(void)
{
	unsigned char i;
	for(i=0;i<25;i++)
	{
		OLED_send_cmd(OLED_init_cmd[i]);
	}
	OLED_clear();
//	OLED_Chinese16x16Str(0,0,Chinese_WEN_F16X16);
//	OLED_Chinese16x16Str(2,0,Chinese_DU_F16X16);	
//	OLED_Chinese16x16Str(0,1,Chinese_SHII_F16X16);	
//	OLED_Chinese16x16Str(2,1,Chinese_DU_F16X16);	
//	OLED_Chinese16x16Str(0,4,Chinese_GUANG_F16X16);		
//	OLED_Chinese16x16Str(2,4,Chinese_ZHAO_F16X16);		
//	                     	
//	OLED_Chinese16x16Str(0,6,Chinese_YAN_F16X16);
//	OLED_Chinese16x16Str(2,6,Chinese_WU_F16X16);			
//	OLED_Chinese16x16Str(3,2,Chinese_YE_F16X16);		
//	OLED_Chinese16x16Str(4,2,Chinese_SHE_F16X16);			
//	OLED_Chinese16x16Str(5,2,Chinese_JII_F16X16);	
////    HAL_Delay(1000);
////	OLED_clear();
//	
//	OLED_Chinese16x16Str(1,0,Chinese_Liu_F16X16);	
//	OLED_Chinese16x16Str(2,0,Chinese_Tang_F16X16);		
//	OLED_Chinese16x16Str(3,0,Chinese_CHONG_F16X16);
//	OLED_Chinese16x16Str(4,0,Chinese_WU_F16X16);	
//	OLED_Chinese16x16Str(5,0,Chinese_WEI_F16X16);	
//	OLED_Chinese16x16Str(6,0,Chinese_SHI_F16X16);	
//	OLED_Chinese16x16Str(7,0,Chinese_QI_F16X16);

}


void Picture_display(const unsigned char *ptr_pic)
{
	unsigned char page,column;
	for(page=0;page<(64/8);page++)        //page loop
	  { 
	Page_set(page);
	Column_set(0);	  
	for(column=0;column<128;column++)	//column loop
		  {
			OLED_send_data(*ptr_pic++);
		  }
	  }
}



void Picture_ReverseDisplay(const unsigned char *ptr_pic)
{
    unsigned char page,column,data;
    for(page=0;page<(64/8);page++)        //page loop
      { 
		  Page_set(page);
		  Column_set(0);	  
		  for(column=0;column<128;column++)	//column loop
          {
            data=*ptr_pic++;
            data=~data;
            OLED_send_data(data);
          }
      }
  }

  
  
  
void OLED_Set_Pos(uint8_t x, uint8_t y) 
{ 
	OLED_send_cmd(0xb0+y);
	OLED_send_cmd(((x&0xf0)>>4)|0x10);
	OLED_send_cmd((x&0x0f)|0x01);
}   
void OLED_Chinese16x16Str(uint8_t x,uint8_t y,const uint8_t * ch)
{
		uint8_t i;
		uint8_t	j,k =0;
		j = x<<4;		// 0~7		该字符占2*8bits
		k = y<<1;	// 0~4	该字符占2*8bits
		OLED_Set_Pos(j,k);
		for(i=0;i<16;i++)
		OLED_send_data(*(ch+i));
		OLED_Set_Pos(j,k+1);	
		for(i=16;i<32;i++)
		OLED_send_data(*(ch+i));	
}

void OLED_OneByte(uint8_t x,uint8_t y,uint8_t k)
{
	uint8_t c=0,i=0,z =0;
	z = x*6;	//获取起始位置
		c =k-32;
	if(z>126){z=0;y++;}
		OLED_Set_Pos(z,y); //设置地址
		/*一个ascii显示需要68bit数据*/
		for(i=0;i<6;i++)
		OLED_send_data(F6x8[c][i]);
}

 
void OLED_P6x8Str(uint8_t x,uint8_t y,int8_t ch[])
{
	uint8_t c=0,i=0,j=0,z =0;
	z = x*6;	//
	while (ch[j]!='\0')
	{
		c =ch[j]-32;
		if(z>126){z=0;y++;}
		OLED_Set_Pos(z,y);
		for(i=0;i<6;i++)
		OLED_send_data(F6x8[c][i]);
		z+=6;
		j++;
	}
}
void OLED_P8x16Str(uint8_t x,uint8_t y,uint8_t *chr)
{
	uint8_t j=0;
	uint8_t c = 0, i = 0;
	while (chr[j]!='\0')
	{
		c = chr[j] - ' ' ;
		OLED_Set_Pos(x,y);
		for(i=0;i<8;i++)
		OLED_send_data(F8X16[c*16+i]);
		OLED_Set_Pos(x,y+1);
		for(i=0;i<8;i++)
		OLED_send_data(F8X16[c*16+i+8]);
		x+=8;
		if(x>120){x=0;y+=2;}
		j++;	
	}
	
}



DHT11.c

#include "dht11.h"
#include "main.h"
#include "oled.h"





void delay_uss(unsigned int us)
{       
  uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
	while(delay--)
	{
		;
	}
}
void DHT11_Rst(void)	   
{    	
	DHT11_IO_OUT(); 	//SET OUTPUT
    DHT11_DQ_OUT=0; 	//拉低DQ
    HAL_Delay(25);    	//拉低至少18ms
    DHT11_DQ_OUT=1; 	//DQ=1 
	delay_uss(30);     	//主机拉高20~40us
}

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void) 	   
{   
	u8 retry=0;
	DHT11_IO_IN();//SET INPUT	 
    while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
	{
		retry++;
		delay_uss(1);
	};	 
	if(retry>=100)return 1;
	else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
	{
		retry++;
		delay_uss(1);
	};
	if(retry>=100)return 1;	    
	return 0;
}
//从DHT11读取一个位
//返回值:1/0
u8 DHT11_Read_Bit(void) 			 
{
 	u8 retry=0;
	while(DHT11_DQ_IN&&retry<100)//等待变为低电平
	{
		retry++;
		delay_uss(1);
	}
	retry=0;
	while(!DHT11_DQ_IN&&retry<100)//等待变高电平
	{
		retry++;
		delay_uss(1);
	}
	delay_us(40);//等待40us
	if(DHT11_DQ_IN)return 1;
	else return 0;		   
}
//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)    
{        
    u8 i,dat;
    dat=0;
	for (i=0;i<8;i++) 
	{
   		dat<<=1; 
	    dat|=DHT11_Read_Bit();
    }						    
    return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
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;	    
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在    	 
u8 DHT11_Init(void)
{	 
 	GPIO_InitTypeDef  GPIO_InitStructure;
 	__HAL_RCC_GPIOA_CLK_ENABLE();
	
 	GPIO_InitStructure.Pin = GPIO_PIN_11;				 //PG11端口配置
 	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; 		 //推挽输出
 	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
	//GPIO_InitStructure.Pull = GPIO_PULLUP;
 	 HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);		 //初始化IO口
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11 ,GPIO_PIN_SET);						 //PG11 输出高
			    
	DHT11_Rst();  //复位DHT11
	return DHT11_Check();//等待DHT11的回应
} 

森旺电子
关注 关注
  • 9
    点赞
  • 211
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
基于STM32的光照检测系统设计
qq_58404700的博客
02-20 2506
本文设计了一种基于STM32的光照检测系统,通过STM32微控制器和光照传感器的配合使用,实现了环境光强度的实时检测与智能调控。基于STM32的光照检测系统作为智能照明控制系统的核心组成部分,能够实现对环境光强度的实时检测与调控,为人们创造舒适的光照环境。本系统设计的主要目标是实现环境光强度的实时检测与智能调控,通过STM32微控制器对环境光强度进行数据采集和处理,根据光强度变化调节照明设备的亮度和色温,以达到节能、舒适和智能化的照明效果。需要根据你使用的光照传感器的规格和你的应用需求来设置。
基于STM32光照强度传感器数据采集.zip
02-02
采集光照强度数据,数据通过串口传输到上位机,微控制器采用的STM32F103VET6单片机
基于STM32的BH1750光照强度传感器读取IIC
12-15
使用的开发板为STM32F103ZET6,通讯方式为IIC,例程可用,可实现最简单的数据读取。内附图片
MQ-2烟雾传感器详解(STM32
最新发布
qq_44016222的博客
09-07 2704
MQ-2气体传感器是一种常用的气体传感器,用于检测空气中的烟雾浓度。工作原理是基于半导体气敏元件的电阻变化。当烟雾气体进入传感器时,它会与气敏元件表面的敏感材料发生化学反应,导致电阻值发生变化。通过测量电阻值的变化,可以推断出烟雾浓度的大小以下是土壤湿度传感器的参数:型号MQ-2工作电压DC 5V工作电流150mA检测气体烟雾、液化石油气、天然气等检测浓度可燃气体输出AO/DOMQ-2烟雾传感器详解(STM32)(资料分享见文末)使用MQ-2型烟雾传感器属于二氧化锡。
基于STM32的光照传感器
09-18
基于STM32的光照传感器(gy-30)代码和手册,一次下载就可以手册加代码全搞定。代码是自己亲自移植的,单片机型号是STM32F103RBT6,亲测使用正常。
STM32CubeMX——光敏电阻检测光照强度
热门推荐
W_Oilpicture的博客
05-02 2万+
前言 多少事,从来急;天地转,光阴迫。 一万年太久,只争朝夕。 ——毛泽东《满江红·致郭沫若同志》 一、简介 光敏电阻 光敏电阻(photoresistor or light-dependent resistor,后者缩写为ldr)或光导管(photoconductor),常用的制作材料为硫化镉,另外还有硒、硫化铝、硫化铅和硫化铋等材料。 这些制作材料具有在特定波长的光照射下,其阻值迅速减小的特性。这是由于光照产生的载流子都参与导电,在外加电场的作用下作漂移运动,电子奔向电源的正极,空穴奔
stm32单片机室内环境温湿度光照强度检测系统
STM32_C51的博客
02-11 1501
1、采用stm32单片机+OLED显示屏+光照强度检测+DHT11温湿度+电机+按键+LED,制作一个温湿度采集、光照强度采集,OLED显示相关数据,3、当采集温度大于设置温度,开启散热电机,当采集湿度小于设置湿度,开启加湿电机,当采集光照强度低于设置强度,开启LED照明补光,本设计使用C语言编程设计,程序代码采用keil5编写,程序有中文注释,新手容易看懂,仿真采用Proteus软件进行仿真。4、OLED显示屏显示采集温湿度、采集光照强度和设置的温湿度、光照强度阈值。
Stm32_标准库_8_ADC_光敏传感器_测量具体光照强度
Narnat的博客
10-08 5466
需要将其copy到OLED.c文件下,并在OLED.h文件内声明一下。其中row指你想要进行清屏操作的具体行,OLED上一共能显示4行。其中len代表row行从左到右len长度区间的字符串将会被。
基于STM32DHT11MQ-2、光照强度检测
04-11
在本文中,我们将深入探讨基于STM32的环境监测系统,该系统涵盖了温湿度、烟雾和光照强度检测,并配备了OLED显示屏和超限报警功能。STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式硬件和单片机设计...
基于STM32环境检测DHT11温湿度传感器+MQ-2烟雾传感器+光敏电阻(包含原理图源程序文件)#资源达人分享计划#
08-07
在这个项目中,我们主要关注的是基于STM32微控制器的环境监测系统,它结合了DHT11温湿度传感器、MQ-2烟雾传感器和光敏电阻,用于检测环境的温度、湿度、烟雾浓度以及光线强度。这些传感器的数据通过STM32进行采集和...
STM32单片机+DHT11温湿度+BH1750光照强度+MQ-2烟雾浓度+MQ-7一氧化碳+蜂鸣器+OLED屏幕》源代码
05-24
1.STM32单片机+DHT11温湿度+BH1750光照强度+MQ-2烟雾浓度+MQ-7一氧化碳+蜂鸣器+OLED屏幕 2.OLED屏幕显示温湿度、光照强度、烟雾浓度、一氧化碳数据 3.DHT11温湿度 阈值控制 蜂鸣器报警 4.BH1750光照强度 阈值控制 ...
STM32F103+温湿度+光照强度+LN33无线网络
04-02
环境监测节点单片机采集系统 采用STM32F103单片机 实时采集DHT11、BH1750传感器获得温度 湿度 光强。并通过DL-LN33网络模块发给网络上主机,主机为PC机,主机开发代码详见环境监测管控软件。
基于stm32数字光强计GY-30光强采集oled显示
05-31
本代码是基于stm32数字光强计GY-30光强采集并使用oled实时显示
STM32F103模拟IIC驱动TLS2561,读取光照强度并换算
04-28
STM32F103模拟IIC驱动TLS2561,读取光照强度并换算 移植简单
STM32使用MQ-2代码及资料.zip
06-18
自己整理的stm32使用MQ-2烟雾传感器的资料,内含传感器的使用资料,以及整理的一些代码,(51的也有)代码大同小异,只不过量化方式不同。了解ADC即可,适合初学者使用。
STM32-光强检测-串口能显示-1602显示.rar
08-12
STM32-光强检测-串口能显示-1602显示,在普中科技开发板测试成功。
基于stm32dht11mq-2、光照强度检测
11-23
基于STM32DHT11MQ-2和光照强度检测模块可以实现环境监测和报警的功能。 首先,DHT11传感器可以测量环境的温度和湿度。我们使用STM32控制器连接到DHT11传感器上,并通过数据线读取传感器返回的信号。然后,我们...
基于stm32DHT11传感器代码
07-31
标题中的“基于stm32DHT11传感器代码”是指使用STM32微控制器来读取和处理DHT11温湿度传感器的数据。STM32是意法半导体(STMicroelectronics)生产的一种广泛使用的ARM Cortex-M系列微控制器,而DHT11是一款常见的...
STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)
XiaoCaiDaYong的博客
11-03 7867
STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)
stm32检测mq-2在oled上显示
06-28
### 回答1: 要实现STM32检测MQ-2并在OLED上显示,需要先连接好MQ-2模块和OLED模块,并对串口和I2C进行初始化配置。接下来,使用STM32的ADC模块对MQ-2模块进行信号采集,然后通过一定的算法将MQ-2模块采集到的气体浓度值转换为可读的数据,最后将其通过I2C协议发送给OLED模块显示。 在程序设计方面,需要结合STM32的ADC采样功能和I2C通信协议进行编程,可以使用HAL库或者CubeMX快速生成代码。先初始化GPIO和I2C,再在主函数中循环调用ADC进行气体浓度的采集,然后处理数据并发送到OLED显示。同时还需要在OLED上设计一定的布局和显示样式,可以使用开源的OLED库或自行编写。 在实际应用中,还需要考虑到MQ-2模块的安装位置和采样频率等因素,以保证测量结果的准确性和稳定性。此外,还需加入一些保护机制和异常处理程序,以应对MQ-2模块出现故障或读取数据异常的情况。 ### 回答2: MQ-2是一种常见的烟雾、气体检测模块,可以用来检测室内空气中的一氧化碳、乙醇、甲烷等有害气体,具有广泛的应用。而STM32则是一种常见的单片机,人们可以通过编程进行各种控制、运算。 因此,我们可以通过将MQ-2模块与STM32单片机进行连接,使得单片机能够接收到模块检测到的数据信号,再将其处理后显示在OLED屏幕上。 具体实现步骤如下: 1. 准备工作:将MQ-2模块的传感器引脚与STM32单片机的GPIO引脚连接,将OLED屏幕的引脚连接到STM32单片机对应的引脚上。 2. 编写代码:通过STM32的编程软件,编写控制MQ-2模块和OLED屏幕的控制程序。其中,需要设置GPIO引脚的输入输出模式,读取MQ-2模块的检测数据并通过计算转换成实际的气体浓度,最终将浓度值显示在OLED屏幕上。 3. 调试程序:将STM32单片机按照接线方式与MQ-2模块和OLED屏幕连接,将编写好的程序下载到STM32单片机中,进行调试测试。可以逐个检查引脚连接和程序的代码是否正确,查看程序执行效果。 通过以上步骤,我们可以实现STM32检测MQ-2模块并在OLED屏幕上显示气体浓度的需求。这一过程中,我们需要有相关的硬件和编程技术储备,同时也需要注意安全和正确性问题。 ### 回答3: 首先需要了解MQ-2传感器的工作原理,MQ-2传感器可以检测气体的浓度,一般用来检测烟雾等有害气体。在STM32的开发中,通过ADC模块读取MQ-2传感器的模拟信号,然后根据读取的数值进行转换,得到对应的气体浓度值。接下来,将浓度值传输到OLED屏幕上进行显示。 具体实现步骤如下: 1. 首先需要初始化ADC模块,设置其对应的GPIO引脚接收模拟信号,并打开ADC的时钟。同时需要设置ADC采集模式、采样时间、转换精度等参数。 2. 接下来在主函数中通过循环读取ADC模块的数值,并进行转换。将转换后的数值传递给OLED屏幕进行显示。 3. 显示可以通过调用OLED屏幕的驱动函数实现。根据实际需求可以设置不同的显示格式,如显示气体浓度、警告提示等。 需要注意的是,在不同的芯片平台下,ADC模块的设置和读取方法有所不同。同时在电路设计中需要考虑到对应的传感器和OLED模块的引脚接法,在代码调试时需要进行针对性调整。
写文章

热门文章

  • ESP8266烧录固件提示等待上电同步,下载失败 21423
  • STM32F407ZGT6最小系统原理图和PCB 19405
  • STM32F103C8T6最小系统原理图和PCB 18607
  • STM32+MFRC522完成IC卡号读取、密码修改、数据读写 16298
  • STM32项目设计:基于STM32指纹密码锁 14266

分类专栏

  • Keil 2篇
  • 单片机开发 59篇
  • C语言 1篇
  • 智能家居和物联网 13篇
  • 开关电源 3篇
  • AD 2篇
  • 硬件设计 12篇
  • windows 1篇
  • IC测试 6篇
  • C# 1篇
  • Labview 2篇
  • 电路 3篇
  • Surface 1篇
  • 嵌入式系统设计师 2篇

最新评论

  • 基于51单片机数字电压表的设计(PCB+原理图+仿真+论文+代码)

    2401_87079114: 您好,这个文件资料可以分享一份嘛

  • 基于51单片机数字电压表的设计(PCB+原理图+仿真+论文+代码)

    2401_87079114: 您好,这个文件资料可以分享一份嘛

  • 基于51单片机16*64LED电子显示屏设计论文加仿真工程与源码

    2301_81076445: 求求了~LED显示屏在哪里找

  • 基于STM32单片机的数字时钟设计(程序+仿真+说明文档文档资料)

    眰恦731: 无法显示呀

  • AD17原理图和PCB导入嘉立创EDA

    梦幻921: 好像不能免费打板了

大家在看

  • labelme下载及安装 159
  • springboot基于java的汽车维修保养管理系统(源码+java+vue+部署文档+讲解等)
  • 如何应对日志盘满的问题——《OceanBase诊断系列》之 12
  • WANGEDITOR从WORD复制粘贴公式
  • Leveraging Large Language Models for Web Scraping

最新文章

  • Keil中代码补全功能和自动缩进功能设置
  • 51单片机四路DS18B20温度检测系统代码与Proteus仿真图
  • STM32 Modbus主从站实例程序-FreeRTOS
2024
10月 1篇
09月 5篇
07月 3篇
06月 29篇
05月 22篇
04月 30篇
03月 10篇
02月 5篇
01月 14篇
2023年25篇
2022年55篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森旺电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家江苏节庆商场美陈价格福建秋季商场美陈哪家好四川酒店玻璃钢造型景观雕塑制作玻璃钢浮雕雕塑厂气球商场美陈装饰哪家好芜湖步行街玻璃钢雕塑优势惠州哈萨克玻璃钢人物雕塑玻璃钢雕塑税率是多少德州水景校园玻璃钢景观雕塑校园玻璃钢雕塑代理价格嘉兴商场开业美陈商场周年庆美陈打卡点北京通用玻璃钢雕塑高品质的选择河北玻璃钢雕塑厂家规格尺寸珠海玻璃钢卡通雕塑商家耒阳玻璃钢圆门头雕塑玻璃钢雕塑裸体美女漳州玻璃钢雕塑哪里好佛山玻璃钢雕塑摆件湖南公园玻璃钢雕塑设计西安景区玻璃钢雕塑厂家水景玻璃钢彩绘雕塑定制山西个性化玻璃钢雕塑订做价格四川常用商场美陈研发徐州商场新春美陈晋城玻璃钢人物动物不锈钢雕塑宿迁夏季商场美陈制作玻璃钢花盆的主要特点是什么商场美陈消防河南泡沫玻璃钢雕塑定制香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化