嵌入式毕设分享 - Stm32家庭有害气体检测系统 - 物联网 嵌入式 单片机

本文主要是介绍嵌入式毕设分享 - Stm32家庭有害气体检测系统 - 物联网 嵌入式 单片机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 0 前言
  • 1 简介
  • 2 主要器件
  • 3 实现效果
  • 4 设计原理
    • 4.1 ZE08-CH2O甲醛采集传感器
    • 4.2 DHT11温湿度传感器
  • 5 部分核心代码
  • 5 最后


0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 基于Stm32的家庭有害气体检测系统

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

🔥 项目分享与指导:https://gitee.com/sinonfin/sharing

1 简介

2 主要器件

  • STM32F103C8T6主控芯片
  • 甲醛采集传感器
  • DHT11温湿度传感器
  • ESP-01S wifi模块

3 实现效果

在这里插入图片描述
在这里插入图片描述

4 设计原理

4.1 ZE08-CH2O甲醛采集传感器

简介
ZE08-CH2O型电化学甲醛模组是一个通用型、小型化模组。利用电化学原理对空气中存在CH2O(甲醛)进行探测,具有良好的选择性,稳定性。内置温度传感器,可进行温度补偿;同时具有数字输出与模拟电压输出,方便使用。
ZE08-CH2O传感器模块是将成熟的电化学检测技术与精良的电路设计紧密结合,设计制造出的通用型气体模组。
在这里插入图片描述

通讯协议
ZE08-CH2O模块采用串口通讯,串口波特率等参数如下,波特率出厂默认为9600,不可更改:

在这里插入图片描述
所得到的气体浓度计算公式为:

气体浓度值=气体浓度高位*256+气体浓度低位

问答式指令
问答式指令即需要单片机主动发送读取浓度值指令,模块才会返回当前的浓度值。
切换到问答式,命令行格式如下:
在这里插入图片描述
读气体浓度值格式如下:
在这里插入图片描述
模块接收到读取浓度指令后,就会返回一条气体浓度值数据:
在这里插入图片描述

4.2 DHT11温湿度传感器

简介
在这里插入图片描述
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。
接线
在这里插入图片描述
DHT11编码步骤

  1. 单片机上点后1s内不读取(不重要)
  2. 主机(单片机)发送起始信号:
    • 主机先拉高data
    • 拉低data延迟18ms
    • 拉高data(通过此操作将单片机引脚设置为输入)。
  3. 从机(DHT11)收到起始信号后进行应答:
    • 从机拉低data,主机读取到data线被拉低持续80us后从机拉高data线, 持续80us,直到高电平结束,意味着主机可以开始接受数据。
  4. 主机开始接收数据:
    • 主机先把data线拉高(io设置为输入)
    • 从机把data线拉低,主机读取data线电平,直到低电平结束(大约50us)
    • 从机拉高data线后,延迟40us左右(28~70us之间)主机再次读取data线电平,如果为低电平,则为“0”,如果为高电平,则为“1”。
    • 继续重复上述1,2步骤累计40次。

5 部分核心代码

