STM32项目设计:温湿度空气质量报警器, 分享源码、PCB 您所在的位置:网站首页 设计一个报警程序 STM32项目设计:温湿度空气质量报警器, 分享源码、PCB

STM32项目设计:温湿度空气质量报警器, 分享源码、PCB

2024-07-10 18:55| 来源: 网络整理| 查看: 265

文章目录 一、课题二、准备材料三、原理图与PCB设计四、程序设计

QQ交流群1:981140834 QQ交流群2:473982062 QQ交流群3:718245727 QQ交流群4:598455837

百度网盘资料链接:https://pan.baidu.com/s/1J6AuQpoDJbjMko3kSD4aZw 提取码:81f5 取走点个赞~ 实物链接:https://m.tb.cn/h.5hxIKT6?tk=WUiOWYH6nb1 CZ0001

实物链接:https://m.tb.cn/h.5h5NmRE?tk=f35lWYHTlwi CZ3457

一、课题

1、用 DHT11 温湿度传感器获取温湿度信息,显示到OLED屏上 2、用 MQ-135 空气质量传感器获取空气质量信息,显示到OLED屏上 3、设计一个报警系统,可以设置温湿度与空气质量的上限,超过这个值蜂鸣器发出声响报警

二、准备材料

(一)、主控芯片stm32f103c8t6核心板 在这里插入图片描述 (二)DHT11温湿度传感器 在这里插入图片描述

(三)mq135空气质量传感器 在这里插入图片描述 (四)4针IIC OLED 在这里插入图片描述

三、原理图与PCB设计

(一)原理图设计 在这里插入图片描述 (二)PCB设计 在这里插入图片描述

四、程序设计

(一)DHT11驱动 DHT11.c

#include "DHT11.h" #include "delay.h" //???DHT11 //??:??????(????) u8 DHT11_Init() { GPIO_InitTypeDef GPIO_InitStruce; RCC_APB2PeriphClockCmd(DHT11_DQ_RCC,ENABLE); //????PA0 GPIO_InitStruce.GPIO_Pin = DHT11_DQ_PIN; GPIO_InitStruce.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruce.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DHT11_DQ_PORT,&GPIO_InitStruce); DHT11_Rst(); return DHT11_Check(); } //??DHT11 void DHT11_Rst(void) { DHT11_IO_OUT(); //SET OUTPUT DHT11_DQ_OUT=0; //??DQ delay_ms(20); //????18ms DHT11_DQ_OUT=1; //DQ=1 delay_us(30); //????20~40us } //??DHT11??? //??1:????DHT11??? //??0:?? u8 DHT11_Check(void) { u8 retry=0; DHT11_IO_IN();//SET INPUT while (DHT11_DQ_IN&&retry retry++; delay_us(1); }; if(retry>=100)return 1; return 0; } //?DHT11????? //???:1/0 u8 DHT11_Read_Bit(void) { u8 retry=0; while(DHT11_DQ_IN&&retry retry++; delay_us(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 u8 buf[5]; u8 i; DHT11_Rst(); if(DHT11_Check()==0) { for(i=0;i *humi=buf[0]; *temp=buf[2]; } }else return 1; return 0; }

DHT11.h

#ifndef __DHT11_H #define __DHT11_H #include "sys.h" #define DHT11_IO_IN() {GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=8 ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M //PA1 作为模拟通道输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚 GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1); //复位ADC1 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目 ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器 ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1 ADC_ResetCalibration(ADC1); //使能复位校准 while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束 ADC_StartCalibration(ADC1); //开启AD校准 while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束 // ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能 } //获得ADC值 //ch:通道值 0~3 u16 Get_Adc(u8 ch) { //设置指定ADC的规则组通道,一个序列,采样时间 ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束 return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果 } u16 Get_Adc_Average(u8 ch,u8 times) { u32 temp_val=0; u8 t; for(t=0;t u16 key; int adc,cnt=0; float volt; delay_init(); NVIC_Configuration(); BEEP_Init(); OLED_Init(); OLED_Clear(); uart_init(115200); printf("欢迎使用化作尘健康小工具\r\n"); KEY_Init(); LED_Init(); TIM3_Int_Init(500-1,720-1); DEV_Init(); OLED_Clear(); OLED_Dis_Menu(); while(1) { if(cnt++ ==1000) { cnt = 0; LED0=!LED0; adc = Get_Adc_Average(0,5); volt = adc*3.3/4096; air = pow((3.4880*10*volt)/(5-volt),(1.0/0.3203)); printf("air :%d\r\n",air); //获取温湿度 DHT11_Read_Data( &temp, &humi); if(last_temp!=temp || last_humi!=humi) { OLED_Dis_DHT(temp,humi,air); } } key = Key_GetValue(); //按键扫描 if(key) DealKeyVal(key); if(!KEY1_IO()) { printf("%d\r\n",GetTime()); } if(temp>Max_temp || humi>Max_humi || air>Max_air) { if(cnt


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有