实验三:通过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个继电器的状态。

仍然创建DIY设备,其中设备类型选择00(Custom Device Type)

具体操作如下图:

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 = "xxxxxxxxxxxxxxxxxxxxxxxx";
const char* deviceID = "xxxxxxxxx";
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);
  }
}

results matching ""

    No results matching ""