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; //last state |
17 |
//host send start signal |
18 |
pinMode(DHT11PIN,OUTPUT); //set pin to output |
19 |
digitalWrite(DHT11PIN,LOW); //set to low at least 18ms |
21 |
digitalWrite(DHT11PIN,HIGH); //set to high 20-40us |
22 |
delayMicroseconds(40); |
24 |
//start recieve dht response |
25 |
pinMode(DHT11PIN,INPUT); //set pin to input |
26 |
for(i=0;i<MAX_TIME;i++) |
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 |
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 |
38 |
// top 3 transistions are ignored, maybe aim to wait for dht finish response signal |
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 |
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]); |
56 |
int attempts=ATTEMPTS; |
57 |
if(wiringPiSetup()==-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 |
上述程序保存为.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 |
1 |
if((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xFF))){ |
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温湿度传感器
一.相关介绍 DHT11介绍: DHT11是一款比较便宜的温湿度传感器模块.读取数据只需要占用一个IO口.能够同时测量温度和相对湿度. DHT11的数据手册可以看这里:http://wenku.bai ...
- 树莓派使用DHT11温湿度传感器(C语言)
硬件: 树莓派 2.0 DHT模块 接树莓派5V GND GPIO1 功能:读取传感器数据并打印出来 // //mydht11.c // #include <wiringPi.h> #i ...
- 树莓派连接DHT11温湿度传感器(python)
介绍 DHT11作为一个廉价配件,同时包含了温度.湿度传感器,而且,编码使用也非常简单. 本文介绍如果在树莓派中使用 DHT11,代码是Python.如果有任何疑问,欢迎在下面留言. 接线 VCC接5 ...
- 在树莓派上读取DHT11温湿度传感器-python代码实现及常见问题(全面简单易懂)
最近由于自己的课题需要,想要用在树莓派上使用DHT11温湿度传感器来读取空气中温湿度,遇到了几个问题,解决之后也对之前的知识进行了回顾,总结,特整理如下,希望能给也在学习树莓派的小伙伴们带来一些帮助. ...
- DHT11温湿度传感器编程思路以及代码的实现(转载)
源自:https://blog.csdn.net/qq_34952376/article/details/81193938 在我们刚开始进入单片机的学习中,练习写传感器的时序是必不可少的,其实我比较推 ...
- STC15系列通用-STC15F2K60S2/STCW4K32S4读取DHT11温湿度传感器数据串口输出代码实例工程免费下载
//为了方便大家调试,另附程序工程共大家下载,下载地址:https://www.90pan.com/b1908750 //************************** //程序说明:stc ...
- Arduino和C51开发DHT11温湿度传感器
技术:51单片机.Arduino.DHT11.温湿度传感器.传感器 概述 学习单片机离不开对传感器的学习,本文主要介绍DHT11温湿度传感器的使用方法,同学也可以了解更多的传感器,这对你以后开发产 ...
- DHT11温湿度传感器模块使用方法和驱动代码实现
DHT11模块简介 DHT11是一款价格便宜,易于使用的温度湿度测量二合一传感器.它具有超小体积.极低功耗的特点.它使用单根总线与单片机进行双向的串行数据传输,信号传输距离可达20米以上.非常适用于对 ...
- 玩转X-CTR100 l STM32F4 l DHT11温湿度传感器
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] DHT11数字温湿度传感器是一款含有已校准数字信号输 ...
随机推荐
- 设计模式中类的关系之聚合关系(Aggregation)
聚合关系是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系,此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享.比如计算机与 ...
- sqrt函数实现(神奇的算法)
我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然 ...
- Tree UVA - 548 已知中序遍历和后序遍历,求这颗二叉树。
You are to determine the value of the leaf node in a given binary tree that is the terminal node of ...
- 集合映射中的映射包(使用xml文件)
如果持久类有List对象,我们可以通过列表或者bag元素在映射文件中映射. 这个包(bag)就像List一样,但它不需要索引元素. 在这里,我们使用论坛的场景: 论坛中一个问题有多个答案. 我们来看看 ...
- Eclipse 菜单
Eclipse 菜单 Eclipse 查看的菜单栏通常包含以下几个菜单: File 菜单 Edit 菜单 Navigate 菜单 Search 菜单 Project 菜单 Run 菜单 Window ...
- Python gevent学习笔记-2
在上一篇里面介绍了gevent的最主要的功能,先来来了解一下gevent里面一些更加高级的功能. 事件 事件是一种可以让greenlet进行异步通信的手段. ? 1 2 3 4 5 6 7 8 9 1 ...
- Golang中的正则表达式
声明:文章转自GoLove 用法: 单一: . 匹配任意一个字符,如果设置 s = true,则可以匹配换行符 [字符类] 匹配"字符类"中的一个字符,"字符类" ...
- FZU2030(括号匹配)
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110977#problem/E 题目大意:略 题目思路:数据范围很小,可以搜索, ...
- JAVA的Hashtable在遍历时的迭代器线程问题
这篇博客主要讲什么 Hashtable及其内部类的部分源码分析 Hashtable在遍历时的java.util.ConcurrentModificationException异常的来由和解决 单机在内 ...
- MongoDB实践-自定义ASP.NET Session Store
Session由来 由于HTTP协议是无状态的,客户端与服务器端进行“请求-响应”操作后,建立的连接就释放了,服务器端根本不知道刚才是哪个客户端访问的.但是有些场景是需要知道客户端的状态的,最典型的就 ...