5分钟通过树莓派上传Arduino串口的温度数据,无需编程。
本帖最后由 Damn_intuition 于 2013-4-24 00:31 编辑首先感谢erjiang,他的这篇文章(http://www.geek-workshop.com/thread-2341-1-1.html)帮助了我很多,看似简单但是非常实用的一片教程。
我说的这个串口数据的读取,主要是读取的 湿度数据和温度数据,这是我的 YEELINK 设备页面http://www.yeelink.net/devices/1209,
Arduino下的编程过程不再阐述,只要最后能够USB串口输出数据即可,比如我的数据输出格式如下:
H为湿度,T为温度
<H:23.80,T:21.70>
<H:23.60,T:21.60>
<H:23.60,T:21.70>
<H:23.70,T:21.80>
<H:23.70,T:21.80>
<H:23.60,T:21.70>
<H:23.60,T:21.70>
<H:23.70,T:21.80>
<H:23.70,T:21.80>
<H:23.60,T:21.70>
应要求上传温度采集部分代码
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 2 //DHT11 PIN 3 连接UNO 3
void setup()
{
Serial.begin(9600);
Serial.println("DHT11 TEST PROGRAM ");
Serial.print("LIBRARY VERSION: ");
Serial.println(DHT11LIB_VERSION);
Serial.println();
for (int p=4; p<=17; p++) //通过循环的方式设置2-7号引脚为输出状态
{
pinMode(p,OUTPUT);
digitalWrite(p,1);
Serial.print("DigitalPin:");
Serial.print(p);
Serial.println(" OK");
}
Serial.println("");
}
int k = 0 ;
int i =0 ;
float hv;
float tv;
void loop()
{
Serial.print("\n");
int chk = DHT11.read(DHT11PIN);
switch (chk)
{
case DHTLIB_OK:
hv = (float) DHT11.humidity;
tv = (float) DHT11.temperature-2;
i++;
if (i>9)i=0;
if (k>10){
Serial.print("<H:");
Serial.print((float)(hv+hv+hv+hv+hv+hv+hv+hv+hv+hv)/10,2);
Serial.print(",");
Serial.print("T:");
Serial.print((float)(tv+tv+tv+tv+tv+tv+tv+tv+tv+tv)/10,2);
Serial.print(">");
// displayint ((int)((hv+hv+hv+hv+hv+hv+hv+hv+hv+hv)/10)*100+(int)((tv+tv+tv+tv+tv+tv+tv+tv+tv+tv)/10));
}
else{
k++;
}
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
delay(200);
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
delay(200);
break;
default:
Serial.println("Unknown error");
delay(200);
break;
}
//delay(200);
}
void displayint(int number){
int loopcount = 0;
while (loopcount < 100){
displayLed('0'+(int)number/1000);
digitalWrite(17,0);
delay(4);
digitalWrite(17,1);
displayLed('0'+(int)number/100%10);
digitalWrite(16,0);
delay(4);
digitalWrite(16,1);
displayLed('0'+(int)number/10%10);
digitalWrite(15,0);
delay(4);
digitalWrite(15,1);
displayLed('0'+(int)number%10);
digitalWrite(14,0);
delay(4);
digitalWrite(14,1);
loopcount++;
}
}
void displayNumber(int Number){
int z = 0;
for(int x=4;x<=11;x++){
digitalWrite(x,Number);
z++;
if(z >= 9)
z = 0;
}
}
void displayLed (char i){
/* 字符
int Number0={
0,0,0,0,0,0,1,1 };
int Number1={
1,0,0,1,1,1,1,1 };
int Number2={
0,0,1,0,0,1,0,1 };
int Number3={
0,0,0,0,1,1,0,1 };
int Number4={
1,0,0,1,1,0,0,1 };
int Number5={
0,1,0,0,1,0,0,1 };
int Number6={
0,1,0,0,0,0,0,1 };
int Number7={
0,0,0,1,1,1,1,1 };
int Number8={
0,0,0,0,0,0,0,1 };
int Number9={
0,0,0,0,1,0,0,1 };
int Numberx={
1,1,1,1,1,1,1,0 };
*/
int Number0={
0,0,0,0,0,0,1,1 };
int Number1={
1,1,1,1,0,0,1,1 };
int Number2={
0,0,1,0,0,1,0,1 };
int Number3={
0,1,1,0,0,0,0,1 };
int Number4={
1,1,0,1,0,0,0,1 };
int Number5={
0,1,0,0,1,0,0,1 };
int Number6={
0,0,0,0,1,0,0,1 };
int Number7={
1,1,1,0,0,0,1,1 };
int Number8={
0,0,0,0,0,0,0,1 };
int Number9={
0,1,0,0,0,0,0,1 };
int Numberx={
1,1,1,1,1,1,1,0 };
switch(i){
case '0':
displayNumber(Number0);
break;
case '1':
displayNumber(Number1);
break;
case '2':
displayNumber(Number2);
break;
case '3':
displayNumber(Number3);
break;
case '4':
displayNumber(Number4);
break;
case '5':
displayNumber(Number5);
break;
case '6':
displayNumber(Number6);
break;
case '7':
displayNumber(Number7);
break;
case '8':
displayNumber(Number8);
break;
case '9':
displayNumber(Number9);
break;
case '.':
displayNumber(Numberx);
break;
}
}
Pi的下面操作过程如下:
编辑/etc/rc.local 文件:
sudo vi /etc/rc.local
在文件最后一行增加下面这一句(实现了后台读取串口数据到TR.log文件):
sudo cat /dev/ttyUSB0 > /home/pi/TR.log &
在/home/pi下准备脚本yeelink.sh, 内容为以下命令, 其中的ApiKey和URL请改为自己设备对应的信息.
KKKK=`tail /home/pi/TR.log -n 1`
KRH=`expr substr $KKKK 4 5`
KTM=`expr substr $KKKK 12 5`
printf $KRH
curl --request POST --data '{"value":'$KRH'}' --header "U-ApiKey:你的KEY" http://api.yeelink.net/v1.0/device/1209/sensor/1469/datapoints
sleep 5s
printf $KTM
curl --request POST --data '{"value":'$KTM'}' --header "U-ApiKey:你的KEY" http://api.yeelink.net/v1.0/device/1209/sensor/1467/datapoints
注:上面的命令中,1209和1467、1469分别是设备号和温湿度传感器号,U-ApiKey是yeelink账号的APIKEY,如果你使用的话,可以根据自己的情况进行修改
为脚本增加可执行权限
pi@raspberrypi ~ $ chmod +x yeelink.sh
将脚本加入cronjob
pi@raspberrypi ~ $ crontab -e
加入下面一行, 让脚本每分钟运行一次, 保存退出.
*/2 * * * * /home/pi/yeelink.sh 不错,支持!树莓派的爱好者越多越好 学习了,谢谢楼主 不错。谢谢了!! 本帖最后由 cciew 于 2013-4-8 10:52 编辑
感谢楼主写的好教程!如果添加上注释就更好了! 能不能把你用的元器件和代码分享一下,我也想弄这么一套。 你好!有个问题请求帮忙;我是使用树莓派连接DHT11,参考了http://hugozhu.myalert.info/2013/03/17/03-17-interfacing-temperature-and-humidity-sensor-with-raspberry-pi.html的代码,可以读取了湿度和温度,但无法上传YEELINK(因为没有相关的程序代码),是否要写入一个TXT文件后才能上传?如何编写API(在YEELINK的帮助看不是很明白),也咨询和发请教帖无果,拜读过你的【5分钟通过树莓派上传Arduino串口的温度数据,无需编程】想请教你如何编程上传YEELINK 谢谢楼主分享 楼主,你好!
你这样的做法是通过树莓派通过串口实时接收Arduino的数据,我想请教下,树莓派通过蓝牙的串口将Arduino保存在SD卡上的文件拷贝过来的程序,是不是和你这个一样? atlas 发表于 2014-7-10 17:30 static/image/common/back.gif
楼主,你好!
你这样的做法是通过树莓派通过串口实时接收Arduino的数据,我想请教下,树莓派通过蓝牙的串 ...
理论上是一样的,文件流。 Damn_intuition 发表于 2014-7-14 19:06 static/image/common/back.gif
理论上是一样的,文件流。
楼主你好 那个树莓派的这个脚本 我在运行的时候提示 expr: 语法错误 是什么情况呢 呃,树莓派不能直接从传感器读温度么?
页:
[1]