Wido2Yeelink

2017-04-061.4万
AI 快速预览详细 收起
本文介绍了如何在Yeelink平台上使用DHT11温湿度传感器实现同时连接两个节点的方法。通过修改代码中的URL路径和数据包发送逻辑,可以轻松实现多设备数据上传。适合初学者和STEM教育场景,提供了详细的代码示例和步骤说明。


想请教下Yeelink上怎么实现同时连接一个设备的两个节点,用的设备是DHT11温室度传感器。例子中只是连接了一个节点,需要在哪里做些改进呢?  我是初学

[mw_shl_code=cpp,true]#include <Adafruit_CC3000.h>
#include <ccspi.h>
#include <SPI.h>
#include <dht11.h>
dht11 DHT;
#define DHT11_PIN 0
#define Wido_IRQ   7
#define Wido_VBAT  5
#define Wido_CS    10

Adafruit_CC3000 Wido = Adafruit_CC3000(Wido_CS, Wido_IRQ, Wido_VBAT,
SPI_CLOCK_DIVIDER); // you can change this clock speed
// Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
#define WLAN_SECURITY   WLAN_SEC_WPA2


#define WLAN_SSID       "ChinaNGB-Yd4fWw"           // cannot be longer than 32 characters!
#define WLAN_PASS       "arrd2472"          // For connecting router or AP, don't forget to set the SSID and password here!!


#define TCP_TIMEOUT      3000
//#define CC3000_TINY_DRIVER

#define WEBSITE  "api.yeelink.net"
#define API_key  "87c0a2706cf9f5f5062a6ef3cb7b8ffc"  // Update Your API Key. To get your API Key, please check the link below
                                                     // http://www.yeelink.net/user/user_profile

void setup(){

  Serial.begin(115200);
  Serial.println(F("Hello, CC3000!\n"));

  /* Initialise the module */
  Serial.println(F("\nInitialising the CC3000 ..."));
  if (!Wido.begin())
  {
    Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
    while(1);
  }

  /* Attempt to connect to an access point */
  char *ssid = WLAN_SSID;             /* Max 32 chars */
  Serial.print(F("\nAttempting to connect to "));
  Serial.println(ssid);

  /* NOTE: Secure connections are not available in 'Tiny' mode!
   By default connectToAP will retry indefinitely, however you can pass an
   optional maximum number of retries (greater than zero) as the fourth parameter.
   */
  if (!Wido.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
    Serial.println(F("Failed!"));
    while(1);
  }

  Serial.println(F("Connected!"));

  /* Wait for DHCP to complete */
  Serial.println(F("Request DHCP"));
  while (!Wido.checkDHCP())
  {
    delay(100); // ToDo: Insert a DHCP timeout!
  }  

}

uint32_t ip = 0;


