硬件电路的设计
(末尾附文件)
3.1系统的功能分析及体系结构设计
3.1.1系统功能分析
本设计由STM32F103C8T6单片机核心电路+温湿度传感器DHT11电路+LCD1602液晶显示电路+继电器控制电路+GSM短信模块SIM800A电路+高亮LED灯补光电路+光照强度电路+电源电路组成。
1、检测花盆湿度、温度和光照状态值,并显示;参数显示通过LCD1602液晶显示,
2、远程控制,通过GSM短信远程浇水和补光灯控制。发送一条短信:jiaoshui,继电器1打开(可外接水泵表示浇水),返回短信jiaoshui_ok,1分钟关闭。发送一条短信:buguang,强制补光,并返回短信buguagn_ok,1分钟关闭。发送短信:get,返回液晶显示内容即温湿度内容,用于远程查看数据。
3、湿度低于35自动浇水、光照较暗自动补光。
4、GSM模块SIM800A和SIM900A电路程序完全兼容外观外形一模一样。
3.1.2系统总体结构
本系统具体框图如下图所示:
原理图:
高亮LED灯照明电路(高电平有效)设计
超高亮LED是比一般LED发光二极管的亮度高近百倍的新型LED,其外壳是无色透明树脂封装,其发光体本身就能发出某一波长的光,从而呈现出某一种颜色。在本设计中,选择白色高亮LED灯作为照明灯使用。
一、白色高亮LED灯的优点。
(1)寿命长,可靠耐用,维护费用极为低廉,可连续使用105h,比普通白炽灯泡长100倍;
(2)高效率,其发光效率可达80%~90%,LED比节能灯还要节能1/4;
(3)点亮速度快。
在本设计中, LED灯均为高亮LED灯,通过三极管驱动LED灯的亮灭,电阻为限流电阻,保护三极管。当单片机的控制引脚为高电平时,三极管导通,此时,高亮LED灯亮。否则,高亮LED灯不亮。 高亮LED灯照明电路原理图如下图所示。
5V继电器控制电路(高电平有效)设计
继电器是一种电控制器件,是当输入量(激励量)的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。继电器是具有隔离功能的自动开关元件,广泛应用于遥控、遥测、
通讯、自动控制、机电一体化及电力电子设备中,是最重要的控制元件之一故在电路中起着自动调节、安全保护、转换电路等作用。继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)释放。这样吸合、释放,从而达到了在电路中的导通、切断的目的。在本系统中,通过三极管驱动继电器,当单片机的控制引脚为高电平时,三极管导通,此时继电器供电闭合,同时指示灯LED亮,与LED灯串联的电阻为限流作用保护LED灯,与三极管基集相连的电阻也是限流作用,保护三极管。继电器控制电路的原理图如下图所示。
LED信号指示灯电路设计
LED灯即发光二极管,它是半导体二极管的一种,可以把电能转化成光能。发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。在电路中,电阻的作用是限流,保护LED灯。只要单片机的控制引脚拉低,则LED灯亮,否则,LED灯不亮。其具体电路原理图如下图所示。
DHT11温湿度传感器模块电路设计
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。DHT11与单片机之间能采用简单的单总线进行通信,仅仅需要一个I/O口。传感器内部湿度和温度数据40Bit的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。DHT11功耗很低,5V电源电压下,工作平均最大电流0.5mA。
一、传感器参数
(1)传感器采用DHT11
(2)工作电压范围:3.3V-5.5V
(3)工作电流 :平均0.5mA
(4)湿度测量范围:20-90%RH
(5)湿度测量误差:±5%
(6)温度测量范围:0-50℃
(7)温度测量误差:±2%
(8)湿度分辨率 :1%RH 8位
(9)温度分辨率 :1℃ 8位
(10)采样周期 :1S
(11)单总线结构
(12)与TTL兼容(5V)
(13)输出形式:数字输出
(14)PCB板尺寸:3.2cm*1.4cm
(15)有固定栓孔,方便安装
二、接口说明
(1)VCC 外接3.5V-5.5V
(2)GND 外接GND
(3)DATA 小板开关量输出接口,可外接单片机
GMDZ光敏电阻传感器模块电路设计
本系统选择光敏电阻传感器模块对光照进行检测,该模块可以实现对周围环境的亮度和光强进行检测。
光敏电阻是用硫化隔或硒化隔等半导体材料制成的特殊电阻器,其工作原理是基于内光电效应。光照愈强,阻值就愈低,随着光照强度的升高,电阻值迅速降低,亮电阻值可小至1KΩ以下。光敏电阻对光线十分敏感,其在无光照时,呈高阻状态,暗电阻一般可达1.5MΩ。光敏电阻的特殊性能,随着科技的发展将得到极其广泛应用。
光敏电阻器一般用于光的测量、光的控制和光电转换(将光的变化转换为电的变化)。常用的光敏电阻器硫化镉光敏电阻器,它是由半导体材料制成的。光敏电阻器对光的敏感性(即光谱特性)与人眼对可见光(0.4~0.76)μm的响应很接近,只要人眼可感受的光,都会引起它的阻值变化。设计光控电路时,都用白炽灯泡(小电珠)光线或自然光线作控制光源,使设计大为简化。
一、传感器参数
(1)采用灵敏型光敏电阻传感器,可以检测周围环境的亮度和光强
(2)灵敏度可调(图中蓝色数字电位器调节)
(3)工作电压3.3V-5V。
(4)输出形式:DO数字开关量输出(0和1)和AO模拟电压输出。
(5)电源指示灯和数字开关量输出指示灯。
(6)比较器输出,信号干净,波形好,驱动能力强,超过15mA。比较器采用LM393芯片,工作稳定。
系统软件设计
1、检测花盆湿度、温度和光照状态值,并显示;参数显示通过LCD1602液晶显示,
2、远程控制,通过GSM短信远程浇水和补光灯控制。发送一条短信:jiaoshui,继电器1打开(可外接水泵表示浇水),返回短信jiaoshui_ok,1分钟关闭。发送一条短信:buguang,强制补光,并返回短信buguagn_ok,1分钟关闭。发送短信:get,返回液晶显示内容即温湿度内容,用于远程查看数据。
3、湿度低于35自动浇水、光照较暗自动补光。
#include "led.h"#include "delay.h"#include "sys.h"#include "key.h"#include "usart.h"#include "timer.h"#include "lcd1602.h"#include "dht11.h"#define INIT 0x00#define JIAOSHUI 0x01#define BUGUANG0x02#define GETMESG0x03#define SOMEONE 0x09char tab[16];u8 readDhtFlag=0;//读取温湿度标志 定时器中处理u8 lighFlag=0;//光照标志u8 mesgJiaoShuiFlag=0; //短信浇水标志 u8 countJiao=0; //短信浇水计时 定时器中处理u8 mesgBuguangFlag=0; //短信补光标志u8 countBu=0; //短信补光计时 定时器中处理unsigned char stepNum =0;//运行步骤unsigned int timeCount =0;//接收短信处理延时char Crtl_Z[1]={0x1a}; //发送短信最后字节char AT_CMGS[26]="AT+CMGS=\"";unsigned char rebackMesFlag; //返回短信unsigned char clearMesFlag =0;//定时清除短信unsigned char readMesIng = 0;//读取短信中标志int main(void){unsigned int i;delay_init();//延时函数初始化NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(9600); //串口初始化LED_Init(); //LED端口初始化KEY_Init();//按键端口初始化TIM3_Int_Init(499,7199);//10Khz的计数频率,计数到500为50ms led_gsm=0;//打开蜂鸣器Lcd_GPIO_init(); //初始化lcd引脚Lcd_Init(); //初始化lcd屏幕delay_ms(20);Lcd_Puts(0,0,"My Designer! ");//初始化显示sprintf(tab,"Temp:%02d DH:%02d L ",(u16)DHT11.Tem_H,(u16)DHT11.Hum_H);Lcd_Puts(0,1,(unsigned char *)tab);//初始化显示 ligh=1;//灯光relay=1;//继电器delay_ms(200);ligh=0;//关闭灯光relay=0;//关闭继电器for(i=0;i<50;i++)delay_ms(100);//延时有助于稳定UART_SendStr(USART1 , "AT+CMGF=1\r\n",11); //设置字符集for(i=0;i<5;i++)delay_ms(100);//延时有助于稳定UART_SendStr(USART1 , "AT+CSCS=\"GSM\"\r\n",15); //设置干什么、for(i=0;i<5;i++)delay_ms(100);//延时有助于稳定UART_SendStr(USART1 , "AT+CMGDA=\"DEL ALL\"\r\n",20); //删除所有短信for(i=0;i<5;i++)delay_ms(100);//延时有助于稳定led_gsm=1;//关闭ledwhile(1){if(readDhtFlag==1){readDhtFlag=0;DHT11_ReadData();//是否读取到温湿度if(check_ligh==1)//查看光照强度{lighFlag = 'L';}else{lighFlag = 'H';}sprintf(tab,"Temp:%02d DH:%02d %c ",(u16)DHT11.Tem_H,(u16)DHT11.Hum_H,lighFlag);Lcd_Puts(0,1,(unsigned char *)tab);//初始化显示 if(mesgJiaoShuiFlag==0)//短信不在控制时{if(DHT11.Hum_H<35) //{relay=1;}//打开继电器else{relay=0;}//关闭继电器}if(mesgBuguangFlag==0)//短信不在控制时{if(check_ligh==1){ligh=1;}//打开灯光else{ligh=0;}//关闭灯光}}if(readFlag==1) //读取短信息标志{readFlag=0; //读取标志清零readMesIng = 1;//读取短信过程中timeCount++ ;if((stepNum == 0)&&(timeCount>=4))//定时读取短信{UART_SendStr(USART1 , "AT+CMGF=1\r\n",11); //设置字符集timeCount = 0;//延时设置量stepNum++;//进入操作过程1}else if((stepNum == 1)&&(timeCount>=4))//定时读取短信{for(i=0;i<SIZEBUF;i++){timebuf[i]='0'; //清空timebuf}UART_SendStr(USART1 ,"AT+CMGR=1\r\n",11);timeCount = 0;//延时设置量stepNum++;//进入操作过程1}else if((stepNum == 2)&&(timeCount >= 4))//定时读取短信{rebackMesFlag=INIT;for(i=0;i<(SIZEBUF-5);i++){if((timebuf[i]=='j')&&(timebuf[i+1]=='i')&&(timebuf[i+2]=='a')&&(timebuf[i+3]=='o')&&(timebuf[i+4]=='s'))//查询是否接收到jiaoshui{mesgJiaoShuiFlag=1;//短信控制标志countJiao=0;//浇水计数relay=1;//打开继电器rebackMesFlag=JIAOSHUI;//返回短信标志break;}else if((timebuf[i]=='b')&&(timebuf[i+1]=='u')&&(timebuf[i+2]=='g')&&(timebuf[i+3]=='u')&&(timebuf[i+4]=='a'))//查询是否接收到buguang{mesgBuguangFlag=1;//短信控制标志countBu=0;//计数ligh=1;//打开灯光rebackMesFlag=BUGUANG;//返回短信标志break;}else if((timebuf[i]=='g')&&(timebuf[i+1]=='e')&&(timebuf[i+2]=='t'))//查询是否接收到get{rebackMesFlag=GETMESG;//返回短信标志break;}if((timebuf[i]=='+')&&(timebuf[i+1]=='8')&&(timebuf[i+2]=='6'))//查询短信息中的号码{led_gsm = 0;rebackMesFlag = SOMEONE; //有人发送短信 AT_CMGS[9]=timebuf[i+0]; //提取号码AT_CMGS[10]=timebuf[i+1];AT_CMGS[11]=timebuf[i+2];AT_CMGS[12]=timebuf[i+3];AT_CMGS[13]=timebuf[i+4];AT_CMGS[14]=timebuf[i+5];AT_CMGS[15]=timebuf[i+6];AT_CMGS[16]=timebuf[i+7];AT_CMGS[17]=timebuf[i+8];AT_CMGS[18]=timebuf[i+9];AT_CMGS[19]=timebuf[i+10];AT_CMGS[20]=timebuf[i+11]; AT_CMGS[21]=timebuf[i+12];AT_CMGS[22]=timebuf[i+13];}}AT_CMGS[23]='"'; //整理字符串 AT_CMGS[24]=0x0d;AT_CMGS[25]=0x0a;if(rebackMesFlag != INIT){UART_SendStr(USART1 ,"AT+CMGDA=\"DEL ALL\"\r\n",20);//删除所有短信for(i=0;i<5;i++)delay_ms(100);//延时有助于稳定UART_SendStr(USART1 ,"AT+CMGF=1\r\n",11); //设置字符集for(i=0;i<3;i++)delay_ms(100);//延时有助于稳定UART_SendStr(USART1 ,"AT+CSCS=\"GSM\"\r\n",15); //设置干什么、for(i=0;i<3;i++)delay_ms(100);//延时有助于稳定UART_SendStr(USART1 , ( char *)AT_CMGS,26);//准备发送短信for(i=0;i<2;i++)delay_ms(100);//延时有助于稳定 if(rebackMesFlag==JIAOSHUI){UART_SendStr(USART1 ,"jiaoshui_ok! ",13); //发送短信息内容}else if(rebackMesFlag==BUGUANG){UART_SendStr(USART1 ,"buguang_ok! ",13); //发送短信息内容}else if(rebackMesFlag==GETMESG){UART_SendStr(USART1 ,(char *)tab,16); //发送温度湿度}else{UART_SendStr(USART1 ,"cmd_err!",13); //发送短信息命令错误}delay_ms(100); UART_SendStr(USART1 ,(char *)Crtl_Z, 1); //发送for(i=0;i<20;i++)delay_ms(100);//延时有助于稳定}timeCount = 0;//延时设置量stepNum++;//进入操作过程1}else if((stepNum == 3)&&(timeCount >= 4))//定时读取短信{clearMesFlag++;if(clearMesFlag>10){clearMesFlag = 0;UART_SendStr(USART1 ,"AT+CMGDA=\"DEL ALL\"\r\n",20);//删除所有短信}timeCount = 0;//延时设置量stepNum = 0;//进入操作过程1led_gsm=1; //关闭指示灯readMesIng = 0;//读取短信过程中} }}}
.
链接:/s/19G48iDByIchSn3ENkUO_6Q
提取码:1dub
.