|
最近接触了物联网,就找yeelink编了代码测试,目的是想让yeelink能够获取温度数据,同时接了一个LED开关,希望能够上传温度数据的过程中,也能够随时控制LED开关。现在功能能够实现,但是数据经常好几分钟传一个,而且没什么规律。开关点击后很长时间才能够看到设备效果。
有哪位大神指点下,看看哪里错了?
#include <SPI.h>
#include <Ethernet.h>
#define ledpin 3
#define APIKEY "0683c31991703ace433e551e9443233"
#define DEVICEID 35104
#define SENSORID 39511
#define SENSORID2 39430
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
EthernetClient client;
char server[] = "api.yeelink.net";
unsigned long lastConnectionTime = 0;
boolean lastConnected = false;
const unsigned long postingInterval = 3*1000;
String returnValue = "";
boolean ResponseBegin = false;
void setup()
{
pinMode(ledpin, OUTPUT);
Serial.begin(9600);
if (Ethernet.begin(mac) == 0)
{
Serial.println("Failed to configure Ethernet using DHCP");
for(;;)
;
}
else
{
Serial.println("Ethernet configuration OK");
}
}
void loop() {
while(client.available())
{
char c = client.read();
if (c == '{')
{
ResponseBegin = true;
}
else if (c == '}')
{
ResponseBegin = false;
}
if (ResponseBegin)
{
returnValue += c;
}
if (returnValue.length() !=0 && (ResponseBegin == false))
{
Serial.println(returnValue);
if (returnValue.charAt(returnValue.length() - 1) == '1')
{
Serial.println("turn on the LED");
digitalWrite(ledpin, HIGH);
}
else if(returnValue.charAt(returnValue.length() - 1) == '0')
{
Serial.println("turn off the LED");
digitalWrite(ledpin, LOW);
}
returnValue = "";
}
}
if (!client.connected() && lastConnected) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
if(!client.connected() && (millis() - lastConnectionTime > postingInterval))
{Serial.print("yeelink:");
getData();
int sensorReading = analogRead(0);//读取传感器数据并发送到yeelink服务。
Serial.print("yeelink:");
Serial.println(sensorReading);
sendData(sensorReading);
}
lastConnected = client.connected();
}
void getData(void) {
if (client.connect(server, 80))
{
Serial.println("connecting...");
client.print("GET /v1.0/device/");
client.print(DEVICEID);
client.print("/sensor/");
client.print(SENSORID2);
client.print("/datapoints");
client.println(" HTTP/1.1");
client.println("Host: api.yeelink.net");
client.print("Accept: *");
client.print("/");
client.println("*");
client.print("U-ApiKey: ");
client.println(APIKEY);
client.println("Content-Length: 0");
client.println("Connection: close");
client.println();
Serial.println("print get done.");
}
else {
Serial.println("connection failed");
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
lastConnectionTime = millis();
}
void sendData(int thisData)
{
if (client.connect(server, 80))
{
Serial.println("connecting...");
client.print("POST /v1.0/device/");
client.print(DEVICEID);
client.print("/sensor/");
client.print(SENSORID);
client.print("/datapoints");
client.println(" HTTP/1.1");
client.println("Host: api.yeelink.net");
client.print("Accept: *");
client.print("/");
client.println("*");
client.print("U-ApiKey: ");
client.println(APIKEY);
client.print("Content-Length: ");
int thisLength = 10 + getLength(thisData);
client.println(thisLength);
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("Connection: close");
client.println();
client.print("{\"value\":");
client.print(thisData);
client.println("}");
}
else
{
Serial.println("connection failed");
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
lastConnectionTime = millis();
}
int getLength(int someValue)
{
int digits = 1;
int dividend = someValue /10;
while (dividend > 0)
{
dividend = dividend /10;
digits++;
}
return digits;
}
|
|