Giao tiếp BME280 với Raspberry Pi Pico sử dụng microPython

Giao tiếp BME280 với Raspberry Pi Pico sử dụng microPython

Giới thiệu BME280 

Cảm biến BME280 được sử dụng để đo các chỉ số liên quan đến nhiệt độ môi trường, áp suất khí quyển và độ ẩm tương đối. Nó chủ yếu được sử dụng trong các ứng dụng web và di động, nơi tiêu thụ điện năng thấp là điểm mạnh. Cảm biến này sử dụng giao thức I2C hoặc SPI để truyền dữ liệu tới bộ điều khiển micro. Mặc dù có một nhiều phiên bản BME280 khác nhau có sẵn trên thị trường, nhưng ở đây sử dụng phiên bản có hỗ trợ giao thức truyền thông I2C và SPI.

 I2C viết tắt là Inter-Integrated Circuit và hoạt động trên nguyên tắc của hệ thống đa truy cập nhiều master slave dữ liệu đồng bộ. Với BME280 và bộ vi điều khiển, Raspberry Pi Pico đóng vai trò là master và cảm biến BME280 là slave. Raspberry Pi Pico giao tiếp với cảm biến BME280 thông qua giao thức I2C để cung cấp nhiệt độ, áp suất khí quyển và chỉ số độ ẩm tương đối. 

Sơ đồ chân

Hình dưới đây cho thấy cảm biến BME280 và sơ đồ chân của nó. BME280 Pinout Diagram

BME280 Pinout

VCC: kết nối với nguồn 3.3V

SCL: sử dụng đễ nhận xung clock

SDA: sử dụng để gửi và nhận dữ liệu

Sơ đồ đấu nối Raspberry Pi Pico và BME280

Việc kết nối BME280 với Raspberry Pi Pico rất đơn giản. Chúng ta kết nối đầu VCC với 3,3V, nối đất với mặt đất (điểm chung), chân SCL của cảm biến với SCL của bo mạch và SDA của cảm biến với chân SDA của bo mạch. 

Chân hỗ trợ I2C của Raspberry Pi Pico

Raspberry Pi Pico có hai bộ điều khiển giao thức I2C. Cả hai bộ điều khiển I2C đều có thể truy cập thông qua các chân GPIO của Raspberry Pi Pico. Bảng sau đây là kết nối của các chân GPIO với cả hai bộ điều khiển I2C. Mỗi kết nối của bộ điều khiển có thể được cấu hình thông qua nhiều chân GPIO như trong hình. Nhưng trước khi sử dụng bộ điều khiển I2C, nên cấu hình trong phần mềm các chân GPIO mà bạn muốn sử dụng làm bộ điều khiển I2C cụ thể.

Bộ điều khiển giao thức I2C

Các chân GPIO

I2C0 – SDA

GP0/GP4/GP8/GP12/GP16/GP20

I2C0 – SCL

GP1/GP5/GP9/GP13/GP17/GP21

I2C1 – SDA

GP2/GP6/GP10/GP14/GP18/GP26

I2C1 – SCL

GP3/GP7/GP11/GP15/GP19/GP27

Các kết nối chân giữa hai thiết bị đang sử dụng được mô tả như bên dưới.

BME280

Raspberry Pi Pico

VCC

3.3V

SDA

GP0 (I2C0 SDA)

SCL

GP1 (I2C0 SCL)

GND

GND

Chúng tôi đã sử dụng các kết nối giống như được chỉ định trong bảng trên. Tuy nhiên, bạn cũng có thể sử dụng với các kết hợp chân SDA/SCL khác. Sơ đồ kết nốiRaspberry Pi Pico với BME280Sơ đồ kết nối Raspberry Pi Pico với BME280

Thư viện hỗ trợ lập trình BME280 MicroPython

Chúng tôi sẽ phải cài đặt thư viện BME280 cho MicroPython.

 Để thực hiện, hãy mở phần mềm Thonny IDE và Raspberry Pi Pico đang được cắm vào máy tính. Chọn Tools > Manage Packages. Thao tác này sẽ mở Trình quản lý package Thonny.

Raspberry Pi Pico Installing ssd1306 OLED library MicoPython 1

Tìm kiếm “bme280” trong thanh tìm kiếm bằng cách nhập tên của nó và nhấp vào nút 'Tìm kiếm trên PyPI.' Từ các kết quả tìm kiếm sau, nhấp vào kết quả được đánh dấu bên dưới: micropython-bme280 và cài đặt thư viện này. Installing BME280 Micropython library Thonny

Sau một lúc, thư viện này sẽ được cài đặt thành công. Bây giờ đã sẵn sàng lập trình Raspberry Pi Pico với cảm biến BME280 sử dụng MicroPython. 

Đo nhiệt độ, áp suất và độ ẩm sử dụng BME280

