如何用arduino+ethernet shield(W5100)与yeelink结合5分钟实现传感器数据web上传
来源:互联网 发布:淘宝乔丹运动服 编辑:程序博客网 时间:2024/04/28 05:40
转自Yeelink博客。http://blog.yeelink.net/?p=34
本文介绍如何在Arduino上实现自己的Yeelink客户端,以便将采集到的传感器数据上传到Yeelink平台上。该例程会每隔30s采集一次传感器数据并发送到yeelink服务器。
硬件需求
Arduino主板
Ethernet板(W5100)
BH1750光强传感器模块(你可以替换成自己的传感器)
软件需求
Yeelink帐号(注册新用户)
增加一个设备和一个传感器(参考快速开始)
电路
Ethernet板和主板的插接略去。
传感器插接线:
VCC-5v
GND-GND
SCL-SCL(analog pin 5)
SDA-SDA(analog pin 4)
ADD-NC
实物图
Yeelink网站上生成的数据曲线
源码
同时也被开源至了Github
https://github.com/dapingliu/arduino_client_4_yeelink
/* Yeelink sensor client example */#include <SPI.h>#include <Ethernet.h>#include <Wire.h>#include <math.h>int BH1750address = 0x23;byte buff[2];// for yeelink api#define APIKEY "9cdf51696fa9ddfacdf819033a5f2f63" // replace your yeelink api key here#define DEVICEID 4 // replace your device ID#define SENSORID 7 // replace your sensor ID// assign a MAC address for the ethernet controller.byte mac[] = { 0x00, 0x1D, 0x72, 0x82, 0x35, 0x9D};// initialize the library instance:EthernetClient client;char server[] = "api.yeelink.net"; // name address for yeelink APIunsigned long lastConnectionTime = 0; // last time you connected to the server, in millisecondsboolean lastConnected = false; // state of the connection last time through the main loopconst unsigned long postingInterval = 30*1000; // delay between 2 datapoints, 30svoid setup() { Wire.begin(); // start serial port: Serial.begin(57600); // start the Ethernet connection with DHCP: if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); for(;;) ; } else { Serial.println("Ethernet configuration OK"); }}void loop() { // if there's incoming data from the net connection. // send it out the serial port. This is for debugging // purposes only: if (client.available()) { char c = client.read(); Serial.print(c); } // if there's no net connection, but there was one last time // through the loop, then stop the client: if (!client.connected() && lastConnected) { Serial.println(); Serial.println("disconnecting."); client.stop(); } // if you're not connected, and ten seconds have passed since // your last connection, then connect again and send data: if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) { // read sensor data, replace with your code int sensorReading = readLightSensor(); //send data to server sendData(sensorReading); } // store the state of the connection for next time through // the loop: lastConnected = client.connected();}// this method makes a HTTP connection to the server:void sendData(int thisData) { // if there's a successful connection: if (client.connect(server, 80)) { Serial.println("connecting..."); // send the HTTP PUT request: 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: "); // calculate the length of the sensor reading in bytes: // 8 bytes for {"value":} + number of digits of the data: int thisLength = 10 + getLength(thisData); client.println(thisLength); client.println("Content-Type: application/x-www-form-urlencoded"); client.println("Connection: close"); client.println(); // here's the actual content of the PUT request: client.print("{\"value\":"); client.print(thisData); client.println("}"); } else { // if you couldn't make a connection: Serial.println("connection failed"); Serial.println(); Serial.println("disconnecting."); client.stop(); } // note the time that the connection was made or attempted: lastConnectionTime = millis();}// This method calculates the number of digits in the// sensor reading. Since each digit of the ASCII decimal// representation is a byte, the number of digits equals// the number of bytes: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;}///////////////////////////////////////////////////////////////////////////// get data from light sensor// you can replace this code for your sensorint readLightSensor(){ uint16_t val=0; BH1750_Init(BH1750address); delay(200); if(2==BH1750_Read(BH1750address)) { val=((buff[0]<<8)|buff[1])/1.2; } Serial.print("Sensor value is: "); Serial.println((int)val); return val;}int BH1750_Read(int address) //{ int i=0; Wire.beginTransmission(address); Wire.requestFrom(address, 2); while(Wire.available()) // { buff[i] = Wire.read(); // receive one byte i++; } Wire.endTransmission(); return i;}void BH1750_Init(int address){ Wire.beginTransmission(address); Wire.write(0x10);//1lx reolution 120ms Wire.endTransmission();}
注:WIZnet在线转载作品均尽可能注明出处,该作品所有人的一切权利均不因本站转载而转移。作者如不同意转载,即请通知本站予以删除或改正。转载的作品可能在标题或内容上或许有所改动。
- 如何用arduino+ethernet shield(W5100)与yeelink结合5分钟实现传感器数据web上传
- 【转】物联网跟我动手做系列教程—第三篇 实验三如何用arduino+ethernet shield与yeelink结合5分钟实现web远程家电控制(代码已更新)
- 【转】推荐教程2:W5100+arduino+乐联网平台实现传感器数据上传
- Arduino W5100 Yeelink PIN7控制
- arduino mega 2560结合 ethernet shield拓展板使用心得
- Arduino Srl发布W5500 Ethernet Shield!
- 开源第六周 ethernet shield数据传输+yeelink
- 【AllJoyn专题】基于AllJoyn和Yeelink的传感器数据上传与指令下行的研究
- 使用Arduino+W5100+YEELINK搭建自己的智能控制系统
- 以太网W5500上传多路传感器数据到Yeelink
- Arduino Ethernet W5100扩展板的指示灯含义
- yeelink 批量上传数据
- 没有W5100我们也能做yeelink的室内温度监控-基于Arduino和LM35
- arduino与传感器
- 如何用 JavaScript 控制 Arduino?
- 如何用 JavaScript 控制 Arduino?
- 如何用seam实现文件上传
- 如何用FileItem来实现文件上传
- Failed to allocate memory: 8
- PHP代码审核
- mac 系统截图
- openGL在Windows 7(64位操作系统)下的配置小问题
- linux study
- 如何用arduino+ethernet shield(W5100)与yeelink结合5分钟实现传感器数据web上传
- 在动态库(dynamic libraries)和静态库(static libraries)使用模板(template)
- How To Customize The Tab Bar Using iOS 5 Appearance API
- jvm线程状态的流转
- 关于过去,我的2012
- Ingenuous Cubrency UVA 11137
- POJ 哥巴猜想
- Oracle Bigfile Tablespace大文件表空间(转)
- linux 查看端口号命令