跳转至内容

维基少年:树莓派/树莓派光敏电阻夜灯

来自维基教科书,为开放世界提供开放书籍

安德鲁·奥克利
公共领域 2018 年 9 月 15 日
www.cotswoldjam.org

发光二极管 (LED)

[编辑 | 编辑源代码]

发光二极管 (LED) 有一条短脚和一条长脚。如果你摸摸它的边缘,你还会发现一个平边。短脚和平边始终连接到负极 (地线)。

电阻 可以任意方向连接。阻值越低 (欧姆值越低) 的电阻允许通过更多的电流,使 LED 更亮;阻值越高的电阻允许通过更少的电流,使 LED 更暗。我们使用的是一个 220 欧姆的电阻,但任何 220-470 欧姆的电阻都可以正常工作。

光敏电阻 (LDR)

[编辑 | 编辑源代码]

光敏电阻 (LDR),也称为光电管或光敏电阻,可以任意方向连接。光线越强,它们允许通过的电流就越多。我们使用的是阻值在 2 到 20,000 欧姆之间的光敏电阻,但大多数在爱好者套件中找到的光电管都可以正常工作。

电容 有一条短脚、一条长脚和一侧有一条条纹。与 LED 一样,它们必须用短脚和条纹连接到负极 (地线)。我们使用的是 1 微法电容,你也应该使用。电容存储少量的电荷,当它充满时,它会释放所有的电荷。如果你将它连接到更强的电荷,它会更快地释放电荷。如果你将它连接到弱电荷,它需要更长时间才能释放电荷。

面包板

[编辑 | 编辑源代码]

这个微型面包板 有 25 个连接点。这些列从 0 到 4 编号 (有些列将中间的列标记为 1、2 和 3)。同一列上的所有点都连接在一起,但不同的列不连接。你也可以使用更大的面包板。

跳线 (也称为 DuPont 线) 将电子元件连接到 GPIO 引脚。你应该有两根短跳线和一根长跳线 (都是“母对母” - 两端都有插孔)。

将光敏电阻连接到面包板

[编辑 | 编辑源代码]

电容 有一条短脚和一条长脚。短脚一侧还带有一条条纹。这是负极 (地线)。

电容放置在负极位于第 1 列,另一条脚位于第 2 列的位置。

光敏电阻 (LDR) 需要连接到第 2 列和第 3 列。连接方向无关紧要。

使用 20 厘米 (8 英寸) 的公对母跳线将

  • 第 1 列连接到地线引脚,例如引脚 14 (GND)
  • 第 2 列连接到引脚 12 (GPIO 18)
  • 第 3 列连接到引脚 1 (3.3V)

连接 LED

[编辑 | 编辑源代码]

将电阻连接到两根 10 厘米的母对母跳线之间,并将这些跳线连接到 LED 的长脚 (正极)。将它连接到引脚 22 (GPIO 25)

将 20 厘米的母对母跳线连接到 LED 的短脚 (负极),然后将这根线的另一端连接到地线,引脚 20 (GND)

光敏电阻程序

[编辑 | 编辑源代码]

从树莓派菜单中,选择“编程”,然后选择“Python 3 (IDLE)”。

从 IDLE 菜单中,选择“文件”,然后选择“打开”。找到 python 文件夹并双击打开它。找到 lightsensor 文件夹并双击打开它。选择 lightsensor1.py 程序并单击“打开”。你应该看到

from gpiozero import LightSensor
from time import sleep
sensor=LightSensor(18)
while True:
 print (sensor.value)
 sleep(0.2)

使用“运行”菜单中的“运行模块”运行此程序。它需要一段时间才能启动,然后它应该打印出一组数字。

用手指盖住光敏电阻。数字会变小。将面包板整个包住,不讓任何光線照射到它 – 数字应该变为零。

按住CTRL 键并按下 C 停止程序。您可以在窗口右上角的 X 按钮处关闭 shell 窗口。

夜灯 - 天黑后打开灯光

[编辑 | 编辑源代码]

从 IDLE 菜单中加载 lightsensor2.py 程序

from gpiozero import LightSensor, LED
from time import sleep
sensor=LightSensor(18)
led=LED(25)
sensor.threshold=0.1
while True:
 print (sensor.value)
 if ( sensor.light_detected ):
  led.off()
 else:
  led.on()
  sleep(0.2)

使用“运行”菜单中的“运行模块”运行此程序。它需要一些时间才能启动,然后它应该打印一些数字,当数字低于 0.1(黑暗)时,LED 将打开。

停止程序并尝试将传感器阈值更改为例如 0.2 或 0.4 或甚至 0.6。看看如何设置夜灯,以便在不同程度的黑暗中打开。

sensor.threshold=0.4

这些程序在做什么?

[编辑 | 编辑源代码]

光敏电阻 (LDR) 是一种模拟传感器 - 它实际上不会产生数字,它只是在光线充足时让更多电流通过,在黑暗时让更少的电流通过。

