Damn_intuition 发表于 2012-11-20 12:17:47

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

erjiang 发表于 2012-11-20 20:49:02

不错,支持!树莓派的爱好者越多越好

加菲猫 发表于 2012-12-5 21:14:08

学习了,谢谢楼主

sam70 发表于 2013-3-4 11:53:03

不错。谢谢了!!

cciew 发表于 2013-4-7 17:47:25

本帖最后由 cciew 于 2013-4-8 10:52 编辑

感谢楼主写的好教程!如果添加上注释就更好了!

aijam 发表于 2013-4-7 18:33:52

能不能把你用的元器件和代码分享一下,我也想弄这么一套。

gzrm 发表于 2013-6-30 16:37:12

你好!有个问题请求帮忙;我是使用树莓派连接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

问题不大 发表于 2013-8-16 14:49:27

谢谢楼主分享

atlas 发表于 2014-7-10 17:30:39

楼主,你好!

你这样的做法是通过树莓派通过串口实时接收Arduino的数据,我想请教下,树莓派通过蓝牙的串口将Arduino保存在SD卡上的文件拷贝过来的程序,是不是和你这个一样?

Damn_intuition 发表于 2014-7-14 19:06:42

atlas 发表于 2014-7-10 17:30 static/image/common/back.gif
楼主,你好!

你这样的做法是通过树莓派通过串口实时接收Arduino的数据,我想请教下,树莓派通过蓝牙的串 ...

理论上是一样的,文件流。

heian4125 发表于 2016-5-22 21:44:09

Damn_intuition 发表于 2014-7-14 19:06 static/image/common/back.gif
理论上是一样的,文件流。

楼主你好 那个树莓派的这个脚本 我在运行的时候提示 expr: 语法错误 是什么情况呢

pumpitup 发表于 2016-7-31 11:53:19

呃,树莓派不能直接从传感器读温度么?
页: [1]
查看完整版本: 5分钟通过树莓派上传Arduino串口的温度数据,无需编程。