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用户后,再执行编译和运行:

1 sudo su - 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程序:

如下程序借鉴了网上一老外的程序,忘了原帖地址在哪。

01 #include <wiringPi.h>
02 #include <stdio.h>
03 #include <stdlib.h>
04 #include <stdint.h>
05 #define MAX_TIME 85
06 #define DHT11PIN 7
07 #define ATTEMPTS 5                 //retry 5 times when no response
08 int dht11_val[5]={0,0,0,0,0};
09   
10 int dht11_read_val(){
11     uint8_t lststate=HIGH;         //last state
12     uint8_t counter=0;
13     uint8_t j=0,i;
14     for(i=0;i<5;i++)
15         dht11_val[i]=0;
16          
17     //host send start signal    
18     pinMode(DHT11PIN,OUTPUT);      //set pin to output 
19     digitalWrite(DHT11PIN,LOW);    //set to low at least 18ms 
20     delay(18);
21     digitalWrite(DHT11PIN,HIGH);   //set to high 20-40us
22     delayMicroseconds(40);
23      
24     //start recieve dht response
25     pinMode(DHT11PIN,INPUT);       //set pin to input
26     for(i=0;i<MAX_TIME;i++)         
27     {
28         counter=0;
29         while(digitalRead(DHT11PIN)==lststate){     //read pin state to see if dht responsed. if dht always high for 255 + 1 times, break this while circle
30             counter++;
31             delayMicroseconds(1);
32             if(counter==255)
33                 break;
34         }
35         lststate=digitalRead(DHT11PIN);             //read current state and store as last state. 
36         if(counter==255)                            //if dht always high for 255 + 1 times, break this for circle
37             break;
38         // top 3 transistions are ignored, maybe aim to wait for dht finish response signal
39         if((i>=4)&&(i%2==0)){
40             dht11_val[j/8]<<=1;                     //write 1 bit to 0 by moving left (auto add 0)
41             if(counter>16)                          //long mean 1
42                 dht11_val[j/8]|=1;                  //write 1 bit to 1 
43             j++;
44         }
45     }
46     // verify checksum and print the verified data
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]);
49         return 1;
50     }
51     else
52         return 0;
53 }
54   
55 int main(void){
56     int attempts=ATTEMPTS;
57     if(wiringPiSetup()==-1)
58         exit(1);
59     while(attempts){                        //you have 5 times to retry
60         int success = dht11_read_val();     //get result including printing out
61         if (success) {                      //if get result, quit program; if not, retry 5 times then quit
62             break;
63         }
64         attempts--;
65         delay(2500);
66     }
67     return 0;
68 }

上述程序保存为.c文件后编译成可执行文件,运行后会在屏幕打印温度和湿度。

程序中的数据接收处理部分细节如下:

