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

硬件:

树莓派 2.0

DHT模块  接树莓派5V GND GPIO1

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

  1. //
  2. //mydht11.c
  3. //
  4. #include <wiringPi.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7.  
  8. typedef unsigned char uint8;
  9. typedef unsigned int uint16;
  10. typedef unsigned long uint32;
  11.  
  12. #define HIGH_TIME 32
  13.  
  14. int pinNumber =; //use gpio1 to read data
  15. uint32 databuf;
  16.  
  17. uint8 readSensorData(void)
  18. {
  19. uint8 crc;
  20. uint8 i;
  21.  
  22. pinMode(pinNumber,OUTPUT); // set mode to output
  23. digitalWrite(pinNumber, ); // output a high level
  24. delay();
  25. digitalWrite(pinNumber, ); // output a low level
  26. pinMode(pinNumber, INPUT); // set mode to input
  27. pullUpDnControl(pinNumber,PUD_UP);
  28.  
  29. delayMicroseconds();
  30. if(digitalRead(pinNumber)==) //SENSOR ANS
  31. {
  32. while(!digitalRead(pinNumber)); //wait to high
  33.  
  34. for(i=;i<;i++)
  35. {
  36. while(digitalRead(pinNumber)); //data clock start
  37. while(!digitalRead(pinNumber)); //data start
  38. delayMicroseconds(HIGH_TIME);
  39. databuf*=;
  40. if(digitalRead(pinNumber)==) //
  41. {
  42. databuf++;
  43. }
  44. }
  45.  
  46. for(i=;i<;i++)
  47. {
  48. while(digitalRead(pinNumber)); //data clock start
  49. while(!digitalRead(pinNumber)); //data start
  50. delayMicroseconds(HIGH_TIME);
  51. crc*=;
  52. if(digitalRead(pinNumber)==) //
  53. {
  54. crc++;
  55. }
  56. }
  57. return ;
  58. }
  59. else
  60. {
  61. return ;
  62. }
  63. }
  64.  
  65. int main (void)
  66. {
  67.  
  68. printf("Use GPIO1 to read data!\n");
  69.  
  70. if (- == wiringPiSetup()) {
  71. printf("Setup wiringPi failed!");
  72. return ;
  73. }
  74.  
  75. pinMode(pinNumber, OUTPUT); // set mode to output
  76. digitalWrite(pinNumber, ); // output a high level
  77.  
  78. printf("Enter OS-------\n");
  79. while() {
  80. pinMode(pinNumber,OUTPUT); // set mode to output
  81. digitalWrite(pinNumber, ); // output a high level
  82. delay();
  83. if(readSensorData())
  84. {
  85. printf("Congratulations ! Sensor data read ok!\n");
  86. printf("RH:%d.%d\n",(databuf>>)&0xff,(databuf>>)&0xff);
  87. printf("TMP:%d.%d\n",(databuf>>)&0xff,databuf&0xff);
  88. databuf=;
  89. }
  90. else
  91. {
  92. printf("Sorry! Sensor dosent ans!\n");
  93. databuf=;
  94. }
  95. }
  96. return ;
  97. }

源代码2:

  1. //dht11.c
    #include <wiringPi.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <stdint.h>
  5. #define MAX_TIME 85
  6. #define DHT11PIN 1
  7. #define ATTEMPTS 5 //retry 5 times when no response
  8. int dht11_val[]={,,,,};
  9.  
  10. int dht11_read_val(){
  11. uint8_t lststate=HIGH; //last state
  12. uint8_t counter=;
  13. uint8_t j=,i;
  14. for(i=;i<;i++)
  15. dht11_val[i]=;
  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();
  21. digitalWrite(DHT11PIN,HIGH); //set to high 20-40us
  22. delayMicroseconds();
  23.  
  24. //start recieve dht response
  25. pinMode(DHT11PIN,INPUT); //set pin to input
  26. for(i=;i<MAX_TIME;i++)
  27. {
  28. counter=;
  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();
  32. if(counter==)
  33. break;
  34. }
  35. lststate=digitalRead(DHT11PIN); //read current state and store as last state.
  36. if(counter==) //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>=)&&(i%==)){
  40. dht11_val[j/]<<=; //write 1 bit to 0 by moving left (auto add 0)
  41. if(counter>) //long mean 1
  42. dht11_val[j/]|=; //write 1 bit to 1
  43. j++;
  44. }
  45. }
  46. // verify checksum and print the verified data
  47. if((j>=)&&(dht11_val[]==((dht11_val[]+dht11_val[]+dht11_val[]+dht11_val[])& 0xFF))){
  48. printf("RH:%d,TEMP:%d\n",dht11_val[],dht11_val[]);
  49. return ;
  50. }
  51. else
  52. return ;
  53. }
  54.  
  55. int main(void){
  56. int attempts=ATTEMPTS;
  57. if(wiringPiSetup()==-)
  58. exit();
  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();
  66. }
  67. return ;
  68. }

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

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

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

运行程序:

  1. $ 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. codeforces 598A Tricky Sum

    题目链接:http://codeforces.com/contest/598/problem/A 题目分类:大数 题意:1到n 如果是2的次方则减去这个数,否则就加上这个数,求最后的结果是多少 题目分 ...

  2. android中设置TextView/Button 走马灯效果

    在Android的ApiDemo中,有Button的走马灯效果,但是换作是TextView,还是有一点差异. 定义走马灯(Marquee),主要在Project/res/layout/main.xml ...

  3. 【PostgreSQL】PostgreSQL语法

    在阅读的过程中有不论什么问题.欢迎一起交流 邮箱:1494713801@qq.com    QQ:1494713801 一.PostgreSQL时间类型转换 --时间类型转成字符类型 select t ...

  4. CSDN编程挑战——《高斯公式》

    高斯公式 题目详情: 高斯在上小学时发明了等差数列求和公式:1+2+..+100=5050.如今问题在于给你一个正整数n,问你他能够表示为多少种连续正整数之和?(自身也算). 输入格式: 多组数据,每 ...

  5. servlet其工作原理和例子证明

    servlet简单介绍 当我们在地址栏里面输入www.baidu.com,终于呈如今我们面前的是百度搜索的页面.在这些訪问过程中,都会有一个webserver来处理这些请求以及訪问处理后的结果. 而s ...

  6. Jobbox.io(职位盒子): 新兴的面向技术人才的职场招聘众推平台

    人才招聘市场一个主要问题在于猎头中介费昂贵.这对于大公司而言,或可接受. 但对于海量小微企业而言招聘成本和效率之间的平衡是非常大的一个问题. 现在产品猎场(Product Hunt)上出现了一些新的招 ...

  7. 学习日记之命令模式和Effective C++

    命令模式(Command): 讲一个请求封装为一个对象.从而使你可用不同的请求对客户进行參数化.对请求队列或记录请求日志.以及支持可撤销的操作. 命令模式长处: (1),它能较easy地设计一个命令队 ...

  8. HDU 4616 Game (搜索)、(树形dp)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4616 这道题目数据可能比较弱,搜索都可以AC,但是不敢写,哎…… 搜索AC代码: #include & ...

  9. Adaboost的几个人脸检测网站

    [1]基础学习笔记之opencv(1):opencv中facedetect例子浅析 http://www.cnblogs.com/tornadomeet/archive/2012/03/22/2411 ...

  10. FOJ 1591 —— Coral的烦恼

    #include<stdio.h> int main() { __int64 n,i,sum,l,r; while(scanf("%I64d",&n)!=EOF ...