极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 33133|回复: 11

5分钟通过树莓派上传Arduino串口的温度数据,无需编程。

[复制链接]
发表于 2012-11-20 12:17:47 | 显示全部楼层 |阅读模式
本帖最后由 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>

应要求上传温度采集部分代码
  1. #include <dht11.h>
  2. dht11 DHT11;
  3. #define DHT11PIN 2 //DHT11 PIN 3 连接UNO 3

  4. void setup()
  5. {  
  6.   Serial.begin(9600);
  7.   Serial.println("DHT11 TEST PROGRAM ");
  8.   Serial.print("LIBRARY VERSION: ");
  9.   Serial.println(DHT11LIB_VERSION);
  10.   Serial.println();
  11.   for (int p=4; p<=17; p++)    //通过循环的方式设置2-7号引脚为输出状态
  12.   {
  13.     pinMode(p,OUTPUT);
  14.     digitalWrite(p,1);
  15.     Serial.print("DigitalPin:");
  16.     Serial.print(p);
  17.     Serial.println(" OK");
  18.   }
  19.   Serial.println("");

  20. }

  21. int k = 0 ;
  22. int i =0 ;
  23. float hv[10];
  24. float tv[10];
  25. void loop()
  26. {
  27.   Serial.print("\n");
  28.   int chk = DHT11.read(DHT11PIN);
  29.   switch (chk)
  30.   {
  31.   case DHTLIB_OK:
  32.     hv [i] = (float) DHT11.humidity;
  33.     tv [i] = (float) DHT11.temperature-2;
  34.     i++;
  35.     if (i>9)i=0;
  36.     if (k>10){
  37.       Serial.print("<H:");
  38.       Serial.print((float)(hv[0]+hv[1]+hv[2]+hv[3]+hv[4]+hv[5]+hv[6]+hv[7]+hv[8]+hv[9])/10,2);
  39.       Serial.print(",");
  40.       Serial.print("T:");
  41.       Serial.print((float)(tv[0]+tv[1]+tv[2]+tv[3]+tv[4]+tv[5]+tv[6]+tv[7]+tv[8]+tv[9])/10,2);
  42.       Serial.print(">");

  43.      // displayint ((int)((hv[0]+hv[1]+hv[2]+hv[3]+hv[4]+hv[5]+hv[6]+hv[7]+hv[8]+hv[9])/10)*100+(int)((tv[0]+tv[1]+tv[2]+tv[3]+tv[4]+tv[5]+tv[6]+tv[7]+tv[8]+tv[9])/10));
  44.     }
  45.     else{
  46.       k++;
  47.     }
  48.     break;
  49.   case DHTLIB_ERROR_CHECKSUM:
  50.     Serial.println("Checksum error");
  51.     delay(200);
  52.     break;
  53.   case DHTLIB_ERROR_TIMEOUT:
  54.     Serial.println("Time out error");
  55.     delay(200);
  56.     break;
  57.   default:
  58.     Serial.println("Unknown error");
  59.     delay(200);
  60.     break;

  61.   }
  62.   //delay(200);
  63. }

  64. void displayint(int number){
  65.   int loopcount = 0;
  66.   while (loopcount < 100){
  67.    
  68.     displayLed('0'+(int)number/1000);
  69.     digitalWrite(17,0);
  70.     delay(4);
  71.     digitalWrite(17,1);

  72.     displayLed('0'+(int)number/100%10);
  73.     digitalWrite(16,0);
  74.     delay(4);
  75.     digitalWrite(16,1);

  76.     displayLed('0'+(int)number/10%10);
  77.     digitalWrite(15,0);
  78.     delay(4);
  79.     digitalWrite(15,1);

  80.     displayLed('0'+(int)number%10);
  81.     digitalWrite(14,0);
  82.     delay(4);
  83.     digitalWrite(14,1);
  84.    
  85.     loopcount++;
  86.   }
  87. }

  88. void displayNumber(int Number[8]){
  89.   int z = 0;
  90.   for(int x=4;x<=11;x++){
  91.     digitalWrite(x,Number[z]);
  92.     z++;
  93.     if(z >= 9)
  94.       z = 0;
  95.   }
  96. }

  97. void displayLed (char i){
  98.   /* 字符
  99.    int Number0[8]={
  100.    0,0,0,0,0,0,1,1              };
  101.    int Number1[8]={
  102.    1,0,0,1,1,1,1,1              };
  103.    int Number2[8]={
  104.    0,0,1,0,0,1,0,1              };
  105.    int Number3[8]={
  106.    0,0,0,0,1,1,0,1              };
  107.    int Number4[8]={
  108.    1,0,0,1,1,0,0,1              };
  109.    int Number5[8]={
  110.    0,1,0,0,1,0,0,1              };
  111.    int Number6[8]={
  112.    0,1,0,0,0,0,0,1              };
  113.    int Number7[8]={
  114.    0,0,0,1,1,1,1,1              };
  115.    int Number8[8]={
  116.    0,0,0,0,0,0,0,1              };
  117.    int Number9[8]={
  118.    0,0,0,0,1,0,0,1              };
  119.    int Numberx[8]={
  120.    1,1,1,1,1,1,1,0              };
  121.    */
  122.   int Number0[8]={
  123.     0,0,0,0,0,0,1,1                };
  124.   int Number1[8]={
  125.     1,1,1,1,0,0,1,1                };
  126.   int Number2[8]={
  127.     0,0,1,0,0,1,0,1                };
  128.   int Number3[8]={
  129.     0,1,1,0,0,0,0,1                };
  130.   int Number4[8]={
  131.     1,1,0,1,0,0,0,1                };
  132.   int Number5[8]={
  133.     0,1,0,0,1,0,0,1                };
  134.   int Number6[8]={
  135.     0,0,0,0,1,0,0,1                 };
  136.   int Number7[8]={
  137.     1,1,1,0,0,0,1,1                };
  138.   int Number8[8]={
  139.     0,0,0,0,0,0,0,1                };
  140.   int Number9[8]={
  141.     0,1,0,0,0,0,0,1                };
  142.   int Numberx[8]={
  143.     1,1,1,1,1,1,1,0                };

  144.   switch(i){
  145.   case '0':
  146.     displayNumber(Number0);
  147.     break;
  148.   case '1':
  149.     displayNumber(Number1);
  150.     break;
  151.   case '2':
  152.     displayNumber(Number2);
  153.     break;
  154.   case '3':
  155.     displayNumber(Number3);
  156.     break;
  157.   case '4':
  158.     displayNumber(Number4);
  159.     break;
  160.   case '5':
  161.     displayNumber(Number5);
  162.     break;
  163.   case '6':
  164.     displayNumber(Number6);
  165.     break;
  166.   case '7':
  167.     displayNumber(Number7);
  168.     break;
  169.   case '8':
  170.     displayNumber(Number8);
  171.     break;         
  172.   case '9':
  173.     displayNumber(Number9);
  174.     break;
  175.   case '.':
  176.     displayNumber(Numberx);
  177.     break;
  178.   }      

  179. }  

