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

DS18B20, пожалуй, один из самых из известных и доступных датчиков температуры. В основном для чтения данных с DS18B20 используется микроконтроллеры, к примеру: ATmega8, ATtiny2313, Arduino и др.. С появлением одно платных мини-компьютеров стало интересно, как будет работать подключённый датчик температуры DS18B20 к Orange Pi, Banana Pi или Raspberry Pi — самые популярнуе мини-компьютеры.
Для работы с GPIO на Orange Pi и Banana Pi необходимо установить WiringOP и BPI-WiringPi соответственно, и IDE Code::Blocks.
При создании статьи был выбран Banana Pi M3, так как он  у меня постоянно включён. Но данный пример программы будет работать и при подключении DS18B20 к Orange Pi или Raspberry Pi.

OneWire библиотека

OneWire.h

OneWire.cpp

Подключение нескольких DS18B20 к Orange Pi на одну шину

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

При подключение нескольких датчиков DS18B20 к Orange Pi, Banana Pi или Raspberry Pi на одну шину, главное устройство (компьютер) должно определить коды ROM всех подчиненных устройств на шине. Команда SEARCH ROM [F0h] — (ПОИСК ROM) позволяет устройству управления определять номера и типы подчиненных устройств. Устройство управления изучает коды ROM через процесс устранения, которое требует, чтобы Главное устройство исполнил цикл Поиска ROM (то есть, команда ROM Поиска, сопровождаемая обменом данных). Эту процедуру необходимо выполнить столько раз, сколько необходимо, чтобы идентифицировать все из подчиненных устройств. Если есть только одно подчиненное устройство на шине, более простая команда READ ROM [33h] (Чтения ROM) может использоваться место процесса Поиска ROM.
После каждого цикла Поиска ROM, устройство управления шиной должно возвратиться к Шагу 1 (Инициализация) в операционной последовательности.

main.cpp

double getTemp(OneWire * oneWire, uint64_t ds18b20s) — возвращает данные температуры в градусах Цельсия.

Результат

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

Скачать проект Code::blocks

DS18B20 Banana Pi M3.zip

Если есть вопросы, пишите в комментариях, попробуем разобраться.

 

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

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

  • Как компилировать скрипт?

  • Благодарю за статью. Все отлично завелось на OrangePi Zero.

    • Здравствуйте, я изменил чуть-чуть прошивку, добавил метод

      чтобы проверять целостность данных. Также изменил и функцию

  • Подскажите, пожалуйста, как скомпилировать скрипт на OrangePi Zero ? Машины с Ubuntu/XServer нет 🙁

    Пробую так:
    root@orangepizero:~/sensor# sudo g++ OneWire.cpp -o OneWire -lwiringPi -lpthread

    Выдает:
    /usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/crt1.o: In function _start':
    (.text+0x28): undefined reference to
    main’
    collect2: error: ld returned 1 exit status

    При компиляции main.cpp жалуется на отсутствие OneWire.

    • Если вы хотите сделать это вручную, вы можете скомпилировать все ваши .cpp файлы в объектные файлы:

      и связывать все объектные файлы:

      -c означает «скомпилировать, не связывать», и вы получите файлы name.o.

      Или перечислите все остальные файлы .cpp после main.cpp.

      где main.out и есть программа

      • Спасибо за оперативный ответ. Компиляция прошла без ошибок. Появился файл main.out. Если я правильно понял, то это исполняемый бинарник.
        Выполнил chmod +x ./main.out. Запускаю.

        Выдает в цикле ошибку:
        [digitalRead:L2123] the pin:-1 is invalid, please check it over!
        [getAlt:L1572] the pin:-1 mode: 0 is invaild,please check it over!

        Что может быть?

        Датчики подключены 2 шт, как указано на схеме. Только GND взят с 25 контакта, вместо 39-го, т.к. у меня OrangePI-Zero, и на CON3 всего 26 контактов.

        • Я так понимаю вам нужно задать другой пин здесь вместо 24-го;

          к примеру 1, 4, 5 или 11.
          выполните команду gpio readall, чтобы понять что это за пины:

  • Вы оказались правы. Именно в этом параметре была загвоздка.

    Кто будет подключать Orange PI Zero, на заметку:
    11-у пину соответствует значение wPi — 0.
    С этим значением программа скомпилировалась, но не запустилась, выдав:
    error: id_bit = cmp_id_bit = 1.
    То, что диод на этом порту моргал отлично, только сбивает с толку.

    У меня заработало так: сигнальный провод датчика на 26-й пин,
    строка кода в main.cpp: OneWire * ds18b20 = new OneWire(11);
    После этого, я получил температуру с датчика.

    Спасибо вам, добрый админ!

    • Добавка к предыдущему посту (Open Pi Zero):
      По предложенной на сайте схеме, когда провод данных подключается к 11-му пину, строчка в программе в main.cpp: OneWire * ds18b20 = new OneWire(0);
      программа запускается, и видит датчики. Но иногда (довольно часто) не запускается с выше указанной ошибкой. Что меня и смутило в первый раз. Иногда видит только один датчик. Показания температуры могут улетать в зону 4000 градусов, а могут колебаться в пределах +- 10 градусов на соседних измерениях. При том, что среда так не меняется.

      В любом случае, спасибо хозяину этого замечательного места! С вашей помощью датчики завелись. Буду добиваться от них надежной работы. Хочу климатику на них регулировать.

      • Лучше всего использовать пины wPi GPIO.* (GPIO.1, GPIO.4, GPIO.5, GPIO.7 и GPIO.11 — это физические 12, 16, 18, 7 и 26 соответственно), так как они общего назначения, т.е. их можно использовать как обычные цифровые пины входа и выхода. Все остальные пины — это порты IIC (I2C), SPI и UART.
        Так что для Orange Pi Zero следующие конфигурации самые оптимальные:

        И ещё, если надумаете использовать на долгое время датчик, тогда нужно запитать от 3.3 В, чтобы не убить GPIO от 5 В. У меня вроде не сгорел, но лучше подстраховаться.

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

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