Считывание температуры с помощью датчика DS18B20 и Orange Pi PC (ARMBIAN 5.35)

В предыдущей статье мы считывали показания датчика DS18B20 без использования драйверов, написав собственную программу на C++. В этой статье мы попробуем настроить 1-Wire драйвер и, с его помощью, получить температуру с DS18B20, подключенного к Orange Pi PC.

Операционная система Armbian 5.35 (Ubuntu 16.04) имеет драйвер для работы с 1-Wire устройствами, а именно с датчиком температуры DS18B20. По умолчанию этот драйвер отключён и по этому нужно его настроить.

О наличии этого драйвера в других операционных системах (не Armbian) я не знаю, не проверял.

Настройка драйвера 1-Wire

  1. Для начала сделайте резервную копию script.bin, чтобы, в случае чего, вы смогли вернуть обратно все настройки:
    sudo cp /boot/script.bin /boot/script.bak
  2. Преобразуйте бинарный файл script.bin в редактируемый файл fex:
    bin2fex /boot/script.bin /boot/script.fex
  3. Теперь отредактируйте файл script.fex с помощью утилиты nano:
    nano /boot/script.fex
  4. Найдите раздел [w1_para] и отредактируйте строки w1_used и gpio:
    [w1_para]
    w1_used = 1
    gpio = 20

    где gpio — это номер пина по колонке BCM. Чтобы узнать, где и какой пин находится, выполняем gpio readall. В моём случае BCM=20, т.е. 37-й физический пин.gpio readall - номер пина BCM

  5. Сохраните и закройте файл:
    Ctrl X, Y (Yes), Enter
  6. Преобразуйте измененный script.fex в script.bin:
    sudo fex2bin /boot/script.fex /boot/script.bin
  7. Отредактируйте файл /etc/modules с помощью утилиты nano:
    nano /etc/modules
  8. Добавьте следующие строки:
    w1-sunxi
    w1-gpio
    w1-therm
  9. Сохраните и закройте файл:
    Ctrl X, Y (Yes), Enter
  10. Перезагрузите систему:
    reboot

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

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

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

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

dmesg | grep -E 'w1|wire'

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

root@orangepipc:~# dmesg | grep -E 'w1|wire'
[    5.375196] W1_SUNXI: Added w1-gpio on GPIO-20
[    5.379420] Driver for 1-wire Dallas network protocol.

Это означает, что драйвер 1-wire настроен на 20-й пин.

Чтобы увидеть все подключённые датчики выполняем:

ls -al /sys/bus/w1/devices

У меня два датчика, 28-000005464e04 и 28-00000547cabb:

root@orangepipc:~# ls -al /sys/bus/w1/devices
total 0
drwxr-xr-x 2 root root 0 Dec  3 19:59 .
drwxr-xr-x 4 root root 0 Dec  3 19:59 ..
lrwxrwxrwx 1 root root 0 Dec  3 20:02 28-000005464e04 -> ../../../devices/w1_bus_master1/28-000005464e04
lrwxrwxrwx 1 root root 0 Dec  3 20:02 28-00000547cabb -> ../../../devices/w1_bus_master1/28-00000547cabb
lrwxrwxrwx 1 root root 0 Dec  3 19:59 w1_bus_master1 -> ../../../devices/w1_bus_master1
root@orangepipc:~#

Температура и crc записаны в файле w1_slave каждого датчика и, чтобы узнать её, выводим на экран содержимое этого файла:

cat /sys/bus/w1/devices/28-000005464e04/w1_slave

результат:

61 01 4b 46 7f ff 0f 10 02 : crc=02 YES
61 01 4b 46 7f ff 0f 10 02 t=22062

где температура t=22062, т.е. 22.062 °C.
Считывание температуры с датчика DS18B20

Похожие записи

