曉東
樓道中的聲光雙控燈是一種很常見的利用聲音和光線信號來控制照明的電子裝置,其應用場景是在光線昏暗時對一定強度的響聲做出亮燈“回應”,持續十幾秒鐘后再關閉燈光照明,也就是必須要同時滿足光線較暗和響聲達到一定程度這兩個條件才會“開燈”,否則一直處于“不工作”狀態。在Arduino中,我們可以利用聲音傳感器和光線傳感器來分別檢測環境周圍的聲音與光線強弱,然后分別通過Arduino IDE代碼編程、Python代碼編程和Mind+圖形化編程三種方式,實現“聲光雙控燈”功能。
實驗器材:Arduino UNO主板一個,聲音傳感器一個,光線傳感器一個,紅色LED燈一支,面包板一塊,各種顏色的杜邦線若干。
首先,將LED燈長腿插入13號引腳,短腿插入GND接地引腳;接著,將Arduino的5V和GND與面包板邊緣插槽連接(紅色與藍色標注),再通過杜邦線將聲音傳感器和光線傳感器的VCC正極和GND接地也插接至面包板;然后將聲音傳感器的OUT信號輸出端連接至Arduino的2號數字引腳,光線傳感器的AO模擬信號輸出端連接至Arduino的A2模擬引腳;最后,通過數據線將Arduino與計算機USB接口連接(如圖1)。
首先,在Arduino IDE中通過“int led = 13;”和“int SoundSensorPin = 2;”兩個語句,分別對LED燈和聲音傳感器的連接引腳進行聲明;接著,在setup()函數中通過“pinMode(led,OUTPUT);”和“pinMode(SoundSensorPin,INPUT);”兩個語句,設置13號引腳為輸出模式、2號引腳為輸入模式。
在loop()函數中,先通過“int LightSensorValue
=analogRead(A2);”語句,建立變量LightSensorValue,其值是讀取光線傳感器通過A2模擬引腳的傳輸數據;再通過“int SoundSensorValue = digitalRead(SoundSensorPin);”語句,建立變量SoundSensorValue,其值是讀取聲音傳感器通過2號數字引腳的傳輸數據。
經過實驗測試后發現,正常室內光線時所測得的光線數據是220左右,用手捂住光線傳感器(模擬低光照條件)時測得的光線數據是930左右,而用手電照射光線傳感器時測得的光線數據是20左右,這說明光線越強,數據值越小,光線越弱,數據值越大。通過調節聲音傳感器上的電位器,使其處于一個比較合適的檢測環境周圍聲音強度范圍內,發現“沒有聲音”時的檢測值是1(對應HIGH高電平),“有聲音”時的檢測值是0(對應LOW低電平)。因此在“if…else…”選擇結構中將判斷條件構建為“SoundSensorVal
ue == LOW and LightSensorValue >= 500”,也就是判斷聲音傳感器的檢測值是否為0、光線傳感器的檢測值是否在500以上,當這兩個條件同時滿足時,就應當去控制LED燈發光:“digitalWrite(led,HIGH);”,而且要讓它持續發光3秒:“delay(3000);”。條件不成立的話,LED處于熄滅狀態,在else分支中通過“digitalWrite(led,LOW);”語句來實現(如圖2)。
將程序編譯并上傳Arduino,對聲光雙控燈進行測試:當室內光線處于正常照明狀態時,音箱中音樂的強度再大,LED燈也不會亮;如果用手捂住光線傳感器,此時再播放音樂的話,LED燈就會應聲而亮(如圖3)。同樣,當光線傳感器被捂住時,保持周圍環境處于比較安靜的狀態,LED燈也不會發光。
借助pinpong庫模塊,在PythonIDLE編程環境中對Arduino進行代碼編程。首先,通過“import time”和“from pinpong.board import Board,Pin”語句,導入time和pinpong庫模塊;“Board(“uno”).begin()”語句的作用是實現對Arduino UNO板型的初始化操作(包括連接主板端口號的自動識別);接著,分別建立led、SoundSensor和LightSensor三個變量,分別對應LED燈、聲音傳感器和光線傳感器的聲明設置,語句“led = Pin(Pin.D13, Pin.OUT)”的作用是設置連接在13號引腳的LED燈為信號輸出端,語句“SoundSensor = Pin(Pin.D2, Pin.IN)”的作用是設置連接在2號數字引腳的聲音傳感器為信號輸入端,語句“LightSensor = Pin(Pin.A2, Pin.ANALO
G)”的作用是設置連接在A2模擬引腳的光線傳感器為模擬信號端。