NodeMCU與感測器

使用嵌入式系統其中一個最主要的目的就是希望能夠收集環境中的資訊,而這些資訊就需要透過感測器來加以實現。在這個單元中,我們將逐一介紹一些方便好用的感測器。

溫濕度感測器

最常用的感測器非溫濕度感測器莫屬了,在NodeMCU的MicroPython已經有可以直接使用的模組,在程式中可以直接使用import引入使用。常見的溫濕度感測器有以下這兩種:

它們分別是DHT11和DHT22,詳細的規格如下面這個網址上的說明:

元件本身都是4支接腳,但是做成模組之後,只保留3支腳,實際使用上也只要這3支腳就可以了。在這個單元練習中使用的是3支腳的DHT11模組。仔細觀察模組的外觀可以看到板子上的標示,其中右邊是「-」,也就是要連接到負極(GND),中間沒有標的地方是「+」,要連接到正極(也就是電源處),左側的「S」接腳,就是要連接訊號信的地方,也就是NodeMCU的輸入埠。

和NodeMCU連接的方式非常簡單,只要把正負接腳連接到擴充板的3V和GND輸出,然後把「S」訊號接腳連接到NodeMCU的D2接腳就可以了。如下圖所示:

近一點看的話如下圖所示:

接著就是連上NodeMCU的MicroPython Shell,輸入以下程式:

import dht
from machine import Pin
d = dht.DHT11(Pin(4))
d.measure()
d.temperature() #溫度
d.humidity() #濕度

別忘了,參考NodeMCU的腳位圖,D2其實是GPIO4,所以在程式中是操作時是設定第4支腳(Pin(4))

執行的結果如下所示:

上面這個例子是攝氏溫度,如果要改為華氏的話,透過以下的公式就可以輕鬆轉換了:

f=c95+32f = c * \frac{9}{5}+32

以下是每2秒即輸出目前的溫濕度的程式,總共會輸出10次資訊:

import dht
import time
from machine import Pin
d = dht.DHT11(Pin(4))
for i in range(10):
d.measure()
print("{}, {}%".format(d.temperature(), d.humidity()))
time.sleep(2)

光感測器

NodeMCU本身有一個Pin可以作為類比輸入之用,它是接腳A0。而在這裡用來量測亮度的感測模組是下面這個:

它的底下有4支接腳,從左至右分別是類比輸出、數位輸出、GND、以及正電源。只要把A0連接到NodeMCU的A0,然後再接上電源,就可以使用這個感測器了。連接的方式如下:

NodeMCU上的連接方式:

這個模組還有一個D0可以直接拿來當作是開關之用,模組板上的可變電阻就是調整靈敏度用的。

然後,就可以使用以下的程式顯示出目前的亮度值:

from machine import ADC
import time
adc = ADC(0)
for i in range(50):
print(adc.read())
time.sleep(0.5)

煙霧感測器

接下來要實習的是煙霧感測器,我們這次用的是Keyes的煙霧感測模組,其外觀如下:

和光感測模組類似,它需要5V的電源輸入以及GND接地。另外,上圖那個OUT接腳要接上NodeMCU的A0接腳,也就是它使用的也是類比的輸入。由於NodeMCU只有一個類比輸入接腳,因此除非加上多工器的功能,不然的話,同一個時間只能連接一個類比輸入感測器,也就是上面的煙霧感測器和光感測器只能連接其中一個。

煙霧感測器的連接方式如下:

至於程式呢,則是和光感測器的一模一樣喔。

LED與感測器的整合

還記得在前一個單元中,我們使用了8顆LED做了一個簡單的電子輪盤遊戲嗎?同樣的8顆LED,這次我們打算把它變成一個亮度指示器。回憶一下之前8顆LED的樣子:

這次加上前面測試的光感測器,記得加上電源以及連接上A0,如下所示:

使用以下的程式,就可以透過亮度來顯示不同數量的LED燈號了:

from machine import ADC
from machine import Pin
import time
led_no = [16,5,4,0, 2, 14, 12, 13]
def switch_off():
for led in leds:
led.off()
leds = list()
for i in range(len(led_no)):
led = Pin(led_no[i], Pin.OUT)
leds.append(led)
adc = ADC(0)
while True:
switch_off()
level = adc.read()
led = int(level/400 * 8)
for i in range(led):
leds[i].on()

上面這個程式在亮度愈暗的時候,顯示的燈光數愈多,如下所示:

繼電器與感測器的整合

我們使用的繼電器模組是下面這個:

同樣地,它有3支接腳,自左而右分別是信號、正電源以及GND。由於繼電器需要比較大的電壓,因此只能夠過外接的5V電源或是NodeMCU擴充板上的5V電源才推得動,無法直接使用NodeMCU主板上的3.3V電源喔。

接著,我們把它和光感測器一起使用在NodeMCU上,如下所示:

把繼電器的S信號線連接到D2,也就是第4支接腳,正負電源接到擴充板的USB電源輸出的地方,然後執行以下的程式:

from machine import Pin
from machine import ADC
relay = Pin(4, Pin.OUT)
while True:
if adc.read() > 500:
relay.on()
else:
relay.off()

以下是執行的結果示範: