使用WIFI Shield V3上传温湿度到YEELINK,yeelink无数据
2014-10-221.6万
AI 快速预览详细
本文介绍了使用WIFI Shield V3将DHT11传感器的温湿度数据上传到YEELINK平台时遇到无数据的问题。具体报错现象是数据未能成功上传。文章提供了详细的代码示例和故障排查步骤,特别是检查API请求的Content-Length字段与实际数据长度的一致性。通过修正Content-Length字段,可以确保数据正确上传。
|
弄了很久都没有弄好,现在只能找大家帮忙了,折腾好几个晚上了 程序: #include <dht11.h> dht11 DHT; float TEMP; int HUMI; int thisLength; int time=0; void setup() { Serial.begin(115200); pinMode(13,OUTPUT); } void loop() { int chk = DHT.read(4); TEMP = DHT.temperature; HUMI = DHT.humidity; TEMP = (int(TEMP * 100.0)) / 100.0; char tempStr[20]; floatToString(TEMP,tempStr); String data; data+=""; data+=String(tempStr); int t=data.length(); time=time+1; if (time%2==1) { Serial.println("POST http://api.yeelink.net/v1.0/device/14899/sensor/25567/datapoints/add"); Serial.println("Host: api.yeelink.net"); Serial.print("Accept: *"); Serial.print("/"); Serial.println("*"); Serial.print("U-ApiKey: "); Serial.println("9d2b482044dfaa42ad59806af17ae5c3"); // 此处用你的APIKEY替代 Serial.print("Content-Length: "); int thislength=17+t; Serial.println(thislength); Serial.println("Content-Type: application/x-www-form-urlencoded"); Serial.println("Connection: close"); Serial.println(); Serial.print("params={\"value\":"); Serial.print(TEMP); Serial.println("}"); delay(1000); digitalWrite(13,LOW); delay(5000); } else if(time%2==0) { Serial.println("POST http://api.yeelink.net/v1.0/device/14899/sensor/25786/datapoints/add"); Serial.println("Host: api.yeelink.net"); Serial.print("Accept: *"); Serial.print("/"); Serial.println("*"); Serial.print("U-ApiKey: "); Serial.println("9d2b482044dfaa42ad59806af17ae5c3"); Serial.print("Content-Length: "); int thislength=17+getLength(HUMI); Serial.println(thislength); Serial.println("Content-Type: application/x-www-form-urlencoded"); Serial.println("Connection: close"); Serial.println(); Serial.print("params={\"value\":"); Serial.print(HUMI); Serial.println("}"); delay(1000); digitalWrite(13,LOW); delay(5000); } } int getLength(int someValue) { // there's at least one byte: int digits = 1; // continually divide the value by ten, // adding one to the digit count for each // time you divide, until you're at 0: int dividend = someValue /10; while (dividend > 0) { dividend = dividend /10; digits++; } // return the number of digits: return digits; } void floatToString(float in,char* out){ uint16_t Tc_100 = in*100; uint8_t whole, fract; whole = Tc_100/100 ; // separate off the whole and fractional portions fract = Tc_100 % 100; sprintf(out,"%d.%d",whole,fract); delay (10000); } COM的数据 POST http://api.yeelink.net/v1.0/device/14899/sensor/25567/datapoints/add Host: api.yeelink.net Accept: */* U-ApiKey: 9d2b482044dfaa42ad59806af17ae5c3 Content-Length: 21 Content-Type: application/x-www-form-urlencoded Connection: close params={"value":28.00} POST http://api.yeelink.net/v1.0/device/14899/sensor/25786/datapoints/add Host: api.yeelink.net Accept: */* U-ApiKey: 9d2b482044dfaa42ad59806af17ae5c3 Content-Length: 19 Content-Type: application/x-www-form-urlencoded Connection: close params={"value":71} POST http://api.yeelink.net/v1.0/device/14899/sensor/25567/datapoints/add Host: api.yeelink.net Accept: */* U-ApiKey: 9d2b482044dfaa42ad59806af17ae5c3 Content-Length: 21 Content-Type: application/x-www-form-urlencoded Connection: close params={"value":28.00} 下面是wifi sheild的设置界面的截图,连续好几天都折腾到深夜,还是无果,求大家帮忙看一下 ![]() ![]() ![]() ![]() ![]() YEELINK界面 ![]() ![]() |











[code]//没有传感器,上传一个循环的1-10的数字
int i;
//for yeelink api
#define APIKEY "*******" //改为自己的
#define DEVICEID **** //改为自己的
#define SENSORID **** //改为自己的
void postData(int thisData) {
Serial.print("POST /v1.0/device/");
Serial.print(DEVICEID);
Serial.print("/sensor/");
Serial.print(SENSORID);
Serial.print("/datapoints");
Serial.println(" HTTP/1.1");
Serial.println("Host: api.yeelink.net");
Serial.print("Accept: *");
Serial.print("/");
Serial.println("*");
Serial.print("U-ApiKey: ");
Serial.println(APIKEY);
Serial.print("Content-Length: ");
int thisLength = 10 + getLength(thisData);
Serial.print(thisLength);
Serial.println();
Serial.println("Content-Type: application/x-www-form-urlencoded");
Serial.println();
Serial.print("{"value":");
Serial.print(thisData);
Serial.println("}");
}
int getLength(int someValue) {
int digits = 1;
int dividend = someValue /10;
while (dividend > 0) {
dividend = dividend /10;
digits++;
}
return digits;
}
void setup(){
Serial.begin(115200);
}
void loop() {
for(i=1;i<10;i++){
postData(i);
delay(5*1000);
}
}[/code]
参考:http://blog.sina.com.cn/s/blog_54bf41d30101qpq4.html#commonComment