Для измерения температуры в бытовых целях хорошо подходят цифровые датчики DS18B20. Эти датчики способны измерять температуру в пределах от -55 до 125 °C, с заявленной точностью от производителя в 0,5 °C. Для большинства гражданских нужд такой диапазон и такая точность измерения вполне приемлема (какую-нибудь систему термоконтроля собрать или еще чего). Поэтому решил попрактиковаться с этим датчиком, обязательно пригодится.
Работает датчик по однопроводному интерфейсу 1-Wire. Здесь я описывать этот протокол не буду, так как информации и так достаточно. Отличное описание работы интерфейса 1-wire и методика работы с датчиком ds18b20 можно почитать на http://samou4ka.net/ Для нас самое важное, что нужно знать на первом этапе лишь то, что сигнальный провод необходимо подтягивать к шине питания подтягивающим резистором номиналом примерно 4,7к. Если длина сигнального провода увеличивается, необходимо снижать сопротивление подтягивающего резистора. Читал о том, что датчик соединяли с МК проводом длинной 90 метров, для исправной работы датчика сопротивление резистора составило 3к.
У себя для освоения работы с датчиком использовал микроконтроллер Atmega32 и выводил показания на двухстрочный алфавитно-цифровой ЖКИ.
Что касается программной части, в Bascom-AVR имеется библиотека работы с протоколом 1-Wire. Ее и задействуем. В программе полученные результаты с датчика немного корректируются, иначе при отрицательных температурах результат будет ложным на 1 градус, и нулевая температура выводится без знака.
$regfile = “m32def.dat”
$crystal = 1000000 ‘ 1 MHz
‘*** Конфигурируем ЖКИ
Config Lcd = 16 * 2
Config Lcdpin = Pin, Rs=Portc.5, E=Portc.4, Db4=Portc.0, Db5=Portc.1, Db6=Portc.2, Db7 = Portc.3
‘ ***Конфигурируем однопроводную шину
Config 1wire = Portb.7
‘ *** Заводим переменные
Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Sign As String * 1
Dim T As Byte
Dim T1 As Byte
Dim T2 As Byte
Cls
Cursor Off
‘***ОСНОВНАЯ ПРОГРАММА
Do ‘ начало цикла
1wreset
If Err = 1 Then ‘если при опросе небыло ответа ставим флаг ошибки
Cls
Rem датчик
Rem не подключен
Lcd ” гaїАёє ” ‘ выводим надпись об отсутствии датчика
Locate 2 , 1
Lcd ” Ѕe ѕoгє»ЖАeЅ”
Wait 1
Else ‘ иначе, если ошибки не было, продолжаем опрос датчика
1wwrite &HCC ‘ Выдаем команду чтения ПЗУ
1wwrite &H44 ‘ Запуск измерения
Waitms 750 ‘ Ждем окончания преобразования
1wreset
1wwrite &HCC
1wwrite &HBE ‘ Команда чтения ОЗУ датчика
Byte0 = 1wread() ‘ Читаем нулевой байт
Byte1 = 1wread() ‘ Читаем первый байт
If Byte1 > 248 Then ‘ Проверка на отрицательность температуры
Byte0 = &HFF – Byte0
Byte1 = &HFF – Byte1
Sign = “-“
Else
Sign = “+”
End If
T1 = Byte0 / 16 ‘ Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16 ‘ Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1 = T1 + T2 ‘ Формируем результат для вывода на дисплей
‘ *** Коррекция полученных значений
If Sign = “-” Then ‘ для корректного вывода отрицательных температур
T1 = T1 + 1
End If
If Sign = “+” And T1 = 0 Then ‘ убираем знак “+” с нулевой температуры
Sign = ” “
End If
Cls
‘ *** Выводим результат на дисплей
Rem Температура
Lcd ” Teјѕepaїypa” ‘ тут пишем что измеряем
Locate 2 , 6
Lcd Sign ; T1 ; ‘ выводим знак и температуру на дисплей
Locate 2 , 9
Lcd Chr(223) ; “C” ‘ Сhr(223) – символ “градус”
Cursor Off
End If
Wait 1 ‘ ждем 1 секундy
Loop ‘ повторяем цикл
End
Датчик не подключен, выводится соответствующее сообщение:
А это с подключенным датчиком, при комнатной температуре:
Ниже можете скачать исходник, файл в протеусе и откомпилированный файл:
Последние статьи
- Лучшая практика проектирования при размещении компонентов печатной платы
- Android 6.0 на lancer X
- Простой усилитель мощности класса АВ своими руками.
- Двухтактный ультралинейный ламповый УНЧ на EL84 (6П14П).
- Люксметр на ATmega8 и цифровом датчике BH1750
- Контроллер для светодиодной ленты с ИК управлением
- Самодельный LED светильник на основе ИК датчика HC-SR501
- Простой усилитель низкой частоты на TDA7377 и NE5532
- Простейший звонок с двумя мелодиями
- LED Cube 8x8x8 на Arduino с RTC