void loop(){
  
  static Adafruit_CC3000_Client WidoClient;
  static unsigned long RetryMillis = 0;
  static unsigned long uploadtStamp = 0;
  static unsigned long sensortStamp = 0;

  if(!WidoClient.connected() && millis() - RetryMillis > TCP_TIMEOUT){
    // Update the time stamp
    RetryMillis = millis();

    Serial.println(F("Try to connect the cloud server"));
    WidoClient.close();

    // Get Yeelink IP address
    Serial.print(F("api.yeelink.net -> "));
    while  (ip  ==  0)  {
      if  (!Wido.getHostByName(WEBSITE, &ip))  {    //  Get the server IP address based on the domain name
        Serial.println(F("Couldn't resolve!"));
      }
      delay(500);
    }  
    Wido.printIPdotsRev(ip);
    Serial.println(F(""));
   
    // Connect to the Yeelink Server
    WidoClient = Wido.connectTCP(ip, 80);          // Try to connect cloud server
  }
  
  if(WidoClient.connected() && millis() - uploadtStamp > 10000){
    uploadtStamp = millis();
    // If the device is connected to the cloud server, upload the data every 2000ms.
   
    // Prepare Http Package for Yeelink & get length
    int length = 0;
    char lengthstr[3];
   
    // Create Http data package
    char httpPackage[60] = "";
   
    //strcat(httpPackage,"{\"value\":");
   // itoa(DHT.temperature,httpPackage+strlen(httpPackage),10);          // push the data(temp) to the http data package
    //strcat(httpPackage,"}");

    strcat(httpPackage,"{\"value\":");
    itoa(DHT.humidity,httpPackage+strlen(httpPackage),10);          // push the data(temp) to the http data package
    strcat(httpPackage,"}");

   
    length = strlen(httpPackage);                           // get the length of data package
    itoa(length,lengthstr,10);                              // convert int to char array for posting
    Serial.print(F("Length = "));
    Serial.println(length);
   
    Serial.println(F("Connected to Yeelink server."));
   
    // Send headers
    Serial.print(F("Sending headers"));
   
    //WidoClient.fastrprint(F("POST /v1.0/device/"));
    //WidoClient.fastrprint(F("356326/sensor/403687/datapoints"));  //Please change your device ID and sensor ID here, after creating
   // WidoClient.fastrprint(F("\r\n"));
    WidoClient.fastrprint(F("POST /v1.0/device/"));
    WidoClient.fastrprint(F("356326/sensor/403688/datapoints"));                                                     //Please check the link: http://www.yeelink.net/user/devices
                                                           //The example URL: http://api.yeelink.net/v1.0/device/100/sensor/20/datapoints
    WidoClient.fastrprintln(F(" HTTP/1.1"));
    Serial.print(F("."));
   
    WidoClient.fastrprintln(F("Host: api.yeelink.net"));
    Serial.print(F("."));
   
    WidoClient.fastrprint(F("U-ApiKey: "));
    WidoClient.fastrprintln(API_key);
    Serial.print(F("."));
   
    WidoClient.fastrprint("Content-Length: ");
    WidoClient.fastrprintln(lengthstr);
    WidoClient.fastrprintln("");
    Serial.print(F("."));
   
    Serial.println(F(" done."));
   
    // Send data
    Serial.print(F("Sending data"));
    WidoClient.fastrprintln(httpPackage);

    Serial.println(F(" done."));
   
    /********** Get the http page feedback ***********/
   
    unsigned long rTimer = millis();
    Serial.println(F("Reading Cloud Response!!!\r\n"));
    while (millis() - rTimer < 10000) {
      while (WidoClient.connected() && WidoClient.available()) {
        char c = WidoClient.read();
        Serial.print(c);
      }
    }
    delay(1000);             // Wait for 1s to finish posting the data stream
    WidoClient.close();      // Close the service connection
  
    RetryMillis = millis();  // Reset the timer stamp for applying the connection with the service
  }

  if(millis() - sensortStamp > 2000){
    sensortStamp = millis();
    // read the LM35 sensor value and convert to the degrees every 100ms.
    setDHT11();
}
}
   void setDHT11(){
    int chk;
  
  chk = DHT.read(DHT11_PIN);    // READ DATA
  switch (chk){
    case DHTLIB_OK:  
                Serial.print("OK,\t");
                break;
    case DHTLIB_ERROR_CHECKSUM:
                Serial.print("Checksum error,\t");
                break;
    case DHTLIB_ERROR_TIMEOUT:
                Serial.print("Time out error,\t");
                break;
    default:
                Serial.print("Unknown error,\t");
                break;
  }
// DISPLAT DATA
  Serial.print(DHT.humidity);
  Serial.print(",\t");

  Serial.println(DHT.temperature);

  delay(1000);
    }[/mw_shl_code]

  

创作许可协议

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

评论(2)
Vash
Vash
同时读取两个传感器的数据吗?
songoku
songoku
作者
回复Vash
读取两个传感器也可以啊,就是不知道咋写
songoku
songoku
作者
回复Vash
就一个传感器,温湿度传感器,同时把温度和湿度传到yeelink上
pATAq
pATAq
1、详述一下你的项目需求(想做什么,实现什么功能),YeeLink好像不是很好用
2、什么叫做一个设备的两个节点,比如不同传感器数值?
songoku
songoku
作者
回复pATAq
http://api.yeelink.net/v1.0/device/356326/sensor/403687/datapointshttp://api.yeelink.net/v1.0/device/356326/sensor/403688/datapoints
一个设备,DHT11温湿度传感器,同时把温度湿度上传到yeelink。
另外你说的yeelink不好用?那有哪个比较好用的呢,另外的平台有开发文档吗?
- 没有更多了 -