Cảm biến nhiệt độ DS18B20 với Raspberry Pi Pico sử dụng MicroPython

Cảm biến nhiệt độ DS18B20 với Raspberry Pi Pico sử dụng MicroPython

Giới thiệu DS18B20

Nó là một cảm biến nhiệt độ có thể lập trình một dây trong tự nhiên. Nó được sử dụng rộng rãi để đo nhiệt độ của các dung dịch hóa học và các chất có trong môi trường cứng. Một trong những lợi thế của việc sử dụng cảm biến này là chúng tôi chỉ yêu cầu một chân duy nhất của bảng Raspberry Pi Pico để truyền dữ liệu. Do đó, việc sử dụng với bộ điều khiển vi mô là vô cùng thuận tiện vì chúng ta có thể đo nhiều nhiệt độ bằng cách sử dụng số lượng chân ít nhất trên bảng phát triển của mình.

Bảng dưới đây cho thấy một số đặc điểm chính của cảm biến ds18b120.

Tính năng

Giá trị

Điện áp hoạt động

3V-5V ·

Phạm vi nhiệt độ

-55 °C đến + 125 °C

Chính xác

±0,5 °C

Độ phân giải đầu ra

9bit đến 12bit

 

Sơ đồ sơ đồ chân

Một phiên bản chống nước của cảm biến này cũng có sẵn trên thị trường. Các số liệu sau đây cho thấy sơ đồ chân của các cảm biến DS18B20.

Sơ đồ sơ đồ sơ đồ chân chống thấm nước DS18B20

Pin ra khỏi DS18B20 không thấm nước

Sơ đồ sau đây cho thấy sơ đồ chân của cảm biến nhiệt độ DS18B20 bình thường.

Sơ đồ sơ đồ chân DS18B20

Bảng dưới đây liệt kê các cấu hình ghim:

Ghim

Mô tả:__________

VCC

Đây là chân cấp nguồn cho cảm biến. 3.3V cho bảng Raspberry Pi Pico

Dữ liệu

Chân này cho giá trị nhiệt độ

Mặt đất

Chân này được kết nối với mặt đất

Chi tiết cấu hình pin DS18B20

Cảm biến nhiệt độ này cũng đi kèm trong một mô-đun gói duy nhất có chứa cảm biến và điện trở kéo lên. Nếu bạn đang sử dụng mô-đun, bạn không cần kết nối điện trở ohm 4.7K bên ngoài. Bởi vì mô-đun đã có một điện trở kéo lên trên tàu.

Mô-đun DS18B20

DS18B20 Ký sinh trùng so với chế độ bình thường

Cảm biến DS18B20 có thể được cấp nguồn ở hai chế độ khác nhau.

Chế độ bình thường: Cảm biến được cấp nguồn thông qua nguồn bên ngoài thông qua chân VDD và điện trở kéo lên 4.7K ohm.

Chế độ ký sinh trùng: Cảm biến thu được nguồn điện từ đường dữ liệu của chính nó. Do đó, không cần nguồn điện bên ngoài.

Phần cứng cần thiết

Bây giờ chúng ta sẽ học cách kết nối cảm biến nhiệt độ với Raspberry Pi Pico. Chúng ta sẽ cần các thành phần sau.

Các thành phần bắt buộc:

  1. Raspberry Pi Pico

  2. Cảm biến DS18B20

  3. Điện trở 4.7k ohm

  4. Breadboard

  5. Dây kết nối

Raspberry Pi Pico với Sơ đồ sơ đồ DS18B20

Như bạn có thể thấy trong sơ đồ sơ đồ bên dưới, chúng tôi đã sử dụng DS10B20 ở chế độ bình thường và cấp nguồn cho cảm biến bằng chân VCC từ chân 3.3V của bảng Raspberry Pi Pico.

Kết nối Raspberry Pi Pico với DS18B20 như thể hiện trong sơ đồ dưới đây:



Raspberry Pi Pico với sơ đồ kết nối ds18b20

Như bạn có thể thấy ở trên, chúng tôi đã cấp nguồn cho cảm biến bằng chế độ bình thường. Cảm biến DS18B20 có ba thiết bị đầu cuối mà chúng ta đã thấy ở trên trong sơ đồ chân. Thiết bị đầu cuối đầu tiên được nối đất với bảng Raspberry Pi Pico. Đường dữ liệu của cảm biến, là cực giữa, được kết nối thông qua GP2 thông qua điện trở kéo lên 4.7k-ohm. Chúng tôi cũng có thể chọn bất kỳ chân GPIO nào khác. Thiết bị đầu cuối thứ ba được cung cấp bởi 3.3V từ Raspberry Pi Pico.

Raspberry Pi Pico với ds18b20

Cài đặt thư viện DS18B20

Đối với dự án này, chúng tôi sẽ yêu cầu hai thư viện: ds18x20.py và onewire.py. Sao chép cả hai thư viện này và lưu chúng trong Raspberry Pi Pico của bạn với các tên tệp tương ứng. Mở một tệp mới trong Thonny. Sao chép các thư viện được cung cấp dưới đây. Lưu chúng vào Raspberry Pi Pico với tên ds18x20.py và onewire.py trong thư mục lib.

ds18x20.py

# DS18x20 temperature sensor driver for MicroPython.

# MIT license; Copyright (c) 2016 Damien P. George

 

from micropython import const

 

_CONVERT = const(0x44)

_RD_SCRATCH = const(0xBE)

_WR_SCRATCH = const(0x4E)

 

 

class DS18X20:

    def __init__(self, onewire):

        self.ow = onewire

        self.buf = bytearray(9)

 

    def scan(self):

        return [rom for rom in self.ow.scan() if rom[0] in (0x10, 0x22, 0x28)]

 

    def convert_temp(self):

        self.ow.reset(True)

        self.ow.writebyte(self.ow.SKIP_ROM)

        self.ow.writebyte(_CONVERT)

 

    def read_scratch(self, rom):

        self.ow.reset(True)

        self.ow.select_rom(rom)

        self.ow.writebyte(_RD_SCRATCH)

        self.ow.readinto(self.buf)

        if self.ow.crc8(self.buf):

            raise Exception("CRC error")

        return self.buf

 

    def write_scratch(self, rom, buf):

        self.ow.reset(True)

        self.ow.select_rom(rom)

        self.ow.writebyte(_WR_SCRATCH)

        self.ow.write(buf)

 

    def read_temp(self, rom):

        buf = self.read_scratch(rom)

        if rom[0] == 0x10:

            if buf[1]:

                t = buf[0] >> 1 | 0x80

                t = -((~t + 1) & 0xFF)

            else:

                t = buf[0] >> 1

            return t - 0.25 + (buf[7] - buf[6]) / buf[7]

        else:

            t = buf[1] << 8 | buf[0]

            if t & 0x8000:  # sign bit set

                t = -((t ^ 0xFFFF) + 1)

            return t / 16

onewire.py

# 1-Wire driver for MicroPython

# MIT license; Copyright (c) 2016 Damien P. George

 

import _onewire as _ow

 

 

class OneWireError(Exception):

    pass

 

 

class OneWire:

    SEARCH_ROM = 0xF0

    MATCH_ROM = 0x55

    SKIP_ROM = 0xCC

 

    def __init__(self, pin):

        self.pin = pin

        self.pin.init(pin.OPEN_DRAIN, pin.PULL_UP)

 

    def reset(self, required=False):

        reset = _ow.reset(self.pin)

        if required and not reset:

            raise OneWireError

        return reset

 

    def readbit(self):

        return _ow.readbit(self.pin)

 

    def readbyte(self):

        return _ow.readbyte(self.pin)

 

    def readinto(self, buf):

        for i in range(len(buf)):

            buf[i] = _ow.readbyte(self.pin)

 

    def writebit(self, value):

        return _ow.writebit(self.pin, value)

 

    def writebyte(self, value):

        return _ow.writebyte(self.pin, value)

 

    def write(self, buf):

        for b in buf:

            _ow.writebyte(self.pin, b)

 

    def select_rom(self, rom):

        self.reset()

        self.writebyte(self.MATCH_ROM)

        self.write(rom)

 

    def scan(self):

        devices = []

        diff = 65

        rom = False

        for i in range(0xFF):

            rom, diff = self._search_rom(rom, diff)

            if rom:

                devices += [rom]

            if diff == 0:

                break

        return devices

 

    def _search_rom(self, l_rom, diff):

        if not self.reset():

            return None, 0

        self.writebyte(self.SEARCH_ROM)

        if not l_rom:

            l_rom = bytearray(8)

        rom = bytearray(8)

        next_diff = 0

        i = 64

        for byte in range(8):

            r_b = 0

            for bit in range(8):

                b = self.readbit()

                if self.readbit():

                    if b:  # there are no devices or there is an error on the bus

                        return None, 0

                else:

                    if not b:  # collision, two devices with different bit meaning

                        if diff > i or ((l_rom[byte] & (1 << bit)) and diff != i):

                            b = 1

                            next_diff = i

                self.writebit(b)

                if b:

                    r_b |= 1 << bit

                i -= 1

            rom[byte] = r_b

        return rom, next_diff

 

    def crc8(self, data):

        return _ow.crc8(data)

