Подключение датчика температуры DS18B20 к ATmega8 и вывод температуры на LCD HD44780

Подключение нескольких DS18B20 к ATmega8 на одну шину (1xN Animating число найденных устройств) - Паразитное питаниеВ данной статье пойдет речь о том, как подключить датчик температуры DS18B20 к ATmega8 и отображать данные на ЖКИ-дисплее 16×1 на базе HD44780. Будут приведены три примеры программ работы с датчиком температуры, а именно: самый простой — подключение одного DS18B20 к ATmega8; подключение нескольких DS18B20 к ATmega8 на разные выводы микроконтроллера; самый сложный — подключение нескольких датчиков температуры DS18B20 к ATmega8 на одну шину. Для проверки работоспособности программ и схем был использован эмулятор Proteus 7 (ISIS 7 Professional). Код программ (проекты в Atmel Studio 7 целиком) вы сможете скачать по ссылке в конце статьи. После оптимизации кода вместо ATmega8 можно использовать более простой микроконтроллер ATtiny2313.

OneWire библиотека

config.h

 

OneWire.h

OneWire.cpp

 

Подключение одного DS18B20 к ATmega8

Самый простой способ подключения термодатчика DS18B20 к микроконтроллеру, конечно же, подключение одного датчика. В таком случае нет необходимости искать адрес подключённого датчика, а можем напрямую с ним общаться и считывать данные. Всё это возможно благодаря команды SKIP ROM [CCh] — Пропуск ROM [CCh]. Обратите внимание, что команда ЧТЕНИЕ ПАМЯТИ [BEh] может следовать за командой Пропуска ROM, только если на шине присутствует одно подчиненное устройство. Команда Пропуска ROM, сопровождаемая командой ЧТЕНИЕ ПАМЯТИ вызовет конфликт на уровне данных на шине, если на шине более одного подчиненного устройства, так как все устройства будут пытаться одновременно передавать данные.

main.cpp

double getTemp(void) — возвращает данные температуры в градусах Цельсия.
inline void printTemp(double d) — отображает на экран температуру.
inline void explodeDoubleNumber(int* numbers, double flt) — преобразует вещественное число flt в два целых, которые записываются в numbers.
Вместо функций inline void printTemp(double d) и inline void explodeDoubleNumber(int* numbers, double flt) можно использовать sprintf(), но она жрёт слишком много памяти.

Обычное питание

Подключение одного DS18B20 к ATmega8 (1x1)

Результат

Подключение одного DS18B20 к ATmega8 (1x1 Animating)

Паразитное питание

Подключение одного DS18B20 к ATmega8 (1x1) - Паразитное питание

Результат

Подключение одного DS18B20 к ATmega8 (1x1 Animating) - Паразитное питание

Подключение нескольких DS18B20 к ATmega8

Подключить несколько датчиков DS18B20 к ATmega8 или к другому микроконтроллеру, можно двумя способами. Первый способ — датчики можно подключить на разные выводы микроконтроллера, это самый простой способ, но в таком случае число подключенных датчиков зависит от числа выводов. Второй и самый лучший способ — это подключить все датчики на одну шину, в данном случае необходимо будет найти адреса всех подключённых датчиков.

Подключение нескольких DS18B20 к ATmega8 на разные выводы

Подключение нескольких DS18B20 к ATmega8 на разные выводы (NxN)

main.cpp

Результат

Подключение нескольких DS18B20 к ATmega8 на разные выводы (NxN Animating)

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

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

Алгоритм поиска 1-Wire устройств с использованием команды Search ROM прекрасно описан в этом видео:

main.cpp

Обычное питание

Подключение нескольких DS18B20 к ATmega8 на одну шину (1xN)

Результат

Подключение нескольких DS18B20 к ATmega8 на одну шину (1xN Animating число найденных устройств)

Подключение нескольких DS18B20 к ATmega8 на одну шину (1xN Animating 1)

Подключение нескольких DS18B20 к ATmega8 на одну шину (1xN Animating 2)

Паразитное питание

Подключение нескольких DS18B20 к ATmega8 на одну шину (1xN) - Паразитное питание

Результат

Подключение нескольких DS18B20 к ATmega8 на одну шину (1xN Animating число найденных устройств) - Паразитное питание

Подключение нескольких DS18B20 к ATmega8 на одну шину (1xN Animating 1) - Паразитное питание

Подключение нескольких DS18B20 к ATmega8 на одну шину (1xN Animating 2) - Паразитное питание

Внимание! При использовании паразитного питания не рекомендуется использовать датчики для температуры выше +100ºC, а также при операциях преобразования температуры и копирования данных из Scratchpad в один из регистров EEPROM, потребляемый ток может достигать 1.5 мА, что непосильно внутреннему конденсатору, а на резисторе подтяжки (R1 4.7k) будет большое падение напряжения, что недопустимо скажется на работе устройства в целом. Для этого необходимо организовать линии DQ схему мощной подтяжки, реализуемой по такой схеме:

DS18B20 вариант подключения - так называемое паразитное подключение (паразитное питание)

После выдачи команды конвертирования температуры [44h] или копирования ОЗУ В ПЗУ (Copy Scratchpad) [48h] необходимо включить мощную подтяжку MOSFET-транзистором линии DQ на 10 мкс (макс.), как указанно в даташите датчика, после чего выждать время преобразования или время передачи данных, причем в это время никаких действий при включенной мощной подтяжке на линии DQ быть не должно!

Скачать Atmel Studio 7 проекты и схемы в ISIS Professional (Proteus):
DS18B20 + LCD 16×2 + ATmega8 — ISIS Professional (Proteus)
DS18B20 + LCD 16×2 + ATmega8 — Atmel Studio 7

Купить DS18B20 на Aliexpress


Купить ATMEGA8A на Aliexpress


Купить LCD1602 HD44780 на Aliexpress




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

  • Собрал пример с одним датчиком, LCD только двухстрочны. На экране «Т = -0,0 С». Почему так???

    • Привет, попробуйте вариант с подключением нескольких датчиков на одну шину, помоему это вторая папка из архива, там подключается на PIND7. Обычно то, что работает в протеусе, работает и на реальных мк. Если и этот не пойдёт, тогда я протестирую у себя и отпишусь

    • вариант с подключением нескольких датчиков на одну шину универсальный, вы сможете увидеть сколько устройств подключены и подключены ли вообще, также резистор обязателен, без него датчик и выдаст -0,0, что означает что датчик не подключён

  • Все заработало, разобрался.Дело в конфигурации фьюзов, по умолчанию частота стоит 1мгц , а по коду надо 8мгц. Я новичок по этому не сразу вник в детали. А какая конфигурация фьюзов используется вами в данном проекте? На примере khazama AVR.

    • В данном проекте — 8мгц, CKSEL Fuses: (0100) Int.RC 8MHz, т.е. внутренний RC генератор, но для конкретного проекта я всегда использую внешний кварц на 11.0592МГц или больше.
      И да, почти у всех AVR микроконтроллеров по умолчанию стоит 1мгц, я всегда первым делом меняю фьюзы на (1111) Ext. Crystal High Freq или в khazama avr programmer Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms; , а на ATtiny2313 ещё и делитель частоты на 8 отключаю.

  • Спасибо за интересную статью!!! А аналогичные примеры есть с применением I2C подключения к LCD в Atmel Studio???

    • У меня два LCD и оба без I2C, хотя можно купить отдельно адаптер и подключить без проблем.
      А по поводу примеров, пока нет, но планирую что-то сделать именно на ATmega8, просто времени не хватает, идей то много.
      Я эту статью сделал, так как ничего толком не нашёл в интернете и решил сам сделать все примеры подключения датчика DS18B20.
      И ещё, я уже отошёл от Atmel Studio, теперь использую Eclipse, так как кроме дебагинга меня там ничего не устраивало и решил сменить среду разработки на более удобную.
      Ссылка на статью как настроить Eclipse под AVR: http://micro-pi.ru/%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b0-eclipse-c-%d0%b4%d0%bb%d1%8f-%d0%b4%d0%bb%d1%8f-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b-%d1%81-avr/

  • Жаль, а я только пытаюсь изучить студию…..

  • Здравствуйте! Пытаюсь внедрить Ваш код по подключению двух датчиков на одну шину в Atmel Studio 6.2. Дело в том, что основной проект у меня написан на СИ (не СИ++), и почему-то компилятор ругается на два определения в OneWire.h и соответственно OneWire.cpp:
    void searchRom(uint64_t*, uint8_t&);
    и
    uint64_t searchNextAddress(uint64_t, uint8_t&);
    а именно на знак «&». Честно сказать не понимаю зачем он нужен, но после того как его убрал, проект успешно скомпилировался, но возникла проблема — в массиве rom после выполнения функции searchRom(roms, n), определяется только один серийный номер датчика (второй равен нулю) и соответственно выводится температура только его одно. Помогите разобраться в чем дело. Заранее спасибо.

    • Здравствуйте! Если у вас C проект, значит вам нужно переименовать OneWire.cpp в OneWire.c или создать C++ проект. Кстати, можете импортировать прикреплённый к посту проект DS18B20 + LCD 16×2 + ATmega8 — Atmel Studio 7 или создать C++ проект и туда импортировать все файлы переименовав с .c на .cpp.
      По поводу ошибки, можете сюда вставить полное сообщение ошибки/ошибок и я смогу вам помочь.
      Теперь по поводу знака «&», без него, к сожалению, будет работать только один датчик, данная переменная помогает искать все подключённые устройства.

      Ссылки (&) – особый тип данных, являющийся скрытой формой указателя, который при использовании автоматически разименовывается. Ссылка может быть объявлена как другим именем, так и как псевдоним переменной, на которую ссылается.
      подробнее здесь: http://cppstudio.com/post/429/

    • Можете скачать вот этот проект, тут я его переделал в C: DS18B20_ATmega8_LCD.zip. Исправил void searchRom(uint64_t*, uint8_t&); и uint64_t searchNextAddress(uint64_t, uint8_t&);, в C «&» не работает.
      Также исправил несколько Warning-ов, когда будет время переделаю всё для C. Удачи!

  • admin, большое спасибо!

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

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