Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Урок 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. 

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

Прикрепленные файлы:

Теги:

Опубликована: 0 1
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 1 чел.

Комментарии (19) | Я собрал (0) | Подписаться

0
Дмитрий #
Доброго времени, урок хороший, всё понятно, ну или почти всё. Задам пару глупых вопросов
1) Где брать команды которые посылать на датчик? (Вдруг я захочу с другим датчиком работать например освещённости)
1wwrite &HCC
1wwrite &H44

2) Начиная с 34 строки не очень понятно. Изначально мы записали показания датчика в переменную А и В, зачем использовать другие переменные? Или они необходимы для корректного вывода на дисплей?
3) Алгебру я знаю, но действия с 34 по 45 строку не понятны.
Ещё вопрос, зачем используются резисторы R1 и R2?
Ответить
0

[Автор]
#
1) Смотрите в даташите на конкретный датчик
2) Именно
3) Эти действия нужны для корректного отображения отритцательных температур
Резистор R1 устанавливает контрастность ЖК индикатора, R2 подтягивает шину 1-Wire к плюсу питания, тем самым устанавливая на ней лог. 1
Ответить
0
demonust #
1) они описаны в даташите.
2) это для отобраэения +/- температуры.
3) R2 нужен для правильной работы датчика. Подтягивая его к +, создается логическая 1. R2 настраивает контрастность диспея. Описано подробно в даташите.
Ответить
0
Денис #
Собрал схему с датчиком, только датчик подключил к порту PD.0 вместо PB.1 как у вас на схеме. И еще на схеме у вас не нарисован кварц на 8МГц...? В общем при включении на экране выводится сразу Err, схема не работает. Кварц стоит на 8МГц, подтягивающий резистор на 4.7к, все порты сконфигурированы правильно. В чем может быть причина?
P.S. Нашел причину... Кроется в значении переменной $crystal = 8000000, датчик нормально работает только при значении в 1МГц. Каким образом можно приспособить датчик к работе МК хотя бы на 4МГц?
Ответить
0
ФК Кубань #
Может забыли сбросить CKDIV8? Он должен быть под единицей (выключен). И внутренний такт. генератор на 8 МГц. Low=E4 High=DF
Ответить
0

[Автор]
#
Очевидно, что, да! Очень часто случается, что забывают именно про CKDIV8. А тут важны точные временные интервалы!
Ответить
0
TDA2003 #
Таксс... Датчик мк считывает через PB.1! Так в прошивке!!!
Config 1wire = Portb.1
Отредактирован 06.08.2013 09:30
Ответить
0
JasonALT #
Зачем в прошивке в 23 и 24 строках используется пустой цикл?
Ответить
0

[Автор]
#
Если устройство не найдет датчик, то выведет Err на ЖКИ и уйдёт в этот бесконечный цикл.
Ответить
0
Олег #
Как выводить десятую часть температуры?
Ответить
0
КЭС #
Проверял в протеусе, при отрицательных значениях показания некорректные. После замены в 34стр. "If A > 248 Then" на I"f В > 248 Then" стал показывать, но округляет в сторону занижения температуры, например при значении на датчике -3,4 показания на индикаторе "-4С".
Ответить
0

[Автор]
#
Ваше утверждение не верно, так как Proteus всего лишь компьютерный симулятор электроники и имеет множество косяков и недочётов. Проверяйте работу схемы в железе тогда видно будет.
P.S. Данный код проверялся мною, всё работает и отображает корректно, даже при отритцательных температурах.
Ответить
0
олег #
В железе меньше +10 не меряет
Ответить
0
Евгений #
В протеусе не работает, потом разобрался: меняем "If A > 248 Then" на I"f В > 248 Then" и еще частоту на $crystal = 1000000 и устанавливаем фьюз CKDIV8.
Тогда работает!
Ответить
0
Sergey #
Помогите! Сколько уже перевернул статей ни чего не выходит. Пробовал на разных устройствах и на разных платах. Схема такая же. Код такой же. Работает только на частоте 8 мегагерц. То есть, когда внутренний генератор стоит на 8МГц, делитель на 8 отключен, и переменная кристалл=8000000 - всё работает, но когда включаю делитель на 8 и меняю кристалл на 1000000 - всё, болт. Светит 0 ! У меня устройства работают в таких местах, что я не могу частоту ЦП поднимать до 8 МГц, а 1МГц градусник не пашет, гад!
Ответить
0
Александр #
Не подскажете, решили проблему или нет ? Тоже не могу скрестить ШИМ и работу с температурой. Для ШИМ CKDIV8 нужно включить, а для температуры выключить.
Ответить
0
Павел #
Собрал, заработало с первого раза, у кого не пошло, внимательно СЕБЯ проверяйте, у разработчика все правильно
Ответить
0
Sergei #
Попробуйте померить этим собранным макетом отрицательные температуры. Очень удивитесь, казус выйдет неимоверный.
К сожалению, судя по всему в код действительно закралась ошибка.
Первым делом датчик передает младший байт (А), а потом - старший (В):
A = 1wread()
B = 1wread()
Знак температуры хранится всё ж в старшем байте - В. Поэтому в коде должно быть так:
If B > 248 Then
После этого в протеусе симулирует нормально, незачем его винить
Ответить
0
ANDRIO771 #
Как будет выглядеть код при подключении двух датчиков DS18B20?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Программатор Pickit3
Программатор Pickit3
Мультиметр Mastech MS8268 USB осциллограф DSO-2090
вверх