使用board编码
两个传感器的vcc与gnd分别接入正极3.3v与负极,传感器的out针脚接入树莓派gpio针脚
传感器out针脚接入树莓派的针脚号,out针脚是输出传感器数据
光感: 19
声感: 21
led灯:正极37,负极34接地
#!/usr/bin/env python
# encoding: utf-8
import RPi.GPIO as GPIO
import time
# LED正极连接的GPIO
LED = 37
# 声音感应器OUT口连接的GPIO
# 光感
SENSOR = 19
# 声感
SENSOR21 = 21
# 当前LED灯的开关状?
flg = False
GPIO.setmode(GPIO.BOARD)
# 指定GPIO4(声音感应器的OUT口连接的GPIO口)的模式为输入模式
# 默认拉高到高电平,低电平表示OUT口有输出
GPIO.setup(SENSOR, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(SENSOR21, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# 指定GPIO17(LED长针连接的GPIO针脚)的模式为输出模
GPIO.setup(LED, GPIO.OUT)
GPIO.output(LED, 1)
time.sleep(1)
GPIO.output(LED, 0)
# 当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了
num = 0
def callback(channel):
global num
# 检测声音感应器是否输出低电平,若是低电平,表示声音被检测到,点亮或关闭LED
print(channel, GPIO.input(SENSOR), GPIO.input(SENSOR21))
num += 1
print(num)
# if (GPIO.input(SENSOR) == 1 and GPIO.input(SENSOR21) == 0):
# 如果没有灯光,触发点亮led
if (GPIO.input(SENSOR) == 1):
GPIO.output(LED, 1)
# 稍微延时一会,避免刚点亮就熄灭,或者刚熄灭就点亮
time.sleep(0.1)
GPIO.output(LED, 0)
# 监听光感
GPIO.add_event_detect(SENSOR, GPIO.RISING, callback)
# 监听声控
GPIO.add_event_detect(SENSOR21, GPIO.RISING, callback, bouncetime=200)
while True:
time.sleep(10)
GPIO.cleanup()
附上温湿度传感器
#!/usr/bin/python
# encoding: utf-8
import RPi.GPIO as GPIO
import time
channel = 37 # 引脚号16
data = [] # 温湿度值
j = 0 # 计数器
GPIO.setmode(GPIO.BOARD)
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:
continue
while GPIO.input(channel) == GPIO.HIGH:
continue
while 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 += 1
print "sensor is working."
print data # 输出初始数据高低电平
humidity_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 = 0
humidity_point = 0
temperature = 0
temperature_point = 0
check = 0
for 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_point # 十进制的数据相加
if check == tmp: # 数据校验,相等则输出
print "temperature : ", temperature, ", humidity : ", humidity
else: # 错误输出错误信息,和校验数据
print "wrong"
print "temperature : ", temperature, ", humidity : ", humidity, " check : ", check, " tmp : ", tmp
GPIO.cleanup() # 重置针脚
网友评论