智能家居环境小护士(原理图、pcb、源码、设计报告)

news2024/7/6 18:57:08

目录
ARM-STM32校园创新大赛 1
题 目: 智能家居环境小护士 1
摘要 1
引言 2

  1. 系统方案 3
    整套系统的工作原理是:单片机是整套系统的控制核心,温湿度传感器负责测试环境中的温湿度;烟雾传感器负责检测空气中的有毒气体,如甲醛和硫氢化物;加湿器负责加湿;当烟雾传感器检测到环境中存在有毒气体时,这个消息被单片机检测到后,单片机就会告诉通讯模块,通讯模块就会发短信通知主人;如果无有毒气体,温湿度传感器测得的温湿度在显示模块上上显示出来,环境中太干时,加湿器就加湿。各个模块各自有各自的任务,互相合作,共同营造一个舒适的环境。 3
  2. 系统硬件设计 3
    2.1温湿度传感器 3
    2.2 烟雾传感器 3
    2.3加湿器 3
    2.4单片机最小系统 3
    2.5 矩阵键盘 3
    2.6 通信模块 4
  3. 系统软件设计 4
    软件调试 4
  4. 系统创新 4
  5. 评测与结论 5
    附录 5

1.系统方案
整套系统的工作原理是:单片机是整套系统的控制核心,温湿度传感器负责测试环境中的温湿度;烟雾传感器负责检测空气中的有毒气体,如甲醛和硫氢化物;加湿器负责加湿;当烟雾传感器检测到环境中存在有毒气体时,这个消息被单片机检测到后,单片机就会告诉通讯模块,通讯模块就会发短信通知主人;如果无有毒气体,温湿度传感器测得的温湿度在显示模块上上显示出来,环境中太干时,加湿器就加湿。各个模块各自有各自的任务,互相合作,共同营造一个舒适的环境。
2.系统硬件设计
2.1温湿度传感器
DHT11在整套系统中主要负责对环境中的温度和湿度进行实行检测。
2.2 烟雾传感器
烟雾传感器在整个系统中负责检测环境中的有毒气体。
2.3加湿器
当环境中温度大于某个数值或者湿度小于某个数值时,加湿器就会加湿。下图是从网上买的加湿器套件,然后再焊接成成品。
2.4单片机最小系统
整个系统的控制核心是,数据的发送、接受、显示,通信模块发短信等都是单片机控制的。
2.5 矩阵键盘
矩阵键盘是自己焊接的,主要用于设置任何人的电话号码。

2.6 通信模块
通信模块主要用于当烟雾传感器检测到有毒气体时,发短信通知主人。
3.系统软件设计
软件调试
前边介绍了系统整体的硬件和软件,下面介绍下软件调试。
通讯模块不发短信,刚开始感觉很奇怪,感觉自己硬件也没出错,程序应该也没错,但是通讯模块就是不发短信,后来反复检查硬件,加上个小灯,在排除硬件出错的前提下,反复调试软件,终于发短信了:原来是当烟雾传感器检测到有毒气体时,单片机正在执行别的操作,当单片机回来检查烟雾传感器时,那一瞬间已经过去了,所以不会发短信,加上个中断就可以了。
4.系统创新
整套系统的创新之处在于其智能:当室内有毒气体浓度大于某个浓度时,报警模块可以发出声音,还可以触动通信模块,发短信通知主人,并且可以设置任意人的电话号码,从而减少一些不必要的损失;还有就是加湿器可以根据温湿度传感器测量的温湿度,选择不同的工作模式进行加湿,这也是体现其智能的原因之一;再有,整套系统可以显著得改善环境,这也是其智能的原因。

#include"reg52.h"
#include "uart.c"
#include "delay.h"
#include <intrins.h>

//uchar code PhoneNO[]= "18332211268"; //接收方号码
uchar code PhoneNO[]= "18032837054"; //接收方号码
uchar code Text1[]= "HOME DOCTOR:Harm gas comes out ,please contact 119";  //内容
uchar  mq_135_flag;
uchar DHT11[5],RTflag=0;//读取到得数据校验标志
uchar  FLAG;   //超时标志位
uchar  dis_buf;            //显示缓存
uchar  temp;
uchar  key;                //键顺序吗
void delay0(uchar x);      //x*0.14MS
uchar cdis1[16] = {"  KEY NUMBER   "};
uchar cdis2[16] = {"  KEY-CODE:   H "};
uint i;

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

