无名族 发表于 2015-3-15 20:50:15

树莓派2B实现温湿度监控(DHT22温湿度传感器)两种方式

前言:一时兴起,买了个树莓派2b,信心满满的准备好好研究一番,结果光安装系统就折腾了两天,本人虽然懂些PHP,但是都是在windows下操作,Linux接触很少,C更是一塌糊涂,最终一番折腾,也算是圆满实现,写个教程让大家少走弯路,网上基于树莓派2B的教程较少,很多操作按照教程来做根本无法实现,中间走了很多弯路,本教程适合新手,高手请略过。。。
硬件:树莓派2B DHT22温湿度传感器(买的集成好的模块,已有上拉电阻)
系统:Raspbian Debian Wheezy 2014-02-16
读取操作:基于wiringPi或BCM2835 C Library
接线:/DHT22共有三根引脚(有的是四根):
1–>3.3v 接左边第1个GPIO针脚
2–>GPIO 数据接口,可随意连接1个GPIO针脚(第7个针脚对应的是GPIO Pin #4)
3–>NC 不接(我的没这个引脚)
3–>GND 接地(第6个针脚)
声明:以下操作均在root权限下进行
一、首先说说基于wiringPi读取:
wiringPi操作相对简单,只要系统安装wiringPi:
git clone git://git.drogon.net/wiringPi
cd wiringPi
git pull origin
cd wiringPi
./build到这里wiringPi安装完毕,你可以输入gpio readall看下引脚的定义。
获取操作更简单,直接把代码编译执行就行了,我找了个dht11的读取代码,然后修改了下:
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define MAX_TIME 100
#define DHT11PIN 7 //读取数据引脚
#define ATTEMPTS 5               //retry 5 times when no response
int dht11_val={0,0,0,0,0};

int dht11_read_val(){
    uint8_t lststate=HIGH;         //last state
    uint8_t counter=0;
    uint8_t j=0,i;
    for(i=0;i<5;i++)
      dht11_val=0;         
    //host send start signal   
    pinMode(DHT11PIN,OUTPUT);      //set pin to output
    digitalWrite(DHT11PIN,LOW);    //set to low at least 18ms
    delay(18);
    digitalWrite(DHT11PIN,HIGH);   //set to high 20-40us
    delayMicroseconds(30);
   
    //start recieve dht response
    pinMode(DHT11PIN,INPUT);       //set pin to input
    for(i=0;i<MAX_TIME;i++)         
    {
      counter=0;
      while(digitalRead(DHT11PIN)==lststate){   //read pin state to see if dht responsed. if dht always high for 255 + 1 times, break this while circle
            counter++;
            delayMicroseconds(1);
            if(counter==255)
                break;
      }
      lststate=digitalRead(DHT11PIN);             //read current state and store as last state.
      if(counter==255)                            //if dht always high for 255 + 1 times, break this for circle
            break;
      // top 3 transistions are ignored, maybe aim to wait for dht finish response signal
      if((i>=4)&&(i%2==0)){
            dht11_val<<=1;                     //write 1 bit to 0 by moving left (auto add 0)
            if(counter>16)                        //long mean 1
                dht11_val|=1;                  //write 1 bit to 1
            j++;
      }
    }
    // verify checksum and print the verified data
    if((j>=40)&&(dht11_val==((dht11_val+dht11_val+dht11_val+dht11_val)& 0xFF))){
      float f, h;
          h = dht11_val * 256 + dht11_val;
          h /= 10;
          f = (dht11_val & 0x7F)* 256 + dht11_val;
      f /= 10.0;
      if (dht11_val & 0x80)f *= -1;
          printf("Temp =%.1f *C, Hum = %.1f \%\n", f, h);
      return 1;
    }
    else
      return 0;
}

int main(void){
    int attempts=ATTEMPTS;
    if(wiringPiSetup()==-1)
      exit(1);
    while(attempts){                        //you have 5 times to retry
      int success = dht11_read_val();   //get result including printing out
      if (success) {                      //if get result, quit program; if not, retry 5 times then quit
            break;
      }
      attempts--;
      delay(2500);
    }
    return 0;
}保存为test.c编译执行即可看到温度和湿度,很多教程也是到此结束,给个结果的截图,但对于新手来说,怎么编译是个问题,当然包括我在内,百度后知道是gcc -o 可怎么也编译不成功,后来细致的看了下gcc的命令,发现需要加-l参数来指定库名,这个对于老手来说肯定要笑了。
执行编译运行:
gcc -Wall -o test test.c -lwiringPi
./test如果不出意外,你就看到了执行结果:
二、再说说基于BCM2835 C Library读取:
这部分是折腾我的地方,本来先是尝试的这种方法,按照网上教程,一路下来,发现只要读取就没反应,什么结果都不出卡在那里,后来觉得是版本问题,改了下代码只执行gpio端口设置为OUT,执行后发现,根本就没变,因为2B是bcm2836的芯片,然后就是各种搜,QQ群求助也是让找2836的,可怎么也找不到,无奈去http://www.airspayce.com/mikem/bcm2835一看,最新版本为1.42,我下载的是1.36,会不会最新版本支持呢,重新下载编译,尝试读取,成功,下面是操作过程:
首先安装BCM2835 C Library:
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.42.tar.gz
tar xvzf bcm2835-1.42.tar.gz
cd bcm2835-1.42
./configure
make
make check
make install下载dht22读取程序编译读取:
cd /home/pi
git clone https://github.com/dohkoos/Raspberry-Pi-Code.git
cd Raspberry-Pi-Code/DHT22
make
./dht 22 4 #数据接口接在第7针脚,所以这里是4来个图:





wtchennewmyy 发表于 2015-3-20 00:38:18

mark 以后应该能用到

树老大 发表于 2015-3-15 22:05:15

这必须赞美啊。

gyt922 发表于 2015-3-17 17:06:55

谢谢分享!!!!!!

kidsuntown 发表于 2015-3-18 10:14:34

不错啊,一直没搞定

ZWeiandLen 发表于 2015-3-18 11:11:00

哦哦哦,好帖要顶,最喜欢这种头一回的帖子了

PiHackCode 发表于 2015-3-21 10:20:03

洒洒水水水水水水

smpli 发表于 2015-3-21 15:20:05

学习!!!!!!!

princezhou 发表于 2015-3-23 13:26:57

这是我需要的,感谢啊,搞起!

lulgjacky 发表于 2015-3-23 16:58:10

看看
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 树莓派2B实现温湿度监控(DHT22温湿度传感器)两种方式