查看: 2577|回复: 2
收起左侧

请教利用树莓派连接DHT11上传YEELINK的方法

2013-6-26 23:53:01 | 显示全部楼层 |阅读模式
我是个新手,已按网上的教程,将DTH11连接树莓派并显示湿度和温度数据了,现在不知该怎样连接yeelink的传感器,之前按教程连接摄像头成功,但网上找不到如何连接YEELINK的程序。
我是参考这教程http://hugozhu.myalert.info/2013 ... h-raspberry-pi.html操作的,但教程是教连接coms.com;请热心人指导
回复

使用道具 举报

2015-1-25 20:07:47 | 显示全部楼层
代码写的不好,请见谅
DHT11引脚连接:GND---GND   VCC---3.3V   DATA---GPIO1
注:需要安装wiringpi和smbus
在树莓派的/home/pi里:
新建文本yeelink.py
内容:
  1. #!/usr/bin/python
  2. import os  
  3. import commands
  4. import requests
  5. import json
  6. from time import strftime, sleep
  7. #apikey换成你自己的,设备ID也是
  8. headers = {"U-ApiKey": "ffd6293ec3a7b1025ae9b3a262xxxxxx"}
  9. DEVICE_ID = "17618"
  10. RH_ID = "30658"
  11. TMP_ID = "30651"

  12. def upload_temp(sensor_type, temp):

  13.     if sensor_type == "RH":
  14.         sensor_id = RH_ID
  15.         print "RH:", temp
  16.         url = r"http://api.yeelink.net/v1.1/device/%s/sensor/%s/datapoints" % (DEVICE_ID, sensor_id)
  17.         #print url
  18.         data = {"timestamp": strftime("%Y-%m-%dT%H:%M:%S"), "value": temp}
  19.         #print data
  20.         r = requests.post(url, data=json.dumps(data), headers=headers)
  21.     else:
  22.         sensor_id = TMP_ID
  23.         print "TEMP:", temp
  24.         url = r"http://api.yeelink.net/v1.1/device/%s/sensor/%s/datapoints" % (DEVICE_ID, sensor_id)
  25.         #print url
  26.         data = {"timestamp": strftime("%Y-%m-%dT%H:%M:%S"), "value": temp}
  27.         #print data
  28.         r = requests.post(url, data=json.dumps(data), headers=headers)
  29. while True:
  30.     p = os.popen('sudo ./sensor1')
  31.     rh = p.readline();
  32.     q = os.popen('sudo ./sensor')
  33.     tmp = q.readline();
  34.     upload_temp("RH", rh)
  35.     upload_temp("TEMP",tmp)
  36.     sleep(20)
复制代码
新建文本sensor.c
内容:
  1. #include <wiringPi.h>  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. #include <stdint.h>  
  5. #define MAX_TIME 85  
  6. #define GpioPort 1
  7.   
  8. //存储读取的数据  
  9. int dht11_val[5] = { 0, 0, 0, 0, 0 };  
  10. //此函数读取温度值  
  11. int dht11_read_val(){  
  12.     uint8_t lststate = HIGH;//HIGH在wiringPi.h定义为1  
  13.     uint8_t counter = 0;//计数器  
  14.     uint8_t j = 0, i;  
  15.     //初始化数组为0  
  16.     for (i = 0; i < 5; i++)  
  17.         dht11_val[i] = 0;  
  18.     //发送开始信号  
  19.     pinMode(GpioPort, OUTPUT);//设置GPIO为输出  
  20.     digitalWrite(GpioPort, LOW);//保持低电平至少18ms  
  21.     delay(18);  
  22.     digitalWrite(GpioPort, HIGH);//保持高电平20-40us  
  23.     delayMicroseconds(40);  
  24.     //开始接受dht响应信号  
  25.     pinMode(GpioPort, INPUT);//设置GPIO为输入  
  26.     //开始等待温度传感器回应(根据数据手册温度传感器回应时会拉低数据线)  
  27.     for (i = 0; i < MAX_TIME; i++)  
  28.     {  
  29.         counter = 0;  
  30.         while (digitalRead(GpioPort) == lststate){//如果此时的电平和当前电平相等说明电平没有发生变化,所以继续等下一次循环  
  31.             counter++;  
  32.             delayMicroseconds(1);  
  33.             if (counter == 255)//如果在循环了255+1次之后温度传感器还未变换数据线则退出此次循环  
  34.                 break;  
  35.         }  
  36.         lststate = digitalRead(GpioPort);//读取数据线最新的状态值  
  37.         if (counter == 255)//如果在循环了255+1次之后温度传感器还未变换数据线则退出此次循环  
  38.             break;  
  39.         //前三次被忽略可能是在等温度传感器响应(这玩意不是数据手册上说的反应那么快的....)  
  40.         if ((i >= 4) && (i % 2 == 0)){//对2取余是因为偶数电平是用来传输数据的(从数据手册可以看出)  
  41.             dht11_val[j / 8] <<= 1;//左移一位(此时最后一位为0)  
  42.             if (counter > 16) //此处时间很长代表此处为1  
  43.                 dht11_val[j / 8] |= 1; //将数据1写入  
  44.             j++;  
  45.         }  
  46.     }  
  47.     /*
  48.     开始处理数据

  49.     1.因为一次完整的数据输出为40位,所以j应大于40
  50.     2.dht11_val[4]为校验和,此处判断校验和是否正确
  51.     3.只打印dht11_val[0], dht11_val[2]是因为dht11_val[1], dht11_val[3]?切∈糠郑菔菔植嵝∈贾瘴?
  52.     */  
  53.     if ((j >= 40) && (dht11_val[4] == ((dht11_val[0] + dht11_val[1] + dht11_val[2] + dht11_val[3]) & 0xFF))){  
  54.         //printf("RH:%d,TEMP:%d\n", dht11_val[0], dht11_val[2]);
  55.         printf("%d",dht11_val[2]);
  56.         return 1;  
  57.     }  
  58.     else  
  59.         return 0;  
  60. }  
  61. int main(void){  
  62.     //重复5次进行尝试  
  63.     int attempts = 5;  
  64.     //初始化GPIO  
  65.     if (wiringPiSetup() == -1)  
  66.         exit(1);  
  67.     //进行5次尝试  
  68.     while (attempts){  
  69.         //获取温度值  
  70.         int success = dht11_read_val();  
  71.         //获取成功后退出  
  72.         if (success)  
  73.             break;  
  74.         attempts--;  
  75.         delay(2500);  
  76.     }  
  77.     return 0;  
  78. }  