//I/O定义
//*********************************************************************/
sbit LED=P2^0;//定义单片机P1口的第1位 (即P1.0)为指示灯端
sbit DOUT=P1^1;//定义单片机P2口的第1位 (即P2.0)为气体传感器的输入端

sbit dat=P2^2;//温湿度数据口
sbit RS=P2^4; //1602读数据
sbit RW=P2^5;//1602写数据
sbit EN=P2^6; //1602读写数据使能口
sbit WET_MOTOR=P2^7;//加湿器控制口
sbit KEY1=P1^2;//夏天与秋天模式
sbit KEY2=P1^3;//春天与冬天模式
sbit KEY3=P1^4;//睡眠模式
sbit flag_sms=P1^4;//短信输入开始按钮
//注意在P1口处添加了数字矩阵键盘,不要冲突
void Delay_t(uint j)
{      uchar i;
	    for(;j>0;j--)
	  { 	
		for(i=0;i<27;i++);	
	  }
}
void  Delay_10us(void) //10us延时函数
{
        uchar i;
         i--;
         i--;
         i--;
         i--;
         i--;
         i--;
}
void delay(uint z)//1毫秒延时函数
{
   uint x,y;
   for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}

/********************************************************
* INT0中断函数                                          *
********************************************************/
void  mq_135_test(void) interrupt 0 
{
   EX0=0;
   mq_135_flag=1;     //中断计数  
   EX0=1;
}
//
 //	 此下为加湿器动作和模式设置,温湿度显示部分
 //
void lcd_write_com(uchar com) //1602写指令
{
   RS=0;
   RW=0;
   EN=1;
   P0=com;
   delay(1);
   EN=0;

}
void lcd_init()	//1602初始化
{

 

}
void lcd_write_data(uchar date)//1602写数据
{
   RS=1;
   RW=0;
   EN=1;
 
   EN=0;
}
void write_str(uchar x,uchar y,uchar *s)//在任意地址写符号字母或数字
{
	 
	while(*s)
	{
	   lcd_write_data(*s);
	   s++;
	}



}
void write_shu(uchar x,uchar y,uchar num)//数据显示函数
{
	  
	  uchar s,g;
	  if(y==0)
	  lcd_write_com(0x80+x);
	  else
	  lcd_write_com(0xc0+x);
	
}

uchar scan_key(void)  //注意我暂时没有消抖	也没涉及是否支持多个按下,按键要那种不可以弹上来,要自己控制
{
 if(KEY1==0)return 1; //夏天与秋天模式

}

 void wet_motor(void)//加湿器模式分春天与冬天,夏天与秋天
 {	
 
 //		 DHT11[2]=30;//温度整数
//		 DHT11[0]=10; //湿度整数   
		 uchar a;
		   a=scan_key();
		   switch(a)
		   {
			   case  1:{if( DHT11[0]>5&&DHT11[2]>10)WET_MOTOR=1;};break;//夏天与秋天模式
			   case 2:{if( DHT11[0]<10&&DHT11[2]>26)WET_MOTOR=1;};break;//春天与冬天模式
			   case 3:{if( DHT11[0]>5&&DHT11[2]<25)WET_MOTOR=0;};break;// 睡眠模式
			   default:WET_MOTOR=1;
			   
		   }
 }

