查看: 2515|回复: 0

stm32+SIM900A智能家居

[复制链接]
  • TA的每日心情
    开心
    2022-8-16 09:50
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2017-3-8 08:56:32 | 显示全部楼层 |阅读模式
    分享到:
    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;                                                                                }
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 18:36 , Processed in 0.115353 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.