MicroPython Raspberry Pi Pico DS18B20 : Nhận giá trị nhiệt độ

Sau khi tải hai thư viện được đề cập ở trên lên Raspberry Pi Pico của chúng tôi, hãy để chúng tôi lập trình bo mạch của mình bằng cảm biến ds18b20.

Bây giờ chúng ta hãy xem xét một ví dụ để cho thấy hoạt động của cảm biến. Chúng tôi sẽ kết nối cảm biến ds18b20 của mình với Raspberry Pi Pico như được hiển thị ở trên trong sơ đồ kết nối. Chúng ta sẽ thấy một mã tập lệnh MicroPython và sau khi tải nó lên bảng của chúng ta, chúng ta sẽ thấy các số đọc hiện tại về nhiệt độ được in trên thiết bị đầu cuối vỏ MicroPython.

Mã MicroPython DS18B20

Bây giờ chúng ta hãy xem xét tập lệnh MicroPython cho DS18b20 để có được kết quả đọc cảm biến. Sao chép đoạn mã sau vào tệp main.py và tải tệp main.py lên Raspberry Pi Pico.

Tập lệnh MicroPython này đọc các giá trị Nhiệt độ từ DS18B20 và in chúng trên bảng điều khiển shell MicroPython.

import machine, onewire, ds18x20

from time import sleep

 

ds_pin = machine.Pin(2)

 

ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))

 

roms = ds_sensor.scan()

 

print('Found DS devices')

print('Temperature (°C)')

 

while True:

 

  ds_sensor.convert_temp()

 

  sleep(1)

 

  for rom in roms:

 

    print(ds_sensor.read_temp(rom))

 

  sleep(3)

Mã hoạt động như thế nào?

Nhập thư viện

Đầu tiên, chúng tôi sẽ nhập mô-đun máy. Chúng tôi cũng nhập mô-đun giấc ngủ để chúng tôi có thể thêm độ trễ giữa các lần đọc của chúng tôi. Ngoài ra, nhập một dây và thư viện ds18x20 mà chúng tôi vừa tải lên bảng của mình.

import machine, onewire, ds18x20

from time import sleep

Tiếp theo, chúng ta sẽ tạo một instance của class Pin với tên đối tượng là ds_pin và set GP2 làm chân dòng dữ liệu DS18B20. Phương pháp DS18X20()

ds_pin = machine.Pin(2)

 

ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))

Phương pháp quét() quét tất cả các cảm biến DS18B20 được kết nối với chân ds_sensor và lưu địa chỉ 64 bit của mỗi cảm biến trong một biến danh sách là "roms". Sau đó, chúng tôi sẽ sử dụng các địa chỉ này để đọc từng địa chỉ từ cảm biến một.

roms = ds_sensor.scan()

 

print('Found DS devices')

Sau đó gọi đối tượng trên phương thức convert_temp() trước khi đọc nhiệt độ từ cảm biến bằng địa chỉ duy nhất của nó.

Để đọc nhiệt độ, sử dụng quy trình read_temp() trên đối tượng ds_sensor và chuyển một địa chỉ được lưu trữ trong danh sách roms. Cảm biến nhiệt độ DS18B20 cung cấp đầu ra dữ liệu ở dạng dữ liệu nổi. Số đọc nhiệt độ hiện tại sẽ được in trong thiết bị đầu cuối vỏ sau mỗi 3 giây.

while True:

 

  ds_sensor.convert_temp()

 

  sleep(1)

 

  for rom in roms:

 

    print(ds_sensor.read_temp(rom))

 

  sleep(3)

Demo

Để kiểm tra tập lệnh MicroPython cho DS18B20 với Raspberry Pi Pico, hãy tải tệp main.py lên bảng của bạn.

Bạn sẽ thấy các giá trị Nhiệt độ trên bảng điều khiển shell liên tục cập nhật lên các giá trị mới sau mỗi 3 giây.

Số đọc cảm biến Raspberry Pi Pico DS18B20 trên vỏ

Raspberry Pi Pico Display DS18B20 Giá trị cảm biến trê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ị Nhiệt độ DS18B20 trên màn hình OLED SSD0 96.1306 bằng MicroPython và Raspberry Pi Pico.

Màn hình OLED SSD1306 Thư viện MicroPython

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

  • Để làm điều đó thành công, hãy mở Thonny IDE của bạn với Raspberry Pi Pico được cắm vào hệ thống của bạn. Đi tới Công cụ > Quản lý gói. Điều này sẽ mở ra Trình quản lý gói Thonny.

