.NET IoT. Часть 3. Подключение датчика температуры DS18B20

Датчика температуры DS18B20 уже подключали в Linux, значение температуры считывали, используя виртуальную файловую систему Sysfs. Теперь будем считывать температуру датчика DS18B20 из dotnet кода.

Оглавление

  1. Постановка задачи
  2. Датчик DS18B20
  3. Схема подключения датчика DS18B20
  4. Файл наложения устройств DTS для включения 1-Wire протокола
  5. Подготовка устройства
  6. Подготовка среды запуска (ПК)
  7. Получение значения температуры датчика DS18B20 из .NET кода
  8. Литература

Постановка задачи

Реализовать программу считывания показаний датчика DS18B20 по 1-Wire протоколу из .NET кода.

Датчик DS18B20

DS18B20
Датчик DS18B20

Датчик температуры основан на популярной микросхеме DS18B20. Он определяет температуру окружающей среды в диапазоне от -55 °C до +125 °C и передаёт данные в виде цифрового сигнала с 12-битным разрешением по протоколу 1-Wire. Этот протокол позволяет подключить огромное количество таких датчиков, используя всего один цифровой порт контроллера и всего два провода для всех датчиков: землю и сигнал. В этом случае применяется так называемое «паразитное питание», при котором датчик получает энергию прямо с линии сигнала. Каждый датчик имеет уникальный прошитый на производстве 64-битный код, который может использоваться микроконтроллером для общения с конкретным сенсором на общей шине. Код каждого сенсора считывается отдельной командой.

В постоянной памяти DS18B20 можно сохранить граничные значения температуры, при выходе из которых сенсор будет переходить в режим тревоги. На общей шине из многих сенсоров микроконтроллер может за раз узнать, какие из них перешли в этот режим. Таким образом легко определить проблемный участок в контролируемой среде.

Разрешение показаний настраивается и составляет от 9 до 12 бит. Меньше разрешение — выше скорость преобразования.

Схема подключения датчика DS18B20

Датчик DS18B20 можно подключить практически на любой контакт 40-контактного разъема совместимого с Raspberry Pi 3. Подключим DS18B20 на №31 контакт разъема, название контакта «PB5».

DS18B20 with Banana Pi BPI-M64
Принципиальная схема подключения 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 linux armbian DS18B20
Включение слоя DTS для датчика DS18B20

После перезагрузки выполним команду:

dmesg | grep -E 'w1|wire'

В результате должны получить примерно такой результат:

Banana Pi BPI-M64 ds18b20
Отображение отладочной информации в Linux

Из которого следует что драйвер поддержки включен и был обнаружен один датчик 28.0000034aa0ba.

Для получения значения температуры выполним чтение, командой:

cat /sys/bus/w1/devices/28-0000034aa0ba/w1_slave

Banana Pi BPI-M64 ds18b20
Отображение температуры датчика 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 .NET IoT Linux DS18B20
Запуск проекта 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.

Литература

Вам также может понравиться

About the Author: Anton

Programistik