Урок 15. Работа с датчиком температуры DS18B20 в BASCOM-AVR

Наверное все радиолюбители которые знакомы с цифровой электроникой знают этот замечательный датчик 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. Соберём из этого простую схему:

mc181-1.png

Вот, на всякий случай распиновка датчика 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, его даже лучше заменить на переменное. Я собрал устройство на макетной плате с механическими контактами, вот фото:

mc181-4.jpg  

Ну и собственно видео как всё это работает:

На видео вы можете увидеть, как я нагреваю датчик с помощью паяльника: НЕ ПОВТОРЯТЬ ЭТО!!! Если конечно не хотите спалить  DS18B20. Помните интервал температур в котором работает датчик, от -55 до 125 °C. 

На этом всё! Складывайте вопросы в комментариях, постараюсь своевременно на них ответить.

Урок 16. Работа с энкодером в BASCOM-AVR