复制代码
新建文本sensor1.c
内容:
  1. #include <wiringPi.h>  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. #include <stdint.h>  
  5. #define MAX_TIME 85  
  6. #define GpioPort 1
  7.   
  8. //存储读取的数据  
  9. int dht11_val[5] = { 0, 0, 0, 0, 0 };  
  10. //此函数读取温度值  
  11. int dht11_read_val(){  
  12.     uint8_t lststate = HIGH;//HIGH在wiringPi.h定义为1  
  13.     uint8_t counter = 0;//计数器  
  14.     uint8_t j = 0, i;  
  15.     //初始化数组为0  
  16.     for (i = 0; i < 5; i++)  
  17.         dht11_val[i] = 0;  
  18.     //发送开始信号  
  19.     pinMode(GpioPort, OUTPUT);//设置GPIO为输出  
  20.     digitalWrite(GpioPort, LOW);//保持低电平至少18ms  
  21.     delay(18);  
  22.     digitalWrite(GpioPort, HIGH);//保持高电平20-40us  
  23.     delayMicroseconds(40);  
  24.     //开始接受dht响应信号  
  25.     pinMode(GpioPort, INPUT);//设置GPIO为输入  
  26.     //开始等待温度传感器回应(根据数据手册温度传感器回应时会拉低数据线)  
  27.     for (i = 0; i < MAX_TIME; i++)  
  28.     {  
  29.         counter = 0;  
  30.         while (digitalRead(GpioPort) == lststate){//如果此时的电平和当前电平相等说明电平没有发生变化,所以继续等下一次循环  
  31.             counter++;  
  32.             delayMicroseconds(1);  
  33.             if (counter == 255)//如果在循环了255+1次之后温度传感器还未变换数据线则退出此次循环  
  34.                 break;  
  35.         }  
  36.         lststate = digitalRead(GpioPort);//读取数据线最新的状态值  
  37.         if (counter == 255)//如果在循环了255+1次之后温度传感器还未变换数据线则退出此次循环  
  38.             break;  
  39.         //前三次被忽略可能是在等温度传感器响应(这玩意不是数据手册上说的反应那么快的....)  
  40.         if ((i >= 4) && (i % 2 == 0)){//对2取余是因为偶数电平是用来传输数据的(从数据手册可以看出)  
  41.             dht11_val[j / 8] <<= 1;//左移一位(此时最后一位为0)  
  42.             if (counter > 16) //此处时间很长代表此处为1  
  43.                 dht11_val[j / 8] |= 1; //将数据1写入  
  44.             j++;  
  45.         }  
  46.     }  
  47.     /*
  48.     开始处理数据

  49.     1.因为一次完整的数据输出为40位,所以j应大于40
  50.     2.dht11_val[4]为校验和,此处判断校验和是否正确
  51.     3.只打印dht11_val[0], dht11_val[2]是因为dht11_val[1], dht11_val[3]?切∈糠郑菔菔植嵝∈贾瘴?
  52.     */  
  53.     if ((j >= 40) && (dht11_val[4] == ((dht11_val[0] + dht11_val[1] + dht11_val[2] + dht11_val[3]) & 0xFF))){  
  54.         //printf("RH:%d,TEMP:%d\n", dht11_val[0], dht11_val[2]);
  55.         printf("%d",dht11_val[0]);
  56.         return 1;  
  57.     }  
  58.     else  
  59.         return 0;  
  60. }  
  61. int main(void){  
  62.     //重复5次进行尝试  
  63.     int attempts = 5;  
  64.     //初始化GPIO  
  65.     if (wiringPiSetup() == -1)  
  66.         exit(1);  
  67.     //进行5次尝试  
  68.     while (attempts){  
  69.         //获取温度值  
  70.         int success = dht11_read_val();  
  71.         //获取成功后退出  
  72.         if (success)  
  73.             break;  
  74.         attempts--;  
  75.         delay(2500);  
  76.     }  
  77.     return 0;  
  78. }  
复制代码
执行命令:

sudo gcc -o sensor sensor.c -L/usr/local/lib -lwiringPi
sudo gcc -o sensor1 sensor1.c -L/usr/local/lib -lwiringPi

sudo python yeelink.py
即可
回复 支持 反对

使用道具 举报

2015-1-25 20:08:27 | 显示全部楼层
本帖最后由 钱学森℡ 于 2015-1-30 17:27 编辑

不懂再问我。。。。。
回复 支持 反对

使用道具 举报

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

本版积分规则

热点推荐

关注我们,了解更多

官方微信

服务时间:10:00-16:00

13714503811

公司地址:深圳市龙岗区南湾街道东门头路8号

Copyright © 2012-2020 Powered by 树莓派论坛 2019.4  粤ICP备15075382号-1
快速回复 返回列表 返回顶部