原文地址: http://blog.csdn.net/liang890319/article/details/8739683

硬件:

树莓派 2.0

DHT模块  接树莓派5V GND GPIO1

功能:读取传感器数据并打印出来

//
//mydht11.c
//
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h> typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32; #define HIGH_TIME 32 int pinNumber =; //use gpio1 to read data
uint32 databuf; uint8 readSensorData(void)
{
uint8 crc;
uint8 i; pinMode(pinNumber,OUTPUT); // set mode to output
digitalWrite(pinNumber, ); // output a high level
delay();
digitalWrite(pinNumber, ); // output a low level
pinMode(pinNumber, INPUT); // set mode to input
pullUpDnControl(pinNumber,PUD_UP); delayMicroseconds();
if(digitalRead(pinNumber)==) //SENSOR ANS
{
while(!digitalRead(pinNumber)); //wait to high for(i=;i<;i++)
{
while(digitalRead(pinNumber)); //data clock start
while(!digitalRead(pinNumber)); //data start
delayMicroseconds(HIGH_TIME);
databuf*=;
if(digitalRead(pinNumber)==) //
{
databuf++;
}
} for(i=;i<;i++)
{
while(digitalRead(pinNumber)); //data clock start
while(!digitalRead(pinNumber)); //data start
delayMicroseconds(HIGH_TIME);
crc*=;
if(digitalRead(pinNumber)==) //
{
crc++;
}
}
return ;
}
else
{
return ;
}
} int main (void)
{ printf("Use GPIO1 to read data!\n"); if (- == wiringPiSetup()) {
printf("Setup wiringPi failed!");
return ;
} pinMode(pinNumber, OUTPUT); // set mode to output
digitalWrite(pinNumber, ); // output a high level printf("Enter OS-------\n");
while() {
pinMode(pinNumber,OUTPUT); // set mode to output
digitalWrite(pinNumber, ); // output a high level
delay();
if(readSensorData())
{
printf("Congratulations ! Sensor data read ok!\n");
printf("RH:%d.%d\n",(databuf>>)&0xff,(databuf>>)&0xff);
printf("TMP:%d.%d\n",(databuf>>)&0xff,databuf&0xff);
databuf=;
}
else
{
printf("Sorry! Sensor dosent ans!\n");
databuf=;
}
}
return ;
}

源代码2:

//dht11.c 
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define MAX_TIME 85
#define DHT11PIN 1
#define ATTEMPTS 5 //retry 5 times when no response
int dht11_val[]={,,,,}; int dht11_read_val(){
uint8_t lststate=HIGH; //last state
uint8_t counter=;
uint8_t j=,i;
for(i=;i<;i++)
dht11_val[i]=; //host send start signal
pinMode(DHT11PIN,OUTPUT); //set pin to output
digitalWrite(DHT11PIN,LOW); //set to low at least 18ms
delay();
digitalWrite(DHT11PIN,HIGH); //set to high 20-40us
delayMicroseconds(); //start recieve dht response
pinMode(DHT11PIN,INPUT); //set pin to input
for(i=;i<MAX_TIME;i++)
{
counter=;
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();
if(counter==)
break;
}
lststate=digitalRead(DHT11PIN); //read current state and store as last state.
if(counter==) //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>=)&&(i%==)){
dht11_val[j/]<<=; //write 1 bit to 0 by moving left (auto add 0)
if(counter>) //long mean 1
dht11_val[j/]|=; //write 1 bit to 1
j++;
}
}
// verify checksum and print the verified data
if((j>=)&&(dht11_val[]==((dht11_val[]+dht11_val[]+dht11_val[]+dht11_val[])& 0xFF))){
printf("RH:%d,TEMP:%d\n",dht11_val[],dht11_val[]);
return ;
}
else
return ;
} int main(void){
int attempts=ATTEMPTS;
if(wiringPiSetup()==-)
exit();
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();
}
return ;
}

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 dt11_test dt11-.c -lwiringPi     #连接动态库

gcc是编译器,-Wall是在编译时显示警告信息,-o executefilename cfilename.c是将cfilename.c文件编译成文件名为executefilename的可执行文件,-lwiringPi是将wiringPi头文件包含在可执行文件中。

编译完之后会生成文件名为executefilename的文件,使用root权限执行如下命令即可运行:

运行程序:

$ sudo ./dt_11_test 

wiringPi

#wiringPi 源代码,我已经同步到bitbucket.org了。

