各种模块如何连接yeelink(WIDO,ESP8266,WIFI扩展板,Python)

2015-12-232.5万
精华项目
AI 快速预览详细 收起
本文介绍了如何使用DFRobot的Wido开发板连接Yeelink物联网平台。首先,需要下载Wido配套的库文件并放置在Arduino路径的libraries文件夹中。然后,在例程中调用Wido2yeelink例程,并更改路由器名称、密码、服务器网址和API_key,以及传感器地址。上传程序后,打开串口助手查看输出。这样就可以实现与Yeelink的数据上传。
内容充实,求版主加精。

使用DFRobot公司开发的Wido开发板可以非常方便快捷的接入较为常用的物联网网站。此处选择大家使用比较多的Yeelink作为范例。其他物联网网站连接也是大同小异。

Wido是一块集成TICC3000WIFI芯片的leonardo,作为一块集成WIFI的Arduino板子由于其集成的WIFI模块是SPI通信,所以空出了串口使得其同时可以使用蓝牙模块,比一般的Arduino作为IOT核心板更有优势。

废话不多说了,下面就来看看如何连接。下载完Wido配套的库之后,将库文件放置在Arduino路径的libraries文件夹中。之后就可以在例程里调出一个名为Wido2yeelink的例程。程序比较长,这里就不贴了。说几个重点的部分

1、更改路由器名称和密码
#define WLAN_SSID       "1207"           // cannot be longer than 32 characters!
#define WLAN_PASS       "liudao1207"        
Wido连接互联网当然需要先跟路由器连接,这里就是路由器的SSID和密码

2、更改服务器网址和API_key
#define WEBSITE  "api.yeelink.net"
#define API_key  "59a4ea38a9909344b0ebfaff59e58933"  
yeelink的API key在下图位置
各种模块如何连接yeelink(WIDO,ESP8266,WIFI扩展板,Python)图1
各种模块如何连接yeelink(WIDO,ESP8266,WIFI扩展板,Python)图2


3、更改传感器地址
WidoClient.fastrprint(F("POST /v1.1/device/"));
WidoClient.fastrprint(F("341588/sensor/381410/datapoints"));
这两句是传感器的url,需要更改成自己创建的传感器的url,另外这个demo是上传数据型传感器数据的,如果要其他传感器数据,需要更改下数据格式。数据都是json的,具体的格式以yeelink提供的文档为准。
各种模块如何连接yeelink(WIDO,ESP8266,WIFI扩展板,Python)图3

这3个位置更改好以后,上传程序,打开串口助手。(住leonardo串口和UNO不一样,UNO在串口助手打开后,会重启单片机,而leonardo不会,所以需要下载完程序后尽快打开,才能看到完整的输出,否则可能会错过前面的输出。)
就会看到以下的显示。
各种模块如何连接yeelink(WIDO,ESP8266,WIFI扩展板,Python)图4
上传数据OK。
此时再上yeelink看看,图表出来了,撒花。
各种模块如何连接yeelink(WIDO,ESP8266,WIFI扩展板,Python)图5
各种模块如何连接yeelink(WIDO,ESP8266,WIFI扩展板,Python)图6

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(10)
xbox
xbox
请问有没有wido的库,现在找不到了
Tobyh3ro
Tobyh3ro
图片看不到,怎么样才可以看?求链接
dsweiliang
dsweiliang
很好很好,认真研究研究一下
吹口琴的钢铁侠
吹口琴的钢铁侠
然而Yeelink网站经常挂,公司是不是快倒闭了23333333
何处不江南
何处不江南
作者
回复吹口琴的钢铁侠
用它的beta版网页,他的老版网页确实经常挂
何处不江南
何处不江南
作者
[align=left][align=left][align=center]在只有PC的情况下连接yeelink[/align][/align][/align]
[align=left]前面几期提到了如何用各种WIFI模块把传感器的数据传到Yeelink上。但很多童鞋可能要说了,我没有WIFI模块,也没有以太网的模块,这些都太贵了,我也想体验下物联网,把传感器数据传上Yeelink,可不可以呢?
[/align]
[align=left]还真可以,大家可能忽略了一个事实,电脑作为一个功能最全面模块,可以为Arduino提供最多的扩展功能。现在我们可以把电脑作为一个中转。将Arduino的数据传到Yeelink上。[/align]
[align=left]由于最近正在学习Python,所以就研究了下如何用Python把Arduino数据传到Yeelink上。先画个流程图理理思路。[/align][align=center]

[/align][align=left] 通过流程图我们可以看见,用Arduino要做的事情很简单,读取数据,串口发送。重点在于电脑端的编程。使用Python需要完成以下两件事。
[/align][align=left]1、读取串口数据。[/align][align=left]2、将读到的数据发送到Yeelink网站。[/align]
[align=left]一、Arduino端程序。[/align][align=left]鉴于一切从简的原则,这次我并没有设计任何的通信协议,只是单纯的发送一个数据而已。(在实际项目中十分不好,应该做一个简单的通信协议)[/align]
[align=left]下面贴出Arduino端的程序,这里还是用模拟口读到的数据作为传感器信号好了。[/align][align=left][code]void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println(analogRead(A0));
delay(10000);
}[/code][/align][align=left]这里设计的时候把主机定义为Arduino,由Arduino来控制上传的速度,delay是为了实现10s上传一次,而PC端则是一接收到数据就上传。[/align]
[align=left]二、PC端程序。[/align][align=left]PC端使用Python编程。[/align]
[align=left]Python作为一门高级语言,在世界范围内被程序员,黑客,极客,理论研究者广泛应用。是一门非常好用的语言。[/align]
[align=left]想学Python的同学,可以去以下地址看,因为我也是刚接触就不误人子弟了。[/align][align=left]http://www.runoob.com/python/python-tutorial.html[/align][align=left]http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000[/align]
[align=left]由于使用广泛,网上资料非常多,完全不必要担心学不会。[/align][align=left]这里贴出Python代码。[/align][code]import serial
import httplib2
from time import sleep
S1=serial.Serial(port='COM7',baudrate=115200,bytesize=8,parity='N',stopbits=1,timeout=5)
#打开串口
print "serial.isOpen() =", S1.isOpen()
H1=httplib2.Http(".cache")
temp=""
while True:
sleep(0.2)
while S1.inWaiting() > 0:
temp+= S1.read()
#读取数据
if temp:
temp=float(temp)
print temp
headers = {
"Host": "api.yeelink.net",
"Accept": "*/*",
"U-ApiKey": "59a4ea38a9909344b0ebfaff59e58933",
"Content-Length": str(len(str(temp))+10),
}
data = "{\"value\":"+str(temp)+"}"
#不能使用一般的数据发送方式 因为格式不对
resp, content = H1.request("http://api.yeelink.net/v1.1/device/341588/sensor/381410/datapoints", "POST", headers=headers,body=data)
print resp
temp=""
S1.close()
#串口关闭 退出时执行 非正常退出会影响下次打开[/code]
[align=left]这里用到了3个外部模块,其中有2个是需要安装的,具体安装方法也请各位百度吧。这里不做详细介绍。[/align]
[align=left]代码中有个”COM7“需要更换成自己Arduino在电脑上的串口号。[/align][align=left]ApiKey在Yeelink上找[/align][align=left]

传感器地址也是[/align][align=left]

好了这样你就可以通过你的PC向Yeelink发送数据了。由于代码是基于Python的所以可以很好的移植到树莓派,或者Arduino Yun上面去,稍微改进下应该就能把树莓派作为家庭互联网的终端了。[/align]
何处不江南
何处不江南
作者
[align=left][align=center]使用WIFI Shield模块如何连接yeelink[/align][/align][align=left]

[/align][align=left]扩展板的基本工作原理如下:[/align][align=left]模块本身可以通过设置与路由器相连接,通过路由器连接上因特网,根据用户的配置,连接上相应的服务器和对应的端口。[/align][align=left]此时模块本身变为一个透传模块。即将Arduino串口发送的数据,原封不动的发到服务器的对应端口上。基于模块的这个原理可以按以下步骤操纵,逐步的连接上我们的目标网站Yeelink。
STEP 1 准备工作:
Arduino UNO 一块
DFRobot WIFI shield 一块[/align]
[align=left]STEP 2 设置wifi[/align][align=left]模块本身可以建立一个AP网络,用户可以通过电脑或手机随时访问该AP网络对模块进行设置,让模块加入到其他路由器的WIFI AP网络。相比于其他wifi模块的AT指令设置模式,此模块的设置方式是最方便快捷的。(此方式达成的效果与AT指令配置相同)[/align]
[align=left]首先模块插上UNO,并用USB连接UNO。(因为一般台式没有无线网卡,我用的是手机)此时手机上会出现模块创建的一个AP网络:[/align][align=left]

