当前位置:   article > 正文

实训关于stm32单片机的多个传感器应用(附C++源码和解析)_基于stm32嵌入式接口与传感器应用开发的代码

基于stm32嵌入式接口与传感器应用开发的代码

目录

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温湿度传感器(要监测当前环境的温度、湿度,通过温湿度传感器来实现的)

引脚说明:

相关宏定义:

 输入输出配置:

  1. if(DHT11_Dout_IN()==Bit_RESET)
  2. {
  3. /*轮询直到从机发出 的80us 低电平 响应信号结束*/
  4. while(DHT11_Dout_IN()==Bit_RESET);
  5. /*轮询直到从机发出的 80us 高电平 标置信号结束*/
  6. while(DHT11_Dout_IN()==Bit_SET);
  7. /*开始接收数据*/
  8. DHT11_Data->humi_int= DHT11_ReadByte();
  9. DHT11_Data->humi_deci= DHT11_ReadByte();
  10. DHT11_Data->temp_int= DHT11_ReadByte();
  11. DHT11_Data->temp_deci= DHT11_ReadByte();
  12. DHT11_Data->check_sum= DHT11_ReadByte();

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

  1. if(DHT11_Read_TempAndHumidity (&DHT11_Data) == SUCCESS)
  2. {
  3. char BUFF1[100];
  4. sprintf(BUFF1,"°☆☆☆温度: %d.%d°C ☆☆☆°",DHT11_Data.temp_int, DHT11_Data.temp_deci);
  5. printf("%d.%d\r\n",DHT11_Data.temp_int, DHT11_Data.temp_deci);
  6. LCD_ClearLine(LINE(1));
  7. ILI9341_DispStringLine_EN_CH(LINE(1),BUFF1);
  8. i f (DHT11_Data.temp_int>=26)
  9. {
  10. LED1_ON;
  11. BEEP( Open); // 响
  12. Delay(0x0FFFFF);
  13. BEEP( Close ); // 不响
  14. Delay(0x0FFFFF);
  15. LCD_ClearLine(LINE(3)); /* 清除单行文字 */
  16. ILI9341_DispStringLine_EN_CH(LINE(3),"警告,温度过高!");
  17. }
  18. else
  19. {
  20. LCD_ClearLine(LINE(3)); /* 清除单行文字 */
  21. ILI9341_DispStringLine_EN_CH(LINE(3),"温度正常!");
  22. }

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

引脚说明:

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

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

光敏电阻测试:

 

  1. uint8_t LDR_Test(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
  2. {
  3. /*检测光敏输入状态 */
  4. if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 1 )
  5. {
  6. return LDR_OFF; // 无光
  7. }
  8. else
  9. return LDR_ON; // 有光
  10. }

显示白天黑夜并报警

  1. if (LDR_Test(LDR_GPIO_PORT,LDR_GPIO_PIN) == LDR_ON)
  2. {
  3. LED3_OFF;
  4. LCD_ClearLine(LINE(4)); /* 清除单行文字 */
  5. ILI9341_DispStringLine_EN_CH(LINE(4),"o(* ̄▽ ̄*)ブ光线充足,不亮灯");
  6. }
  7. else if(LDR_Test(LDR_GPIO_PORT,LDR_GPIO_PIN) == LDR_OFF)
  8. {
  9. LED3_ON;
  10. //BEEP( Open); // 响
  11. //Delay(0x0FFFFF);
  12. //BEEP( Close ); // 不响
  13. //Delay(0x0FFFFF);
  14. LCD_ClearLine(LINE(4)); /* 清除单行文字 */
  15. ILI9341_DispStringLine_EN_CH(LINE(4),"┭┮﹏┭┮光线不足,亮灯");
  16. }

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

主函数调用(改写)引脚

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

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

引脚说明:

 定时器设置:

  1. void hcsr04_NVIC()
  2. {
  3. NVIC_InitTypeDef NVIC_InitStructure;
  4. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  5. NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
  6. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  7. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  8. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  9. NVIC_Init(&NVIC_InitStructure);
  10. }

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

  1. float Hcsr04GetLength(void)
  2. {
  3. u32 t = 0;
  4. int i = 0;
  5. float lengthTemp = 0;
  6. float sum = 0;
  7. while(i!=5)
  8. {
  9. TRIG_Send = 1;
  10. delay_us(20);
  11. TRIG_Send = 0;
  12. while(ECHO_Reci == 0);
  13. OpenTimerForHc();
  14. i = i + 1;
  15. while(ECHO_Reci == 1);
  16. CloseTimerForHc();
  17. t = GetEchoTimer();
  18. lengthTemp = ((float)t/58.0);//cm
  19. sum = lengthTemp + sum ;
  20. }
  21. lengthTemp = sum/5.0;
  22. return lengthTemp;
  23. }

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

  1. length = Hcsr04GetLength();
  2. printf("距离为:%.3fcm\n",length);
  3. sprintf(dispBuff,"/****距离为:%.3fcm ****/",length);
  4. LCD_ClearLine(LINE(5)); /* 清除单行文字 */
  5. LCD_ClearLine(LINE(6)); /* 清除单行文字 */
  6. ILI9341_DispStringLine_EN_CH(LINE(5),"*******提示:监测到距离*******");
  7. ILI9341_DispStringLine_EN_CH(LINE(6),dispBuff);
  8. if(length<=20)
  9. {
  10. LED1_ON;
  11. BEEP(Open); // 响
  12. Delay(0x0FFFFF);
  13. BEEP(Close); // 不响
  14. Delay(0x0FFFFF);
  15. sprintf(dispBuff,"/*距离过近,距离为:%.3fcm */",length);
  16. LCD_ClearLine(LINE(7)); /* 清除单行文字 */
  17. ILI9341_DispStringLine_EN_CH(LINE(7),dispBuff);
  18. }
  19. else{
  20. LCD_ClearLine(LINE(7)); /* 清除单行文字 */
  21. ILI9341_DispStringLine_EN_CH(LINE(7),"距离正常!");
  22. }

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

Sim900A.c:

  1. void SIM900A_phone(void){
  2. SIM900A_Clear();
  3. while(SIM900A_SendCmd("ATD19901541203;\r\n", "OK")) // SIM900A
  4. {
  5. Delay(0x0FFFFF);
  6. //printf( " --AT \n");
  7. }
  8. }

SIM900A_sendCmd函数:

  1. Bool SIM900A_SendCmd(char *cmd, char *res)
  2. {
  3. unsigned char timeOut = 10;//200;
  4. Usart_SendString(SIM900A_USART, (unsigned char *)cmd, strlen((const char *)cmd));
  5. //Usart_SendString(SIM900A_USART, (unsigned char *)cmd);
  6. while(timeOut--)
  7. {
  8. //printf("[%d]%s \n",SIM900A_cnt,SIM900A_buf);
  9. if(SIM900A_WaitRecive() == REV_OK) //如果收到数据
  10. {
  11. //printf("Usart_GetReceive: %s \n",SIM900A_buf);
  12. if(strstr((const char *)SIM900A_buf, res) != NULL) //如果检索到关键词
  13. {
  14. printf("GOT: %s \n",SIM900A_buf);
  15. SIM900A_Clear(); //清空缓存
  16. return 0;
  17. }
  18. }
  19. Delay(0x0FFFFF);
  20. }

5.项目小结

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/684052
推荐阅读
相关标签
  

闽ICP备14008679号