打印
[STM32F0]

【ST资源大分享】+ STM32F051+W5100连接Yeelink上传数据

[复制链接]
1389|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
numenjian|  楼主 | 2016-8-2 13:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 numenjian 于 2016-8-2 13:56 编辑

背景:          在新房装修前,一直计划着家里布置一套监控系统,能够实时掌控家里的状况,外加控制一些用电设备。
     然而理想是美好的,现实却(装修时实在太忙了,没顾上)。。。。。。。。
     虽然未能实现,不管怎么样,亡羊补牢,未为晚也。现在比较流行智能家居,恰好本人又是做无线监控系统的,所以就临时改变了一下方案:无线监控。

正文:
    首先说一下利用的平台:  
         软件平台:  Yeelink  (不深入探讨了,需要了解的人自己百度吧)
         硬件平台: STM32F051(还有一块F429开发板在用,过几天移植一下换过来,毕竟能用的资源比较多)+W5100(arduino开发板的网络模块)+射频模块(暂用CC2520,公司的)
    主要功能:
         目前仅做了一款温度传感器数据采集,采用的是DS18B20,监控主站主要负责无线传感器数据采集接收,并通过以太网将数据传送到Yeelink平台,无线传感器数量可以任意增加(需先软件配置),传感器数据上传间隔为12s(yeelink限制了最小间隔为10s).

                                                                          
                                                                                                         监控主站

                                                                                                   
                                                                                                            传感器
        效果如下:
                                                                                                                     

                                                                                                 主站温度  
                                                        

                                                                                                  传感器温度

       主站放在客厅,传感器放厨房(暂时只加了1台传感器),采用2.4G进行传输(发射功率4.5dBm,仅单向传输没有加入协议栈)暂时还是比较稳定的,上图是3天的稳定记录。但是ZigBee的穿透和绕射能力较弱,通过提升功率(手里还有加了PA的板子,能到+20dBm)也能覆盖一套房子,但是过大的发射功率很多人不能接受(比如辐射、功耗)。过几天准备换个频段(433MHz,刚好手里也有Sx1278、Si4463)试试全覆盖测试。

      也许有朋友比较关心代码,我也附一些吧。STM32的函数库就不分享了,官网很多,我就是用的官方例程。12864LCD、18B20这些驱动网上也很多,需要的朋友可以私信我。重点讲一下W5100是怎样连接yeelink的吧。
   W5100的驱动用的是百度来的,就w5100.c和w5100.h,一搜一堆。
   首先是IO初始化:
             这里定义了PB12~PB15,用硬件SPI2;W5100还有RST引脚需要控制;还有一个中断引脚(可以查询寄存器,不一定用)
   其次是 W5100硬件初始化:
            W5100_HARTRESET();   //强制复位        
            W5100_Init();                   //寄存器初始化,包括配置网关、IP、物理地址、重发次数
            Socket_Init(0,S0_Port,S0_DPort,S0_DIP); //socket0初始化,主要是设置目的地址(远程主机地址)
            Socket_Connect(0);       //设置为客户端模式

          到此,W5100已经能够完成作为客户端连接远程服务器了。
          需要注意的是,本机网关、IP设置需要与家里的路由器匹配,否则上不了网,传不了数据;远程主机IP必须为 42.96.164.52,端口号80   (yeelink)

   配置完成后就是在任务中添加上传函数,上传函数必须按照yeelink的固定格式,可以采用以下函数(EmbedNet论坛飞鸿踏雪大神的字符串生成方法)  
    char* Yeelink_PostString(const char *device_id,const char *sensors_id,float value)
    {
        char remote_server[] = "api.yeelink.net";
        char str_tmp[128] = {0};
        // Http内容,表单内容
        char http_content[32] = {0};
        //表头的内容
        sprintf(str_tmp,"/v1.0/device/%s/sensor/%s/datapoints",device_id,sensors_id);
        // 确定提交内容的值 例如 {"value":20。1}
        sprintf( http_content , "{\"value\":%.1f}" , value);
        // 确定 HTTP请求首部
        // 例如POST /v1.0/device/dbeacfc4943e593ebe2bcf46a684f794/1/1/datapoints/add HTTP/1.1\r\n
        sprintf( http_request , "POST %s HTTP/1.1\r\n",str_tmp);
        // 增加属性 例如 Host: api.machtalk.net\r\n
        sprintf( str_tmp , "Host: %s\r\n" , remote_server);
        strcat( http_request , str_tmp);
        // 增加密码 例如 APIKey: dbeacfc4943e593ebe2bcf46a684f794
        sprintf( str_tmp , "U-ApiKey:%s\r\n" , APIKEY);//需要替换为自己的APIKey
        strcat( http_request , str_tmp);
        strcat( http_request , "Accept: */*\r\n");
        // 增加提交表单内容的长度 例如 Content-Length:12\r\n
        sprintf( str_tmp , "Content-Length: %d\r\n" ,strlen(http_content) );
        strcat( http_request , str_tmp);
        // 增加表单编码格式 Content-Type:application/x-www-form-urlencoded\r\n
        strcat( http_request , "Content-Type: application/x-www-form-urlencoded\r\n");
        // HTTP首部和HTTP内容 分隔部分
        strcat( http_request , "\r\n");
        // HTTP负载内容
        strcat( http_request , http_content);
        return http_request;//返回生成的所需要发送的字符串指针
    }


   发送函数,在每次发送前都必须先连接( 调用Socket_Connect(0),并判断连接状态,连接成功方可发送数据),因为yeelink每次传送完数据都会主动断开连接!
    void Yeelink_SendTCPC (char *pYeelinkStr,SOCKET s)
    {        
        unsigned int  i=0;
        while(pYeelinkStr!=0x00)
        {

            Tx_Buffer=pYeelinkStr;
            i++;
        }
        S_tx_process(s,i);  //发送TxBuf[]内容                        
    }

   至此,已经能够完成基本数据上传了,需要注意的是,每个传感器上传间隔都必须设置的大于10s,否则yeelink会返回错误命令,导致数据丢失。


W5100.zip (13.43 KB)
yeelink.zip (2.21 KB)
沙发
mmuuss586| | 2016-8-2 13:50 | 只看该作者
谢楼主分享;

使用特权

评论回复
板凳
皈依| | 2016-8-2 22:00 | 只看该作者
这个厉害啊~自己装修自己搞智能家居~哈哈

使用特权

评论回复
地板
numenjian|  楼主 | 2016-8-3 13:54 | 只看该作者
皈依 发表于 2016-8-2 22:00
这个厉害啊~自己装修自己搞智能家居~哈哈

挺实用的,现在只能做一些灯、开关控制和简单的温湿度、气体采集等

使用特权

评论回复
5
Larm1| | 2016-8-5 14:08 | 只看该作者
好东西,谢谢楼主分享...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

324

帖子

6

粉丝