NodeMCU + Max7219

NodeMCU本身並沒有自帶顯示器,除了把從感測器取得的資料透過網際網路傳遞到外界之外,也可以連接一些常見的顯示器以顯示出字元資訊或是數值資料,每一種顯示裝置各有其特色,本次所使用的Max7219是一個比較大型的8×8點陣字元輸出裝置,除了顯示數字之外也可以顯示大小寫文字及各種字元符號。以下是max7219的外觀(以下是由4個8×8點陣式LED所組成的):

雖然看起來有非常多的LED,但是其中大部份的工作都已被裡面的IC幫我們完成了,因此,其實它只有少少的5條線需要連接。背面看起來如下所示:

其中,VCC和GND不用說,當然就是分別接到5V電源和接地,我們直接把它們接到NodeMCU的控充板所提供的USB電源處。另外的三條線,DIN,CS,以及CLK,則分別接到D7,D8,和D5,如下所示:

這樣就連接好囉。在程式方面,它需要一個驅動程式max7219,這很容易,只要前往以下的網址,把這個檔案利用ampy上傳到板子上就可以了,除了使用ampy之外,也可以在Mu Editor上的File檔案管理上傳到板子裡面。

https://github.com/mcauser/micropython-max7219

我們需要的是上面這個網頁中的max7219.py這個檔案,

在Mu Editor的檔案管理上看起來像是以下這個樣子:

結合上一篇文章中取得DHT11溫濕度感測器的方法,以下的程式碼可以定期的讓這個顯示器顯示出現在的溫度以及濕度:

from machine import Pin, SPI
import max7219
import time, dht
d = dht.DHT11(Pin(16))
spi = SPI(1, baudrate=10000000, polarity=0, phase=0)
disp = max7219.Matrix8x8(spi, Pin(15), 4)
disp.brightness(1)
while True:
    d.measure()
    disp.fill(0)
    disp.text("{}c".format(d.temperature()), 0, 0, 1)
    disp.show()
    time.sleep(1)
    disp.fill(0)
    disp.text("{}%".format(d.humidity()), 0, 0, 1)
    disp.show()
    time.sleep(2)

上述程式的執行結果如下:

除了即時顯示溫濕度之外,有時候我們也會利用這個顯示器來顯示文字,但因為它一次只能顯示4個字元,所以我們需要利用一些簡單的字串處理技巧來讓訊息內容以捲動的方式來顯示出所有的字元的內容,程式碼如下:

from machine import Pin, SPI
import max7219
import time
spi = SPI(1, baudrate=10000000, polarity=0, phase=0)
disp = max7219.Matrix8x8(spi, Pin(15), 4)
disp.brightness(1)
msg = "We love Python!   "
while True:
    disp.fill(0)
    disp.text(msg[:4], 0, 0, 1)
    disp.show()
    time.sleep(1)
    msg = msg[1:] + msg[0]

上述程式的執行結果如下:

以下程式結合了網路校時以及時間。溫濕度顯示的功能:

from machine import Pin, SPI
import max7219
import time, network, dht
from ntptime import settime
spi = SPI(1, baudrate=10000000, polarity=0, phase=0)
disp = max7219.Matrix8x8(spi, Pin(15), 4)
disp.brightness(0)
def show_message(s):
    disp.fill(0)
    disp.text(s, 0, 0, 1)
    disp.show()
    time.sleep(1)

d = dht.DHT11(Pin(16))
wlan = network.WLAN(network.STA_IF)
wlan.connect("ssid", "password")
show_message("-><-")
while not wlan.isconnected():
    pass
show_message("ok")
settime()
while True:
    utc = time.mktime(time.localtime())
    data = time.localtime(utc+28800)
    show_message(str(data[0]))
    show_message("{:>2d}{:>2d}".format(data[1], data[2]))
    show_message("{:>2d}{:>2d}".format(data[3], data[4]))
    d.measure()
    show_message("{}c".format(d.temperature()))
    show_message("{}%".format(d.humidity()))

使用上述的程式碼別忘了要修改ssid和password才能夠正常運作。以下是執行的結果:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *