Наверное все радиолюбители которые знакомы с цифровой электроникой знают этот замечательный датчик 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 Кб)