Raspberry Pi 筆記(36):光照度感測模組GY-30(BH1750FVI )- 模擬特雷門

我們日常生活中有一種狀況是,當車輛開進室內停車場時,如果室內光線不足,很容易就影響駕駛者的視線。如果能在車輛進入較暗的室內時,自動開啟燈光,補足照明,就可以減少碰撞的發生。國內一般比較高級的車款都會配備這項功能,這個實驗我們嘗試以光照度感應的數值,判斷光線不足時,開啟 LED模擬打開車燈。另外一個有趣的實驗是「特雷門」樂器是用震盪頻率的改變來製造聲音。為什麼在這裡提到特雷門呢?因為我想試著用光度的變化來產生不同頻率的聲音。藉由線的變化,發出不同聲音,因為光度比較難掌控,發出來的聲音不夠準確,要演奏的難度很高,但是就當作是個好玩的實驗。


[特雷門]

特雷門這個樂器是在 1919年發明,樂器包含有兩個像天線的突出構造,一個是長直金屬桿,一個是環狀的水平金屬圈, 垂直桿控制音頻率高低,水平環狀圈控制音量大小。原理是利用手與天線構造的距離遠近,改變其電容之大小,而影響其振盪迴路之振盪頻率。
由於音色特殊,早期許多電影的恐怖氣氛都是用它來營造的。
不過因為手的位置沒有明顯的記號可參考,完全靠演奏者的感覺,音準控制不易,操作起來有相當的難度,極少人專精此項樂器。[維基百科]

來源:維基百科

[照度單位]

勒克斯 (Lux,通常簡寫為lx) 是一個標識照度的國際單位制單位,1流明每平方米面積,就是1勒克斯。也就是1勒克斯表示每平方米有1流明。

1勒克斯 = 1 流明/平方米 = 1 燭光·球面度/平方米(1 lx = 1 lm/m2= 1 cd·sr·m2)。

流明(英語:Lumen), 號為lm。是光通 的國際單位制的導出單位(derived unit),是從一光源放射出的可見光的量度。光通量(luminous flux)與輻射通量(radiant flux)不同,輻射通量是所有電磁波發光總功率的量度,而光通量量度則反映了人眼對不同波長光的變化敏感度。如果一個光源發射1燭光的發光強度到1個立體角的範圍裡,則到那個立體角的總發射光通量就是一流明。


[GY-30 光照度感測模組]

實驗所用的模組是 GY-30,主要是 BH1750FVI 這個 IC 的功能,模組的特點包括:

• 電源:DC3 ~ 5V
• 感測範圍:1 ~ 65535 Lux
• 感測器內置16bit,AD轉換器直接數位輸出,省略複雜的計算
• 不區分環境光源、接近於視覺靈敏度的分光特性
• 可對廣泛的亮度進行1Lux的高精度測定
• 受到紅外線影響非常小
• 標準NXP IIC通信協定
• 模組內部包含通信電位轉換,與 5v 開發板直接連接


[接線圖]


• GY-30 模組連接線路
GY-30模組
Raspberry Pi
GND Ground
Pin 14 GND
ADD Address select
Pin 6 GND
SDA  I2C SDA
Pin 3 GPIO 2
SCL  I2C SCL
Pin 5 GPIO 3
VCC 3.3V
Pin 1 3.3V

Pin 11 GPIO 17 LED

[程式一]

當照度值小於300 時,開啟 LED 燈。

#!/usr/bin/python
import smbus
import time
import sys
import os
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)

# Define some constants from the datasheet
DEVICE     = 0x23 # Default device I2C address

ONE_TIME_HIGH_RES_MODE_1 = 0x20
ONE_TIME_HIGH_RES_MODE_2 = 0x21

num = 0
LED = 11
GPIO.setup(LED,GPIO.OUT)

bus = smbus.SMBus(1)  # Rev 2 Pi uses 1
def convertToNumber(data):
  # 將 2位元轉成數字
  return ((data[1] + (256 * data[0])) / 1.2)

def readLight(addr=DEVICE):
  data = bus.read_i2c_block_data(addr,ONE_TIME_HIGH_RES_MODE_2)
  return convertToNumber(data)

def main():

  while True:
    num = readLight()
    print "Light Level : " + str(num) + " lx"
    if num < 300:
       GPIO.output(LED,GPIO.HIGH)
    else:
       GPIO.output(LED,GPIO.LOW)
    time.sleep(0.2)

if __name__=="__main__":
   main()


[程式一執行結果]


[程式二]

要執行本程式前,需先安裝 sox 套件,執行指令如下:

$ sudo apt-get install sox

安裝完成後,就有一個 play 程式可播放聲音,透過光的照度變化產生不同聲音:

#!/usr/bin/python
import smbus
import time
import sys
import os

DEVICE     = 0x23 # Default device I2C address

ONE_TIME_HIGH_RES_MODE_1 = 0x20
ONE_TIME_HIGH_RES_MODE_2 = 0x21

bus = smbus.SMBus(1)  # Rev 2 Pi uses 1

def convertToNumber(data):
  # 將 2位元轉成數字
return ((data[1] + (256 * data[0])) / 1.2) def readLight(addr=DEVICE): data = bus.read_i2c_block_data(addr,ONE_TIME_HIGH_RES_MODE_2) return convertToNumber(data) def main(): while True: print "Light Level : " + str(readLight()) + " lx"
    # 呼叫作業系統程式 play
    str2 = 'play -n -q synth .07 sin ' + str(readLight())
    os.system(str2)
#   time.sleep(0.1)  // Control Speed

if __name__=="__main__":
   main()

[程式二執行結果]


[參考資料]

• raspberrypi-spy:BH1750FVI I2C Digital Light Intensity Sensor

Post a Comment

較新的 較舊