Наверное все радиолюбители которые знакомы с цифровой электроникой знают этот замечательный датчик DS18B20. Его приемущество что для связи с ним нужна всего лишь одна линия на которую можно подключить несколько датчиков, называется этот интерфейс 1-Wire. Датчик может измерять температуру в интервале от -55 до 125 °C с точностью до 0.5 °C.
Сегодня мы научимся считывать данные температуры с одного DS18B20 в BASCOM-AVR.
Для начала работы с DS18B20 нужно сконфигурировать порт микроконтроллера к которому подключён датчик, для этого есть команда: Config 1wire = Порт, пример: Config 1wire = Portb.1. Потом нужно послать датчику команду сброса 1wreset после чего прочитать полученный байт в регистре Err, если значение в нём равно единице (If Err = 1 Then) значит DS18B20 не подключён \ неисправен или нет подтягивающего сопритивления на линии (оно должно быть около 4,7кОм). Все остальные значения регистра Err указавают на правильную работу датчика. Теперь (в случае если Err <> 1 (-: ) нужно послать DS18B20 команду чтения 1wwrite &HCC и 1wwrite &H44 потом подождать примерно 800 миллисекунд и заново пошлём команду сброса 1wreset, после чего нужно применить следующие команды 1wwrite &HCC и 1wwrite &HBE. Всё, можно считывать байты температуры с датчика, для этого воспользуемся командой 1wread() и с её помощью считаем данные в переменные A и B (их надо заранее сконфигурировать, тип Byte), вот так: A = 1wread() и B = 1wread(). Теперь осталось обработать полученные данные и вывести их например на ЖК индикатор. Я специально не провожу здесь команды обработки и вывода данных с датчика чтобы не усложнять урок, их вы можете наглядно посмотреть в исходном коде практической программы. Уверяю вас там всё очень просто, только надо учить алгебру!
Практическая работа
Давайте теперь попробуем поработать с датчиком температуры DS18B20 на практике, а именно соберём простой термометр. Для этого будем использовать микроконтроллер Attiny2313, ЖК индикатор на контроллере HD44780 с разрешением 16*2 или 16*4 и сам датчик DS18B20. Соберём из этого простую схему:
Вот, на всякий случай распиновка датчика DS18B20:
Напишем и откомпилируем следующую практическую программу:
$regfile = "attiny2313.dat" $crystal = 8000000 Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2 Config Lcd = 16 * 4 Config 1wire = Portb.1 Dim A As Byte Dim B As Byte Dim C As Byte Dim D As Byte Dim E As Byte Initlcd Cls Cursor Off Do 1wreset If Err = 1 Then Cls Lcd "Err" Do Loop Else 1wwrite &HCC 1wwrite &H44 Waitms 750 1wreset 1wwrite &HCC 1wwrite &HBE A = 1wread() B = 1wread() If A > 248 Then A = &HFF - A B = &HFF - B E = 2 Else E = 1 End If C = A / 16 D = B * 16 C = C + D If E = 2 Then C = C + 1 If E = 1 And C = 0 Then E = 0 Cls Lcd "Temp= " If E = 0 Then Lcd " " ; C ; "'" ; "C" If E = 1 Then Lcd "+" ; C ; "'" ; "C" If E = 2 Then Lcd "-" ; C ; "'" ; "C" End If Loop End
Прошьём её в микроконтроллер и выставим следующие фьюз биты (для программы SinaProg):
После сборки схемы и прошивки микроконтроллера запускайте устройство (напряжение питания 5 вольт можно взять от USB), на ЖКИ должна отобразиться текущая температура. Если датчик неисправен или подключён неправильно тогда на ЖКИ отобразиться надпись "Err". Контрастность ЖКИ можно устанавливать изменяя сопротивление R1, его даже лучше заменить на переменное. Я собрал устройство на макетной плате с механическими контактами, вот фото:
Ну и собственно видео как всё это работает:
На видео вы можете увидеть, как я нагреваю датчик с помощью паяльника: НЕ ПОВТОРЯТЬ ЭТО!!! Если конечно не хотите спалить DS18B20. Помните интервал температур в котором работает датчик, от -55 до 125 °C.
На этом всё! Складывайте вопросы в комментариях, постараюсь своевременно на них ответить.
Урок 16. Работа с энкодером в BASCOM-AVR
Прикрепленные файлы:
- ds18b20.rar (40 Кб)
Комментарии (19) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
1) Где брать команды которые посылать на датчик? (Вдруг я захочу с другим датчиком работать например освещённости)
1wwrite &HCC
1wwrite &H44
2) Начиная с 34 строки не очень понятно. Изначально мы записали показания датчика в переменную А и В, зачем использовать другие переменные? Или они необходимы для корректного вывода на дисплей?
3) Алгебру я знаю, но действия с 34 по 45 строку не понятны.
Ещё вопрос, зачем используются резисторы R1 и R2?
[Автор]
2) Именно
3) Эти действия нужны для корректного отображения отритцательных температур
Резистор R1 устанавливает контрастность ЖК индикатора, R2 подтягивает шину 1-Wire к плюсу питания, тем самым устанавливая на ней лог. 1
2) это для отобраэения +/- температуры.
3) R2 нужен для правильной работы датчика. Подтягивая его к +, создается логическая 1. R2 настраивает контрастность диспея. Описано подробно в даташите.
P.S. Нашел причину... Кроется в значении переменной $crystal = 8000000, датчик нормально работает только при значении в 1МГц. Каким образом можно приспособить датчик к работе МК хотя бы на 4МГц?
[Автор]
[Автор]
[Автор]
P.S. Данный код проверялся мною, всё работает и отображает корректно, даже при отритцательных температурах.
Тогда работает!
К сожалению, судя по всему в код действительно закралась ошибка.
Первым делом датчик передает младший байт (А), а потом - старший (В):
B = 1wread()