Overview
本文主要介绍如何用树莓派实现简易防人体入侵安防系统,树莓派周期性检测人体红外检测模块输出的高低电平,当有人入侵时候蜂鸣器报警.
Experimental Parts
Pi3 x1
|
|
人体红外感性模块 x1
|
|
有源蜂鸣器 x1
|
|
杜邦线 x3
|
在连接电路的时候特别注意不要把电源正负极接反,否则会烧毁Pi和传感器模块,上图中蜂鸣器模块引脚顺序可能跟实物引脚顺序不一样,在接线的时候需要对照实物连线。
其中蜂鸣器是低电平有效的。
下面给出人体红外检测模块、继电器模块的原理图。
Motion sensor Schematic
Motion sensor Interface Layout
The two potentiometer can adjust delay time and sensitivity, as the follow picture:
Software
1)在/home/pi路径下用nano新建一个motionsensor-test.py文件
sudo nano motionsensor-test.py
2)向motionsensor-test.py中写入代码
import RPi.GPIO as GPIO import time M_pin = 18 #select the pin for motionsensor B_pin = 26 #select the pin for buzzer def init(): GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(M_pin,GPIO.IN) GPIO.setup(B_pin,GPIO.OUT) pass def buzzer(): while GPIO.input(M_pin): GPIO.output(B_pin,GPIO.LOW) time.sleep(0.5) GPIO.output(B_pin,GPIO.HIGH) time.sleep(0.5) def detct(): for i in range(101): if GPIO.input(M_pin): print "Someone is closing!" buzzer() else: GPIO.output(B_pin,GPIO.HIGH) print "Nobody!" time.sleep(2) time.sleep(5) init() detct() GPIO.cleanup()
写完代码后,键盘输入Ctrl X根据提示输入Y保存退出
示例代码可以通过下面命令下载得到
sudo wget --no-check-certificate http://osoyoo.com/driver/motionsensor-test.py
3)运行脚本
sudo python ./motionsensor-test.py
屏幕上打印出了提示信息,检测到人体移动的时候,蜂鸣器响起。
Overview
本文中将介绍如何用树莓派和电压传感器设计电压表,把测量到的读数实时打印在终端上。
Parts
本项目将用到如下器件
Pi3 x1
|
|
电压传感器模块 x1 | |
模数转换器 x1 | |
面包板 x1 | |
公对公跳线 x若干 | |
公对母跳线 x若干 |
Hardware
电压传感器模块基于电阻分压原理所设计,能使端子接口输入的电压缩小5倍,由于树莓派GPIO工作电压一般是3.3V,所以模块输入电压最好低于3.3Vx5=16.5V),模块输出接口:”+”接3.3V, “-“接GND,”s”接ADC的AD输入端;DC输入接口:端子正极接VCC,负极接GND。如图
Raspberry Pi只能处理数字信号,需要处理的是电压传感器模块输出的电压信号,由于电压信号是模拟信号,所以需要使用ADC,本项目使用MCP3008作为ADC芯片,这是一片很常用的ADC芯片。
Software
可以把pi直接接到显示器上,也可以通过SSH方式远程登录Pi。
1)编写代码
在/home/pi路径下用nano新建一个voltage.py(名字随意,你喜欢就好!)
sudo nano voltage.py
并往新建的文件中写入示例代码,代码可以通过执行下面的shell命令得到
sudo wget --no-check-certificate http://osoyoo.com/driver/voltage.py
2)执行python程序
sudo python ./voltage.py
3)测试
将模块的DC输入端子接到电压小于16.5V的电源上,屏幕会输出检测到的电压。例如将DC输出口接到3.3V电源上,屏幕会输出3.29V,会有一点的误差,毕竟是通过ADC后得到的电压值。
Overview
本文介绍在树莓派如何使用火焰传感器设计火焰探测器。火焰传感器对波长在 760 纳米~1100 纳米范围内的光源,模块具有数字和模拟信号双路输出,当检测到有火焰时候数字输出口输出高电平,模拟输出口输出电压与火焰大小有关,火焰 越大电压越高。模块的灵敏度可通过可调电位器调节。
Experimental Parts
为了完成设计需要用到一下器件
Pi3 x1
|
|
火焰传感器模块 x1 | |
模数转换器 x1 | |
面包板 x1 | |
公对公跳线 x若干 | |
公对母跳线 x若干 |
Hardware
火焰传感器模块 可以检测火焰或者波长在 760 纳米~1100 纳米范围内的光源, 打火机测试火焰距离为 80cm,对火焰越大,测试距离越远 , 探测角度 60 度左右,对火焰光谱特别灵敏 。其灵敏度可以通过可调继电器调节,工作电压为3.3V-5V之间,本文用3.3V给火焰模块供电。与树莓派具体连接参考下图。
在接线的时候请认清模块正负极,不要接反了,否则会烧坏你的Pi和模块。模块的上的GND接Pi上的0V;模块上的VCC接3.3V。对于如何识别Pi的IO口请参考这篇文章: How to read Raspberry Pi i/o pin diagram (GPIO pin graph)
Software
可以把pi直接接到显示器上,也可以通过SSH方式远程登录Pi。
1)编写代码
在/home/pi路径下用nano新建一个flame.py(名字随意,你喜欢就好!)
sudo nano flame.py
并往新建的文件中写入示例代码,代码可以通过执行下面的shell命令得到
sudo wget --no-check-certificate http://osoyoo.com/driver/flame.py
2)执行python程序
sudo python ./flame.py
3)测试
程序运行起来后,用打火机对着模块打火,如果模块检测到火光,模块上的绿色LED指示灯会亮起来,同时屏幕上会打印出提示信息;如果没有打火机对着模块打火,绿色指示灯不亮,或者没有对着模打火绿色指示灯就已经亮起,可以通过调节可调电位器进行校正。正常情况下会输出如下信息。
Overview
本项目将利用MQ-7CO传感器模块,在树莓派上设计CO气体检测器,可以检测环境中CO气体浓度。MQ-7气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2),传感器的电导率随空气中一氧化碳气体浓度增加而增大,模块可以将电导率的变化,转换为与该气体浓度相对应的输出信号。 MQ-7气体传感器对一氧化碳的灵敏度高,是一款适合多种应用的低成本传感器。
Parts
本项目将用到如下器件
Pi3 x1
|
|
MQ-7模块 x1 | |
模数转换器 x1 | |
面包板 x1 | |
公对公跳线 x若干 | |
公对母跳线 x若干 |
Hardware
Raspberry Pi只能处理数字信号,但是本项目中要用到MQ-7模块输出的模拟信号,所以需要用到模数转换器。本项目中利用MCP3008把MQ-7模块输出的电压信号转换成数字信号,根据转换后电压的大小来判断环境中CO浓度。
其中MQ-7模块工作在5V电压下,具有模拟信号和数字信号双路输出,当模块检测到CO气体的时候,信号指示灯亮起,数字信号输出口输出低电平。模块上面有一个可调电阻,通过调节可调电阻能够调节模块的灵敏度。
模块之间与树莓派具体连接请参考下图
在接线的时候请认清模块正负极,不要接反了,否则会烧坏你的Pi和模块。模块的上的GND接Pi上的0V;模块上的VCC接5V。对于如何识别Pi的IO口请参考这篇文章: How to read Raspberry Pi i/o pin diagram (GPIO pin graph)
Software
可以把pi直接接到显示器上,也可以通过SSH方式远程登录Pi。
1)编写代码
在/home/pi路径下用nano新建一个mq-7.py(名字随意,你喜欢就好!)
sudo nano mq-7.py
并往新建的文件中写入示例代码,代码可以通过执行下面的shell命令得到
sudo wget --no-check-certificate http://osoyoo.com/driver/mq-7.py
2)执行python程序
sudo python ./mq-7.py
3)测试
程序让mq-7模块上电后先预热20s,待数据稳定后再输出,所以刚开始的20S没有数据输出。如果出现模块有细微发烫是正常的。打火机大火会生成部分CO气体,将打火机对着模块打火屏幕会打印出来”CO is detected”的字样,并且打印出当前传感器输出电压,信号指示灯亮起,如果没有上述现象,可通过顺时针调节可调电阻,直到出现上述现象为止。
Overview
本项目将利用MQ-2烟雾传感器模块,在树莓派上设计烟雾检测器。烟雾传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2),当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大,模块可以将将电导率的变化转换为与该气体浓度相对应的输出信号。MQ-2气体传感器对对液化石油气,丙烷,氢气敏感的灵敏度高。
Parts
本项目将用到如下器件
Pi3 x1
|
|
MQ-2模块 x1 | |
模数转换器 x1 | |
面包板 x1 | |
公对公跳线 x若干 | |
公对母跳线 x若干 |
Hardware
Raspberry Pi只能处理数字信号,但是本项目中要用到MQ-2模块输出的模拟信号,所以需要用到模数转换器。本项目中利用MCP3008把MQ-2模块输出的电压信号转换成数字信号,根据转换后电压的大小来判断是否有烟雾。
其中MQ-2模块工作在2.5-5V电压下,在本项目中利用3.3V供电,模块具有模拟信号和数字信号双路输出,当模块检测到有烟雾的时候,信号指示灯亮起,数字信号输出口输出低电平。模块上面有一个可调电阻,通过调节可调电阻能够调节模块的灵敏度。
模块之间与树莓派具体连接请参考下图
在接线的时候请认清模块正负极,不要接反了,否则会烧坏你的Pi和模块。模块的上的GND接Pi上的0V;模块上的VCC接3.3V。对于如何识别Pi的IO口请参考这篇文章: How to read Raspberry Pi i/o pin diagram (GPIO pin graph)
Software
可以把pi直接接到显示器上,也可以通过SSH方式远程登录Pi。
1)编写代码
在/home/pi路径下用nano新建一个mq-2.py(名字随意,你喜欢就好!)
sudo nano mq-2.py
并往新建的文件中写入示例代码,代码可以通过执行下面的shell命令得到
sudo wget --no-check-certificate http://osoyoo.com/driver/mq-2.py
2)执行python程序
sudo python ./mq-2.py
3)测试
让mq-2模块预热20s左右,让数据稳定,如果出现模块有细微发烫是正常的。用打火机对着模块释放可燃气体,屏幕会打印出来”Gas lealage”的字样,并且打印出当前传感器输出电压,信号指示灯亮起,如果没有上述现象,可通过顺时针调节可调电阻,直到出现上述现象为止;在不向其释放可燃气体时候会输出”Gas not leak”字样。
Overview
Hardware
Raspberry Pi是一个出色的微型计算机,你可以使用它来控制数字输入和输出。但是当你想用它来处理模拟信号,例如像热敏电阻、电位器等模拟传感器输出时候,Raspberry Pi就有些力不从心了,就需要借助模数转换芯片将模拟信号转换成数字信号。本项目中利用MCP3008水位检测模块输出的电压信号转换成数字信号,MCP3008是一款8通道10位精度的模数转换芯片。
水位检测模块是一款简单易用、性价比较高的水位/水滴识别检测传感器,其是通过具有一系列的暴露的平行导线线迹测量其水滴/水量大小从而判断水位。轻松完成水量到模拟信号的转换。该模块工作在DC3-5V,在本项目中采用3.3V供电。与树莓派具体连接请参考下图。
在接线的时候请认清模块正负极,不要接反了,否则会烧坏你的Pi和模块。模块的上的GND接Pi上的0V;模块上的VCC接3.3V。对于如何识别Pi的IO口请参考这篇文章: How to read Raspberry Pi i/o pin diagram (GPIO pin graph)
Software
可以把pi直接接到显示器上,也可以通过SSH方式远程登录Pi。
1)编写代码
在/home/pi路径下用nano新建一个waterlevel.py(名字随意,你喜欢就好!)
sudo nano waterlevel.py
并往新建的文件中写入代码,代码可以通过执行下面的shell命令得到:
sudo wget --no-check-certificate http://osoyoo.com/driver/waterlevel.py
2)执行python程序
sudo python ./waterlevel.py
3)测试
将水位检测模块由浅入深的插入水中,注意不要让水位淹没到模块上的电子元器件,会发现模块插入的越深屏幕上打印的数字越大;把模块放置在干燥处时候数字为0
Overview
本文将介绍如何用树莓派、防震传感器模块和有源蜂鸣器模块设计智能报警器。当防震传感器模块检测有震动的时候,会输出高电平,没有震动输出低电平,利用这一特点,树莓派通过中断的方式查询防震传感器模块输出的电平信号,当检测到高电平(即有震动时候),蜂鸣器报警;否则不报警。可以将自己设计的防盗报警器安装在自己家的窗户上,如果有小偷破窗而入,就会报警。
Experimental Parts
为了完成设计需要用到一下器件
Pi3 x1
|
|
有源蜂鸣器模块 x1 | |
防震模块 x1 | |
面包板 x1 | |
公对公跳线 x若干 | |
公对母跳线 x若干 |
Hardware
本中只需要用到两个传感器模块,防震传感器模块和有源蜂鸣器模块。防震模块工作在3.3V-5V电压下,在本项目中采用3.3V供电。在不震动情况下呈常闭状态,输出低电平,开关信号指示灯被点亮;震动时候输出高电平,开关信号指示灯熄灭。其原理图和外形图分别如下图所示。
有源蜂蜜器模块,工作在3.3V-5V电压之间,本项目中同样采用3.3V供电。模块是低电平有效,即控制器给一个低电平,蜂鸣器响,给高电平不响。
与树莓派具体连线参考下图
在接线的时候请认清模块正负极,不要接反了,否则会烧坏你的Pi和模块。模块的上的GND接Pi上的0V;模块上的VCC接3.3V。将蜂鸣器接到20号引脚(BCM编号方式),防震模块接到21号引脚上(BCM编号方式)。关于如何识别Pi的IO口请参考这篇文章: How to read Raspberry Pi i/o pin diagram (GPIO pin graph)
Software
可以把pi直接接到显示器上,也可以通过SSH方式远程登录Pi。
1)编写代码
在/home/pi路径下用nano新建一个vibration.py(名字随意,你喜欢就好!)
sudo nano vibration.py
并往新建的文件中写入如下代码:
#!/usr/bin/env python import RPi.GPIO as GPIO import time class Sw40(object): """docstring for Senal""" def __init__(self, pin , buzzer): self.buzzer = buzzer GPIO.setmode(GPIO.BCM) GPIO.setup(self.buzzer,GPIO.OUT) self.pin = pin GPIO.setup(self.pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) GPIO.add_event_detect(self.pin, GPIO.RISING, callback=self.callback, bouncetime=1) self.count = 0 def callback(self , pin): self.count += 1 def BuzzerOn(self): GPIO.output(self.buzzer , 0) def BuzzerOff(self): GPIO.output(self.buzzer , 1) def main(): print"system initialition..." sensor = Sw40(21,20) print"ok!\n" try: while True: time.sleep(1) if sensor.count >=10: print"be careful!there are thieves!\n" sensor.BuzzerOn() else: print"it is safe!\n" sensor.BuzzerOff() sensor.count = 0 except KeyboardInterrupt: GPIO.cleanup() if __name__ == '__main__': main()
上面的代码可以通过执行下面的shell命令得到
sudo wget --no-check-certificate http://osoyoo.com/driver/vibration.py
2)执行python脚本
sudo python ./vibration.py
3)测试
将防震模块放置在水平桌面上,发现没有什么异样,但是,当你用手拍击桌面的时候,效果就不一样了,会听到蜂蜜器发出报警声,停止拍击蜂鸣器也停止发声。至此基于树莓派的智能报警器就设计好了,赶快安装到你家窗户上去防贼去吧!
Overview
本文介绍如何用树莓派设计数字触摸开关,并通过这个数字触摸开关控制继电器通断。程序启动树莓派不间断检测TTP223数字触摸传感器模块输出信号,当检测到有触摸动作发生时候,继电器闭合,并且在触摸时候蜂鸣器会响一声,代表被触摸。该模块是一个基于触摸检测ICTTP223B的电容式点动型触摸开关模块。常态下,模块输出低电平,模式为低功耗模式;当用手指触摸相应位置时,模块会输出高电平,模式切换为快速模式;当持续12秒没有触摸时,模式又切换为低功耗模式。
Experimental Parts
为了完成设计需要用到一下器件
Pi3 x1
|
|
有源蜂鸣器模块 x1 | |
数字触摸开关TTP223 x1 | |
2路继电器模块 x1 | |
面包板 x1 | |
公对公跳线 x若干 | |
公对母跳线 x若干 |
Hardware
本文中用到了三个传感器,分别是数字触摸开关TTP223模块、有源蜂鸣器模块和2路继电器模块。数字触摸开关TTP223模块工作在DC2—5.5V,本文中采用3.3V供电,检测到有触摸动作时候输出高电平,否则输出低电平;有源蜂鸣器模块采用2TY三极管(S8550)驱动,工作在3.3V-5V之间,本文将其接到3.3V电压上,模块低电平触发;2路继电器模块低电平触发,同样用3.3V供电。
与树莓派具体连线参考下图
在接线的时候请认清模块正负极,不要接反了,否则会烧坏你的Pi和模块。模块的上的GND接Pi上的0V;模块上的VCC接3.3V。对于如何识别Pi的IO口请参考这篇文章: How to read Raspberry Pi i/o pin diagram (GPIO pin graph)
Software
可以把pi直接接到显示器上,也可以通过SSH方式远程登录Pi。
1)编写代码
在/home/pi路径下用nano新建一个touchsensor.py(名字随意,你喜欢就好!)
sudo nano touchsensor.py
并往新建的文件中写入如下代码:
import RPi.GPIO as GPIO import time import os #sensor pin define buzzer = 14 touch = 26 relay_in1 = 13 relay_in2 = 19 #GPIO port init def init(): GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(buzzer,GPIO.OUT) GPIO.setup(relay_in1,GPIO.OUT) GPIO.setup(relay_in2,GPIO.OUT) GPIO.setup(touch,GPIO.IN,pull_up_down=GPIO.PUD_UP) pass #turn on buzzer def buzzer_on(): GPIO.output(buzzer,GPIO.LOW) time.sleep(0.2) GPIO.output(buzzer,GPIO.HIGH) time.sleep(0.2) pass #turn off buzzer def buzzer_off(): GPIO.output(buzzer,GPIO.HIGH) pass #turn on relay def relay_on(): #open relay channal1 ana channal2 GPIO.output(relay_in1,GPIO.LOW) GPIO.output(relay_in2,GPIO.LOW) #turn off relay def relay_off(): GPIO.output(relay_in1,GPIO.HIGH) GPIO.output(relay_in2,GPIO.HIGH) touchstatus = False #read digital touch sensor def read_touchsensor(): global touchstatus if (GPIO.input(touch)==True): touchstatus = not touchstatus if touchstatus: print"Turn on relay" print"\n" buzzer_on() relay_on() else: print"Turn off relay" print"\n" buzzer_on() relay_off() pass #main loop def main(): print"...................................................................System initializing..." init() buzzer_off() relay_off() print"...................................................................Ok" print"...................................................................Please touch" print"\n" while True: read_touchsensor() if __name__ == '__main__': try: main() pass except KeyboardInterrupt: pass pass GPIO.cleanup()
上面的代码可以通过执行下面的shell命令得到
sudo wget --no-check-certificate http://osoyoo.com/driver/touchsensor.py
2)执行python脚本
sudo python ./touchsensor.py
3)测试
用手指触摸数字触摸开关模块上同心圆位置,会听到滴答声,这是蜂鸣器吸合的声音,在触摸同时蜂鸣器会响一声。可以将一些其他设备接到继电器,就可以通过自己设计的触摸开关来控制了。
Overview
本文介绍如何用树莓派实现声光控开关设计,声光控开关是通过声音和光照度控制的开关,当环境的亮度达到某个设定值以下,同时环境的噪音超过某个值,这种开关就会开启。在本文中通过树莓派采集声音检测模块和光敏电阻模块输出的声音和光照度信号,通过采集到的声光信号控制开关通断,这里的开关是软件开关(用软件实现),当开关闭合时候,蜂蜜器响起。
Experimental Parts
为了完成设计需要用到一下器件
Pi3 x1
|
|
有源蜂鸣器模块 x1 | |
声音检测模块 x1 | |
光敏电阻模块 x1 | |
面包板 x1 | |
模数转换器 x1 | |
公对公跳线 x若干 | |
公对母跳线 x若干 |
Hardware
Raspberry Pi是一个出色的微型计算机,你可以使用它来控制数字输入和输出。但是当你想用它来处理模拟信号,例如像热敏电阻、电位器等模拟传感器输出时候,Raspberry Pi就有些力不从心了,就需要借助模数转换芯片将模拟信号转换成数字信号。本项目中利用MCP3008把光敏电阻模块输出的电压信号转换成数字信号,Pi根据转换后的数值大小以及声音检测传感器输出的信号控制蜂鸣器鸣叫。MCP3008是一款8通道10位精度的模数转换芯片。
声音检测模块可以检测周围环境的声音强度 , 此传感器只能识别声音的有无 , 能识别声音的大小或者特定频率的声音; 灵敏度可通过模块上的蓝色电位器调节;工作在3.3V-5V,因为树莓派GPIO口一般工作在3.3V电压,所以采用3.3V供电;模块输出数字’0’和数字’1’信号,模 块在环境声音强度达不到设定阈值时, DO 口输出高电平,当外界环境声音强度超过设定阈值时,模块D0输出低电平 ,阈值通过调节电位器设定。器原理图如图所示。
有源蜂鸣器模块采用2TY三极管(8550)驱动,工作在3.3V-5V之间,本文将其接到3.3V电压上,模块低电平触发。
各模块之间与树莓派具体连接请参考下图
在接线的时候请认清模块正负极,不要接反了,否则会烧坏你的Pi和模块。模块的上的GND接Pi上的0V;模块上的VCC接3.3V。对于如何识别Pi的IO口请参考这篇文章: How to read Raspberry Pi i/o pin diagram (GPIO pin graph)
Software
可以把pi直接接到显示器上,也可以通过SSH方式远程登录Pi。
1)编写代码
在/home/pi路径下用nano新建一个alarm.py(名字随意,你喜欢就好!)
sudo nano alarm.py
并往新建的文件中写入如下代码:
import RPi.GPIO as GPIO import time import os buzzer = 14 sound = 26 # change these as desired - they're the pins connected from the # SPI port on the ADC to the Cobbler SPICLK = 11 SPIMISO = 9 SPIMOSI = 10 SPICS = 8 def init(): GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(buzzer,GPIO.OUT) #GPIO.output(buzzer,GPIO.HIGH) GPIO.setup(sound,GPIO.IN,pull_up_down=GPIO.PUD_UP) # set up the SPI interface pins GPIO.setup(SPIMOSI, GPIO.OUT) GPIO.setup(SPIMISO, GPIO.IN) GPIO.setup(SPICLK, GPIO.OUT) GPIO.setup(SPICS, GPIO.OUT) pass #buzzer alarm def alarm(): GPIO.output(buzzer,GPIO.LOW) time.sleep(1) GPIO.output(buzzer,GPIO.HIGH) time.sleep(1) #read SPI data from MCP3008(or MCP3204) chip,8 possible adc's (0 thru 7) def readadc(adcnum, clockpin, mosipin, misopin, cspin): if ((adcnum > 7) or (adcnum < 0)): return -1 GPIO.output(cspin, True) GPIO.output(clockpin, False) # start clock low GPIO.output(cspin, False) # bring CS low commandout = adcnum commandout |= 0x18 # start bit + single-ended bit commandout <<= 3 # we only need to send 5 bits here for i in range(5): if (commandout & 0x80): GPIO.output(mosipin, True) else: GPIO.output(mosipin, False) commandout <<= 1 GPIO.output(clockpin, True) GPIO.output(clockpin, False) adcout = 0 # read in one empty bit, one null bit and 10 ADC bits for i in range(12): GPIO.output(clockpin, True) GPIO.output(clockpin, False) adcout <<= 1 if (GPIO.input(misopin)): adcout |= 0x1 GPIO.output(cspin, True) adcout >>= 1 # first bit is 'null' so drop it return adcout # photoresistor connected to adc #0 photo_ch = 0 def main(): init() time.sleep(2) print"will detect sonud and light signal" while True: photo_value = readadc(photo_ch, SPICLK, SPIMOSI, SPIMISO, SPICS) if (GPIO.input(sound) == False)and (photo_value>=650): #detected sound signal and light intensity is low print "Alarm!" alarm() time.sleep(1) elif (GPIO.input(sound) == False)and (photo_value<=650): #detected sound signal,but light intensity is high GPIO.output(buzzer,GPIO.HIGH) print "sound signal is detected ,but light intensity is high!" time.sleep(1) elif (GPIO.input(sound) == True)and (photo_value<=650): GPIO.output(buzzer,GPIO.HIGH) print "sound signal not detected ,light intensity is high!" time.sleep(1) elif (GPIO.input(sound) == True)and (photo_value>=650): GPIO.output(buzzer,GPIO.HIGH) print "sound signal not detected ,light intensity is low!" time.sleep(1) print "light intensity is: " + str("%.1f"%((1024-photo_value)/1024.*100))+"%" if __name__ =='__main__': try: main() except KeyboardInterrupt: pass GPIO.cleanup()
上面的代码可以通过执行下面的shell命令得到
sudo wget --no-check-certificate http://osoyoo.com/driver/alarm.py
2)执行python程序
sudo python ./alarm.py
3)测试
将手遮住光敏电阻模块,同时大声说话(或以其他方式发出响声),会发现间歇性蜂鸣器响起来了;只要将遮住光敏电阻模块的手移开或是停止发出声响,蜂鸣器也随即停止鸣叫。这样就实现了声光控开关的设计。
Overview
在本文中将介绍如何用树莓派读取温湿度传感器DHT11 温湿度数据。温度湿度模块看起来简单,只有三个引脚(实际4个接口,有一个脚悬空),但仔细一想,3个引脚分别作为VCC、GND、DATA用,因为传给树莓派GPIO的只有高电平、低电平,那么怎么来读取温度数字和湿度数字呢?这么一想,并不简单!因为引脚少,它需要高低变化的时序信号来表达数值,还有一些其它信号如开始信号等等。所以得先深入了解一下DHT11模块了。
DHT11时序介绍
1)数据帧格式
DHT11会向主机发送40位(5子节)数据,第一二个子节数据表示温度值;第三四个子节数据代表湿度值;最后一个子节是校验码。如果数据无误的情况下,前4个子节的和等于校验码。
2)握手阶段
一旦DHT11收到开始信号,DHT11将向主机发送响应信号,同时将DATA脚拉低80us作为响应,然后DHT11拉高DATA脚80us,握手完毕。
3)数据发送阶段
一次的湿度和温度数据,DHT11需要发送40bits数据,每一位数据之前都以50us低电平开始,随后的高电平时序信号,持续26us-28us的表示这一位是0,持续70us表示这一位是1,然后继续50us低电平,紧接着下一位的高电平开始。
数据 ‘0’:
数据 ‘1’:
Parts
为了完成本项目需要用到如下器件
Pi3 x1
|
|
DS18B20 x1
|
|
杜邦线 x3
|
Hardware
硬件连接很简单,将DHT11的VCC接到Pi的3.3V;DHT11的GND接到Pi的GND;DHT11的DATA接到Pi的GPIO14(BCM编码方式),关于GPIO的识别请参考: How to read Raspberry Pi i/o pin diagram (GPIO pin graph)
Software
本文将介绍2中方式读取DHT11数据,一种是Python方式读取,一种是C语言方式读取。
1)Python方式
在任一路径下(如/home/pi)用nano新建一个dht11-test.py文件
sudo nano dht11-test.py
往dht11-test.py文件写入如下代码:
# _____ _____ _____ __ __ _____ _____ #| | __| | | | | | #| | |__ | | |_ _| | | | | #|_____|_____|_____| |_| |_____|_____| # # Use Raspberry Pi to get temperature/humidity from DHT11 sensor # import time import dht11 import RPi.GPIO as GPIO #define GPIO 14 as DHT11 data pin Temp_sensor=14 def main(): # Main program block GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbers # Initialise display # lcd_init() instance = dht11.DHT11(pin = Temp_sensor) while True: #get DHT11 sensor value result = instance.read() print"Temperature = ",result.temperature,"C"," Humidity = ",result.humidity,"%" time.sleep(1) if __name__ == '__main__': try: main() except KeyboardInterrupt: pass # finally: # lcd_byte(0x01, LCD_CMD)
运行Python代码需要依赖一个dht11.py文件,用下面的命令下载,需要保证dht11.py文件与dht11-test.py在同一路径下。
sudo sudo wget --no-check-certificate http://osoyoo.com/driver/dht11.py
运行Python程序
sudo python ./dht11-test.p
执行完上面的命令后会在屏幕上打印出温湿度值,但是很多时候会出现温湿度都等于0的情况,这是为什么?原因在于树莓派读取DHT11的输出信号,需要微秒级的定时,否则在数据传输阶段,很难准确的识别出每一位是“0”还是“1”,树莓派运行的Raspbian系统是一个非实时系统,很难实现准确的微秒级定时,会导致数据丢失,使DHT11在数据校验时候不正确。
2)C语言方式
A.在树莓派下用C语言操作GPIO需要首先安装GPIO库,运行下面命令(如果已经安装请跳过)
sudo git clone git://git.drogon.net/wiringPi
sudo cd wiringPi
sudo ./build
B.在任一路径下(如/home/pi)用nano新建一个dht11-test.py文件
sudo nano dht11-test.c
往dht11-test.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 MAXTIMINGS 85 #define DHTPIN 15 int 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; float f; /* 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); }
C.编译、执行程序
sudo gcc -o dht11-test dht11-test.c -lwiringPi
sudo ./dht11-test
本文中所有用到的代码可以通过下面的命令获取到
sudo wget --no-check-certificate http://osoyoo.com/wp-content/uploads/2017/03/dht11_code.rar
对比发现,C语言方式虽然也有数据丢失的情况,但是总体来说比Python少一些,,这是因为C语言是高级语言,直接对树莓派GPIO进行操作。
Overview
DS18B20是一个比较常用的温度传感器,采用单总线控制,以前用单片机编程控制时严格按照单总线的时序控制,今天来看看在树莓派Raspbian系统下如何控制DS18B20,体验一下在linux世界,一切都是文件。读取DS18B20温度也是对文件的操作。
Parts
为了完成本项目需要用到如下器件
Pi3 x1
|
|
DS18B20 x1
|
|
杜邦线 x3
|
Hardware
将DS18B20温度传感器模块的”S”引脚接到树莓派的4脚(BCM编码方式);”-“接到树莓派的GND引脚;DS18B20中间应交接到树莓派5V电源处。如图
加载内核单总线模块
Raspbian支持单总线协议,能挂接如DS18B20之类的单总线设备,并读取其数据。但是需要加载这个模块
在命令行输入如下命令
sudo nano /boot/config.txt
将光标移动到最后添加下面一句话
dtoverlay=w1-gpio
按下键盘上的Ctrl X后按照提示保存退出
查看模块是否启动
重启树莓派是上面的配置生效
sudo reboot
待树莓派启动起来后,命令行输入
lsmod
如果如发现红色方框所示说明模块已启动。
如果没有发现,也可以运行如下命令加载模块
sudo modprobe w1-gpio sudo modprobe w1-therm
读取温度
如果一切顺利,在/sys/bus/w1/devices中发现一个28-XXXX开头的文件夹,这个就是DS18B20的ROM,每个DS18B20都一样,在这个文件夹中读取w1_slave文件则会返回当前温度值。
sudo modprobe w1-gpio sudo modprobe w1-therm cd /sys/bus/w1/devices cd /28-xxxxxx cat w1_slave
Software
用nano编辑器新建一个temp.py文件,并输入如下代码
sudo nano temp.py
import os import glob import time os.system('modprobe w1-gpio') os.system('modprobe w1-therm') base_dir = '/sys/bus/w1/devices/' device_folder = glob.glob(base_dir + '28*')[0] device_file = device_folder + '/w1_slave' def read_temp_raw(): f = open(device_file, 'r') lines = f.readlines() f.close() return lines def read_temp(): lines = read_temp_raw() while lines[0].strip()[-3:] != 'YES': time.sleep(0.2) lines = read_temp_raw() equals_pos = lines[1].find('t=') if equals_pos != -1: temp_string = lines[1][equals_pos+2:] temp_c = float(temp_string) / 1000.0 temp_f = temp_c * 9.0 / 5.0 + 32.0 return temp_c, temp_f while True: print('C =%3.3f F = %3.3f'% read_temp()) time.sleep(1)
上面的代码将每隔1秒钟以摄氏温度和华氏温度的格式打印一次温度值。
注解:1)os.system(‘modprobe w1-gpio’)和os.system(‘modprobe w1-therm’)两句在程序的开头运行了一下modprobe命令
2)base_dir = ‘/sys/bus/w1/devices/’和device_folder = glob.glob(base_dir + ’28*’)[0] 是获取/sys/bus/w1/devices/下面所有以28开头的目录文件
3)device_file = device_folder + ‘/w1_slave’ 打开文件并读取数据
4)while lines[0].strip()[–3:] != ‘YES’: 判断所读取文件的第一行的末尾三个字符是否等于YES
5)equals_pos = lines[1].find(‘t=’) 查找所读取文件中第二行中t=开始的位置,如果查找失败返回-1
You can download the data sheet from link:
The programmable switch doesn’t required a lot of electronic components and is quite easy to build. The Parts Lists for the programmable switch is shown below .
1)tactile pushbutton switch
2)Raspberry Pi
3)solderless breadboard
4)several jumper wires
In order to read the tactile pushbutton switch status, the RPi.GPIO library needs to be installed on the Raspberry Pi. The RPi.GPIO is a software module that conveniently allows the Raspberry Pi GPIO pins to be manipulated for electronic controls applications. To install the RPi.GPIO library onto the Raspberry Pi, open the LXTerminal and type the following linux installation command after the prompt:
pi@raspberrypi ~ $ sudo apt-get install python-dev python~rpi.gpio
After the linux installation command is entered, you will see a series of RPi.GPIO bulld-installation file sequences being displayed on the monitor as shown below.
Attaching a tactile pushbutton switch to the RPi is quite easy to do. An important item to remember is the RPi’s GPIO pins are +3.3VDC compliant. Applying voltages greater than +3.3VDC will damage the RPi. The electrical wiring diagram for attaching the tactile pushbutton switch is shown next.
Although, the circuit wiring to the RPi is quite simple, recheck the wiring before programming the RPi. This important verification step will assure you project execution success when the python code is installed and running on the RPi.
The next phase of the project build is to provide a python script for reading a tactile pushbutton switch wired to a RPi GPIO pin. The python script for reading a tactile pushbutton switch is shown next.
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.IN,pull_up_down=GPIO.PUD_UP)
while True:
inputValue = GPIO.input(18)
if (inputValue == False):
print("Button press ")
time.sleep(0.3)
You can entered this script using either the LXTerminal’s nano editor or with the Python’s IDLE (Integrated Development Enviroment). Save the script as pbbutton.py in the home/pi directory of the RPi. Next, type the following linux command to run the script on the RPi into the LXTerminal as shown next.
Next, press the tactile pushbutton switch. If the script was typed correctly, you will see the message “button press” displayed on the monitor’s screen. Congratulations on building a programmable pushbutton switch!
pi@raspberrypi ~ $ sudo python pbbutton.py
The tactile pushbutton switch can easily be programmed to provide a variety of output messages and switching responses. Try changing the “Button Press” message to display your name or a whimiscal word when activating the switch. Record your results in a laboratory notebook.
To help beginners to easily study the Raspberry Pi hardware controlling, we designed some straight forward sample projects which can save user a lot of money and time to do research.