本帖最后由 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[10];
- float tv[10];
- void loop()
- {
- Serial.print("\n");
- int chk = DHT11.read(DHT11PIN);
- switch (chk)
- {
- case DHTLIB_OK:
- hv [i] = (float) DHT11.humidity;
- tv [i] = (float) DHT11.temperature-2;
- i++;
- if (i>9)i=0;
- if (k>10){
- Serial.print("<H:");
- 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);
- Serial.print(",");
- Serial.print("T:");
- 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);
- Serial.print(">");
- // 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));
- }
- 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[8]){
- int z = 0;
- for(int x=4;x<=11;x++){
- digitalWrite(x,Number[z]);
- z++;
- if(z >= 9)
- z = 0;
- }
- }
- void displayLed (char i){
- /* 字符
- int Number0[8]={
- 0,0,0,0,0,0,1,1 };
- int Number1[8]={
- 1,0,0,1,1,1,1,1 };
- int Number2[8]={
- 0,0,1,0,0,1,0,1 };
- int Number3[8]={
- 0,0,0,0,1,1,0,1 };
- int Number4[8]={
- 1,0,0,1,1,0,0,1 };
- int Number5[8]={
- 0,1,0,0,1,0,0,1 };
- int Number6[8]={
- 0,1,0,0,0,0,0,1 };
- int Number7[8]={
- 0,0,0,1,1,1,1,1 };
- int Number8[8]={
- 0,0,0,0,0,0,0,1 };
- int Number9[8]={
- 0,0,0,0,1,0,0,1 };
- int Numberx[8]={
- 1,1,1,1,1,1,1,0 };
- */
- int Number0[8]={
- 0,0,0,0,0,0,1,1 };
- int Number1[8]={
- 1,1,1,1,0,0,1,1 };
- int Number2[8]={
- 0,0,1,0,0,1,0,1 };
- int Number3[8]={
- 0,1,1,0,0,0,0,1 };
- int Number4[8]={
- 1,1,0,1,0,0,0,1 };
- int Number5[8]={
- 0,1,0,0,1,0,0,1 };
- int Number6[8]={
- 0,0,0,0,1,0,0,1 };
- int Number7[8]={
- 1,1,1,0,0,0,1,1 };
- int Number8[8]={
- 0,0,0,0,0,0,0,1 };
- int Number9[8]={
- 0,1,0,0,0,0,0,1 };
- int Numberx[8]={
- 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 文件:
在文件最后一行增加下面这一句(实现了后台读取串口数据到TR.log文件): sudo cat /dev/ttyUSB0 > /home/pi/TR.log &
在/home/pi下准备脚本yeelink.sh, 内容为以下命令, 其中的ApiKey和URL请改为自己设备对应的信息.
注:上面的命令中,1209和1467、1469分别是设备号和温湿度传感器号,U-ApiKey是yeelink账号的APIKEY,如果你使用的话,可以根据自己的情况进行修改
为脚本增加可执行权限 pi@raspberrypi ~ $ chmod +x yeelink.sh
将脚本加入cronjob pi@raspberrypi ~ $ crontab -e
加入下面一行, 让脚本每分钟运行一次, 保存退出. */2 * * * * /home/pi/yeelink.sh |