Vì đã cài đặt thư viện BME280 cho mạch Raspberry Pi Pico, sau đó sử dụng các chức năng có sẵn trong thư viện BME280 để đọc giá trị cảm biến.

 Bây giờ hãy xem một ví dụ giải thích hoạt động của cảm biến. Kết nối cảm biến BME280 với mạch Raspberry Pi Pico thông qua giao thức I2C như được hiển thị ở trên trong sơ đồ kết nối. Chúng ta sẽ thấy code tập lệnh MicroPython và sau khi tải nó lên bảng mạch, sẽ thấy các chỉ số về nhiệt độ, áp suất và độ ẩm tương đối được in trên màn hình shell console MicroPython. 

BME280 MicroPython Code

Bây giờ, hãy xem tập lệnh MicroPython hỗ trợ BME280 để đọc cảm biến. Sao chép đoạn code sau vào tệp .py và tải tệp lên Raspberry Pi Pico. Tập lệnh MicroPython này đọc các giá trị Áp suất, Nhiệt độ và Độ ẩm từ BME280 qua các bus I2C và in chúng lên màn hình shell console MicroPython. 

from machine import Pin, I2C        #importing relevant modules & classes

from time import sleep

import bme280       #importing BME280 library

 

i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)    #initializing the I2C method 

 

 

while True:

  bme = bme280.BME280(i2c=i2c)          #BME280 object created

  print(bme.values)

  sleep(10)           #delay of 10s

Giải thích code

Đầu tiên, sẽ import các chân và I2C. Chúng ta phải chỉ định chân sử dụng cho giao tiếp I2C. Chúng tôi cũng cần import module sleep để tạo thêm độ trễ 10 giây giữa các lần đọc dữ liệu. Ngoài ra, hãy import thư viện bme280 đã cài đặt trước đó. 

from machine import Pin, I2C        #importing relevant modules & classes

from time import sleep

import bme280       #importing BME280 library

Xác định các chân GPIO Raspberry Pi Pico sử dụng cho BME280

Tiếp theo, chúng ta sẽ khởi tạo các chân I2C GPIO cho SCL và SDA tương ứng.  Chúng ta đã sử dụng các chân I2C0 SCL và I2C0 SDA.

 Tạo một phương thức I2C() có bốn tham số. Tham số đầu tiên là kênh I2C muốn sử dụng. Tham số thứ hai chỉ định chân I2C GPIO của bo mạch được kết nối trên bus SDA. Tham số thứ ba chỉ định chân I2C GPIO của bo mạch được kết nối với chân SCL. Tham số cuối cùng là kết nối tần số.

 Chúng tôi đang đặt chân SCL ở chân 1 và SDA trên chân 0.

i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)

Tiếp theo, chạy một vòng lặp vô hạn bên trong đó tạo một biến object BME280 có tên là bme để truy cập các giá trị đọc của cảm biến thông qua biến này. Chúng tôi sẽ in các giá trị lên các thiết bị đầu ra bằng cách sử dụng lệnh in. Chúng tôi cũng thêm độ trễ 10 giây sau mỗi lần giá trị đọc được hiển thị. 

while True:

  bme = bme280.BME280(i2c=i2c)          #BME280 object created

  print(bme.values)

  sleep(10)           #delay of 10s

Demo

Sau khi bạn đã sao chép đoạn code sau vào tệp, hãy nhấp vào biểu tượng “Save” để lưu code chương trình trên PC. Lưu tệp bằng cách đặt tên cho tệp kết thúc bằng .py và chọn lưu vào thư mục.

 Sau khi đã lưu code, nhấn nút Run để tải code lên module Raspberry Pi Pico.  Trước khi tải code lên, hãy đảm bảo chọn đúng bảng mạch. Raspberry Pi Pico with BME280 Thonny

Bạn sẽ thấy giá trị nhiệt độ(°C), áp suất (hPa) and độ ẩm (%) đang được in trên màn hình shell console. Mỗi bộ giá trị sẽ được cập nhật sau mỗi 10s.

Raspberry Pi Pico hiển thị giá trị cảm biến BME280 lên màn hình OLED

Trong phần này, chúng ta sẽ xem cách hiển thị các giá trị áp suất, nhiệt độ, độ ẩm BME280 trên màn hình OLED 0,96 SSD1306 bằng MicroPython và Raspberry Pi Pico.

Thư viện hỗ trợ lập trình MicroPython hiển thị OLED SSD1306 

Tải thư viện BME280 MicroPython lên bảng mạch Raspberry Pi Pico. Đối với màn hình OLED, sẽ cần tải thư viện lên Raspberry Pi Pico.

 Để thực hiện, hãy mở phần mềm Thonny IDE và Raspberry Pi Pico đang được cắm vào PC. Chọn Tools > Manage Packages. Thao tác này sẽ mở Trình quản lý package Thonny. 

Raspberry Pi Pico Installing ssd1306 OLED library MicoPython 1

•Tìm kiếm “ssd1306” trong thanh tìm kiếm bằng cách nhập tên của nó và nhấp vào nút ‘Search on PyPI.' Raspberry Pi Pico Installing ssd1306 OLED library MicoPython 2

•Từ các kết quả tìm kiếm sau, hãy nhấp vào kết quả được đánh dấu bên dưới: micropython-ssd1306 Raspberry Pi Pico Installing ssd1306 OLED library MicoPython 3

Tải thư viện này.

