Raspberry Pi Pico: датчик температуры DS18B20 (MicroPython) – один и несколько

В этом руководстве вы узнаете, как подключить датчик температуры DS18B20 к Raspberry Pi Pico и как получать показания температуры, программируя плату с помощью прошивки MicroPython. DS18B20 – это адресуемый датчик температуры, что означает, что вы можете подключить несколько датчиков к одному GPIO. Мы также покажем, как получать температуру с нескольких датчиков DS18B20 одновременно.

Raspberry Pi Pico с датчиком температуры DS18B20 MicroPython один и несколько

Предварительные требования – прошивка MicroPython

Для выполнения этого руководства вам необходимо установить прошивку MicroPython на плату Raspberry Pi Pico. Вам также понадобится IDE для написания и загрузки кода на плату.

Рекомендуемой MicroPython IDE для Raspberry Pi Pico является Thonny IDE. Следуйте следующему руководству, чтобы узнать, как установить Thonny IDE, прошить прошивку MicroPython и загрузить код на плату.

Знакомство с датчиком температуры DS18B20

Датчик температуры DS18B20 – это цифровой датчик температуры с однопроводным интерфейсом (one-wire). Это означает, что для связи с Raspberry Pi Pico ему требуется только одна линия данных (и GND).

Он может питаться от внешнего источника питания или получать питание от линии данных (так называемый «паразитный режим»), что исключает необходимость во внешнем источнике питания.

Распиновка датчика температуры DS18B20

Каждый датчик температуры DS18B20 имеет уникальный 64-битный серийный код. Это позволяет подключить несколько датчиков к одной линии данных. Таким образом, вы можете получать температуру с нескольких датчиков, используя всего один GPIO.

Датчик температуры DS18B20 также доступен в водонепроницаемой версии.

Водонепроницаемая версия датчика температуры DS18B20

Вот краткое описание наиболее важных характеристик датчика температуры DS18B20:

  • Связь по однопроводной шине (one-wire bus)

  • Диапазон напряжения питания: от 3,0 В до 5,5 В

  • Диапазон рабочих температур: от -55°C до +125°C

  • Точность +/-0,5°C (в диапазоне от -10°C до 85°C)

Для получения дополнительной информации обратитесь к даташиту DS18B20.

Необходимые компоненты

Для выполнения этого руководства вам понадобятся следующие компоненты:

Датчик температуры DS18B20 в корпусе Dallas

Подключение датчика температуры DS18B20 к Raspberry Pi Pico

Датчик температуры DS18B20 имеет три вывода: GND, данные и VCC. Датчик температуры DS18B20 может питаться через вывод VDD (нормальный режим) или получать питание от линии данных (паразитный режим). Вы можете выбрать любой режим. Мы предпочитаем использовать нормальный режим.

Распиновка датчика температуры DS18B20

Если вы используете водонепроницаемую версию, вы можете определить каждый вывод по его цвету:

  • черный: GND

  • красный: VDD

  • желтый: линия данных

DS18B20

Raspberry Pi Pico

GND

GND

Data (DQ)

Любой цифровой GPIO (мы будем использовать GPIO22); также необходимо подключить резистор 4,7 кОм между линией данных и VCC

VDD

3V3(OUT)

Вы также можете посмотреть на следующую схему подключения:

Схема подключения DS18B20 к Raspberry Pi Pico (одиночный датчик)

Raspberry Pi Pico с DS18B20 – получение температуры (код MicroPython)

Следующий код считывает температуру с датчика температуры DS18B20 и выводит показания в оболочку MicroPython. В прошивке MicroPython есть встроенный модуль ds18x20, поэтому устанавливать дополнительные библиотеки не требуется.

import machine, onewire, ds18x20, time

ds_pin = machine.Pin(22)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))

roms = ds_sensor.scan()
print('Found DS devices: ', roms)

while True:
  ds_sensor.convert_temp()
  time.sleep_ms(750)
  for rom in roms:
    print(rom)
    tempC = ds_sensor.read_temp(rom)
    tempF = tempC * (9/5) +32
    print('temperature (ºC):', "{:.2f}".format(tempC))
    print('temperature (ºF):', "{:.2f}".format(tempF))
    print()
  time.sleep(5)

Посмотреть исходный код

Продолжайте читать, чтобы узнать, как работает код, или перейдите к разделу Демонстрация.

Как работает код

Начните с подключения необходимых модулей. Модуль machine для доступа к аппаратному обеспечению, onewire для связи с датчиком(ами) DS18B20, ds18x20 для считывания температуры и time для функций, связанных со временем.

import machine, onewire, ds18x20, time

Определите вывод GPIO, к которому подключен датчик DS18B20. Мы используем GPIO22. Измените код, если вы используете другой вывод.

ds_pin = machine.Pin(22)

Затем инициализируйте датчик DS18B20, создав объект ds18x20 с именем ds_sensor на определенном ранее выводе ds_pin:

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

DS18B20 обменивается данными по однопроводному протоколу связи (one-wire), и каждый датчик имеет уникальный 64-битный серийный код. Это означает, что вы можете считывать температуру с нескольких датчиков, подключенных к одному GPIO.

Следующая строка использует функцию scan() для поиска датчиков DS18B20. Найденные адреса сохраняются в переменной roms (переменная roms имеет тип list).

roms = ds_sensor.scan()

Выведите адрес каждого датчика в оболочку:

print('Found DS devices: ', roms)

Затем идет цикл while, который получает температуру с датчика(ов) DS18B20 каждые 5 секунд.

Вам нужно вызывать функцию convert_temp() для объекта ds_sensor каждый раз, когда вы хотите измерить температуру.

ds_sensor.convert_temp()

Добавьте задержку в 750 мс, чтобы дать достаточно времени для преобразования температуры:

time.sleep_ms(750)

После этого мы можем прочитать температуру по адресам, найденным ранее, используя метод read_temp() и передав адрес в качестве аргумента, как показано в следующей строке кода.

tempC = ds_sensor.read_temp(rom)

По умолчанию температура возвращается в градусах Цельсия. Следующая строка преобразует её в градусы Фаренгейта.

tempF = tempC * (9/5) +32

Поскольку вы можете подключить несколько датчиков к одной линии данных, у нас есть цикл for, который перебирает все адреса и выводит температуру для каждого из них (в данном случае это только один датчик):

for rom in roms:
  print(rom)

В каждой итерации мы выводим температуру в градусах Цельсия и в градусах Фаренгейта. Результат будет иметь два десятичных знака {:.2f}.

print('temperature (ºC):', "{:.2f}".format(tempC))
print('temperature (ºF):', "{:.2f}".format(tempF))

Цикл повторяется каждые пять секунд:

time.sleep(5)

Демонстрация

Сохраните код на плату Raspberry Pi Pico с помощью Thonny IDE или любой другой MicroPython IDE по вашему выбору.

Скопируйте предоставленный код в новый файл в Thonny IDE.

Код MicroPython DS18B20 в Thonny IDE для Raspberry Pi Pico

Скопировав код в файл, нажмите на значок Save (Сохранить). Затем выберите Raspberry Pi Pico.

Сохранение файла на Raspberry Pi Pico в MicroPython IDE

Сохраните файл под именем: main.py.

Сохранение файла main.py в MicroPython Thonny IDE

Примечание

Когда вы называете файл main.py, Raspberry Pi Pico будет запускать этот файл автоматически при загрузке. Если вы назовете его по-другому, он все равно будет сохранен в файловой системе платы, но не будет запускаться автоматически при загрузке.

Перезагрузите плату (отключите и снова подключите её к компьютеру). Нажмите маленькую зеленую кнопку «Run Current Script» (Запустить текущий скрипт) или нажмите F5.

Запуск скрипта в Thonny IDE

Новые показания температуры будут выводиться в оболочку приблизительно каждые пять секунд.

Демонстрация работы датчика DS18B20 с Raspberry Pi Pico и MicroPython

Raspberry Pi Pico с несколькими датчиками температуры (MicroPython)

Датчик температуры DS18B20 обменивается данными по однопроводному протоколу (one-wire), и каждый датчик имеет уникальный 64-битный серийный код, поэтому вы можете считывать температуру с нескольких датчиков, используя всего один GPIO.

Raspberry Pi Pico с несколькими датчиками температуры DS18B20

Подключение нескольких датчиков температуры к Raspberry Pi Pico

Для считывания температуры с нескольких датчиков на одной однопроводной шине вам нужно просто соединить все линии данных вместе, как показано на следующей схеме (в качестве примера мы используем четыре датчика, но вы можете использовать два, три или больше), просто убедитесь, что у вас есть резистор 4,7 кОм на линии данных:

Схема подключения нескольких датчиков DS18B20 к Raspberry Pi Pico

Получение температуры с нескольких датчиков DS18B20

Несколько датчиков температуры DS18B20

Для получения температуры с нескольких датчиков DS18B20 вы можете использовать тот же предыдущий скрипт. Вам нужно просто подключить больше датчиков DS18B20. Эти датчики используют общую линию данных – в данном случае все датчики подключены к GPIO22. Мы просто добавили две строки кода для вывода количества найденных датчиков, остальной код остается прежним.

import machine, onewire, ds18x20, time

ds_pin = machine.Pin(22)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))

roms = ds_sensor.scan()
number_devices = len(roms)
print('Number of found devices: ', number_devices)
print('Adresses: ', roms)

while True:
  ds_sensor.convert_temp()
  time.sleep_ms(750)
  for rom in roms:
    print(rom)

    tempC = ds_sensor.read_temp(rom)
    tempF = tempC * (9/5) +32

    print('temperature (ºC):', "{:.2f}".format(tempC))
    print('temperature (ºF):', "{:.2f}".format(tempF))
    print()

  time.sleep(5)

Посмотреть исходный код

Демонстрация (несколько датчиков)

После сборки схемы, загрузки и запуска кода на Raspberry Pi Pico, плата начнет выводить температуру для каждого датчика.

Сначала будет отображен адрес каждого датчика, а затем соответствующая температура.

Демонстрация работы нескольких датчиков DS18B20 с Raspberry Pi Pico и MicroPython

Заключение

В этом руководстве вы узнали, как подключить датчик температуры DS18B20 к Raspberry Pi Pico и как получать показания температуры с помощью прошивки MicroPython. DS18B20 – это адресуемый датчик температуры. Это означает, что вы можете подключить несколько датчиков к одному GPIO и получать показания температуры со всех датчиков одновременно. Мы также рассмотрели это в нашем руководстве.

Если вам нравится Raspberry Pi Pico, обязательно ознакомьтесь с другими нашими руководствами: