維基少年:樹莓派/樹莓派光敏電阻夜燈
安德魯·奧克利
公共領域 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))