Raspberry Pi Pico Cài đặt ssd1306 Thư viện OLED 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 'Tìm kiếm trên PyPI.'

Raspberry Pi Pico Cài đặt ssd1306 Thư viện OLED 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 Cài đặt ssd1306 Thư viện OLED MicoPython 3

Cài đặt thư viện này.

Raspberry Pi Pico Cài đặt ssd1306 Thư viện OLED MicoPython 4

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

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

Chúng tôi sẽ cần các thành phần sau để kết nối Raspberry Pi Pico của chúng tôi với Màn hình OLED và DS18B20.

  1. Raspberry Pi Pico

  2. Cảm biến DS18B20

  3. Màn hình OLED SSD1306

  4. Dây kết nối

Màn hình OLED có 4 thiết bị đầu cuối mà chúng tôi 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 phạm vi 3.3-5V, do đó chúng tôi sẽ kết nối thiết bị đầu cuối VCC với 3.3V, điểm chung với bo mạch và cảm biến. SCL của màn hình sẽ được kết nối với chân SCL của mô-đun và SDA của màn hình sẽ được kết nối với SDA của mô-đun. Mặt bằng của cả ba thiết bị sẽ được tổ chức chung.

Raspberry Pi Pico Chân I2C

Raspberry Pi Pico có hai bộ điều khiển. 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 cho thấy 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, bạn nên định cấu hình trong phần mềm chân GPIO nào bạn muốn sử dụng với bộ điều khiển I2C cụ thể.

Bộ điều khiển I2C

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 giữa ba thiết bị mà chúng tôi đang sử dụng có thể được nhìn thấy bên dưới.

Màn hình OLED SSD1306

Quả mâm xôi 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 tương tự như được chỉ định trong bảng trên. Tuy nhiên, bạn cũng có thể sử dụng các kết hợp chân SDA / SCL khác.

 

DS18B20 ·

Raspberry Pi Pico

VCC

3.3V

Dữ liệu

GP2 ·

GND ·

GND ·

Sơ đồ Raspberry Pi Pico với OLED và DS18B20

Thực hiện theo sơ đồ dưới đây kết nối chúng cho phù hợp.

Raspberry Pi Pico với ds18b20 và sơ đồ kết nối OLED

Raspberry Pi Pico với ds18b20 và OLED

Mã MicroPython: Hiển thị số đọc DS18B20 trên Màn hình OLED

import machine, onewire, ds18x20

from machine import Pin, I2C

from time import sleep

from ssd1306 import SSD1306_I2C

 

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

oled = SSD1306_I2C(128, 64, i2c)

 

ds_pin = machine.Pin(2)

 

ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))

 

roms = ds_sensor.scan()

 

print('Found DS devices')

print('Temperature (°C)')

 

while True:

 

  ds_sensor.convert_temp()

 

  sleep(1)

 

  for rom in roms:

 

    print(ds_sensor.read_temp(rom))

    oled.fill(0)

    oled.text("Temperature (C)", 0, 16)

    oled.text(str(ds_sensor.read_temp(rom)), 0, 35)

    oled.show()

 

  sleep(3)

Mã hoạt động như thế nào?

Trong phần này, chúng tôi sẽ giải thích mã MicroPython được sử dụng để hiển thị các giá trị cảm biến trên OLED.

Nhập thư viện

Chúng tôi sẽ nhập ssd1306 là thư viện màn hình OLED mà chúng tôi đã cài đặt trước đó. Điều này sẽ giúp chúng ta 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

Khởi tạo OLED

Dữ liệu chân SCL và SDA được lưu trong đối tượng '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ờ, chúng ta sẽ tạo một đối tượng 'oled' của SSD1306_I2C sử dụng width, height và đối tượng i2c làm tham số.

oled = SSD1306_I2C(128, 64, i2c)

Xóa màn hình OLED với led.fill() thường xuyên.

 oled.fill(0)

Lấy mẫu nhiệt độ cảm biến DS18B20 và in chúng trong đầu nối vỏ.

ds_sensor.convert_temp()

 

  sleep(1)

 

  for rom in roms:

 

    print(ds_sensor.read_temp(rom))

Cuối cùng, hiển thị văn bản cùng với cảm biến đọc trên OLED.

oled.text("Temperature (C)", 0, 16)

    oled.text(str(ds_sensor.read_temp(rom)), 0, 35)

Cuối cùng, hãy gọi phương thức show() trên phương thức oled để các thay đổi hiển thị trên OLED. Thêm độ trễ 3 giây giữa mỗi lần đọc.

oled.show()

 

  sleep(3) 

 

 

 

 

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