Raspberry Pi Pico應用 – LCD顯示室溫及時間

今天這個應用比較複雜,大家可以把程序多看幾遍以後再開始實作。

Pico板上內建了溫度感測器,對照接腳圖可以看到 Pin 31-35分別標記 ADC0, ADC1, AGND, ADC2 和 ADC_VREF。Pico 板上的溫度感測器沒有實體的引腳,可以透過ADC4來得到數值。

ADC 的存取方式和一般的 GPIO 不同,原因是 GPIO 僅顯示高電位和低電位兩種狀態,而 ADC 會取得不同的電壓數值。Pico 的 ADC 使用 12 位元來計算數值,表示偵測的值可以從 0 到 4095來表示。

Pico板上的傳感器規格,溫度在攝氏 27 度時會提供 0.706V 的電壓,每升高1度,電壓會降低0.001721 伏特。依據這個公式就可以即時計算來自ADC的電壓所代表的溫度。

需要的材料:

LCD1602液晶顯示器 x1

LCD連接模組 x1

麵包板 x1

排線數條


接線方式:

LCD1602 需要5V電壓供電才能顯示字體,而 Pico 提供的是 3.3V ,雖然LCD可以顯示,但字體及背景亮度不足。所以可以改接 Pin40 的VBUS, VBUS 是 micro-USB 的輸入電壓通常是 5V。

我買的LCD直接和連接模組銲接在一起,在LCD的背面可以看到4個接腳,接著依照以下的表格把Pico和LCD連接在一起。



LCD背面照

這裡順帶一提,如果後續執行程式,LCD只有亮起來但是看不到字體,請用小十字起子旋轉照片中右上方的藍色小方塊,這是螢幕的可變電阻,向左或向右轉以後即可看到字體顯示出來,也可以用這個電阻調整LCD的亮度。

連接完成圖

未執行程式前LCD還不會出現時間和溫度,上圖是執行程式後的即時室溫。

Pi Pico是一個微型控制器,所以外接的一些零件都必須再加裝驅動程式。
我們可以到Github這個開源的程式網站下載需要的3個驅動程式。
https://github.com/T-622/RPI-PICO-I2C-LCD

進入網頁後下載以下三個程式到電腦中,點選程式名稱會出現程式碼的網頁,再按右上方下載的圖示即可存到電腦中。請注意不要修改檔名以及變更大小寫,否則後續程式執行會發生錯誤。

lcd_api.py 

pico_i2c_lcd.py

pico_i2c_lcd_test.py



接著把Pico接上電腦,在電腦中按兩下任一個程式,應該會用Thonny開啟程式碼,接著不要修改任何內容,點選Thonny的檔案/另存新檔,會出現以下視窗,再點選Pi Pico。

 


進入對話視窗後先點選右上方選項,建立一個叫lib的新資料夾,把驅動程式存到資料夾中。剩下的兩個程式重複相同的動作,都存到lib的資料夾中。


接著把以下的程式碼在Thonny中輸入,就可以在LCD上看到溫度和時間。
如果室溫比較低,用手握住Pico板後可以看到顯示的溫度會上升。
LCD的功能很多,可以顯示各種字體或是表情圖案等,大家可以在網路上收集相關程式,做更多的嘗試。
程式來自以下網站:
https://atceiling.blogspot.com/2021/03/raspberry-pi-pico51602lcd.html


以下為可以複製的程式碼

import machine

import utime
from machine import ADC
from machine import I2C
from lcd_api import LcdApi
from pico_i2c_lcd import I2cLcd
I2C_ADDR     = 0x27   #LCD1602的I2C位址 
I2C_NUM_ROWS = 2      #LCD 2列數
I2C_NUM_COLS = 16     #LCD16 行數
i2c = I2C(0, sda=machine.Pin(0), scl=machine.Pin(1), freq=400000)   #設定I2C
lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)    
utime.sleep(2)
to_volts = 3.3 / 65535
temper_sensor = ADC(4)   #從ADC(4)取得溫度的電壓值
while True:
    lcd.clear()
    time = utime.localtime()
    
    # 顯示日期及時間
    lcd.putstr("{month:>02d}/{day:>02d} {HH:>02d}:{MM:>02d}:{SS:>02d}".format(
        month=time[1], day=time[2], HH=time[3], MM=time[4], SS=time[5]))
    temper_volts = temper_sensor.read_u16() * to_volts  #取得當時溫度的電壓
   
    celsius_degrees = 27 - (temper_volts - 0.706) / 0.001721    #計算攝氏溫度

    lcd.move_to(0,1)      #游標跳至第二列第一行
    lcd.putstr('TEMP:')    
    lcd.putstr(str(round(celsius_degrees,3)))
    lcd.putstr(' oC')       #用小寫o代替溫度的符號    
    utime.sleep(3)          #暫停3秒鐘
 


留言