Комментарии 27

  • Добрый день
    orange pi one. стоит образ armbian от orangepi pc (на сайте написано что они подходят)
    uname -a
    4.14.70-sunxi #265 SMP Wed Sep 19 10:01:19 CEST 2018 armv7l GNU/Linux
    cat /etc/modules
    w1-sunxi
    w1-gpio
    w1-therm
    gpio-sunxi

    script.bin в нем нет, но в armbian-config нашел включение 1ware

    после чего:

    1
    dmesg | grep -E ‘w1|wire’
    [595233.277311] w1_master_driver w1_bus_master1: Attaching one wire slave 00.cd3400000000 crc 21
    [595233.284890] w1_master_driver w1_bus_master1: Family 0 for 00.cd3400000000.21 is not registered.
    [595259.558238] w1_master_driver w1_bus_master1: Attaching one wire slave 00.2d3400000000 crc c8
    [595259.565671] w1_master_driver w1_bus_master1: Family 0 for 00.2d3400000000.c8 is not registered.
    [595321.800421] w1_master_driver w1_bus_master1: Attaching one wire slave 00.ad3400000000 crc 44
    [595321.807568] w1_master_driver w1_bus_master1: Family 0 for 00.ad3400000000.44 is not registered.
    ….
    и таких записей с разным slave и src еще сотни полторы. Все начинаются с 0

    ls -al /sys/bus/w1/devices
    total 0
    drwxr-xr-x 2 root root 0 Oct 28 06:02 .
    drwxr-xr-x 4 root root 0 Oct 28 05:48 ..
    lrwxrwxrwx 1 root root 0 Oct 28 06:03 00-1d3400000000 -> ../../../devices/w1_bus_master1/00-1d3400000000
    lrwxrwxrwx 1 root root 0 Oct 28 06:03 00-ed3400000000 -> ../../../devices/w1_bus_master1/00-ed3400000000
    lrwxrwxrwx 1 root root 0 Oct 28 05:48 w1_bus_master1 -> ../../../devices/w1_bus_master1

    при этом датчик подключен один (к 37 ноге)
    и id иногда сменяются. бывает что их 3

    ни в одной папке нет файла w1_slave

    Поможете разобраться?

    • В ядре linux 4.14 Вам не нужно редактировать файл fex, но файл /boot/armbianEnv.txt и добавлять строки:

      overlays=w1-gpio
      param_w1_pin=PB20             # desired pin
      param_w1_pin_int_pullup=1     # internal pullup-resistor: 1=on, 0=off
      

      Подключите пины данных устройств к PB20 (это 37-й) gpio и продолжайте, как Kernel 3.4.

      Материалы
      https://docs.armbian.com/User-Guide_Allwinner_overlays/#example-bootarmbianenvtxt-contents
      http://linux-sunxi.org/1-Wire#Linux_kernel_4.14

      • В orange Pi One нет столько gpio
        поставил pin=PB4
        что соответсвует 7 на железке
        но всё ранво проблема как у Сергея.
        :root@orangepione:~# uname -a
        Linux orangepione 4.19.38-sunxi #5.85 SMP Wed May 8 14:20:48 CEST 2019 armv7l GNU/Linux
        root@orangepione:~# dmesg | grep -E ‘w1|wire’
        [ 4.951522] Driver for 1-wire Dallas network protocol.
        [ 4.983972] gpio-110 (onewire@0): enforced open drain please flag it properly in DT/ACPI DSDT/board file
        [ 6.836926] w1_master_driver w1_bus_master1: w1_search: max_slave_count 64 reached, will continue next search.
        [ 53.531830] w1_master_driver w1_bus_master1: Attaching one wire slave 00.800000000000 crc 8c
        [ 53.535548] w1_master_driver w1_bus_master1: Family 0 for 00.800000000000.8c is not registered.
        root@orangepione:~#

        • Проверяется всё очень легко, находим схему платы, в данном случае — это Orange Pi One
          http://linux-sunxi.org/images/7/7e/ORANGE_PI-ONE-V1_1.pdf
          и находим раздел Ext Port (это последняя страница), а тут есть CON3 DIP40-254, т.е. GPIO гребёнка:

          и видим, что выводы общего назначения у нас следующие: PA7, PA8, PA9, PA10, PA20, PA21, PD14, PC4 и PC7. Должен быть ещё и PWM1, что соответствует 7-му пину, но, думаю, у него другая роль.

          • Интересно ведь в readAll данные пины идут для SPI

             +-----+-----+---------+------+---+-Model  A-+---+------+---------+-----+-----+
             | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
             +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
             |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
             |   2 |   8 |   SDA.1 |   IN | 0 |  3 || 4  |   |      | 5v      |     |     |
             |   3 |   9 |   SCL.1 |   IN | 0 |  5 || 6  |   |      | 0v      |     |     |
             |   4 |   7 | GPIO. 7 |   IN | 0 |  7 || 8  | 0 | IN   | TxD     | 15  | 14  |
             |     |     |      0v |      |   |  9 || 10 | 0 | IN   | RxD     | 16  | 15  |
             |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
             |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
             |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
             |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
             |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
             |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
             |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 0 | IN   | CE0     | 10  | 8   |
             |     |     |      0v |      |   | 25 || 26 | 0 | IN   | CE1     | 11  | 7   |
             +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
             | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
             +-----+-----+---------+------+---+-Model  A-+---+------+-----
            

            форматирование корявое, но скрин не могу залить 🙁
            если правилльно понял то допустим если я хочу использовать PA20, то мне в armbianEvn написать :
            param_w1_pin=PB11 ?

            • Попробуйте написать PA20 так, как указано на схеме, если не пойдёт, тогда я попробую сделать на своей плате и отпишусь попозже.
              А.С. Если хотите добавить картинку, тогда вставьте адрес/url с расширением jpg png или bmp и картинку будет видно. Ещё можно использовать тэг < pre >, чтобы вставить текст из терминала

            • А у вас точно Orange Pi One? Гребёнка на One на 40 выводов, а вы, мне кажется, установили не правильную версию WiringPi или у вас Orange Pi Zero?

    • После перезагрузки всё работает точно так-же:

      root@orangepipc:~# dmesg | grep -E 'w1|wire'
      [    9.129075] Driver for 1-wire Dallas network protocol.
      [    9.195337] w1_master_driver w1_bus_master1: Attaching one wire slave 28.000005464e04 crc 55
      [    9.325371] w1_master_driver w1_bus_master1: Attaching one wire slave 28.00000547cabb crc 2d
      root@orangepipc:~#
      

      чтобы увидеть все подключённые датчики:

      root@orangepipc:~# ls -al /sys/bus/w1/devices
      total 0
      drwxr-xr-x 2 root root 0 Oct 28 10:53 .
      drwxr-xr-x 4 root root 0 Oct 28 10:53 ..
      lrwxrwxrwx 1 root root 0 Oct 28 10:53 28-000005464e04 -> ../../../devices/w1_bus_master1/28-000005464e04
      lrwxrwxrwx 1 root root 0 Oct 28 10:53 28-00000547cabb -> ../../../devices/w1_bus_master1/28-00000547cabb
      lrwxrwxrwx 1 root root 0 Oct 28 10:53 w1_bus_master1 -> ../../../devices/w1_bus_master1
      root@orangepipc:~#
      

      и температура:

      root@orangepipc:~# cat /sys/bus/w1/devices/28-000005464e04/w1_slave
      4c 01 4b 46 7f ff 04 10 f5 : crc=f5 YES
      4c 01 4b 46 7f ff 04 10 f5 t=20750
      root@orangepipc:~#
      
  • Linux orangepipcplus 4.19.20-sunxi #5.75
    С датчиком разобрался — работает, но есть один вопросик :
    Вы случаем не знаете как переключить разрешение датчика
    на 10-11 битное преобразование, а то он похоже на 9 битах.

    • А вы при какой температуре это выяснили? Просто я не проверял при больших и отрицательных температурах

  • При комнатной, у вас кстати примером выше тоже похоже — 20750, т.е. точность 0.25 градуса.
    И кстати он предложил подключить датчик на 110 порт (PD14) и на другие не соглашался.

  • Я во всяких никсах и программировании не очень, так что если вам удастся придумать как — будет вам большой респект 😉

  • Да и кстати в начале темы все ок (где температура t=22062, т.е. 22.062 °C.) т.е. преобразование с большим разрешением, интересно почему. Другая версия драйвера ?

  • По опыту общения с 18b20 насколько я понял все просто
    9бит -точность 0.25
    10 — 0.1
    11-0.01

  • Ну да, просто вот вопрос, почему на Kernel 3.4. идет преобразование наверно 12 бит, а на 4.14 — 10 бит.

    • Как установить разрешение DS18B20 на Armbian / Версия ядра Linux 4.x

      На ядре 3.4.x можно только получить температуру с DS18B20. В новой версии ядра Linux 4.x немного исправлены тайминги, достигнута стабильная работа датчиков в режиме паразитного питания, а также добавлена опция изменения разрешения.

      Теперь вы можете легко установить разрешение 9, 10, 11 или 12 бит с помощью простой команды:

      sudo su -c "echo 9..12 > /sys/bus/w1/devices/28-xxxxxxx/w1_slave"
      

      Соответственно при снижении разрешения значительно уменьшается время отклика сенсора с 1100 мс (с 12 бит) до 125 мс (с 9 бит).

      sudo su -c "echo 9 > /sys/bus/w1/devices/28-00000547cabb/w1_slave"
      
      sudo su -c "echo 10 > /sys/bus/w1/devices/28-00000547cabb/w1_slave"
      
      sudo su -c "echo 11 > /sys/bus/w1/devices/28-00000547cabb/w1_slave"
      
      sudo su -c "echo 12 > /sys/bus/w1/devices/28-00000547cabb/w1_slave"
      

      Если у вас версия ядра ниже 4.x, тогда вы получите следующую ошибку:

      root@orangepipc:~# su -c "echo 12 > /sys/bus/w1/devices/28-00000547cabb/w1_slave"
      bash: /sys/bus/w1/devices/28-00000547cabb/w1_slave: Permission denied
      root@orangepipc:~#
      

      https://forum.armbian.com/topic/3276-help-wanted-changing-resolution-of-ds18b20-on-orange-pi/
      https://forum.armbian.com/topic/1558-w1-therm-driver-modifications/
      https://raspberrypi.stackexchange.com/questions/71563/how-to-set-precision-of-ds18b20-via-w1-therm
      https://github.com/raspberrypi/linux/blob/rpi-4.9.y/Documentation/w1/slaves/w1_therm

  • Может просто со старого какой-нить файлик вытащить и переставить на новый?

    • Я пока не могу дать ответ на этот вопрос, вечером попробую экспериментировать, сейчас у меня нет доступа к апельсинке

  • На orange pi pc после установки свежего armbian 21.05.1
    просто запускаем armbian-config -> System -> Hardware
    в самом низу чекаем w1-gpio
    сохраняем, получаем предложение перезагрузки и после чего
    на PD14 получаем данные.
    В node-red узел node-red-contrib-sensor-ds18b20
    сразу читает данные с этого пина.

  • В ядре 5.10.34-sunxi:
    в /boot/armbianEnv.txt
    добавляем:
    overlays=w1-gpio
    param_w1_pin=PA20
    param_w1_pin_int_pullup=1
    инфа отсюда: https://docs.armbian.com/User-Guide_Allwinner_overlays/

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *