文章目录

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

2021年10月27-2022年1月1日 可承接单片机设计,有意可添加Q2809786963

百度网盘资料链接:https://pan.baidu.com/s/1J6AuQpoDJbjMko3kSD4aZw
提取码:81f5
取走点个赞~

一、课题

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);      //????PA0GPIO_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 OUTPUTDHT11_DQ_OUT=0;    //??DQdelay_ms(20);     //????18msDHT11_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<100)//DHT11???40~80us{retry++;   delay_us(1);};  if(retry>=100)return 1;else retry=0;while (!DHT11_DQ_IN&&retry<100)//DHT11????????40~80us{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<100)//???????{retry++;   delay_us(1);}retry=0;while(!DHT11_DQ_IN&&retry<100)//??????{retry++;  delay_us(1);}delay_us(40);//??40usif(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.h

#ifndef __DHT11_H
#define __DHT11_H
#include "sys.h"#define DHT11_IO_IN()  {GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=8<<20;}
#define DHT11_IO_OUT() {GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=3<<20;}#define DHT11_DQ_OUT PAout(5)
#define DHT11_DQ_IN  PAin(5)  #define DHT11_DQ_RCC   RCC_APB2Periph_GPIOA
#define DHT11_DQ_PIN   GPIO_Pin_5
#define DHT11_DQ_PORT  GPIOAu8 DHT11_Init(void);
u8 DHT11_Read_Data(u8 *temp,u8 *humi);
u8 DHT11_Read_Byte(void);
u8 DHT11_Read_Bit(void);
void DHT11_Rst(void);
u8 DHT11_Check(void);#endif

(二)MQ-135驱动,由于用的是ADC,直接上ADC代码

#include "adc.h"#include "delay.h"//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3
void  Adc_Init(void)
{   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);  //使能指定的ADC1ADC_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<times;t++){temp_val+=Get_Adc(ch);delay_ms(5);}return temp_val/times;
}    

(三)主程序

main.c部分代码

int main(void){  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<500)BEEP=1;else if(cnt<1000)BEEP=0;}else BEEP=0;delay_ms(1);}      }

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

  1. java基于ssm空气质量检测系统源码网站空气质量监测源码

    简介 Java基于ssm的空气质量检测系统,检测设备检测一定范围内的企业空气指数,如果有污染则地图显示红色标记. 演示视频 https://www.bilibili.com/video/BV1GK4y ...

  2. java用ssm框架开发的空气质量检测系统源码网站实战项目

    环境: tomcat 7+jdk7+mysql5.5 技术: ssm(spring+springMVC+myibats)+jsp+css+ajax+jq+js+layui+pagehleper分页插件 ...

  3. 基于stm32单片机的空气质量检测仿真(仿真+源码+全套资料)

    资料编号:072 可以通过STM32的ADC检测当前的空气质量,LCD1602显示,并且可以自动控制风扇排气,也可以设置为手动排气.包含全套资料,下面是视频演示: 72-基于stm32单片机的空气质量 ...

  4. java计算机毕业设计教学质量测评系统源码+系统+数据库+lw文档

    java计算机毕业设计教学质量测评系统源码+系统+数据库+lw文档 java计算机毕业设计教学质量测评系统源码+系统+数据库+lw文档 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开 ...

  5. java计算机毕业设计教师教学质量评估系统源码+mysql数据库+系统+lw文档+部署 - 副本

    java计算机毕业设计教师教学质量评估系统源码+mysql数据库+系统+lw文档+部署 - 副本 java计算机毕业设计教师教学质量评估系统源码+mysql数据库+系统+lw文档+部署 - 副本 本源 ...

  6. 基于stm32单片机一氧化碳可燃气体检测仿真(源码+仿真+参考论文)

    资料编号:054 采用stm32单片机作为控制芯片,通过STM32的ADC检测当前的气体浓度,LCD1602显示,并且可以自动控制风扇排气,也可以设置为手动排气.仿真采用Proteus8.9版本,程序 ...

  7. java计算机毕业设计教学质量测评系统源码+系统+lw+数据库+调试运行

    java计算机毕业设计教学质量测评系统源码+系统+lw+数据库+调试运行 注意:该项目只展示部分功能,如需了解,文末获取源码地址. 临近学期结束,还是毕业设计,你还在做java程序.网络编程.课程设计 ...

  8. FX3U PLC源代码,stm32芯片。 全套硬件,软件源码,可以直接用GX Works2编程直接写入。 带读保护版本

    FX3U PLC源代码,stm32芯片. 全套硬件,软件源码,可以直接用GX Works2编程直接写入. 带读保护版本. 是以太网之前的最高版本. 产品功能描述:用梯形图语言编写应用程序,可以直接使用 ...

  9. FX3U PLC源代码,stm32芯片。 全套硬件,软件源码,可以直接用GX Works2编程直接写入

    FX3U PLC源代码,stm32芯片. 全套硬件,软件源码,可以直接用GX Works2编程直接写入. 带读保护版本. 有技术的自动化,电子工程师可以进行学习,有完整pcb,包括报表清单,可以生产制 ...

最新文章

  1. 搜索引擎优化培训教程
  2. 22岁专访库克、B站3天涨粉百万,他将毕设树莓派扫描仪升级,繁星散落在校空!...
  3. 浅谈format格式化输出
  4. Doc命令收集(一)
  5. Angularjs 开始之Hello world
  6. qmake 没有生成.o文件_qmake实用变量
  7. undefined reference to `__errno‘ 解决办法
  8. GridView实现数据编辑和删除(一)
  9. C++ 模板全特化中的函数特化
  10. 配置鸿蒙Windows烧录环境 用Hiburn烧录第一个程序
  11. console错误合集
  12. 【资料整理】squid安装和配置代理上网
  13. 用Unity简单实现第三人称人物的移动和转向
  14. 实训-利用HTML+CSS做响应式项目网页
  15. 使用Wineskin 重新打包《三国志 12 威力增强版 For Mac》
  16. git clone出错
  17. 简易四六级成绩管理系统
  18. 一个程序员失败的爱情
  19. DNS错误不能上网怎么办?电脑dns错误修复方法?
  20. 实践篇(4):Apache jena SPARQL endpoint及推理

热门文章

  1. dsp定点运算基本方法
  2. 图形学-(视图变换,投影变换)
  3. DHCP服务器在校园网中的应用
  4. ESP8266与单片机通信共地问题
  5. iOS开发-Apple开发者账号详解
  6. RMI-spring RMI固定随机数据端口
  7. Java后端接口自动生成神器 -- EasyYapi插件(Yapi接口管理工具在IDEA里的插件)
  8. 更改电脑与eclpse热键冲突
  9. 默纳克普通服务器怎样进协议,默纳克协议代码表、常见电梯系统密码表,见过这么全的吗?...
  10. 安卓逆向-豆瓣app签名算法分析与解密(上)