uchar  write_byte1() //读一个字节
{
	   uchar i,comdata,temp1;
       for(i=0;i<8;i++)	   
	    {
	   	    FLAG=2;	
	  
		 while((dat)&&FLAG++);//flag先与后加1 如果dat一直为1   uchar型变量 flag  溢出变为0  再自加1  
	   	  
	   	 if(FLAG==1)break;		//超时则跳出for循环	
         comdata<<=1;//左移一位   高位在前  低位在后
	   	   comdata|=temp1;
	     }
		 return (comdata);  
}
void DHT11_5() //读5个字节数据  两个字节为温度数据  两个字节为湿度数据 最后一个字节为校验
{
	  uchar i,temp;
	  //主机拉低18ms 
       dat=0;
	   Delay_t(180);
	   dat=1;
	 //总线由上拉电阻拉高 主机延时20us
	   Delay_10us();
	   Delay_10us();
	   Delay_10us();
	   Delay_10us();
	 //主机设为输入 判断从机响应信号 
	   dat=1;
	 //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行	  
	   if(!dat)		 //T !	  
	  { 
		FLAG=2;	   //超时标志位
				 
		while((!dat)&&FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束
			FLAG=2;
			
		while((dat)&&FLAG++); //判断从机拉高80us是否结束
			for(i=0;i<5;i++)//数据接收状态
			{
				DHT11[i]=write_byte1();	
			}		 
			dat=1;	//释放数据总线  为下一次读取做好准备
            temp=(DHT11[0]+DHT11[1]+DHT11[2]+DHT11[3]);
			if(temp==DHT11[4])	//数据校验 	
			{  	   	  
				RTflag=1;		  
			}
			if(RTflag==1) //如果RTflag=1 说明读取到得数据正确
		   {  			
				RTflag=0;
			//	tm[0]=DATARHT[0]/10;
			//	tm[1]=DATARHT[0]%10;
			//	tm[2]=DATARHT[1]/10; //湿度
			  
			//	tm[3]=DATARHT[2]/10;
			//	tm[4]=DATARHT[2]%10;
			//	tm[5]=DATARHT[3]/10; //温度	
			  
				write_str(0,0,"NOW-RH: ");//第一行显示湿度
				write_shu(9,0,DHT11[0]);
				write_str(11,0,".");
				write_shu(12,0,DHT11[1]);
				write_str(13,0,"%");
				write_str(14,0,"RH");
				write_str(0,1,"NOW-TE: ");//第二行为显示温度	
			    write_shu(9,1,DHT11[2]);
				write_str(11,1,".");
				write_shu(12,1,DHT11[3]);
				write_str(13,1,"^");
			    write_str(14,1,"C");
				
				
//				if(DHT11[3]>=30) 
//				JIASHI=1;
//				else 
//				JIASHI=0;
								
		   }

		}

}
//

//此下代码为矩阵键盘输入数据的相关函数
//
/*************************************************************/
/*                                                           */
/*  设定显示位置                                             */
/*                                                           */
/*************************************************************/

void lcd_pos(uchar pos)
{                          
  lcd_write_com(pos | 0x80);  //数据指针=80+地址变量
}

/*************************************************************/
/*                                                           */
/* 键扫描子程序  (4*3 的矩阵) P1.4 P1.5 P1.6 P1.7为行        */
/*							  P1.1 P1.2 P1.3为列             */
/*                            								 */
/*************************************************************/

 void  keyscan(void)
 { 
 }

/*************************************************************/
/*                                                           */
/*判断键是否按下                                             */
/*                                                           */
/*************************************************************/

 void  keydown(void)
 {  
  	P1=0xF0;
	if(P1!=0xF0)  //判断按键是否按下 如果按钮按下 会拉低P1其中的一个端口
	{
	  keyscan();
    }
 }

void num_key(void) //举证键盘输入数字并显示,先提前测试一下,打算用外部中断来开启这个函数
{
    uchar m;
    P0=0xFF;                    //置P0口
    P1=0xFF;                    //置P1口  
    delay(10);                 //延时
    //lcd_init();                //初始化LCD             
        
    lcd_pos(0);                //设置显示位置为第一行的第1个字符
     m = 0;
    while(cdis1[m] != '\0')
     {                         //显示字符
       lcd_write_data(cdis1[m]);
       m++;
     }

    lcd_pos(0x40);             //设置显示位置为第二行第1个字符
     m = 0;
    while(cdis2[m] != '\0')
     {
       lcd_write_data(cdis2[m]);      //显示字符
       m++;
     }       
	  dis_buf = 0x2d;          //显示字符"-"

    while(1)
    { 
       keydown();
	   lcd_pos(0x4c);             
       lcd_write_data(dis_buf);        //第一位数显示   
    }
}
/********************************************************************

*********************************************************************/

//********************************************************************


void main()
{	
	//IT0=0;       //低电平触发外部中断0优先级最高
   IT0=1;       //下降沿触发
   EA=1;
   EX0=1;

	lcd_init();	//1602初始化
	Uart_init(); //串口初始化,
	delay(100);//等待DHT11温湿度传感器数据稳定  开始激活DHT11 
	while(1)
	  {
			//if(DOUT==0)
		
			//delay_ms(30);
					if( mq_135_flag)
					{
						mq_135_flag=0; //标志清零

						SendString("AT+CMGF=1\r\n");	
						
						delayms_1000ms();
						
						SendString("AT+CSCS=\"GSM\"\r\n");	
						
						delayms_1000ms();
						
						SendString("AT+CMGS=");	//信息发送指令 AT+CMGS=//
						SendASC('"');
						SendString(PhoneNO);   
						SendASC('"');
						SendASC('\r');			//发送回车指令//
						SendASC('\n');			//发送回车指令//
						
						delayms_1000ms();
						
						SendString(Text1);  
				
						delayms_1000ms();
						
						SendASC(0x1a);		
						
						delayms_1000ms();
						delayms_1000ms();
						delayms_1000ms();
						delayms_1000ms();
						delayms_1000ms();
						LED=1;//熄灭P1.0口灯将来改为火警警告声


					   for(i==0;i<9;i++)

					   delayms_1000ms();


					}
					else   
					{
					LED=0;//点亮P1.0口灯
				    write_byte1();//读一个字节
  					DHT11_5(); //读数据
				   	wet_motor();
				   }
			


//				   if(flag_sms==1)
//				   num_key();
   	}
 }

 
 


 /*问题:
   每次处理完数据。RsPoint是怎样清零的?????在 准备发一个数据,然后接受一个数据 之前
   RsBuf[RsPoint++]=SBUF;
		RsBuf[RsPoint]=0x00;   //将下一个数据清零

		如果这个发送没问题。加删除,接收函数,参考桌面上的tc35.c

		添加液晶菜单的支持	,类似手机
*/
 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/22435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据同步工具DataX介绍和原理

目录1. DataX介绍2. 框架设计3. 架构1. DataX介绍 DataX是一个各种数据源之间的离线数据同步工具 DataX的设计理念是一种星型数据链路。DataX作为中间传输载体负责连接各种数据源&#xff0c;通过reader从一个数据源读取数据&#xff0c;再通过writer将数据写入另一个数据源。…

Hadoop运行模式

hgfhfg Hadoop运行模式包括&#xff1a;本地模式、伪分布式模式以及完全分布式模式。 Hadoop官方网站&#xff1a;Apache Hadoop 一、本地运行模式 官方Grep案例 1. 创建在hadoop-2.7.2文件下面创建一个input文件夹 mkdir input 2. 将Hadoop的xml配置文件复制到input cp et…

FTP替代产品方案的优异性体现在哪些方面?

多年来&#xff0c;FTP一直是最常见的交换文件的方式&#xff0c;FTP-FTPS-SFTP似乎是FTP的不断迭代更新&#xff0c;但是究竟是技术更新导致FTP过时&#xff1f;还是它真的已经满足不了企业的需求了&#xff1f; 之前&#xff0c;大家选择FTP往往是因为它简单易得的特性&…

在 MySQL 中模拟外部联接 (LEFT、RIGHT、INNER JOIN、OUTER JOIN)

上周的文章详细介绍了 SELECT 查询中的外部联接。它是一种 JOIN 类型&#xff0c;可以从相关表中返回匹配和不匹配的行。遗憾的是&#xff0c;并非所有数据库&#xff08;DB&#xff09;供应商都支持它&#xff0c;包括 MySQL。但这没关系&#xff0c;因为可以通过组合其他三种…

【Java】构造方法及类的初始化

一. 利用构造方法给对象初始化 1. 构造方法的概念 构造方法(也称为构造器)是一个特殊的成员方法&#xff0c;其名字必须与类名相同&#xff0c;在创建对象时&#xff0c;由编译器自动调用&#xff0c;并且在整个对象的生命周期内只调用一次。 构造方法的作用就是给对象中的成…

心知天气api接口怎么用?

心知天气是什么&#xff1f;心知天气提供API吗&#xff1f; 心知天气是国内领先的气象服务商&#xff0c;由中国气象局官方授权的商业气象服务公司&#xff0c;基于气象数值预报和人工智能技术&#xff0c;提供高精度气象数据、天气监控机器人、气象数据可视化产品&#xff0c…

基于PHP+MySQL美食分享网站的设计与实现(含论文)

本系统是一个基于PHP和MySQL的美食分享网站,在本网站中用户可以通过注册登录来查看其他人分享的美食,查看周边好吃的店铺,分享和管理自己的美食,并且可以对他人分享的美食进行评论等一系类操作,通过这些操作可以让大家更加愉快的就美食进行交流 通过上图我们可以看到美食网站的…

Web APIs——DOM

JS 的组成 Web API Web API 是浏览器提供的一套操作浏览器功能和页面元素的 API ( BOM 和 DOM )。 现阶段我们主要针对于浏览器讲解常用的 API , 主要针对浏览器做交互效果。 比如我们想要浏览器弹出一个警示框&#xff0c; 直接使用 alert(‘弹出’) MDN 详细 API : https://d…

如何在Github精准地搜索项目

文章目录1、Github的项目有什么组成&#xff1f;2、如何搜索&#xff1f;in:name 条件in:readme 条件in:description 条件language:条件pushed: 条件stars: 条件awesome 关键字3、查看阅读项目https://blog.csdn.net/qq_45069279/article/details/107809617 https://blog.csdn.…

[附源码]SSM计算机毕业设计高校教师教学助手系统的设计与实现JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

将Nacos注册到springboot使用以及Feign实现服务调用

哈喽~大家好&#xff0c;这篇来看看将Nacos注册到springboot使用以及Feign实现服务调用。 &#x1f947;个人主页&#xff1a;个人主页​​​​​ &#x1f948; 系列专栏&#xff1a;【微服务】 &#x1f949;推荐专栏&#xff1a; JavaEE框架 目录 …

8 年 Java 开发含泪刷题,架构岗现在好难进,有点崩溃

架构岗现在好难进&#xff0c;有点崩溃了。一位粉丝后台留言道。具体问了下情况&#xff0c;是一位 8 年工作经验的朋友&#xff0c;代码功底扎实&#xff0c;项目经验也积累了不少。 为什么要用分布式锁&#xff1f;分布式锁的释放&#xff0c;需要注意什么&#xff1f;锁的过…

Elastic:总结收集日志的几种方法

到目前为止&#xff0c;我们看到有很多中不同的方法来收集日志。甚至&#xff0c;我们针对同样的一个日志&#xff0c;有好多种方法来进行采集。在今天的这篇文章中&#xff0c;我来简单里回顾一下。 通过 Filebeat 采集 Filebeat 是最为常用的一种采集日志的方法。使用 Fileb…

市面上哪种耳机适合跑步用、五款最适合跑步用的蓝牙耳机分享

对于很多运动爱好者来说&#xff0c;跑步&#xff0c;就像吃饭一样&#xff0c;已经成为生活中非常重要的习惯&#xff0c;跑步时听听音乐&#xff0c;让跑步的过程更加愉悦&#xff0c;但是你的运动耳机选对了嘛&#xff1f;首先我们要知道一款专业的运动耳机&#xff0c;一定…

Zookeeper:Mac通过Docker安装Zookeeper集群

此篇为 “Mac通过Docker安装Zookeeper集群”&#xff0c;笔者原本计划是接下来更新Zookeeper应用系列的相关内容&#xff0c;但相关内容依赖Zookeeper集群&#xff0c;虽然前面也更新了 Linux下Zookeeper在三种模式下的部署&#xff0c;但是大家很可能不会有相关的Linux集群准备…

java项目-第152期ssm远程诊断系统-java毕业设计_计算机毕业设计

java项目-第152期ssm远程诊断系统-java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《远程诊断系统》 该项目分为3个角色&#xff0c;管理员、用户和医生。 用户可以在前台浏览医生信息&#xff0c;并且可以进行在线预约&#xff0c; 在后台个人中心可以…

解决常见的电脑故障

1.电脑卡顿怎么办 电脑CPU使用率高的原因有很多&#xff1b;例如&#xff1a;软件方面——驱动故障、病毒影响&#xff1b;硬件方面——内存容量太小&#xff0c;风扇散热故障等。 有效的解决方法&#xff1a;关闭Windows通知 在【设置】-【系统】-【通知和操作】中&#xff0c…

并发编程之定时任务定时线程池

ScheduledThreadPoolExecutor 定时线程池类的类结构图 它用来处理延时任务或定时任务。 它接收SchduledFutureTask类型的任务&#xff0c;是线程池调度任务的最小单位&#xff0c;有三种提交任务的方式&#xff1a; schedulescheduledAtFixedRatescheduledWithFixedDelay它采用…

Numpy函数详解

目录 有关矩阵行列交换问题 法一 法二 行进行互换 列进行互换 insert函数 delete函数 append函数 where函数 默认第一个为行索引第二个为列索引。 行列索引都是以作为起始数值作为第一列或者第一行。(根据c数组的知识进行理解) 有关矩阵行列交换问题 法一 使用矩阵…