void show()			//显示当前数据,LCD第一行
{LCD1602_write(0,0x80);LCD1602_writebyte("CH2O:");  	  //显示当前的甲醛浓度值LCD1602_write(1,0x30+ch2o/10000%10);LCD1602_writebyte(".");LCD1602_write(1,0x30+ch2o/1000%10);LCD1602_write(1,0x30+ch2o/100%10);LCD1602_write(1,0x30+ch2o/10%10);LCD1602_write(1,0x30+ch2o%10);LCD1602_writebyte("mg/m3");
}void main()
{uchar h,l;LCD1602_cls();	  //LCD 1602   调用初始化程序TMOD=0x21;	//配置定时TH0=0x4c;		//50ms  定时赋值TL0=0x00;ET0=1;TR0=1;TH1=0xfd;		//串口波特率定时初始TL1=0xfd;SCON=0x50;	//只发送EA=1;		//打开定时总中断ES=1;		//打开串口中断				TR1=1;h=byte_read(0x2000);l=byte_read(0x2001);   //读取保存的数据ch2o_H=h*256+l;if(ch2o_H>700)ch2o_H=80;while(1){show();		 //显示函数key();		 //按键处理程序}
}void UART_4() interrupt 4 //处理接收的串口数据,接收甲醛传感器指令
{if(RI){RI=0;   //RI 置0UART_dat[bz]=SBUF;	  //暂存串口数据switch(bz){case 0:if(UART_dat[bz]==0xFF) bz=1;else bz=0; break;case 1:if(UART_dat[bz]==0x17) bz=2;else bz=0; break;case 2:if(UART_dat[bz]==0x04) bz=3;else bz=0; break;case 3:if(UART_dat[bz]==0x00) bz=4; else bz=0; break;case 4:bz=5;   break;case 5:bz=6; break;case 6:if(UART_dat[bz]==0x13) bz=7;   else bz=0; break;case 7:if(UART_dat[bz]==0x88) bz=8;  else bz=0; break;case 8:  //校验接收的数据  正确则处理接收的数据if((UART_dat[bz]+UART_dat[1]+UART_dat[2]+UART_dat[3]+UART_dat[4]+UART_dat[5]+UART_dat[6]+UART_dat[7])%256==0){ch2o=UART_dat[4]*256+UART_dat[5];ch2o=ch2o*13.392857;bz=0;}else{bz=0;   }break;}}
//DHT11温湿度传感器部分
#include "reg52.h"
#include "LCD1602.h"
#include "intrins.h"//typedef unsigned char uchar;
//typedef unsigned int uint;//定义变量
sbit Data=P3^6;
uchar rec_dat[13];//用于保存接收到的数据组void DHT11_delay_us(uchar n)
{while(--n);
}void DHT11_delay_ms(uint z)
{uint i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);
}void DHT11_start()
{Data=1;DHT11_delay_us(2);Data=0;DHT11_delay_ms(20);   //延时18ms以上Data=1;DHT11_delay_us(30);
}uchar DHT11_rec_byte()      //接收一个字节
{uchar i,dat=0;for(i=0;i<8;i++)    //从高到低依次接收8位数据{          while(!Data);   //等待50us低电平过去DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0 dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位if(Data==1)    //数据为1时,使dat加1来接收数据1dat+=1;while(Data);  //等待数据线拉低    }  return dat;
}void DHT11_receive()      //接收40位的数据
{uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; DHT11_start();if(Data==0){while(Data==0);   //等待拉高     DHT11_delay_us(40);  //拉高后延时80usR_H=DHT11_rec_byte();    //接收湿度高八位  R_L=DHT11_rec_byte();    //接收湿度低八位  T_H=DHT11_rec_byte();    //接收温度高八位  T_L=DHT11_rec_byte();    //接收温度低八位revise=DHT11_rec_byte(); //接收校正位DHT11_delay_us(25);    //结束if((R_H+R_L+T_H+T_L)==revise)      //校正{RH=R_H;RL=R_L;TH=T_H;TL=T_L;} /*数据处理,方便显示*/rec_dat[0]=RH/10+'0';rec_dat[1]=(RH%10)+'0';rec_dat[2]='%';rec_dat[3]='R';rec_dat[4]='H';rec_dat[5]=' ';rec_dat[6]=' ';rec_dat[7]=(TH/10)+'0';rec_dat[8]=(TH%10)+'0';rec_dat[9]='^';rec_dat[10]='C';}
}void main()
{//使用lcd1602显示数据DHT11_receive();lcd1602(rec_dat);
}

5 最后

🔥 项目分享与指导:https://gitee.com/sinonfin/sharing

这篇关于嵌入式毕设分享 - Stm32家庭有害气体检测系统 - 物联网 嵌入式 单片机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/m0_71369066/article/details/133136075
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/809442

相关文章

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)