https://bitbucket.org/sndnvaps/wiringpi/

github.com

https://github.com/sndnvaps/WiringPi

编译wiringpi 动态库

使用git clone  git@bitbucket.org:sndnvaps/wiringpi.git -b master_upstream        #下载源代码

cd wiringpi

./build

[转载] 树莓派读取温湿度传感器DHT11的更多相关文章

  1. STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题

    1.DHT11和DHT21传感器 这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com). DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合 ...

  2. 进阶之路(中级篇) - 016 温湿度传感器DHT11

    如果想使用 Arduino 开发板驱动 DHT11 来获取温湿度的时候建议使用第三方的库,这样可以加快程序的开发速度,而且不容易出错,下面的代码我已经安转了第三方的库了.详细的安装方法请参考极客先锋的 ...

  3. 温湿度传感器DHT11程序示例

    DHT11概述 HT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器. 它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性.传感器包括一个电阻式 ...

  4. 使用Arduino Wire Library读取温湿度传感器AM2321

    AM2321是采用I2C总线或单总线通讯的国产温湿度传感器.在AM2321手册中,当采用I2C通讯时,手册指定了多处需要主机等待的时间间隔,包括: (1)唤醒传感器时,从机不回复ACK,但主机主要等待 ...

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

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

  6. 基于CC2530/CC2430 的温湿度采集系统--DHT11

    采用常用的温湿度传感器DHT11 参见论坛中实例视频讲解http://bphero.com.cn/forum.php?mod=viewthread&tid=15&extra=page% ...

  7. Arduino I2C + 温湿度传感器AM2321

    (2015.5.17:本日志的内容有所更新,参见<使用Arduino Wire Library读取温湿度传感器AM2321>.) AM2321是广州奥松电子生产的数字式温湿度传感器.虽是国 ...

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

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

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

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

随机推荐

  1. Delphi数据类型转换(有几个字符串函数没见过,比如StringToWideChar和WideCharToString)

    DateTimeToFileDate                  函数                     将DELPHI的日期格式转换为DOS的日期格式         DateTimeT ...

  2. swfupload组件后台获取中文文件名称乱码的问题解决

       问题描写叙述:用swfupload上传文件,含有中文名称的文件上传会报错,我用的是获取FileItem对象,用FileItem对象的getName()方法获取文件名会乱码,试着用request. ...

  3. stm32 ARM中的RO、RW和ZI DATA

    一直以来对于ARM体系中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该有不少人也有和我同样的困惑,因此将 ...

  4. Linux ssh密钥自动登录(转)

    在开发中,经常需要从一台主机ssh登陆到另一台主机去,每次都需要输一次login/Password,很繁琐.使用密钥登陆就可以不用输入用户名和密码了 实现从主机A免密码登陆到主机B,需要以下几个步骤: ...

  5. 图像处理特征不变算子系列之Moravec算子(一)

    论文转载请注明出处:http://blog.csdn.net/kezunhai 1977年,Moravec提出了兴趣点(Points of Interests)的概念,并应用于解决Stanford C ...

  6. hdu1513(最长公共子序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 题意:将一个字符串转变为回文串的最少添加字符个数 分析:只要想到将字符串逆序后与原字符串求最长公 ...

  7. hdu 4740【模拟+深搜】.cpp

    题意: 给出老虎的起始点.方向和驴的起始点.方向.. 规定老虎和驴都不会走自己走过的方格,并且当没路走的时候,驴会右转,老虎会左转.. 当转了一次还没路走就会停下来.. 问他们有没有可能在某一格相遇. ...

  8. PostgreSQL服务端监听设置及client连接方法

    背景介绍: PostgreSQL服务端执行在RedHat Linux上,IP为:192.168.230.128 client安装在Windows XP上, IP为:192.168.230.1 配置方法 ...

  9. 全栈JavaScript之路(十八)HTML5 自己定义数据属性

    HTML5 规范规定,用户能够为元素 自己定义非标准属性, 可是要加入 data- 前缀. 目的是为元素提供与页面渲染无关的信息.或者语义信息.这些属性名能够任意加入,仅仅要带上前缀 data- 开头 ...

  10. DirectX Sample-ConfigSystem中采用配置文件进行游戏设置

    这个例子是一个撞球系统,碰撞部分也值得学习,不过最重要的还是其配置部分,配置文件为config.txt,其中包括: Requirements:所需配置 propertyset:预定义的设置,通过名字引 ...