跳轉至內容

維基少年:樹莓派/樹莓派光敏電阻夜燈

來自華夏公益教科書,為開放世界提供開放書籍

安德魯·奧克利
公共領域 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))
華夏公益教科書