这是一篇树莓开发入门类的文字记录,换成Arduino来做的话可能会更为简单直接,但有些时候也需要通过树莓的PIN来连接一些常规的传感器。
本示例你需要准备以下的材料:
- DHT 11/22
- RaspberryPI
- 4.7 K电阻
具体连接方式如下图所示:
连接好线路之后进入树莓的命令行安装驱动 DHT11的依赖包 Adafruit_DHT
:
$ pip install adafruit-dht
我们使用这个包其实也只是使用其中的一个方法
humidity, temperature = Adafruit_DHT.read_retry( Adafruit_DHT.DHT11, pin )
read_retry
方法第一个参数用于指定当前传感器的型号一般为 DHT11
或 DHT22
,第二个参数则是连接到树莓派的接口号。(GPIO)此方法返回是的一个(湿度,温度)
结构的元组(tuple)类型对象。
完整的代码如下所示:
import time
import Adafruit_DHT
## Assuming the DHT11 sensor is connected to GPIO pin number 4
pin = 4
def run():
while True:
humidity, temperature = Adafruit_DHT.read_retry( Adafruit_DHT.DHT11, pin )
if humidity is not None and temperature is not None:
print "Temp={0:f}*C Humidity={1:f}%".format(temperature, humidity)
else:
print "Failed to get reading. Try again!"
#Sleep some time
time.sleep(10)
run()
运行本示例你需要使用sudo
否则会运行失败。
$ sudo python dht_test,.py
用Python来做这么低层的操作虽然有点别扭但习惯就好了,需要注意的是Python的逐行解析的,程序执行完就会自动退出,所以我在这个范例里面才会使用 while True
这个“死循环” 来模拟下位机的main
函数以实现“主循环”的效果。
这个程序就会每10秒中自动读取一次DHT上的温湿度数据,并打印出来的。
小结
程序虽小但意义很大,与下位机开发不同。在Arduino上或者STM上写个主循环它就会永不停止地按照CPU的时钟循环永远地执行下去,树莓的嵌入式开发需要带着“系统”的思维来进行设计,换一个说法,我们可以将这个示例做成一个Linux的常规服务,用SystemD将这个程序在系统启动时就运行在后台,然后将读取出来的数据写到pyZMQ的队列或者某个文件里面让其它的程序进行读取,这才是“硬件相合”的实现。