选择连接,再打开浏览器,在地址栏里输入10.10.100.254,会出现输入账号密码,输入账号:admin密码admin。就进入了一个web页面就是配置wifi的啦。[/align]
[align=left]为了篇幅,此处配置方式略过不谈,基本方法在DFRobot提供的wiki中有详细的介绍,下面给出地址:[/align][align=left]https://wiki.dfrobot.com.cn/index.php/(SKU:TEL0079)WIFI_Shield_V3_RPSMA_WIFI扩展板_V3_PRSMA接口[/align][align=left]要注意的是,在设置SOCKET_A参数的时候,服务器地址应该设置为api.yeelin.net,端口号改为80,即Http的默认端口。[/align][align=left]

另外比较方便的是,一旦该模块连接上了路由,那么就可以在台式机上通过他的ip访问这个设置界面,再也不用用手机调整了,更加方便一点。[/align]
[align=left]step3:上传程序[/align][align=left]这些设置都完成之后,现在就需要在Arduino中烧录入程序,以便把数据上传到yeelink上了。[/align][align=left]还是和之前一样。先贴出Arduino上的程序,程序下载时,模块上的开关需要拨到Promgram,下载完成之后,需要拨到Arduino端。[/align][align=left][pre]#include [align=left]// for yeelink api[/align][align=left]#define APIKEY "59a4ea38a9909344b0ebfaff59e58933" // replace your yeelink api key here[/align][align=left]#define STIMEOUT 20[/align][align=left]//replace the device ID and sensor ID for temperature sensor.[/align][align=left]#define device_id 341588 // replace your device ID[/align][align=left]#define sensor_id 381410 // replace your sensor ID[/align]
[align=left]SoftwareSerial mySerial(10, 11); // RX, TX [/align][align=left]void setup() {[/align][align=left] // put your setup code here, to run once:[/align][align=left] Serial.begin(115200);[/align][align=left] mySerial.begin(9600);[/align][align=left]}[/align][align=left]unsigned long time1,time2;[/align][align=left]String str="";[/align][align=left]void loop() {[/align][align=left] // put your main code here, to run repeatedly:[/align][align=left] if (Serial.available())[/align][align=left] {[/align][align=left] time2=millis();[/align][align=left] while (1)[/align][align=left] {[/align][align=left] char a;[/align][align=left] if ((millis()-time2)>=STIMEOUT)break;[/align][align=left] if (Serial.available()){a=(char)Serial.read();str+=a;}[/align]
[align=left] }[/align][align=left] }[/align][align=left] if (str!="")[/align][align=left] {[/align][align=left] mySerial.print(str);[/align][align=left] str="";[/align][align=left] }[/align][align=left] if (millis()-time1>=10000)[/align][align=left] {[/align][align=left] String cmd;[/align][align=left] String thisData = String(analogRead(A0)); [/align][align=left] time1 = millis(); [/align][align=left] cmd = "POST /v1.1/device/";[/align][align=left] cmd += String(device_id);[/align][align=left] cmd += "/sensor/";[/align][align=left] cmd += String(sensor_id);[/align][align=left] cmd += "/datapoints";[/align][align=left] cmd += " HTTP/1.1\r\n";[/align][align=left] cmd += "Host: api.yeelink.net\r\n";[/align][align=left] cmd += "Accept: *";[/align][align=left] cmd += "/";[/align][align=left] cmd += "*\r\n";[/align][align=left] cmd += "U-ApiKey: ";[/align][align=left] cmd += APIKEY;[/align][align=left] cmd += "\r\n";[/align][align=left] cmd += "Content-Length: ";[/align][align=left] int thisLength = 10 + thisData.length();[/align][align=left] cmd += String(thisLength);[/align][align=left] cmd += "\r\n";[/align][align=left] cmd += "Content-Type: application/x-www-form-urlencoded\r\n";[/align][align=left] cmd += "Connection: close\r\n";[/align][align=left] cmd += "\r\n";[/align][align=left] cmd += "{"value":";[/align][align=left] cmd += thisData;[/align][align=left] cmd += "}\r\n";[/align][align=left] Serial.print(cmd);[/align][align=left] }[/align][align=left]}[/pre][/align]
[/align][align=left]和之前一样,到各位童鞋那有几个点需要更改:[/align][align=left]#define device_id 341588 // replace your device ID[/align][align=left]#define sensor_id 381410 // replace your sensor ID[/align]
[align=left]

[/align][align=left]#define APIKEY "59a4ea38a9909344b0ebfaff59e58933" // replace your yeelink api key here[/align][align=left]

程序下载之后开关拨到Arduino,由于我用的是UNO没有第二个串口看收到的数据于是我使用了软串口,并在10和11脚接上了USB转ttl模块,就能看到如下图:[/align][align=left]

说明上传OK,现在就可以打开Yeelink界面看看自己上传的数据啦。[/align][align=left]

[/align]
dsweiliang
dsweiliang
正需要这个
何处不江南
何处不江南
作者
回复dsweiliang
相信很多人需要的
hnyzcj
hnyzcj
有空我会来试验下,多谢你的帖子。
何处不江南
何处不江南
作者
回复hnyzcj
哈哈 会继续更新 还准备写个用python给yeelink发数据
hnyzcj
hnyzcj
恩不错,很有指导意义。
何处不江南
何处不江南
作者
[align=left]ESP8266是乐鑫出的一块WIFI单片解决方案。既可以独立的作为一块控制板,也可以通过刷写固件变为一块Arduino兼容的WIFI串口透传模块。和很多串口透传模块一样,他同样是通过AT指令来设置的。[/align]
[align=left]因为通过AT指令设置是比较麻烦的所以使用DFRobot提供的库来使用这个透传模块。这里多说一句,笔者在使用这个模块的时候发现,这个库可能对于Arudino IDE 1.0.6的兼容性存在问题。当使用1.6.5版本IDE的时候可以正常的使用。[/align][align=left][pre]#include "esp8266.h"[align=left]#include "SoftwareSerial.h"[/align]
[align=left]#define ssid "1207" // you need to change it[/align][align=left]#define password "liudao1207"[/align]
[align=left]#define serverIP "42.96.164.52"//api.yeelink.net[/align][align=left]#define serverPort "80"[/align]
[align=left]// for yeelink api[/align][align=left]#define APIKEY "59a4ea38a9909344b0ebfaff59e58933"[/align][align=left]// replace your yeelink api key here[/align][align=left]//replace the device ID and sensor ID for temperature sensor.[/align][align=left]#define device_id 341588 // replace your device ID[/align][align=left]#define sensor_id 381410 // replace your sensor ID[/align]
[align=left]Esp8266 wifi;[/align][align=left]SoftwareSerial mySerial(10, 11); // RX, TX [/align][align=left]unsigned long time = 0;[/align][align=left]void setup() { [/align][align=left] delay(2000);[/align]
[align=left] Serial.begin(115200);[/align][align=left] mySerial.begin(9600);[/align][align=left] wifi.begin(&Serial, &mySerial); //Serial is used to communicate with esp8266 module, mySerial is used to debug[/align]
[align=left] if (wifi.connectAP(ssid, password)) {[/align][align=left] wifi.debugPrintln("connect ap sucessful !");[/align][align=left] } else {[/align][align=left] wifi.debugPrintln("connect fail !");[/align][align=left] }[/align][align=left] wifi.setSingleConnect();[/align][align=left] if (wifi.connectTCPServer(serverIP, serverPort)) {[/align][align=left] wifi.debugPrintln("connect to TCP server successful !");[/align][align=left] }[/align][align=left] String ip_addr;[/align][align=left] ip_addr = wifi.getIP();[/align][align=left] wifi.debugPrintln("esp8266 ip:" + ip_addr);[/align]
[align=left]}[/align][align=left]void loop() {[/align][align=left] int state = wifi.getState();[/align][align=left] switch (state) {[/align][align=left] case WIFI_NEW_MESSAGE:[/align][align=left] wifi.debugPrintln(wifi.getMessage());[/align][align=left] //wifi.sendMessage();[/align][align=left] wifi.setState(WIFI_IDLE);[/align][align=left] break;[/align][align=left] case WIFI_CLOSED ://reconnet to the TCP server[/align][align=left] wifi.debugPrintln("server is closed! and trying to reconnect it!");[/align][align=left] if (wifi.connectTCPServer(serverIP, serverPort)) {[/align][align=left] wifi.debugPrintln("reconnect OK!");[/align][align=left] wifi.setState(WIFI_IDLE);[/align][align=left] }[/align][align=left] else {[/align][align=left] wifi.debugPrintln("reconnect fail");[/align][align=left] wifi.setState(WIFI_CLOSED);[/align][align=left] }[/align][align=left] break;[/align][align=left] case WIFI_IDLE : [/align][align=left] int sta = wifi.checkMessage();[/align][align=left] wifi.setState(sta);[/align][align=left] break;[/align][align=left] }[/align][align=left] if (millis()-time>=10000)[/align][align=left] {[/align][align=left] String cmd;[/align][align=left] String thisData = String(analogRead(A0)); [/align][align=left] time = millis(); [/align][align=left] cmd = "POST /v1.1/device/";[/align][align=left] cmd += String(device_id);[/align][align=left] cmd += "/sensor/";[/align][align=left] cmd += String(sensor_id);[/align][align=left] cmd += "/datapoints";[/align][align=left] cmd += " HTTP/1.1\r\n";[/align][align=left] cmd += "Host: api.yeelink.net\r\n";[/align][align=left] cmd += "Accept: *";[/align][align=left] cmd += "/";[/align][align=left] cmd += "*\r\n";[/align][align=left] cmd += "U-ApiKey: ";[/align][align=left] cmd += APIKEY;[/align][align=left] cmd += "\r\n";[/align][align=left] cmd += "Content-Length: ";[/align][align=left] int thisLength = 10 + thisData.length();[/align][align=left] cmd += String(thisLength);[/align][align=left] cmd += "\r\n";[/align][align=left] cmd += "Content-Type: application/x-www-form-urlencoded\r\n";[/align][align=left] cmd += "Connection: close\r\n";[/align][align=left] cmd += "\r\n";[/align][align=left] cmd += "{"value":";[/align][align=left] cmd += thisData;[/align][align=left] cmd += "}\r\n";[/align][align=left] wifi.debugPrintln(cmd);[/align][align=left] wifi.sendMessage(cmd);[/align][align=left] }[/align][align=left]}[/pre][/align]
[/align]
[align=left]具体的连线图如下,图中的USB转串口主要是用来读取调试信息的,也是因为UNO只有一个串口,所以没办法输出调试信息,通过软串口来解决这个矛盾也是无奈之举:[/align][align=left]

[/align]
[align=left]现在来分析下上面的代码[/align][align=left][pre]#define ssid "1207" // you need to change it
#define password "liudao1207"[/pre][/align][align=left]这2句是你家路由器的SSID和密码,ESP8266先连接你家路由器,然后通过路由器连上WEB,去连接yeelink。[/align]

[align=left][pre]#define serverIP "42.96.164.52"//api.yeelink.net
#define serverPort "80"[/pre][/align][align=left]这2句是需要连接的服务器的ip和端口号[/align]
[align=left][pre]#define device_id 341588 // replace your device ID
#define sensor_id 381410 // replace your sensor ID[/pre][/align][align=left]这2句是你在yeelink上申请的设备号和传感器号。如下图:[/align][align=left]

[/align]
[align=left]switch里的语句是一个状态检测,检测模块是否有收到服务器返回的数据,若有数据返回则通过软串口发送到USB转ttl模块上,这样就可以在串口助手上看到了。当tcp链接断开后,也会自动重新连接。[/align]
[align=left][pre]if (millis()-time>=10000)
{
.....
}[/pre][/align][align=left]中的内容是需要发送给yeelink服务器的数据。是http报文的固定格式。其中包含了你需要发送的数据thisData,可以替换此处的thisData为你想发送的任何数字型数据。若想发送其他类型的数据,可以去查看yeelink的手册,稍微调整下程序即可。[/align][align=left]成功之后你大概会在USB转ttl上收到如下数据:[/align][align=left]

此时再打开yeelink界面,点开你的传感器,大概就能看见刚发送上来的数据的图表了。[/align][align=left]

[/align][align=center]

[/align]
visionsl
visionsl回复何处不江南
ESP8266有库?! 下来学习学习, 谢谢!
- 没有更多了 -