维基少年:树莓派/树莓派光敏电阻夜灯
安德鲁·奥克利
公共领域 2018 年 9 月 15 日
www.cotswoldjam.org
LED 必须始终与电阻一起连接。如果你不使用电阻连接,LED 会烧毁并且可能无法再次工作。 |
发光二极管 (LED) 有一条短脚和一条长脚。如果你摸摸它的边缘,你还会发现一个平边。短脚和平边始终连接到负极 (地线)。
电阻 可以任意方向连接。阻值越低 (欧姆值越低) 的电阻允许通过更多的电流,使 LED 更亮;阻值越高的电阻允许通过更少的电流,使 LED 更暗。我们使用的是一个 220 欧姆的电阻,但任何 220-470 欧姆的电阻都可以正常工作。
光敏电阻 (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)
将电阻连接到两根 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
from gpiozero import LightSensor
from time import sleep
sensor=LightSensor(18)
while True:
print (sensor.value)
sleep(0.2)
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)
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)
# 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))