【手把手教你树莓派3 (五)】DHT11传感器
来源:互联网 发布:适合win10的ps软件 编辑:程序博客网 时间:2024/06/06 05:48
连线方式:
先贴一张树莓派3b的引脚图:
在连线的时候注意编码方式,注意树莓派引脚图的方向,如上图所示。我用的是三个头的dht11传感器,因此连线方式是:
VCC(或正极) --- 树莓派的3v电源
GND (地线或者负极)--- 树莓派的gnd接口
DATA (D或者out) ---树莓派的GPIO引脚
注意自己的传感器的接口的顺序。
python脚本
python使用的是PRi.gpio库来控制引脚,这个库在树莓派里面已经导入了,所以我们直接写代码就好,我用的是下面的代码:
import RPi.GPIO as GPIOimport timechannel =4 data = []j = 0GPIO.setmode(GPIO.BCM)time.sleep(1)GPIO.setup(channel, GPIO.OUT)GPIO.output(channel, GPIO.LOW)time.sleep(0.02)GPIO.output(channel, GPIO.HIGH)GPIO.setup(channel, GPIO.IN)while GPIO.input(channel) == GPIO.LOW: continuewhile GPIO.input(channel) == GPIO.HIGH: continuewhile j < 40: k = 0 while GPIO.input(channel) == GPIO.LOW: continue while GPIO.input(channel) == GPIO.HIGH: k += 1 if k > 100: break if k < 8: data.append(0) else: data.append(1) j += 1print "sensor is working."print datahumidity_bit = data[0:8]humidity_point_bit = data[8:16]temperature_bit = data[16:24]temperature_point_bit = data[24:32]check_bit = data[32:40]humidity = 0humidity_point = 0temperature = 0temperature_point = 0check = 0for i in range(8): humidity += humidity_bit[i] * 2 ** (7-i) humidity_point += humidity_point_bit[i] * 2 ** (7-i) temperature += temperature_bit[i] * 2 ** (7-i) temperature_point += temperature_point_bit[i] * 2 ** (7-i) check += check_bit[i] * 2 ** (7-i)tmp = humidity + humidity_point + temperature + temperature_pointif check == tmp: print "temperature :", temperature, "*C, humidity :", humidity, "%"else: print "wrong" print "temperature :", temperature, "*C, humidity :", humidity, "% check :", check, ", tmp :", tmpGPIO.cleanup()这里要注意,编码方式和引脚号
(1)编码方式:PR库有两种方式,一种是bcm另一种是wiringPi的方式,两者的区别大致是bcm的的pin的序号0,1,3,。。。是与每一个gpio引脚对应的,不包含gnd和电源之类的在内,而wiringPi则是从电源开始为0,然后按增序排。使用python的脚本,只需要在setmode函数里面制定编码方式即可。
(2)引脚号:程序里面用的是bcm的4号(即channel变量),注意连线方式是否与代码匹配
C语言脚本:
要先安装支持GPIO的wiringPi库,这个并没有在系统中预先装好,步骤如下:
sudo apt-get install git-core
git clone git://git.drogon.net/wiringPi
cd wiringPigit pull origin
cd wiringPi./build
安装好以后测试:
输入命令:
gpio -v可以显示版本,如下图
也可以输入:
gpio readall来查看树莓派的引脚编码:
http://wiringpi.com/download-and-install/
下面是c代码:
/* * dht11.c: *Simple test program to test the wiringPi functions *DHT11 test */ #include <wiringPi.h> #include <stdio.h>#include <stdlib.h>#include <stdint.h>#define MAXTIMINGS85#define DHTPIN7int dht11_dat[5] = { 0, 0, 0, 0, 0 }; void read_dht11_dat(){uint8_t laststate= HIGH;uint8_t counter= 0;uint8_t j= 0, i;floatf; /* fahrenheit */ dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0; /* pull pin down for 18 milliseconds */pinMode( DHTPIN, OUTPUT );digitalWrite( DHTPIN, LOW );delay( 18 );/* then pull it up for 40 microseconds */digitalWrite( DHTPIN, HIGH );delayMicroseconds( 40 );/* prepare to read the pin */pinMode( DHTPIN, INPUT ); /* detect change and read data */for ( i = 0; i < MAXTIMINGS; i++ ){counter = 0;while ( digitalRead( DHTPIN ) == laststate ){counter++;delayMicroseconds( 1 );if ( counter == 255 ){break;}}laststate = digitalRead( DHTPIN ); if ( counter == 255 )break; /* ignore first 3 transitions */if ( (i >= 4) && (i % 2 == 0) ){/* shove each bit into the storage bytes */dht11_dat[j / 8] <<= 1;if ( counter > 16 )dht11_dat[j / 8] |= 1;j++;}} /* * check we read 40 bits (8bit x 5 ) + verify checksum in the last byte * print it out if data is good */if ( (j >= 40) && (dht11_dat[4] == ( (dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF) ) ){f = dht11_dat[2] * 9. / 5. + 32;printf( "Humidity = %d.%d %% Temperature = %d.%d *C (%.1f *F)\n",dht11_dat[0], dht11_dat[1], dht11_dat[2], dht11_dat[3], f );}else {printf( "Data not good, skip\n" );}} int main( void ){printf( "Raspberry Pi wiringPi DHT11 Temperature test program\n" ); if ( wiringPiSetup() == -1 )exit( 1 ); while ( 1 ){read_dht11_dat();delay( 1000 ); /* wait 1sec to refresh */} return(0);}(1)这里也要注意编码方式和引脚号,
如果采用wiringPIDE编码,那么程序中用函数
wiringPiSetup()反之用bcm则使用函数
wiringPiSetupGpio()以上信息可查看:
http://raspberrypi.stackexchange.com/questions/40067/using-bcm-gpio-pin-numbers-with-wiringpi-c-library
最后就是检查引脚号和程序是否匹配。
如果不匹配,改程序会一直提示:”Data not good,skip“,如果一直出现这个信息,说明引脚连接方式不对。
(2)注意编译方式:需要-l参数引入wiringPi库,
gcc dht11_c -o dht11_c -l wiringPi执行:
sudo ./dht11_c
结果,目前我的结果不太正确,温度和湿度一直是66,我怀疑是我的传感器有问题,新买一个周三到,到时候试了再贴图。
事实证明确实我的传感器有问题,换了一个成功了。
- 【手把手教你树莓派3 (五)】DHT11传感器
- 树莓派3 B+ 读取温湿度传感器DHT11
- 树莓派连接DHT11温湿度传感器(python)
- 树莓派读取温湿度传感器DHT11
- 传感器系列3--温湿度传感器之DHT11
- DHT11温湿度传感器的树莓派3 python3驱动代码
- zigbee协议栈应用(五)协议栈与温湿度传感器DHT11
- 树莓派的GPIO - DHT11温湿度传感器
- 【raspberry】(四)温湿度传感器DHT11
- 手把手教你用vmware安装oracle10g RAC(五)
- 手把手教你移植linux内核---------OK6410(五)
- android手把手教你开发launcher(五)
- 手把手教你写《雷神》游戏(五)
- 手把手教你智能硬件开发(五) 开关按钮
- 手把手教你mysql(五)聚合函数
- 传感器系列 温湿度传感器DHt11
- 温湿度传感器DHT11
- DHT11温湿度传感器
- FastDFS
- 编译时 和运行时
- Log日志管理
- 冒泡排序
- android studio 查找源码使用 jdk.table.xml
- 【手把手教你树莓派3 (五)】DHT11传感器
- 排序的几种方法
- 搭建React Native环境的几个Tips
- 选项卡
- 并查集系列题解
- awk参数详解
- Math223RectangleArea
- 【NOIP2008双栈排序】题目说什么,我做什么!
- 大型网站架构之分布式消息队列