树莓派使用DHT11温湿度传感器
一、相关介绍
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文件后,通过如下命令进行编译:
gcc -Wall -o executefilename cfilename.c -lwiringPi
gcc是编译器,-Wall是在编译时显示警告信息,-o executefilename cfilename.c是将cfilename.c文件编译成文件名为executefilename的可执行文件,-lwiringPi是将wiringPi头文件包含在可执行文件中。
编译完之后会生成文件名为executefilename的文件,使用root权限执行如下命令即可运行:
sudo ./executefilename
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权限。例如:
编译:
sudo javac -classpath .:classes:/opt/pi4j/lib/'*' YourJavaFile.java
运行:
sudo java -classpath .:classes:/opt/pi4j/lib/'*' YourClassFile.class
如果使用sudo编译和运行时提示找不到javac和java,这是由于root用户没有加载环境变量,所以找不到java的执行命令。可以使用如下命令切换到带有环境变量的root用户后,再执行编译和运行:
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程序:
如下程序借鉴了网上一老外的程序,忘了原帖地址在哪。
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define MAX_TIME 85
#define DHT11PIN 7
#define ATTEMPTS 5 //retry 5 times when no response
int dht11_val[5]={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[i]=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(40);
//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[j/8]<<=1; //write 1 bit to 0 by moving left (auto add 0)
if(counter>16) //long mean 1
dht11_val[j/8]|=1; //write 1 bit to 1
j++;
}
}
// verify checksum and print the verified data
if((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xFF))){
printf("RH:%d,TEMP:%d\n",dht11_val[0],dht11_val[2]);
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;
}
上述程序保存为.c文件后编译成可执行文件,运行后会在屏幕打印温度和湿度。
程序中的数据接收处理部分细节如下:
if((i>=4)&&(i%2==0)){ //前3次分别是:1低电平,2高电平(即响应信号),3低电平(即数据第一个低电平)
//i%2==0 是因为每次都是循环读取低电平和高电平,每次要循环2次才读出一个bit处理
dht11_val[j/8]<<=1; //读到后,j/8可以限制一个数的8个位,左移1位自动补0,相当于读出0
if(counter>16) //counter计数如果超过16,则高电平长,应读1.
dht11_val[j/8]|=1; //故再将上面数与1位或,使最后一位变成1
j++; //j++8个换成下一个数据
}
if((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xFF))){
//这其中(dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xFF)是将5个数相加,和1与。
//目的是防止读出数据都为0,和为0,0和1与后得0,所以if判断条件不成立,返回读取失败码。
//如果读出数据是不为0的正常数据,和1与后还得原数。
使用pi4j编写java程序:
在使用pi4j编写DHT11要求的时序时,始终收不到DHT11回应信号,个人感觉是java达不到DHT11要求的微秒级时序,所以java程序没有成功。如果有哪位大神成功用java写出DHT11程序,希望能赐教一下。
转载:http://my.oschina.net/fantasymaker/blog/275381
树莓派使用DHT11温湿度传感器的更多相关文章
- 树莓派连接DHT11温湿度传感器(python)
介绍 DHT11作为一个廉价配件,同时包含了温度.湿度传感器,而且,编码使用也非常简单. 本文介绍如果在树莓派中使用 DHT11,代码是Python.如果有任何疑问,欢迎在下面留言. 接线 VCC接5 ...
- 树莓派使用DHT11温湿度传感器(C语言程序)
pi4j是基于wiringpi开发的通过java来控制树莓派GPIO口的库文件.在java程序中引入相关类就可以使用已经封装好的方法控制树莓派GPIO口. pi4j官网:http://pi4j.com ...
- 树莓派使用DHT11温湿度传感器(C语言)
硬件: 树莓派 2.0 DHT模块 接树莓派5V GND GPIO1 功能:读取传感器数据并打印出来 // //mydht11.c // #include <wiringPi.h> #i ...
- 在树莓派上读取DHT11温湿度传感器-python代码实现及常见问题(全面简单易懂)
最近由于自己的课题需要,想要用在树莓派上使用DHT11温湿度传感器来读取空气中温湿度,遇到了几个问题,解决之后也对之前的知识进行了回顾,总结,特整理如下,希望能给也在学习树莓派的小伙伴们带来一些帮助. ...
- Arduino和C51开发DHT11温湿度传感器
技术:51单片机.Arduino.DHT11.温湿度传感器.传感器 概述 学习单片机离不开对传感器的学习,本文主要介绍DHT11温湿度传感器的使用方法,同学也可以了解更多的传感器,这对你以后开发产 ...
- DHT11温湿度传感器编程思路以及代码的实现(转载)
源自:https://blog.csdn.net/qq_34952376/article/details/81193938 在我们刚开始进入单片机的学习中,练习写传感器的时序是必不可少的,其实我比较推 ...
- STC15系列通用-STC15F2K60S2/STCW4K32S4读取DHT11温湿度传感器数据串口输出代码实例工程免费下载
//为了方便大家调试,另附程序工程共大家下载,下载地址:https://www.90pan.com/b1908750 //************************** //程序说明:stc ...
- 玩转X-CTR100 l STM32F4 l DHT11温湿度传感器
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] DHT11数字温湿度传感器是一款含有已校准数字信号输 ...
- DHT11温湿度传感器模块使用方法和驱动代码实现
DHT11模块简介 DHT11是一款价格便宜,易于使用的温度湿度测量二合一传感器.它具有超小体积.极低功耗的特点.它使用单根总线与单片机进行双向的串行数据传输,信号传输距离可达20米以上.非常适用于对 ...
随机推荐
- Apache Mahout:适合所有人的可扩展机器学习框架
http://www.ibm.com/developerworks/cn/java/j-mahout-scaling/ 在软件的世界中,两年就像是无比漫长的时光.在过去两年中,我们看到了社交媒体的风生 ...
- Spring(十三):使用工厂方法来配置Bean的两种方式(静态工厂方法&实例工厂方法)
通过调用静态工厂方法创建Bean 1)调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当客户端需要对象时,只需要简单地调用静态方法,而不需要关心创建对象的具体细节. 2)要声明通过静态 ...
- 利用NATAPP隧道解决微信公众号开发之本地调试难题
一.问题 众所周知,微信公众号开发需要公网的有效域名和80端口,本机当然互联网是访问不了的.那么我们难道去一个公网的服务器去开发吗?那样是不是太土了. 答案当然是,NO 当然我们在做微信支付的时候,有 ...
- Mysql写入中文出错
本地调试好像正常,服务器运行报错: UnicodeEncodeError: 'latin-1' codec can't encode character u'\u5206' in position 2 ...
- [Algorithm] Count occurrences of a number in a sorted array with duplicates using Binary Search
Let's say we are going to find out number of occurrences of a number in a sorted array using binary ...
- OpenGL ES 3.0之顶点缓冲
所谓顶点缓冲就是直接将顶点数据存储在gpu的一段缓冲区,不需要从cpu拷贝到gpu.提高了程序的运行效率. 操作步骤 1.创建顶点缓冲对象 GLuint vertexBufferID; 2.分配空间 ...
- RibbonControl中的主题设计
Ribbon+扁平化 据调查,其实人们可能最多只用到全部 Office 功能的 5%,为此,微软交互式团队推出了Ribbon风格,一时间,很多软件升级后都换成了Ribbon界面:扁平化其实不是新东西, ...
- KindEditor-编辑器配置参数属性
KindEditor-源码分析 通过使用KE.show(config)方法即可将编辑器添加到文档中.下面是一段源码: KE.show = function(args) { KE.init(ar ...
- C/C++中的值传递,引用传递,指针传递,指针引用传递
在面试过程中,被面试官问到传值和传引用的区别,之前没有关注过这个问题,今天在网上找了一篇包含代码和图片的讲解文章,浅显易懂,遂转载备忘. 1. 值传递 void f( int p){ printf(& ...
- PAT《数据结构学习与实验指导》实验项目集 2-09 2-10 2-11 2-12 2-13
pat 2-09 装箱问题模拟 #include<cstdio> #include<set> #include<vector> using namespace st ...