美文网首页
树莓派 感光声控灯

树莓派 感光声控灯

作者: adtk | 来源:发表于2018-09-07 12:49 被阅读0次
    rpi-pins-40-0.png

    使用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()  # 重置针脚
    
    

    相关文章

      网友评论

          本文标题:树莓派 感光声控灯

          本文链接:https://www.haomeiwen.com/subject/wxqcgftx.html