STM32和U10通讯模块的智能大棚控制系统软件设计 精品.doc_第1页
STM32和U10通讯模块的智能大棚控制系统软件设计 精品.doc_第2页
STM32和U10通讯模块的智能大棚控制系统软件设计 精品.doc_第3页
STM32和U10通讯模块的智能大棚控制系统软件设计 精品.doc_第4页
STM32和U10通讯模块的智能大棚控制系统软件设计 精品.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于STM32和U10通讯模块的智能大棚控制系统软件设计当前我国农村大棚大部分都是一些中小型的大棚,大型大棚在我国还是比较少的,而且大部分都是半自动或是人工操作的,管理起来比较繁琐而且浪费人力物力。目前国内温室整体的科技含量远低于国外,可以说我国高科技智能温室刚刚起步。由于传统大棚存在诸多缺点,所以智能大棚控制系统应运而生。智能大棚控制系统是根据菜农在实际生产中的要求而设计的一套自动控制技术,该系统具有测温功能,以及手机短信远程控制卷帘机实现远程卷帘功能,并根据温度能够自动打开通风口来进行放风,同时还具有防盗功能。系统控制简单操作易于实现,且工作稳定,用户在使用它时,不但省工省时省力,而且能够早拉晚放,增加光照时间,丰产丰收。能避免在恶劣天气状况下拉草帘不及时而造成不必要的经济损失。还可以扩大大棚规模,增加产值,对促进农业的发展有一定的推进作用。2 硬件平台2.1硬件电路的框架结构STM32F103VET6LDO稳压电路SPX1117M3-3.3RTC后备电源接口继电器反馈继电器输出JTAG接口(20PIN)EEPROM(CAT1640)IC接口U10手机模块Max485USART接口继电器状态灯控制器指示灯电流检测红外检测输入(防盗)温度检测输入行程开关图1 硬件电路的框架结构图各功能单元介绍:STM32F103:微处理单元,完成数据的处理U10通讯模块:收发短信、电话EEPROM存储单元:存储数据信息继电器输出控制单元:控制外部直流继电器,进而控制电机测温单元:测量棚内温度,实现实时调节红外单元:监测人员进入 RTC后备电源接口:掉电时保持时钟准确2.2部分硬件电路图纸图2 STM32 MCU 最小系统电路图3 U10手机模块连接电路3 软件设计总述3.1软件设计要求设计要求:本控制器主要实现的是对农村蔬菜大棚的远程控制。通过控制器内的手机通讯模块接收客户打电话或发短信实现的控制命令,收到客户端的命令并处理后,能够根据命令完成相应的卷帘和放帘、调整放气口、修改控制号码等操作。短信控制命令的数据形式主要是在分析PDU 码格式的短信,电话控制命令的形式则是通过判断电话接通的时间来实现的。为了防止误控制,在写程序的时候要设置专门的分析控制号码的程序,只有存在EEPROM 内的号码才能执行控制,其他号码的控制则被忽略。设计目标: 实现对大棚卷帘机的自动控制。通过单片机内的时钟,根据要求设定定时时间,在定时时间到了之后,自动控制两路继电器的关断,来进行控制卷帘机的正传与反转。卷帘或放帘一定程度,触发设定好的行程开关,电机停止运行。用户也可以在非定时时间通过打电话或发短信控制卷帘机,实现用户控制。实现自动放气的控制。通过温度传感器ds18b20检测温度,根据温度的变化来控制放气装置,调整放气口的大小,实现自动放气。实现防盗的功能。因为农村大棚一般都是建在野外,那么大棚的安全性问题也比较重要。本系统通过安装在大棚内部的红外感应传感器模块,来检测盗贼的进入。在大棚没有人的时候,启动防盗功能。在有人入侵的时候,触发传感器,然后控制器控制大棚内的灯和喇叭打开,并且启动控制器的摄像头,对大棚内部进行图像采集,照片以彩信的形式发送到客户手机中。以后可根据照片中采集到的人的照片报案。3.2软件设计流程图本系统软件设计流程图如图4:开始初始化外设时间校对(短信)待机是否收到串口信息串口3信息接收到电脑发来的数据,并写入EEPROM串口2信息短信信息分析短信信息开关监控定时测温度开关继电器修改EEPROM内信息完成一次操作控制继电器动作电话信息图4 软件流程图4 部分模块程序介绍4.1短消息的相关介绍4.1.1短消息收发的实现模式通过发送特定的AT指令,可以应用手机模块实现发送和接收短信。本平台应用的是上海移远公司的U10模块。用于短信操作的相关AT指令如表1所示:表1 相关AT指令考虑到本系统的主要用户是中文用户,所以收发中文短信是必须要实现的。现如今短信的格式,主要有TEXT和PDU两种格式。TEXT格式和PDU格式都支持发送中文短信,但是考虑到有些模块不支持,对于以后的移植造成不便。所以,在设计中编写了两种格式发送短信的程序,需要哪个就调用哪个。PDU格式相对复杂,它有着特定的协议,而且他还有三种编码方式,我们这里采用的是UCS2编码。UCS2编码主要用于发送Unicode码。而TEXT格式相对简单,因此在此只给出TEXT格式的部分程序:4.1.2 查询端口并发送短信的程序void Check_GPIO_PutMessage(char*num)char* O1;char* O2;char* O3;char* O4;char* O5;if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)=Bit_RESET)O1=5F004E00;elseO1=51734E00;if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)=Bit_RESET)O2=5F004E8C;elseO2=51734E8C;if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)=Bit_RESET)O3=5F004E09;elseO3=51734E09;if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)=Bit_RESET)O4=5F0056DB;elseO4=517356DB;if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)=Bit_RESET)O5=5F004E94;elseO5=51734E94;Deal_number(num);Uart2_PutStr(AT+CMGF=0r);delay_ms(200);Uart2_PutStr(AT+CMGS=35r);delay_ms(200);Uart2_PutStr(0891683108505305F011000D9168);Uart2_PutStr(N); /Uart2_PutStr(5166084638F0);Uart2_PutStr(00080014);Uart2_PutStr(O1);Uart2_PutStr(O2);Uart2_PutStr(O3);Uart2_PutStr(O4);Uart2_PutStr(O5);delay_ms(200);Uart2_PutChar(0x1a);4.2存储器操作函数的设计CAT1640是整个系统存储系统信息的器件,其内部存储了此系统主机的控制电话号码、系统定时控制的一些时间数据、当地经纬度等等,其作用至关重要。4.2.1 CAT1640基本操作介绍CAT1640的写操作:在本系统中CAT1640作为从机使用,在进行单个字节写操作的时候,主机先发送start信号和从机地址,从机收到后给主机发送一个应答信号。然后,主机发送两个8位要写到从机存储位置的地址。在主机收到应答信号之后,开始发送8位数据。发送完成后,CAT1640再发出应答信号,主机接收到后发出停止条件。这时,CAT1640启动内部非易失性存储编程周期,不接受主机的任何要求。CAT1640写周期时序图如图5 。图5 CAT1640写周期时序图CAT1640 内含64字节的页写缓冲区,因此在一个页面写入周期内,写入的字节数不能超过64字节。在执行页面写操作时,开始的第一个字节跟单个字节写入基本相同。不同的是,写完第一个字主机收到CAT1640发来的应答信号之后,并不发送停止条件,而是接着写下一个字节,直到写完后,才发送停止条件。需要注意的是,如果在停止条件之前发送的字节数超过64字节,则之前写入的数据将会被后来的数据覆盖。页面写入的周期时序图如图6:图6 CAT1640写周期时序CAT1640的读操作分为当前地址读取和选择地址读取两种,具体读取时序跟写操作类似,在此不再赘述。4.2.2 CAT1640操作函数介绍主要的操作函数如下:uint8_t I2C_Read(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint16_t addr,uint8_t *buf,uint16_t num) /通过指定I2C接口读取多个字节数据,成功返回0uint8_t I2C_Write(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint16_t addr,uint8_t *buf,uint16_t num); /通过指定I2C接口写入多个字节数据,成功返回04.3 USART通讯部分Usart 通讯部分主要是微处理器与电脑、U10手机模块的通讯。STM32F103系列MCU拥有3个USART,在本系统中Usart2用于MCU与U10通讯模块之间的通讯,Usart3用于MCU与电脑之间的通讯。Usart的主要操作函数如下:4.3.1对USART进行基本配置的函数USART_Init(USARTx, &USART_InitStructure) /初始化串口USART_Cmd(USARTx, ENABLE) /使能串口USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE) /开启串口接收中断USART_ClearFlag(USARTx, USART_FLAG_TC) /清除串口发送完成中断4.3.2串口的读写操作的函数void Uartx_PutChar(u8 ch) /串口写单个字符函数void Uartx_PutStr(char *str) /串口写字符串函数void USARTx_IRQHandler(void) /串口读函数while(USART_GetITStatus(USART2, USART_IT_RXNE) !=SET);TIM_Cmd(TIM2, ENABLE);str2x2= USART_ReceiveData(USART2);x2+;4.4 温度检测函数4.4.1 计算温度值程序DS18B20存储的温度是16 位的带符号扩展的二进制补码形式当工作在12位分辨率时,其中5个符号位,7个整数位,4个小数位 |-整数-|-小数 分辨率 1/(24)=0.0625-| 低字节 | 23 | 22 | 21 | 20 | 2(-1) | 2(-2) | 2(-3) | 2(-4) | |-符号位:0-正 1-负-|-整数-| 高字节 | s | s | s | s | s | 26 | 25 | 24 |温度 = 符号位 + 整数 + 小数*0.0625计算温度的程序如下:float DS18B20_Get_Temp(void)uint8_t tpmsb, tplsb;short s_tem;float f_tem;DS18B20_Rst(); DS18B20_Presence(); DS18B20_Write_Byte(0XCC);/* 跳过 ROM */DS18B20_Write_Byte(0X44);/* 开始转换 */DS18B20_Rst(); DS18B20_Presence();DS18B20_Write_Byte(0XCC);/*跳过ROM */ DS18B20_Write_Byte(0XBE);/* 读温度值*/tplsb = DS18B20_Read_Byte(); tpmsb = DS18B20_Read_Byte(); s_tem = tpmsb8;s_tem = s_tem | tplsb;if( s_tem 0 )/* 负温度*/f_tem = (s_tem+1) * 0.0625;elsef_tem = s_tem * 0.0625;return f_tem; 4.4.2 DS18B20检测和初始化函数static uint8_t DS18B20_Presence(void)uint8_t pulse_time = 0;/* 主机设置为上拉输入 */DS18B20_Mode_IPU();/* 等待存在脉冲的到来,存在脉冲为一个60240us的低电平信号 ,如果存在脉冲没有来则做超时处理,从机接收到主机的复位信号后,会在1560us后给主机发一个存在脉冲*/while( DS18B20_DATA_IN() & pulse_time=100 )return 1;elsepulse_time = 0;/* 存在脉冲到来,且存在的时间不能超过240us */while( !DS18B20_DATA_IN() & pulse_time=240 )return 1;elsereturn 0;uint8_t DS18B20_Init(void)DS18B20_GPIO_Config();DS18B20_Rst();return DS18B20_Presence();5 主要部分源程序5.1 主函数部分主函数中首先进行各个模块进行初始化,然后在循环函数中反复查询各个模块的状态,若状态有变化,则执行相应的操作。程序如下:#include stm32f10x.h#include #include extern u8 t3;extern tm timer;extern char str332;extern char str2200;u8 AlarmReadBuffer16;u8AlarmWriteBuffer16=17,30,1+2,4+8+16,7,0,4+8+16,1+2, 9,30,1+2+4+8+16,0, 3,0,0,1+2+4+8+16;/ 01conrelay1 23 marks1 45conrelay2 67 mars2 /89conrelay3 1011 marks3 1213conrelay4 1415 mars4int main(void) RCC_Configuration(); GPIO_Configuration();NVIC_Configuration();USART3_Configuration();USART2_Configuration(); I2C_Configuration();Timer2_Configuration();Timer3_Configuration(); delay_init(72);RTC_init(); /I2C_Write(I2C1,CAT1640,128,AlarmWriteBuffer,16 );Start_U10(str2);delay_ms(2000);Check_10086(str2);Uart2_PutStr(AT+CMGF=1rn);delay_ms(50);Uart2_PutStr(AT+CMGF=1rn);delay_ms(50);GPIO_Close_Relay(1+2+4+8+16);Check_Start();while(1) Check_sec(); Check_Data2(str2); Check_Data(str3); Check_Alarm(); Check_NewDay(); 5.2 分析手机模块传来的数据的函数void Check_Data2(char *str)u8 k,i,u;char *p,*ttime;char p111,pnstr44,pn11; char time11;if(t2=1)t2=0;p=strstr(str,+CMTI); /+CMTI: SM,2 if(p1=C&p2=M&p3=T&p4=I)Uart2_PutStr(AT+CMGF=1rn);delay_ms(50); Uart2_PutStr(AT+CMGLrn);delay_ms(50);p=strstr(str,READ,+86);/+CMGL:1,RECUNREAD,+8615668064830,20XX/04/07 13:54:38+32if(p1=E&p2=A&p3=D&p4=)Uart2_PutStr(AT+CMGD=1,4rn);delay_ms(50);ttime=p+27;strncpy( time,ttime,11);strncpy( p1,p+10,11);Uart3_PutStr(p1);Uart3_PutStr(rn);if(SeekPhoneNumber(p1) 8)p=strstr(str,rn); p=p+3; if(p0=5) for(k=0;k6;k+)if(pk*8=5&pk*8+1=F&pk*8+2=0&pk*8+3=0)if(pk*8+4=0&pk*8+5=0&pk*8+6=3&pk*8+7=1)|(pk*8+4=4&pk*8+5=E&pk*8+6=0&pk*8+7=0)GPIO_Open_Relay(1);if(pk*8+4=0&pk*8+5=0&pk*8+6=3&pk*8+7=2)|(pk*8+4=4&pk*8+5=E&pk*8+6=8&pk*8+7=C)GPIO_Open_Relay(2);if(pk*8+4=0&pk*8+5=0&pk*8+6=3&pk*8+7=3)|(pk*8+4=4&pk*8+5=E&pk*8+6=0&pk*8+7=9)GPIO_Open_Relay(4);if(pk*8+4=0&pk*8+5=0&pk*8+6=3&pk*8+7=4)|(pk*8+4=5&pk*8+5=6&pk*8+6=D&pk*8+7=B)GPIO_Open_Relay(8);if(pk*8+4=0&pk*8+5=0&pk*8+6=3&pk*8+7=5)|(pk*8+4=4&pk*8+5=E&pk*8+6=9&pk*8+7=4)GPIO_Open_Relay(16);if(pk*8=5&pk*8+1=1&pk*8+2=7&pk*8+3=3)if(pk*8+4=0&pk*8+5=0&pk*8+6=3&pk*8+7=1)|(pk*8+4=4&pk*8+5=E&pk*8+6=0&pk*8+7=0)GPIO_Close_Relay(1);if(pk*8+4=0&pk*8+5=0&pk*8+6=3&pk*8+7=2)|(pk*8+4=4&pk*8+5=E&pk*8+6=8&pk*8+7=C)GPIO_Close_Relay(2);if(pk*8+4=0&pk*8+5=0&pk*8+6=3&pk*8+7=3)|(pk*8+4=4&pk*8+5=E&pk*8+6=0&pk*8+7=9)GPIO_Close_Relay(4);if(pk*8+4=0&pk*8+5=0&pk*8+6=3&pk*8+7=4)|(pk*8+4=5&pk*8+5=6&pk*8+6=D&pk*8+7=B)GPIO_Close_Relay(8);if(pk*8+4=0&pk*8+5=0&pk*8+6=3&pk*8+7=5)|(pk*8+4=4&pk*8+5=E&pk*8+6=9&pk*8+7=4)GPIO_Close_Relay(16);delay_ms(800);Check_GPIO_PutMessage(p1);Uart3_PutStr(Message returnrn);p=strstr(str,67E58BE27CFB7EDF65F695F4);/ 查询系统时间 的unicodeif(p0=6&p8=7&p9=C&p23=4) Uart3_PutStr(Message for system timern);delay_ms(800);Uart2_PutStr(AT+CMGF=1r);delay_ms(200);Uart2_PutStr(AT+CMGS=);Uart2_PutStr(p1);Uart2_PutStr(r);delay_ms(200);SYSTEM_TIME();delay_ms(200);Uart2_PutChar(0x1a); Uart3_PutStr(Message returnrn);p=strstr(str,67E58BE263A7523653F77801);/ 查询控制号码 的unicodeif(p0=6&p6=E&p9=3&p23=1) Uart3_PutStr(Message for control numberrn);RTC_RE_SET(time);delay_ms(800);Uart2_PutStr(AT+CMGF=1r);delay_ms(200);Uart2_PutStr(AT+CMGS=);Uart2_PutStr(p1);Uart2_PutStr(r);delay_ms(200);Control_Number();delay_ms(200);Uart2_PutChar(0x1a);Uart3_PutStr(Message returnrn);p=strstr(str,67E58BE25B9A65F665F695F4);/ 查询定时时间 的unicodeif(p0=6&p8=5&p9=B&p23=4) Uart3_PutStr(Message for alarm timern);delay_ms(800); Uart2_PutStr(AT+CMGF=1r);delay_ms(200);Uart2_PutStr(AT+CMGS=);Uart2_PutStr(p1);Uart2_PutStr(r);delay_ms(200);ALARM_TIME();delay_ms(200);Uart2_PutChar(0x1a);Uart3_PutStr(Message returnrn);p=strstr(str,8BBE7F6E63A7523653F77801);/ 设置控制号码 的unicodeif(p0=8&p8=6&p9=3&p23=1) Uart3_PutStr(Message set control numberrn);p=p+24;if(p0=4&p1=E&p2=0&p3=0) /一 strncpy( pnstr,p+4,44); for(u=0;u11;u+) pnu=pnstru*4+3; Uart3_PutStr(pn);I2C_Write(I2C1,CAT1640,0,(uint8_t*)pn,11);if(p0=4&p1=E&p2=8&p3=C) /二 strncpy( pnstr,p+4,44); for(u=0;u11;u+) pnu=pnstru*4+3; Uart3_PutStr(pn);I2C_Write(I2C1,CAT1640,12,(uint8_t*)pn,11); if(p0=4&p1=E&p2=0&p3=9) /三 strncpy( pnstr,p+4,44); for(u=0;u11;u+) pnu=pnstru*4+3; Uart3_PutStr(pn);I2C_Write(I2C1,CAT1640,24,(uint8_t*)pn,11); if(p0=5&p1=6&p2=D&p3=B) /四strncpy( pnstr,p+4,44); for(u=0;u11;u+) pnu=pnstru*4+3; Uart3_PutStr(pn);I2C_Write(I2C1,CAT1640,36,(uint8_t*)pn,11);if(p0=4&p1=E&p2=9&p3=4) /五 strncpy( pnstr,p+4,44); for(u=0;u11;u+) pnu=pnstru*4+3;Uart3_PutStr(pn);I2C_Write(I2C1,CAT1640,48,(uint8_t*)pn,11);if(p0=5&p1=1&p2=6&p3=D) /六strncpy( pnstr,p+4,44); for(u=0;u11;u+) pnu=pnstru*4+3; Uart3_PutStr(pn);I2C_Write(I2C1,CAT1640,60,(uint8_t*)pn,11); if(p0=4&p1=E&p2=0&p3=3) /七 strncpy( pnstr,p+4,44); for(u=0;u11;u+) pnu=pnstru*4+3; Uart3_PutStr(pn);I2C_Write(I2C1,CAT1640,72,(uint8_t*)pn,11); if(p0=5&p1=1&p2=6&p3=B) /八 strncpy( pnstr,p+4,44); for(u=0;u11;u+) pnu=pnstru*4+3; Uart3_PutStr(pn);I2C_Write(I2C1,CAT1640,84,(uint8_t*)pn,11); RTC_RE_SET(time);delay_ms(800);Uart2_PutStr(AT+CMGF=1r);delay_ms(200); Uart2_PutStr(AT+CMGS=);Uart2_PutStr(p1);Uart2_PutStr(r);delay_ms(200);Uart2_PutStr(Set OK!rn); Control_Number();delay_ms(200);Uart2_PutChar(0x1a);Uart3_PutStr(Message returnrn);p=strstr(str,8BBE7F6E5B9A65F665F695F4);/ 设置定时时间 的unicodeUart3_PutStr(Message set alarm timern);p=p+24;SET_ALARM_TIME(p); RTC_RE_SET(time);delay_ms(800);Uart2_PutStr(AT+CMGF=1r);delay_ms(200);Uart2_PutStr(AT+CMGS=);Uart2_PutStr(p1);Uart2_PutStr(r);delay_ms(200);Uart2_PutStr(Set OK!rn); ALARM_TIME();delay_ms(200);Uart2_PutChar(0x1a);Uart3_PutStr(Message returnrn);p=s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论