复制代码


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

评分

参与人数 1 +30 收起 理由
erjiang + 30 很给力!

查看全部评分

回复

使用道具 举报

发表于 2012-11-20 20:49:02 | 显示全部楼层
不错,支持!树莓派的爱好者越多越好
回复 支持 反对

使用道具 举报

发表于 2012-12-5 21:14:08 | 显示全部楼层
学习了,谢谢楼主
回复 支持 反对

使用道具 举报

发表于 2013-3-4 11:53:03 | 显示全部楼层
不错。谢谢了!!
回复 支持 反对

使用道具 举报

发表于 2013-4-7 17:47:25 | 显示全部楼层
本帖最后由 cciew 于 2013-4-8 10:52 编辑

感谢楼主写的好教程!如果添加上注释就更好了!
回复 支持 反对

使用道具 举报

发表于 2013-4-7 18:33:52 | 显示全部楼层
能不能把你用的元器件和代码分享一下,我也想弄这么一套。
回复 支持 反对

使用道具 举报

发表于 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 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

发表于 2014-7-10 17:30:39 | 显示全部楼层
楼主,你好!

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

使用道具 举报

 楼主| 发表于 2014-7-14 19:06:42 | 显示全部楼层
atlas 发表于 2014-7-10 17:30
楼主,你好!

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

理论上是一样的,文件流。
回复 支持 反对

使用道具 举报

发表于 2016-5-22 21:44:09 | 显示全部楼层
Damn_intuition 发表于 2014-7-14 19:06
理论上是一样的,文件流。

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

使用道具 举报

发表于 2016-7-31 11:53:19 | 显示全部楼层
呃,树莓派不能直接从传感器读温度么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 20:04 , Processed in 0.046660 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表