2021年2月26日 星期五

Raspberry Pi Pico - 使用 MicroPython 驅動整合型 LCD 顯示 Pico 內部溫度感測器值

網頁最後修改時間:2021/02/27

Raspberry Pi Pico(下面簡稱 Pico)主晶片 RP2040 裡有 5 個 ADC 通道,其中通道 4 是與晶片內部的溫度感測器連接,所以可以在不接任何外部裝置的情況下讀出溫度值,雖然它會受到晶片執行負荷量的影響,讀值會有所偏移,但用於本篇的例子已經足夠!

本篇將會說明:怎麼撰寫 Pico 的 MicroPython 程式驅動(賣場的)整合型 LCD,用來顯示讀取 Pico ADC[4] 後的溫度值。


*********************************************************************************

若須購買 Pico,可參考:Raspberry Pi Pico RP2040 開發板分類賣場

有賣場布拉格網頁可參考,可用於 MicroPython 的週邊裝置:

    *********************************************************************************


    【參考接線圖】

    整合型 LCD 的接線,以 3V3 版本與 Pico 的接法最簡潔,沒有外接調節螢幕亮度的可變電阻,和電壓準位轉換模組;但 5V 版本的就需要。

    {3V3} 整合型 LCD 與 Pico 的接線圖

    因為手邊現有存貨的關係,所以在本文使用的是 5V 版本的整合型 LCD 的接線方式,同時也能看到怎麼使用電壓準位模組在 3V3 和 5V 系統之間接線的方式。

    {5V} 整合型 LCD 與 Pico 的接線圖

    /*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*

    撰寫程式前,Pico 要已經燒錄了 MicroPython;若還沒有且不知怎麼做,看這一篇的說明。

    /*-/--*-*/*/*/*/***//-*-*-**-*/*-*-/*/*/*-*-/-////--/**/**--**/--///--//**----**//--**//**----***//*-**//*


    【掃描 I2C 裝置】

    照著上面接好線後,首先必須要檢查一下是不是能正確通訊?下面這個程式碼可以幫助您來做檢查。

    import machine
    i2c = machine.I2C(0, scl=machine.Pin(1), sda=machine.Pin(0))
    
    print('Scan i2c bus...')
    devices = i2c.scan()
    
    if len(devices) == 0:
      print("No i2c device !")
    else:
      print('i2c devices found:',len(devices))
      for device in devices:  
        print("Decimal address: ",device," | Hexa address: ",hex(device))

    將上面程式碼輸入到 Thonny 中後儲存為檔名 i2c_scan.py ,然後執行它。

    執行之後的結果應該如下面所示,也可以看到整合型 LCD 的 I2C 地址:0x3C

    i2c_scan.py 執行輸出


    【整合型 LCD 的 MicroPython 驅動程式】

    下面這個程式,可以直接在電腦端的 Thonny 執行,不需要先上傳到 Pico,執行後會在 LCD 的第一行印出 Hello World! 的字元。但是,如果想要自訂字元輸出,那麼就要先把這個程式(i2c_jlxlcd.py)先上傳到 Pico 的 / 目錄中,要用的時候再 import 進來就可以。

    程式碼下載

    ** 關於程式碼裡所傳送的 16進位值,只要對照整合型 LCD 商品所附的範例程式碼,就會知道 MicroPython 裡所用的這些值的意思,所以如果之前有購買此商品的用戶,那麼就不需要再贅述;其他的,請使用手邊的 LCD 來完成下面的範例程式。

    如下圖所示,Pico 配有兩個 I2C 通道,但接腳搭配有多種配對組合可用,程式裡面選擇的是 <GP0><GP1> 這兩隻接腳,它所代表的是 I2C 通道 0。

    Raspberry Pi Pico 接腳配置圖

    MicroPython 整合型 LCD 驅動程式裡,現在只有三個函式可用,分別是:

    • lcd_init():LCD 初始化;
    • lcd_clear():清除 LCD 螢幕上所有的東西;
    • lcd_display(line, column, dp):將 dp 字串顯示在第 line 列、第 column 行;
    • lcd_begin():印出 I2C 地址與相關資訊,和 LCD 初始化和清除螢幕,使用 LCD 時至少要執行這一行一次;

    單獨執行整合型 LCD 驅動程式的輸出,如下圖所示。

    i2c_jlxlcd.py 執行輸出


    【MicroPython 取得和轉換 Pico 內部溫度感測器的值】

    Pico 有 5 個 ADC 通道,扣掉一個(ADC[4])給溫度感測器用、一個(ADC[3])給 Pico 硬體偵測電壓用,只剩三個給外部裝置連接用,如下圖所示。

    圖片來源 / Picture Source:RP2040 資料手冊 / RP2040 Datasheet

    不管是讀取哪一個 ADC 通道,MicroPython 的程式碼都一樣,只不過因為需要讀取的是 Pico 內部溫度感測器的值,因此讀取後必須再經過公式才能轉換成溫度值,然後再由整合型 LCD 做顯示,下面就是完整的程式碼。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    from machine import ADC
    from utime import sleep
    from i2c_jlxlcd import *
    
    sensor_temperature = ADC(4)
    conversion_factor = 3.3 / (65535)
    
    lcd_begin()
         
    while True:
    	reading = sensor_temperature.read_u16() * conversion_factor
    	temperature = 25 - (reading - 0.706) / 0.001721
    	output_string = 'Temp: ' + str(temperature)
    	lcd_clear()
    	sleep_ms(10)
    	lcd_display(0, 0, output_string)
    	sleep(2)

    在 Thonny 執行程式後,每隔兩秒程式會讀取一次 Pico 溫度值,該溫度值會直接顯示在整合型 LCD 上;方便佈線起見,麵包板上的螢幕顯示是上下相反的,如下圖所示。

    您可以試著把手指輕觸 Pico 上面的 RP2040 晶片,看看溫度值的變化。

    i2c_jlxlcd.py 執行結果


    【結論】

    使用 MicroPython 來熟悉 Pico 的運作是一個不錯的方式,近期賣場也會推出一個 Pico 的 MicroPython 入門學習套件,裡面的電子零件,除了可用來學習樹莓派官方出的 "Get Started with MicroPython on Raspberry Pi Pico" 這份文件中的程式碼和電路之外,多餘的也可以自己再發揮創意,有興趣的記得關注喔!


    .

    .


    <<部落格相關文章>>


    .

    .

    沒有留言:

    張貼留言

    留言屬名為"Unknown"或"不明"的用戶,大多這樣的留言都會直接被刪除掉,不會得到任何回覆!

    發問問題,請描述清楚你(妳)的問題,別人回答前不會想去 "猜" 問題是什麼?

    不知道怎麼發問,請看 [公告] 部落格提問須知 - 如何問問題 !