前几天看到有同事用树莓派搞了一个温度采集的东东. 自己手痒也忍不住搞了一个, 不过思路稍有不同, 我用的是arduino,采集的数据是直接发送到自己的aliyun服务器上.
所需材料:
- arduino uno
- 面包板,杜邦线
- LM35D温度传感器
- 扩展网络模块
该传感器能够测量0-100°的温度
从0开始,每升高1度输出电压提高10mv(0.01v),
通过模拟口检测传感器的电压,就能计算出温度.
模拟口的数值从0~1024对应输入电压0~5v
所以输入电压的计算公式为: (5/1024)in,单位是v
换算成温度就是((5/1024)in)/0.01
c
int in = analogRead(A0); //读取A0口的电压值
float temp = ((5/1024)*in)/0.01 //计算温度
随后只要将采集的数据发送到服务器保留起来就大功告成了.
完整的代码(从ide的example中改改就行了):
#include <SPI.h>
#include <Ethernet.h>
#include <FloatToString.h>
// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(192.168.1.101);
EthernetClient client;
void setup() {
// start the Ethernet connection:
if (Ethernet.begin(mac) == 0) {
//Serial.println("Failed to configure Ethernet using DHCP");
// no point in carrying on, so do nothing forevermore:
for(;;)
;
}
// give the Ethernet shield a second to initialize:
delay(1000);
}
void loop()
{
int n = analogRead(A0); //读取A0口的电压值
float temp = ((5/1024)*in)/0.01 //计算温度
char buffer[25];
String tempStr = floatToString(buffer,temp,2); //arduino比较变态的的类型转换
if (client.connect(server, 8080)) {
client.println("GET /sendTempData.htm?key=securityKey&tempNum="+tempStr);
client.println();
}
delay(1000);
client.stop();
delay(1800000); //半小时采集一次
}
服务端的代码比较简单就不贴出来了. 原始数据是半小时采集一次,加工了一下按小时,按天聚合出最大值,最小值,平均值