树莓派无法读取模拟传感器。树莓派的 GPIO 引脚是数字的,是二进制的 - 它们只能检测高 (1) 或低 (0) 电压。

这些程序所做的是计时电荷充满电容器需要多长时间。电容器就像一块微型可充电电池。

如果光线充足,LDR 会让大量电流通过,电容器会迅速充满。如果光线不足,LDR 只会让少量电流通过,电容器会缓慢充满。

当电容器充满时,它会突然释放所有电荷。树莓派可以检测到这一点,因为它表示为高 (1) 并停止计时器。

然后 LightSensor 对象将此时间测量值反转,以表示“亮度值”。

value = 1 – (充满电容器所需的时间)

电容器非常灵敏,因此所需的时间只占几分之一秒!

高级主题

[编辑 | 编辑源代码]

看看 lightsensor3.py 程序。在这个程序中,我们正在测试三种亮度级别 - 黑暗、中等和明亮 - 并使用 PWMLED 对象来设置 LED 的亮度,而不是简单地打开或关闭它。

最后,还有 lightsensor-old.py 程序。这使用了一种不太先进的方法来测量光线 - 它不使用 LightSensor 对象,而是实际上计时电容器充满需要多长时间,以毫秒为单位并显示此时间。

准备工作

[编辑 | 编辑源代码]

如果您的导师没有准备您的树莓派和设备,或者您没有导师,您可以在开始之前按照以下说明进行设置。

eBay 是购买电子元件的好地方。您需要

  • 运行 Raspbian 操作系统的树莓派。本教程适用于迄今为止的所有型号,包括 A、A+、B、B+ 和 2B。
  • 无焊接面包板 - 我们使用的是一个 25 点的小型面包板,但任何无焊接面包板都可以。
  • LED。我们使用的是一个 5 毫米 (mm) 的黄色 LED。它需要足够亮才能触发光电管,因此黄色、绿色或白色通常比红色或蓝色效果更好。
  • 光敏电阻 (LDR),也称为光电管或光电阻。我们使用的是一个 4 毫米 (mm) 的 2-20k 欧姆 LED。
  • 电阻器。我们使用了 220 欧姆的电阻器,但 220 欧姆到 470 欧姆之间的任何电阻器都可以。
  • 三条 20 厘米 (cm) 的公对母跳线
  • 两条 10 厘米 (cm) 的母对母跳线
  • 一条 20 厘米 (cm) 的母对母跳线

更新您的树莓派

[编辑 | 编辑源代码]

请使用最新的 Raspbian Jessie 安装。这应该已经安装了 GPIOZero。

您可以通过转到终端(菜单 - 附件 - 终端)并键入以下内容来创建文件夹结构并下载文件

cd
mkdir python
cd python
curl -O http://cotswoldjam.org/downloads/2018-09/lightsensor.zip
unzip lightsensor.zip

…其中 -O 是一个减号,后跟一个大写字母 O(而不是数字零)。

本教程的原始 PDF 文件位于 Wikimedia Commons 上:Cjam-light-sensor-nightlight.pdf

lightsensor1.py

[编辑 | 编辑源代码]
from gpiozero import LightSensor
from time import sleep
sensor=LightSensor(18)
while True:
 print (sensor.value)
 sleep(0.2)

lightsensor2.py

[编辑 | 编辑源代码]
from gpiozero import LightSensor, LED
from time import sleep
sensor=LightSensor(18)
led=LED(25)
sensor.threshold=0.1
while True:
 print (sensor.value)
 if ( sensor.light_detected ):
 led.off()
 else:
 led.on()
 sleep(0.2)

lightsensor3.py

[编辑 | 编辑源代码]
from gpiozero import LightSensor, PWMLED
from time import sleep
sensor=LightSensor(18)
led=PWMLED(25)
sensor.threshold=0.1
while True:
  print (sensor.value)
  if ( sensor.value <= 0.1 ):
    led.value=1
  if ( sensor.value > 0.1 and sensor.value < 0.3 ):
    led.value=0.5
  if ( sensor.value >= 0.3 ):
    led.value=0
  sleep(0.2)

lightsensor-old.py

[编辑 | 编辑源代码]
# Set up GPIO using the old method before we had GPIOZero
import RPi.GPIO as GPIO
from time import time,sleep
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
sensor=18

while True:
  # Make sure the capacitor is fully discharged
  # Make pin 18 an output and set it to low voltage
  GPIO.setup(sensor, GPIO.OUT)
  GPIO.output(sensor, GPIO.LOW)
  # Give it a hundredth of a second to fully discharge
  sleep(0.01)

  # Make pin 18 an input and count how long it takes to stop being low
  GPIO.setup(sensor, GPIO.IN)
  # Count how long it takes to charge back up again
  # More light = faster charge
  start=time()
  while (GPIO.input(sensor) == GPIO.LOW):
    # The pass command literally does nothing
    # We use it to wait while the sensor is low
    pass

  end=time()
  # Print the time taken, to 3 decimal places
  print ("{0:.3f}".format(end-start))
华夏公益教科书