1         if((i>=4)&&(i%2==0)){         //前3次分别是:1低电平,2高电平(即响应信号),3低电平(即数据第一个低电平)
2                                       //i%2==0 是因为每次都是循环读取低电平和高电平,每次要循环2次才读出一个bit处理
3             dht11_val[j/8]<<=1;       //读到后,j/8可以限制一个数的8个位,左移1位自动补0,相当于读出0
4             if(counter>16)            //counter计数如果超过16,则高电平长,应读1.
5                 dht11_val[j/8]|=1;    //故再将上面数与1位或,使最后一位变成1 
6             j++;                      //j++8个换成下一个数据
7         }
1 if((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xFF))){
2  
3 //这其中(dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xFF)是将5个数相加,和1与。
4 //目的是防止读出数据都为0,和为0,0和1与后得0,所以if判断条件不成立,返回读取失败码。
5 //如果读出数据是不为0的正常数据,和1与后还得原数。

使用pi4j编写java程序:

在使用pi4j编写DHT11要求的时序时,始终收不到DHT11回应信号,个人感觉是java达不到DHT11要求的微秒级时序,所以java程序没有成功。如果有哪位大神成功用java写出DHT11程序,希望能赐教一下。

转自:http://my.oschina.net/fantasymaker/blog/275381

树莓派使用DHT11温湿度传感器(C语言程序)的更多相关文章

  1. 树莓派使用DHT11温湿度传感器

    一.相关介绍 DHT11介绍: DHT11是一款比较便宜的温湿度传感器模块.读取数据只需要占用一个IO口.能够同时测量温度和相对湿度. DHT11的数据手册可以看这里:http://wenku.bai ...

  2. 树莓派使用DHT11温湿度传感器(C语言)

    硬件: 树莓派 2.0 DHT模块  接树莓派5V GND GPIO1 功能:读取传感器数据并打印出来 // //mydht11.c // #include <wiringPi.h> #i ...

  3. 树莓派连接DHT11温湿度传感器(python)

    介绍 DHT11作为一个廉价配件,同时包含了温度.湿度传感器,而且,编码使用也非常简单. 本文介绍如果在树莓派中使用 DHT11,代码是Python.如果有任何疑问,欢迎在下面留言. 接线 VCC接5 ...

  4. 在树莓派上读取DHT11温湿度传感器-python代码实现及常见问题(全面简单易懂)

    最近由于自己的课题需要,想要用在树莓派上使用DHT11温湿度传感器来读取空气中温湿度,遇到了几个问题,解决之后也对之前的知识进行了回顾,总结,特整理如下,希望能给也在学习树莓派的小伙伴们带来一些帮助. ...

  5. DHT11温湿度传感器编程思路以及代码的实现(转载)

    源自:https://blog.csdn.net/qq_34952376/article/details/81193938 在我们刚开始进入单片机的学习中,练习写传感器的时序是必不可少的,其实我比较推 ...

  6. STC15系列通用-STC15F2K60S2/STCW4K32S4读取DHT11温湿度传感器数据串口输出代码实例工程免费下载

    //为了方便大家调试,另附程序工程共大家下载,下载地址:https://www.90pan.com/b1908750 ​ //************************** //程序说明:stc ...

  7. Arduino和C51开发DHT11温湿度传感器

    技术:51单片机.Arduino.DHT11.温湿度传感器.传感器   概述 学习单片机离不开对传感器的学习,本文主要介绍DHT11温湿度传感器的使用方法,同学也可以了解更多的传感器,这对你以后开发产 ...

  8. DHT11温湿度传感器模块使用方法和驱动代码实现

    DHT11模块简介 DHT11是一款价格便宜,易于使用的温度湿度测量二合一传感器.它具有超小体积.极低功耗的特点.它使用单根总线与单片机进行双向的串行数据传输,信号传输距离可达20米以上.非常适用于对 ...

  9. 玩转X-CTR100 l STM32F4 l DHT11温湿度传感器

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] DHT11数字温湿度传感器是一款含有已校准数字信号输 ...

随机推荐

  1. libubox组件(2)——blob/blobmsg (转载 https://segmentfault.com/a/1190000002391970)

    一:blob相关接口 1.数据结构 1: struct blob_attr { 2: uint32_t id_len; /** 高1位为extend标志,高7位存储id, 3: * 低24位存储dat ...

  2. Yii简单使用阿里云短信教程!

    首先我们下载官方完整包的SDK官方标明了啊,PHP版本一定要不低于5.5下载后目录如下: 我们只需要将目录里的api_sdk复制出来到Yii项目的根目录的common模块下面的extensions文件 ...

  3. 【转】如何彻底删除SVN中的文件和文件夹(附恢复方法)

    这里假设SVN项目的目录为 /data/svn/project,我们想排除trunk/test.exe文件和trunk/notallowed/目录,操作步骤如下及执行的svn命令(在svn安装目录的b ...

  4. Python 之 ImportError: No module named ***

    假设想使用非当前模块中的代码,须要使用Import.这个大家都知道. 假设你要使用的模块(py文件)和当前模块在同一文件夹.仅仅要import对应的文件名称就好,比方在a.py中使用b.py: imp ...

  5. unity 多选枚举

    首先是自定义 using UnityEngine; using System.Collections; using UnityEditor; public class EnumFlagsAttribu ...

  6. knockout Ajax异步无刷新分页 Demo +mvc+bootstrap

    最近工作中web客户端需要用到knockout,在此记录下一些Demo,以后用到的时候查找起来方便.也希望给新入门的knockout使用者一点经验.knockout官方文档.这儿是一个使用knocko ...

  7. 可以将化学结构NMR图谱这样导入Word

    在化学各个领域中,大家常常会用到ChemDraw化学绘图软件来绘制各种图形,ChemDraw因其出色的功能在全球范围内深受欢迎,但是一些用户朋友对于一些功能还不是很了解,需要通过一些教程来了解如何操作 ...

  8. html中div获取焦点,去掉input div等获取焦点时候的边框

    经测试只有在IE chrome才会在获取焦点时有边框 使用CSS div{ outline:none; } DIV焦点事件详解 --[focus和tabIndex]​ 摘自:http://my.osc ...

  9. thinkPHP3.2.2中支持的URL的四种模式

  10. 提高打开Android本地文档的速度

    非常多Android开发人员在參考Android官方API时,都有一个令人头疼的问题:打开一个index.html平均都须要几分钟甚至更长.尤其是在打开API 8以上的版本号的时候.难道是网速不够好? ...