一、相关介绍
DHT11介绍:
DHT11是一款比较便宜的温湿度传感器模块。读取数据只需要占用一个IO口。能够同时测量温度和相对湿度。 DHT11的数据手册可以看这里:http://wenku.baidu.com/view/1955cc70a417866fb84a8e7b.html 需要注意的是,文档中写明一句话:小数部分用于扩展,现只能读出0。所以小数部分目前永远是0!
树莓派IO口介绍
我使用的是B版树莓派,接口如下图。其中的NAME一列是树莓派实际的IO口功能。PIN#一列是后面要介绍的wiringpi和pi4j库文件编程使用的接口编号。


wiringpi介绍
wiringpi是通过C语言控制树莓派GPIO口的头文件。在C语言中包含这个头文件之后可以很简单的调用已经封装好的方法来控制树莓派GPIO口。程序需要先安装。 wiringpi官网:http://wiringpi.com/ wiringpi下载和安装:http://wiringpi.com/download-and-install/ wiringpi文档:http://wiringpi.com/reference/ 编译和运行: 写好C文件后,通过如下命令进行编译: 1 | gcc -Wall -o executefilename cfilename.c -lwiringPi |
gcc是编译器,-Wall是在编译时显示警告信息,-o executefilename cfilename.c是将cfilename.c文件编译成文件名为executefilename的可执行文件,-lwiringPi是将wiringPi头文件包含在可执行文件中。 编译完之后会生成文件名为executefilename的文件,使用root权限执行如下命令即可运行:
pi4j介绍 pi4j是基于wiringpi开发的通过java来控制树莓派GPIO口的库文件。在java程序中引入相关类就可以使用已经封装好的方法控制树莓派GPIO口。 pi4j官网:http://pi4j.com/ pi4j下载:http://pi4j.com/download.html pi4j安装:http://pi4j.com/install.html pi4j文档:http://pi4j.com/apidocs/index.html 编译和运行:
使用了pi4j后,编译.java文件和运行.class文件时,需要使用root权限。例如: 编译:
1 | sudo javac -classpath .:classes:/opt/pi4j/lib/ '*' YourJavaFile.java |
运行: 1 | sudo java -classpath .:classes:/opt/pi4j/lib/ '*' YourClassFile.class |
如果使用sudo编译和运行时提示找不到javac和java,这是由于root用户没有加载环境变量,所以找不到java的执行命令。可以使用如下命令切换到带有环境变量的root用户后,再执行编译和运行:
二、硬件连接 由于本人较懒,而且目前是新手状态使用ubuntu,不知道用什么软件来做图,所以用文字简单描述一下硬件的连接。 DHT11引脚有格子空的为正面,引脚朝下,从左数4个引脚分别为 DHT11引脚名称
| DHT11引脚功能
| 连接到树莓派的GPIO
| 1.VCC
| 正极,连接3.3V或5V
| 物理接口1,即3.3V
| 2.DATA
| 数据输入输出
| 物理接口7,即GPIO 7
| 3.NC
| 悬空(就是不连任何地方)
| 不连
| 4.GND
| 负极
| 物理接口 6,即GND
|
此外按照DHT11数据手册要求,我在DATA和VCC之间连接了一个4.7K欧姆的电阻,起到上拉作用。
三、软件编写 使用wiringpi编写C程序: 如下程序借鉴了网上一老外的程序,忘了原帖地址在哪。 07 | #define ATTEMPTS 5 //retry 5 times when no response |
08 | int dht11_val[5]={0,0,0,0,0}; |
11 | uint8_t lststate=HIGH; |
18 | pinMode(DHT11PIN,OUTPUT); |
19 | digitalWrite(DHT11PIN,LOW); |
21 | digitalWrite(DHT11PIN,HIGH); |
22 | delayMicroseconds(40); |
25 | pinMode(DHT11PIN,INPUT); |
26 | for (i=0;i<MAX_TIME;i++) |
29 | while (digitalRead(DHT11PIN)==lststate){ |
35 | lststate=digitalRead(DHT11PIN); |
47 | if ((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xFF))){ |
48 | printf ( "RH:%d,TEMP:%d\n" ,dht11_val[0],dht11_val[2]); |
56 | int attempts=ATTEMPTS; |
57 | if (wiringPiSetup()==-1) |
60 | int success = dht11_read_val(); |
上述程序保存为.c文件后编译成可执行文件,运行后会在屏幕打印温度和湿度。
程序中的数据接收处理部分细节如下: 1 | if ((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xFF))){ |
使用pi4j编写java程序: 在使用pi4j编写DHT11要求的时序时,始终收不到DHT11回应信号,个人感觉是java达不到DHT11要求的微秒级时序,所以java程序没有成功。如果有哪位大神成功用java写出DHT11程序,希望能赐教一下。
转自:http://my.oschina.net/fantasymaker/blog/275381 |