TA的每日心情 | 开心 2022-8-16 09:50 |
---|
签到天数: 16 天 连续签到: 1 天 [LV.4]偶尔看看III
|
STM32通过GPRS模块SIM900A连接到网络,可以实现手机客户端,微信,网页来控制继电器。
先来说硬件构成,附上原理图和PCB,软件用的AD10。程序带PCB都在里头,实惠装链接:https://pan.baidu.com/s/1cEKWVG 密码:4431
如果失效联系我q308229423。
先来看看3d效果
电路原理图如图所示:
主要用了stm32和SIM900a,通过串口连接,硬件设计的时候注意sim900A的电源部分设计,SIM900A用的是4V电源,我这里直接用二极管降压的,SIM900A在联网的过程中电流的峰值比较大,能达到1A左右,然后会把电压拉低,然后电压低于3.3v的时候芯片就会复位,第一版的电路就有这个问题,后来加了个大电容才得以解决,这版换了5V的稳压芯片,使用的是LM2596,电流比较大,没有出现过SIM900A复位的情况。这个工程是做一个项目用的,我改了改改成智能家居了,如果借鉴的话用芯片和sim900a还有输入输出就好了。
好了接下来说程序是怎么实现的,ps:(这个东西做的比较早,现在分享出来,是想接下来移植到香蕉派和树莓派上,借此机会写出来复习下) 首先我们信息的交互是通过网上云端的服务器,这里借用的是未来之家的开源的服务器,https://www.fuhome.net这是他们的官网,首先在这里感谢他们,感谢龙剑等人。
在官网注册好之后,他们开放的有一个ip端口然后也有协议,我当时用的是协议2.2.3,这个tcp调试软件,可以测试连接是否通畅,之后我
们要做的就是用单片机通过GPRS模块来访问它了,当你注册好之后会获得id,然后你可以加传感器,你需要连接服务器,然后发送心跳包,保持在线的状态,然后可以通过未来之家提供的app或者关注未来之家微信公众号或者直接在网页上控制你的设备,当你通过以上发送命令的时候,服务器会给你的单片机(通过网络给单片机)发送数据,然后你解析出数据就可以实现远程控制了,https://user.qzone.qq.com/308229423/311
可以来我的空间看我的效果视频...
好了来看程序:
首先这里是心跳包和数据包,下边是数据处理的部分,我感觉直接看代码的话会比较乱,还是直接看工程文件好,如果想要做这个的话,主要就是一些字符串的操作,用最简单的串口和SIM900a交互,然后发送的AT的指令集,说道这里再附上siM900A模块的资料,里边有硬件设计手册和AT指令集都有。之后未来之家协议的部分,可以多去官网看看,里边有教程,也是写的比较详细的,好像还有视频教程的。
void act(void){ u8 i,a=100; char *p; complete_flag=0; USART_RX_STA=0; while(complete_flag==0);//for(i=0;i<30;i++)// {// }p=strstr ((const char*)USART_RX_BUF,"open1"); if(p!=NULL) { J2=0; lx_sim900a_send("AT","OK",200);// newdate_flag=0; lx_clear_RX_BUF(); //清空接收缓存 USART_RX_STA=0; lx_sim900a_send("AT+CIPSEND",">",200);// for(i=0;i<6;i++) { control_return[30+i]=control_retk; } for(i=0;i<50;i++) { USART_SendData(USART1, control_return); while ((USART1->SR & 0X40) == 0); if(control_return==0x05) break; } USART_SendData(USART1, 0x1A); while ((USART1->SR & 0X40) == 0); while(newdate_flag==0); while(a--) { delay_ms(10); p=strstr ((const char*)USART_RX_BUF,"SEND OK"); if(p!=NULL) break; } } p=strstr ((const char*)USART_RX_BUF,"close1"); if(p!=NULL) { J2=1; lx_sim900a_send("AT","OK",200);// newdate_flag=0; lx_clear_RX_BUF(); //清空接收缓存 USART_RX_STA=0; lx_sim900a_send("AT+CIPSEND",">",200);// for(i=0;i<6;i++) { control_return[30+i]=control_retg; } for(i=0;i<50;i++) { USART_SendData(USART1, control_return); while ((USART1->SR & 0X40) == 0); if(control_return==0x05) break; } USART_SendData(USART1, 0x1A); while ((USART1->SR & 0X40) == 0); while(newdate_flag==0); while(a--) { delay_ms(10); p=strstr ((const char*)USART_RX_BUF,"SEND OK"); if(p!=NULL) break; } } /////////////////////////////////////////////////////////////////////////p=strstr ((const char*)USART_RX_BUF,"lx"); if(p!=NULL) { lx_sim900a_send("AT","OK",200);// newdate_flag=0; lx_clear_RX_BUF(); //清空接收缓存 USART_RX_STA=0; lx_sim900a_send("AT+CIPSEND",">",200);// //将车位数转化进数组; car_conversion(ceshichewei);ceshichewei++;if(ceshichewei==20)ceshichewei=5; //发送应答; for(i=0;i<33;i++) { USART_SendData(USART1, date_car); while ((USART1->SR & 0X40) == 0);// if(date_car==0x05)// break; } USART_SendData(USART1, 0x1A); while ((USART1->SR & 0X40) == 0); while(newdate_flag==0); while(a--) { delay_ms(10); p=strstr ((const char*)USART_RX_BUF,"SEND OK"); if(p!=NULL) break; } } ///////////////////////////////////////////////////////////////////////// lx_clear_RX_BUF(); USART_RX_STA=0; newdate_flag=0; } |
|