Датчика температуры DS18B20 уже подключали в Linux, значение температуры считывали, используя виртуальную файловую систему Sysfs. Теперь будем считывать температуру датчика DS18B20 из dotnet кода.
Оглавление
- Постановка задачи
- Датчик DS18B20
- Схема подключения датчика DS18B20
- Файл наложения устройств DTS для включения 1-Wire протокола
- Подготовка устройства
- Подготовка среды запуска (ПК)
- Получение значения температуры датчика DS18B20 из .NET кода
- Литература
Постановка задачи
Реализовать программу считывания показаний датчика DS18B20 по 1-Wire протоколу из .NET кода.
- Плата Banana Pi BPI-M64 установлена версия Armbian_21.02.1_Bananapim64_bionic_current_5.10.12_minimal.img.xz, основана на Ubuntu 18.04.5 LTS (Bionic Beaver), ядро Linux 5.10.12. uname: Linux bananapim64 5.10.12-sunxi64 #21.02.1 SMP Wed Feb 3 20:42:58 CET 2021 aarch64 aarch64 aarch64 GNU/Linux.
Датчик DS18B20
Датчик температуры основан на популярной микросхеме DS18B20. Он определяет температуру окружающей среды в диапазоне от -55 °C до +125 °C и передаёт данные в виде цифрового сигнала с 12-битным разрешением по протоколу 1-Wire. Этот протокол позволяет подключить огромное количество таких датчиков, используя всего один цифровой порт контроллера и всего два провода для всех датчиков: землю и сигнал. В этом случае применяется так называемое «паразитное питание», при котором датчик получает энергию прямо с линии сигнала. Каждый датчик имеет уникальный прошитый на производстве 64-битный код, который может использоваться микроконтроллером для общения с конкретным сенсором на общей шине. Код каждого сенсора считывается отдельной командой.
В постоянной памяти DS18B20 можно сохранить граничные значения температуры, при выходе из которых сенсор будет переходить в режим тревоги. На общей шине из многих сенсоров микроконтроллер может за раз узнать, какие из них перешли в этот режим. Таким образом легко определить проблемный участок в контролируемой среде.
Разрешение показаний настраивается и составляет от 9 до 12 бит. Меньше разрешение — выше скорость преобразования.
Схема подключения датчика DS18B20
Датчик DS18B20 можно подключить практически на любой контакт 40-контактного разъема совместимого с Raspberry Pi 3. Подключим DS18B20 на №31 контакт разъема, название контакта «PB5».
Принципиальная схема подключения DS18B20 к Banana Pi BPI-M64
Файл наложения устройств DTS для включения 1-Wire протокола
Как формируются файлы наложения устройств (DTS) можно почитать в публикации Работа с GPIO на примере Banana Pi BPI-M64. Часть 2. Device Tree overlays.
Библиотека .NET работающая с DS18B20 является оберткой над sysfs, поэтому для контакта PB5 потребуется сформировать файл DTS для включения 1-Wire протокола.
Создадим файл DTS с названием: sun50i-a64-w1-gpio-pb5.dts:
/dts-v1/; /plugin/; / { compatible = "allwinner,sun50i-a64"; fragment@0 { target = <&pio>; __overlay__ { w1_pb5_pins: w1-pb5-pins { pins = "PB5"; function = "gpio_in"; }; }; }; fragment@1 { target-path = "/"; __overlay__ { onewire@1 { compatible = "w1-gpio"; pinctrl-names = "default"; pinctrl-0 = <&w1_pb5_pins>; gpios = <&pio 1 5 0>; /* PB5 */ status = "okay"; }; }; }; };
Рассмотрим параметры:
- compatible = «w1-gpio» — указание на загрузку драйвера w1-gpio для устройства;
- gpios = <&pio 1 5 0> — адрес контакта PB5, где &pio — ссылка на gpiochip с расположением контакта, 1 — B (нумерация начинается с 0), 5 — 5, 0 — включение инверсии сигнала, в данном не требуется, поэтому значение 0.
Разместим файл по пути /boot/dtb/allwinner/overlay . Затем компилируем файл .dts в .dtbo:
$ dtc -O dtb -o sun50i-a64-w1-gpio-pb5.dtbo sun50i-a64-w1-gpio-pb5.dts
Запустим утилиту конфигурирования платы: armbian-config . Перейдем по меню: System > Hardware, и включим слой (overlay): w1-gpio-pb5.
Включение слоя DTS для датчика DS18B20
После перезагрузки выполним команду:
dmesg | grep -E 'w1|wire'
В результате должны получить примерно такой результат:
Отображение отладочной информации в Linux
Из которого следует что драйвер поддержки включен и был обнаружен один датчик 28.0000034aa0ba.
Для получения значения температуры выполним чтение, командой:
cat /sys/bus/w1/devices/28-0000034aa0ba/w1_slave
Отображение температуры датчика DS18B20 используя sysfs
Текущее значение температуры составляет: 25.5 градусов Цельсия. Датчик работает, теперь переходим к .NET коду.
Подготовка устройства
На плате Banana Pi BPI-M64 должна быть установлена платформа .NET Runtime 5.0 и отладчик vsdbg, как это сделать указано в публикации Удаленная отладка приложения на .NET 5.0 в Visual Studio Code для ARM на примере Banana Pi BPI-M64 и Cubietruck (Armbian, Linux).
Подготовка среды запуска (ПК)
Отладку будем запускать из среды Visual Studio Code на ПК под ОС Windows 7. Как установить и настроить среду в публикации Создание первого приложения на .NET 5.0 в Visual Studio Code для ARM.
Получение значения температуры датчика DS18B20 из .NET кода
Создадим .NET 5.0 консольное приложение — dotnet-iot-ds18b20. Добавим Nuget-пакет System.Device.Gpio и Iot.Device.Bindings. Классы из пространства Iot.Device.OneWire по сути являются обертками над драйвером OneWire в Sysfs. В качестве основы возьмем пример OneWire.Samples.
Разместим в Program.cs Следующий программный код находит первый доступный датчик работающий по протоколу OneWire и считывает его значение:
using System; using System.Linq; using Iot.Device.OneWire; namespace dotnet_iot_ds18b20 { class Program { static void Main(string[] args) { Console.WriteLine("DS18B20!"); var devOneWire = OneWireThermometerDevice.EnumerateDevices().FirstOrDefault(); double temp=devOneWire.ReadTemperatureAsync().Result.DegreesCelsius; Console.WriteLine($"Temperature = {Math.Round(temp, 2, MidpointRounding.AwayFromZero)}"); } } }
Описание кода:
- OneWireThermometerDevice.EnumerateDevices().FirstOrDefault() — метод возвращает первый доступный объект датчика 1-Wire;
- devOneWire.ReadTemperatureAsync().Result.DegreesCelsius — происходит считывание значения, и конвертация по шкале Цельсия.
- Math.Round(temp, 2, MidpointRounding.AwayFromZero) — округление с точностью до 2 знаков после запятой.
Демонстрация работы программного кода
Запуск проекта dotnet-iot-ds18b20 в Visual Studio Code, удаленная отладка на плате Banana Pi BPI-M64
Согласно перечислению enum в библиотеке Iot.Device.OneWire, файл DeviceFamily.cs, помимо датчика DS18B20 поддерживается подключение следующих датчиков, работающих по OneWire протоколу: DS18S20, MAX31820, DS1825, MAX31826, MAX31850, DS28EA00. Все указанные датчики тоже должны работать, но это неточно. Тестирование было проведено только с датчиком DS18B20.
Приложение dotnet-iot-ds18b20 на GitHub — .NET IoT Samples.