实验三:通过spriteIO来控制LinkNode R4\/R8的继电器开关
实验说明
本实验通过使用LinkSprite公司的IO平台spriteIO来实现控制LinkNode R4\/R8上的继电器开关,从而来实现通过网络来控制硬件开关的功能,主要的实用处在于用来做智能的排插。
本实验的主要工作是:通过LinkNode的wifi模块连接到网络后,然后与spriteIO平台进行网络通信,读取spriteIO上的数据来实现远程控制继电器的功能。
实验目的
了解spriteIO平台的功能,及熟练掌握使用的方法。
能够在LinkNode上使用wifi模块链接网络,并且向spriteIO平台发出简单的POST请求。
能够熟悉LinkNode上的各个IO口的端口号,能基本实现智能插座的功能。
软硬件清单
硬件
- LinkNode R4\/R8
- 串口连接线 x1
软件
Arduino IDE开发环境
实验步骤
1.spriteIO平台上的配置
在spriteIO平台上创建一个DIY的类型的数据,然后存储入d1,d2,d3,d4的数据分别表示继电器的状态,1表示连通,0表示断开。同理如果是LinkNode R8就是需要设置8个数据来存储8个继电器的状态。
具体操作如下图:
2.实现网络请求
把LinkNode连接电脑,并将LinkNode链接wifi网络之后,通过Arduino IDE将以下的程序源码烧录进去即可。(程序只是一个基本4个继电器的query操作,如果你选用的是LinkNode R8需要你自己实现读取8个继电器的query操作。)
源程序如下:
#include <ESP8266WiFi.h>
#include <WString.h>
//the library are needed for autoconfig WiFi
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
// replace with your own API key and device ID,
String apikey = "ea2fe81a-dee3-4026-8743-328ad12ce1db";
const char* deviceID = "00000000df";
const char* server = "www.linksprite.io";
WiFiClient client;
int CONTROL_1 = 12;
int CONTROL_2 = 13;
int CONTROL_3 = 14;
int CONTROL_4 = 16;
int LED = 20;
void setup() {
Serial.begin(115200);
pinMode(CONTROL_1, OUTPUT);
pinMode(CONTROL_2, OUTPUT);
pinMode(CONTROL_3, OUTPUT);
pinMode(CONTROL_4, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
WiFiManager wifiManager;
wifiManager.setAPStaticIPConfig(IPAddress(10, 0, 1, 1), IPAddress(10, 0, 1, 1), IPAddress(255, 255, 255, 0));
wifiManager.autoConnect("LinkNodeAP");
Serial.print("WiFi Connected ...\n");
Serial.println("WiFi connected");
}
void loop() {
String ss;
String s1 = "d1";
String s2 = "d2";
String s3 = "d3";
String s4 = "d4";
ss = "\"";
ss += s1;
ss += "\"";
ss += ",";
ss += "\"";
ss += s2;
ss += "\"";
ss += ",";
ss += "\"";
ss += s3;
ss += "\"";
ss += ",";
ss += "\"";
ss += s4;
ss += "\"";
if (client.connect("www.linksprite.io", 80))
{
String postStr = "{";
postStr += "\"action\":\"query\",";
postStr += "\"apikey\":\"";
postStr += apikey;
postStr += "\",";
postStr += "\"deviceid\":\"";
postStr += deviceID;
postStr += "\",";
postStr += "\"params\":";
postStr += "[";
postStr += ss;
postStr += "]";
postStr += "}";
client.print("POST /api/http HTTP/1.1\n");
client.print("Host: ");
client.print("www.linksprite.io");
client.print("\nContent-Type: application/json\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);
}
delay(200);
String request = "";
while (client.available())
{
char c = client.read();
request += c;
}
if (request != NULL)
{
int index1 = request.indexOf(":{");
int index2 = request.indexOf("}");
int index3 = request.indexOf(s1);
int index4 = request.indexOf(s2);
int index5 = request.indexOf(s3);
int index6 = request.indexOf(s4);
String param = request.substring(index1, index2 + 1);
int le = s1.length();
String val_1 = request.substring(index3 + le + 3, index3 + le + 4);
int ld = s2.length();
String val_2 = request.substring(index4 + ld + 3, index4 + ld + 4);
int lf = s3.length();
String val_3 = request.substring(index5 + lf + 3, index5 + lf + 4);
int lg = s4.length();
String val_4 = request.substring(index6 + lg + 3, index6 + lg + 4);
Serial.println(param);
Serial.println(val_1);
Serial.println(val_2);
Serial.println(val_3);
Serial.println(val_4);
int v_1 = val_2.toInt();
digitalWrite(CONTROL_1, val_1.toInt());
//digitalWrite(CONTROL_2,val_2.toInt());
digitalWrite(CONTROL_3, val_3.toInt());
digitalWrite(CONTROL_4, val_4.toInt());
if (val_1.toInt() == 0)
digitalWrite(CONTROL_1, LOW);
else
digitalWrite(CONTROL_1, HIGH);
if (val_2.toInt() == 0)
digitalWrite(CONTROL_2, LOW);
else
digitalWrite(CONTROL_2, HIGH);
if (val_3.toInt() == 0)
digitalWrite(CONTROL_3, LOW);
else
digitalWrite(CONTROL_3, HIGH);
if (val_4.toInt() == 0)
digitalWrite(CONTROL_4, LOW);
else
digitalWrite(CONTROL_4, HIGH);
client.stop();
delay(20);
}
}