Raspberry Pi Pico Installing ssd1306 OLED library MicoPython 4

Sau một lúc, thư viện này sẽ được cài đặt thành công. Bây giờ đã sẵn sàng lập trình Raspberry Pi Pico với màn hình OLED. 

Kết nối màn hình SSD1306 OLED với Raspberry Pi Pico và BME280

Cần các thành phần sau để kết nối Raspberry Pi Pico với màn hình OLED và BME280. 

  1. Raspberry Pi Pico

  2. Cảm biên BME280 

  3. Màn hìnhSSD1306 OLED 

  4. Kết nối dây

Màn hình OLED có 4 chân sẽ kết nối với Raspberry Pi Pico. Vì màn hình OLED yêu cầu điện áp hoạt động trong khoảng 3,3-5V nên sẽ kết nối chân VCC với 3,3V, đây sẽ là điểm chung với bo mạch và cảm biến. Chân SCL của màn hình sẽ được kết nối với chân SCL của module và chân SDA của màn hình sẽ được kết nối với SDA của module. Chân đất của cả ba thiết bị sẽ được nối chung.

 Các kết nối giữa ba thiết bị đang sử dụng được mô tả bên dưới.

Màn hình SSD1306 OLED 

Raspberry Pi Pico

BME280

VCC

3.3V

VCC

SDA

GP0 (I2C0 SDA)

SDA

SCL

GP1 (I2C0 SCL)

SCL

GND

GND

GND

Sơ đồ đấu nối Raspberry Pi Pico với màn hình OLED và BME280

Thực hiện theo sơ đồ dưới đây để kết nối đúngRaspberry Pi Pico with BME280 and OLED connection diagramSơ đồ kết nối Raspberry Pi Pico, BME280 và OLED

Raspberry Pi Pico with BME280 and OLED

Code MicroPython: Hiển thị giá trị từ cảm biến BME280 lên màn hình OLED

from machine import Pin, I2C        #importing relevant modules & classes

from time import sleep

import bme280        #importing BME280 library

from ssd1306 import SSD1306_I2C

 

i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)    #initializing the I2C method 

oled = SSD1306_I2C(128, 64, i2c)

 

while True:

  oled.fill(0)

  bme = bme280.BME280(i2c=i2c)        #BME280 object created

  temperature = bme.values[0]         #reading the value of temperature

  pressure = bme.values[1]            #reading the value of pressure

  humidity = bme.values[2]            #reading the value of humidity

 

  print('Temperature: ', temperature)    #printing BME280 values

  print('Humidity: ', humidity)

  print('Pressure: ', pressure)

  

  oled.text("Temp "+temperature, 0, 0)

  oled.text("PA "+pressure, 0, 20)

  oled.text("Humidity "+humidity, 0,40)

  oled.show()                          #display 

  sleep(10)     #delay of 10s

Giải thích code

Phần này sẽ giải thích code MicroPython được sử dụng để hiển thị các giá trị cảm biến lên màn hình OLED. 

Import Library

Import thư viện hỗ trợ lập trình ssd1306 OLED đã cài đặt trước đó. Điều này sẽ giúp truy cập tất cả các chức năng được xác định bên trong nó. 

from ssd1306 import SSD1306_I2C

Tạo biến OLED  

Dữ liệu chân SCL và SDA được lưu vào một biến object 'i2c' sẽ kết nối với bus I2C và giúp giao tiếp giữa hai thiết bị

 Bây giờ, sẽ tạo một biến object ‘oled’ của SSD1306_I2C sử dụng chiều rộng, chiều cao và biến i2c làm tham số. 

oled = SSD1306_I2C(128, 64, i2c)

Xóa màn hình OLED với lệnh led.fill(). 

 oled.fill(0)

Lấy các mẫu giá trị nhiệt độ, độ ẩm và áp suất của cảm biến BME280 và in lên màn hình shell console

  temperature = bme.values[0]         #reading the value of temperature

  pressure = bme.values[1]                      #reading the value of pressure

  humidity = bme.values[2]                   #reading the value of humidity

 

  print('Temperature: ', temperature)    #printing BME280 values

  print('Humidity: ', humidity)

  print('Pressure: ', pressure)

Cuối cùng, hiển thị chữ cùng với giá trị đọc được từ cảm biến trên OLED.

  oled.text("Temp "+temperature, 0, 0)

  oled.text("PA "+pressure, 0, 20)

  oled.text("Humidity "+humidity, 0,40)

Cuối cùng, gọi thuộc tính show() trong object oled để các thay đổi hiển thị trên OLED. Tạo độ trễ 10 giây giữa mỗi lần đọc. 

oled.show()                      

sleep(10) 

Demonstration

Tải code trên dưới dạng tệp .py lên mạch Raspberry Pi Pico. Nhấn nút Run để tải code lên module Raspberry Pi Pico. Bạn sẽ thấy các giá trị nhiệt độ, áp suất và độ ẩm của BME280 trên màn hình OLED như sau: 

Ngoài ra, màn hình shell console cũng hiển thị tập các chỉ số cảm biến BME280: 

màn hình shell console cũng hiển thị tập các chỉ số cảm biến BME280:

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn