实训关于stm32单片机的多个传感器应用(附C++源码和解析)

目录

1.实验的目的和要求

2.设计的软件环境

3.思路流程图

4.关键代码解析

4.1温湿度传感器(要监测当前环境的温度、湿度,通过温湿度传感器来实现的)

4.2.光敏电阻传感器(要监测当前环境的光照(黑天和白天),通过光敏电阻传感器来实现的,如果是黑夜,LED灯就亮蓝色,蜂鸣器会报警)

4.3红外线传感器(要监测当前有没有人:通过红外感应传感器,如果有人过来的,蜂鸣器会报警)

4.4超声波传感器(要监测人离你家的距离:通过超声波测试来实现,距离小于20cm,LED灯就亮红色)

4.5 SIM900a模块(有人过来的话,(要把距离、当前环境的的温度、湿度、光照发送短信给你手机))

5.项目小结


1.实验的目的和要求

监测当前环境(通过各种传感(温湿度传感器、超声波传感器。。。)来监测),一旦你的获取的数据(从你的传感器上来的)超过你的阀值(比如当前温度超过这个26°),就会发送短信到你的手机上面去。

2.设计的软件环境

硬件环境:STM32开发板
软件环境:KEIL5 
传感器:温湿度传感器DHT11、超声波传感器、光敏电阻传感器、红外感应传感器  + GPRS模块

3.思路流程图

 

4.关键代码解析

4.1温湿度传感器(要监测当前环境的温度、湿度,通过温湿度传感器来实现的)

引脚说明:

相关宏定义:

 输入输出配置:

if(DHT11_Dout_IN()==Bit_RESET)     
	{
		/*轮询直到从机发出 的80us 低电平 响应信号结束*/  
		while(DHT11_Dout_IN()==Bit_RESET);

		/*轮询直到从机发出的 80us 高电平 标置信号结束*/
		while(DHT11_Dout_IN()==Bit_SET);

		/*开始接收数据*/   
		DHT11_Data->humi_int= DHT11_ReadByte();

		DHT11_Data->humi_deci= DHT11_ReadByte();

		DHT11_Data->temp_int= DHT11_ReadByte();

		DHT11_Data->temp_deci= DHT11_ReadByte();

		DHT11_Data->check_sum= DHT11_ReadByte();

打印显示温度并设置报警温度:

if(DHT11_Read_TempAndHumidity (&DHT11_Data) == SUCCESS)
		{
				char BUFF1[100];
        sprintf(BUFF1,"°☆☆☆温度: %d.%d°C ☆☆☆°",DHT11_Data.temp_int, DHT11_Data.temp_deci);
printf("%d.%d\r\n",DHT11_Data.temp_int, DHT11_Data.temp_deci);
LCD_ClearLine(LINE(1));
ILI9341_DispStringLine_EN_CH(LINE(1),BUFF1);
i f (DHT11_Data.temp_int>=26)
{
	LED1_ON;   
	BEEP( Open); 			  // 响
	Delay(0x0FFFFF);	
	BEEP( Close );		  // 不响
	Delay(0x0FFFFF);
	LCD_ClearLine(LINE(3));	/* 清除单行文字 */
ILI9341_DispStringLine_EN_CH(LINE(3),"警告,温度过高!");
}
else
{
	LCD_ClearLine(LINE(3));	/* 清除单行文字 */
	ILI9341_DispStringLine_EN_CH(LINE(3),"温度正常!");
}

4.2.光敏电阻传感器(要监测当前环境的光照(黑天和白天),通过光敏电阻传感器来实现的,如果是黑夜,LED灯就亮蓝色,蜂鸣器会报警

引脚说明:

配置LDR时钟,配置LDR的GPIO:

void LDR_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/*开启端口的时钟*/
	RCC_APB2PeriphClockCmd(LDR_GPIO_CLK,ENABLE);
	
	//选择输入的引脚
	GPIO_InitStructure.GPIO_Pin = LDR_GPIO_PIN; 
	// 设置光敏输入的引脚为下拉输入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; 
	GPIO_Init(LDR_GPIO_PORT, &GPIO_InitStructure);
}

光敏电阻测试:

 

uint8_t LDR_Test(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{			
	/*检测光敏输入状态 */
	if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 1 )  
	{	  
		return LDR_OFF;    // 无光
	}
	else
		return LDR_ON;    // 有光
}

显示白天黑夜并报警

if (LDR_Test(LDR_GPIO_PORT,LDR_GPIO_PIN) == LDR_ON)
{
	LED3_OFF;
	LCD_ClearLine(LINE(4));	/* 清除单行文字 */
	ILI9341_DispStringLine_EN_CH(LINE(4),"o(* ̄▽ ̄*)ブ光线充足,不亮灯");
}
else if(LDR_Test(LDR_GPIO_PORT,LDR_GPIO_PIN) == LDR_OFF)
{
	LED3_ON;   
	//BEEP( Open); 			  // 响
	//Delay(0x0FFFFF);	
	//BEEP( Close );		  // 不响
	//Delay(0x0FFFFF);
	LCD_ClearLine(LINE(4));	/* 清除单行文字 */
	ILI9341_DispStringLine_EN_CH(LINE(4),"┭┮﹏┭┮光线不足,亮灯");
}

4.3红外线传感器(要监测当前有没有人:通过红外感应传感器,如果有人过来的,蜂鸣器会报警

主函数调用(改写)引脚

if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5) == 0)
{
	printf("附近没人\r\n");
        ILI9341_DisplayStringEx(0,240,18,18,(uint8_t *)"无人靠近,一切正常!",0);
}

4.4超声波传感器(要监测人离你家的距离:通过超声波测试来实现,距离小于20cm,LED灯就亮红色)

引脚说明:

 定时器设置:

void hcsr04_NVIC()
{
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
			
	NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;             
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       
	NVIC_Init(&NVIC_InitStructure);
}

通过定时器计数器值推算距离

float Hcsr04GetLength(void)
{
        u32 t = 0;
        int i = 0;
        float lengthTemp = 0;
        float sum = 0;	
        while(i!=5)
{	 
        TRIG_Send = 1;	
        delay_us(20);
        TRIG_Send = 0;
        while(ECHO_Reci == 0);		 
        OpenTimerForHc();  
        i = i + 1;
        while(ECHO_Reci == 1);
        CloseTimerForHc();        
        t = GetEchoTimer();        
        lengthTemp = ((float)t/58.0);//cm
        sum = lengthTemp + sum ; 
}
        lengthTemp = sum/5.0;
        return lengthTemp;
}

显示超声波距离并设置警报

length = Hcsr04GetLength();
printf("距离为:%.3fcm\n",length);
sprintf(dispBuff,"/****距离为:%.3fcm ****/",length);
LCD_ClearLine(LINE(5));	/* 清除单行文字 */
LCD_ClearLine(LINE(6));	/* 清除单行文字 */
ILI9341_DispStringLine_EN_CH(LINE(5),"*******提示:监测到距离*******");
ILI9341_DispStringLine_EN_CH(LINE(6),dispBuff);
if(length<=20)
{
	LED1_ON;   
	BEEP(Open); 			  // 响
	Delay(0x0FFFFF);	
	BEEP(Close);		  // 不响
	Delay(0x0FFFFF);
	sprintf(dispBuff,"/*距离过近,距离为:%.3fcm */",length);
	LCD_ClearLine(LINE(7));	/* 清除单行文字 */
	ILI9341_DispStringLine_EN_CH(LINE(7),dispBuff);
}
else{
	LCD_ClearLine(LINE(7));	/* 清除单行文字 */
	ILI9341_DispStringLine_EN_CH(LINE(7),"距离正常!");
}

4.5 SIM900a模块(有人过来的话,(要把距离、当前环境的的温度、湿度、光照发送短信给你手机)

Sim900A.c:

void SIM900A_phone(void){
	SIM900A_Clear();
	while(SIM900A_SendCmd("ATD19901541203;\r\n", "OK")) // SIM900A
	{
		Delay(0x0FFFFF);
		//printf( " --AT \n");
	}
}

SIM900A_sendCmd函数:

Bool SIM900A_SendCmd(char *cmd, char *res)
{
	
	    unsigned char timeOut = 10;//200;

	    Usart_SendString(SIM900A_USART, (unsigned char *)cmd, strlen((const char *)cmd));
	    //Usart_SendString(SIM900A_USART, (unsigned char *)cmd);
	    while(timeOut--)
{
		//printf("[%d]%s \n",SIM900A_cnt,SIM900A_buf);
		if(SIM900A_WaitRecive() == REV_OK)				//如果收到数据
{
		//printf("Usart_GetReceive: %s  \n",SIM900A_buf);
if(strstr((const char *)SIM900A_buf, res) != NULL)		//如果检索到关键词
{
		printf("GOT: %s  \n",SIM900A_buf);
		SIM900A_Clear();									//清空缓存
		return 0;
}
}
		
		Delay(0x0FFFFF);
}

5.项目小结

我进行项目的时候也是刚刚接触stm32单片机这类硬件方面的。其实学会了单片机基础,就会发现也并没有那么难的东西。基础的stm32还是比较简单的,但是硬件需要大量的调试和测样,这才是最繁琐的事情。

以上代码只是一部分,我只讲了比较关键的地方,更多代码还请关注我的github:

zhouwenqi123/chuanganqi: 物联网实训stm32单片机关于 温湿度DHT11、超声波,光敏电阻,红外感应,GPRS模块的应用 (github.com)

  • 7
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机嵌入式开发,应用案例
STM32单片机人体检测传感器主要用于检测人体的各种参数,如体温、心率、血氧等。它广泛应用于医疗、健康管理、智能家居、智能穿戴等领域。以下是其应用领域及作用的详细分析: 1. 医疗领域 在医疗领域,STM32单片机人体检测传感器被广泛应用于医疗设备和健康管理系统中。传感器可以检测人体的体温、心率、血压等参数,从而为医生和患者提供更加精确和实时的数据和信息。同时,传感器还可以与云端服务相结合,实现远程监测和诊断,为医疗工作者提供更加便利和高效的服务。 2. 健康管理领域 在健康管理领域,STM32单片机人体检测传感器可以帮助人们监测自己的健康状况,从而更好地管理自己的健康。传感器可以检测人体的体温、心率、睡眠质量等参数,为人们提供更加科学和精准的健康管理方案。同时,传感器还可以与智能手机等设备相结合,实现数据共享和智能化管理,为人们提供更加智能化和便利的健康管理服务。 3. 智能家居领域 在智能家居领域,STM32单片机人体检测传感器可以帮助人们实现智能化的家居环境。传感器可以检测人体的活动状态和行踪,从而实现智能化的灯光、温度、风扇等设备的控制。同时,传感器还可以与语音控制等技术相结合,实现更加智能化和便利的家居控制体验。 4. 智能穿戴领域 在智能穿戴领域,STM32单片机人体检测传感器可以帮助人们实现更加智能化和精准的健康监测。传感器可以检测人体的心率、血氧等参数,从而实现智能化的健康监测和提醒。同时,传感器还可以与智能手环、智能手表等设备相结合,实现更加便利和高效的健康管理和监测服务。 综上所述,STM32单片机人体检测传感器在医疗、健康管理、智能家居、智能穿戴等领域都有广泛的应用,可以帮助人们实现更加智能、高效、便利的生活和工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值