Термометр на микроконтроллере attiny2313 своими руками

Добавил пользователь Дмитрий К.
Обновлено: 18.09.2024

Трехцветные светодиоды хороши тем, что с их помощью можно отобразить любой оттенок цвета. Мне пришла в голову идея, почему не собрать простенький термометр на микроконтроллере например ATtiny13 и отображать температуру в виде оттенков цвета с помощью этого же RGB светодиода.

Проблемы реализации устройства:
Цвет генерируется при помощи ШИМ, оттенок формируется разной интенсивностью свечения трех основных цветов, синего, зеленого и красного. То есть для того, что бы отобразить оттенок необходимо иметь три канала ШИМ.

Для опроса датчика температуры необходимо время, на это время микроконтроллер не будет заниматься генерированием ШИМ и светодиод моргнет. Так как отобразить сразу три цвета с разной интенсивностью при помощи микроконтроллера семейства AVR нельзя. Для отображения разных оттенков при помощи ШИМ используется хитрость, инерционность человеческого глаза.

На данном этапе в коде расположенном ниже реализован термометр, который выдает информацию о температуре на RGB светодиод не используя все возможные оттенки. Для отображения используется всего 3 степени свободы (три режима). Логика следующая: при достижении определенного значения температуры, термометр зажигает соответствующий цвет их трех. Таким образом термометр может отображать только три диапазона температур, которые должны быть заранее заданы.

В данном коде трем цветам светодиода соответствуют следующие температуры:
Синий - 20 градусов,
Зеленый - 30 градусов,
Красный - 40 градусов.

Если получится реализовать время опроса датчика минимальным, то есть таким за которое глаз не заметит выключения свечения светодиода, тогда и получится реализовать RGB термометр именно таким, как он был описан в начале заметки.

Датчик температуры я использовал ds1b20, который подключен к порту B0 микроконтроллера.

Внешний вид собранного устройства:




Индикаторы с ОА и Ок включены параллельно , датчики - тоже .Главной задачей ставил заточить алгоритм вывода на 8 разрядов вместо 4-х от 2-х DS18B20.


Строка 107 нужна обязательно .


Температура меряется раз в 10 сек. Округляется до целых . Незначащие 0-ли удаляются.

Несложные часы-термометр на микроконтроллере ATtiny2313, с семисегментным индикатором. В конструкции использована микросхема часов реального времени DS1307 с резервным питанием от батареи CR2032 (3В), датчик температуры DS18B20.

На индикаторе периодически отображаются значения времени и температуры. Период отображения каждого значения равен 4 секундам. Время отображается в 24 часовом формате — ЧЧ.ММ, при этом старший не значащий ноль часов не отображается. Точка мигает в соответствии с ходом секунд.

Температура отображается с точностью до десятых градуса. Погрешность измерения температуры определяется погрешностью датчика температуры и составляет не больше ±0,5 градусов в диапазоне от -10 до 85 градусов Цельсия. В остальном диапазоне погрешность не хуже ±2 градусов.

Измерение температуры производится один раз в минуту. Считанное с датчика значение температуры сохраняется в памяти контроллера организованной для хранения 5 последних измерений. Для отображения на индикаторе последнее записанное в память значение температуры округляется до целых градусов Цельсия. При отображении температуры в крайнем правом разряде индикатора высвечивается символ градуса. Если за последние 5 минут температура внешнего датчика изменяется больше чем на 0,2 градуса, то символ градуса периодически сменяется символом повышения (стрелка вверх) или понижения (стрелка вниз) температуры.

Схема часов с индикатором с общим анодом

watch_ca_led

Схема часов с индикатором с общим катодом

watch_cc_led

В часах можно использовать как индикаторы с общим анодом, так и с общим катодом. Индикаторы работают в динамическом режиме, реализованном программно. Каждый разряд индикатора включается 100 раз в секунду и 3/4 общего времени работы индикатора находится в выключенном состоянии. В случае использования индикаторов с общим катодом в качестве верхних ключей для управления индикаторами используются транзисторы 2N3906, в качестве нижних 2N7000. Для индикаторов с общим анодом в качестве верхних ключей для управления индикаторами используются транзисторы 2N3906, в качестве нижних — транзисторная сборка ULN2803A.

Прошивка для контроллера (в архиве также имеется исходник и проект для Proteus) написана на AVR ассемблере. Особенность прошивки в том, что она без изменения может работать и в схеме с индикаторами с общим анодом и в схеме с индикаторами с общим катодом. При инициализации опрашивается уровень сигнала BT от кнопок и в зависимости от того низкий он или высокий выбирается алгоритм работы с кнопками и индикаторами. При программировании микроконтроллера необходимо запрограммировать следующие fuse-биты: CKSEL3, CKSEL1, CKSEL0, SUT0, BODLEVEL1, BODLEVEL0 (хотя два последних я не программировал, и все равно работает).

Теперь о том, как это все реализовано практически

Устройство состоит из двух печатных плат из одностороннего стеклотекстолита размерами 50*100 мм — индикатора с кнопками и собственно самих часов. Вариант разводки платы часов и индикатора в формате SprintLayout5 предложен здесь. (Плату часов разводил не я, мои только правки, и изначально вариант был не самый удачный.)

Индикатор состоит из двух двузначных семисегментных индикаторов с общим анодом FYD-8021BS-11. На плате помимо самих индикаторов размещены кнопки.

Микроконтроллер в соответствии с разводкой платы применен в SOIC корпусе. В качестве верхних ключей, опять же в соответствии с разводкой платы и возможной взаимозаменяемостью, применены транзисторы КТ361В. Хотя аналог 2N3906 — КТ361Г, но последних в наличии не оказалось. Вариант получился не самый лучший, но тем не менее рабочий. Из оригинальной схемы были исключены детали, стоящие до стабилизатора U3, и по ошибке конденсаторы С3 и С4.

DSC05866

При запуске устройство отказалось работать напрочь. Причина — отсутствие на выходе стабилизатора U3 какой-либо емкости вообще и, как следствие, большой уровень пульсаций по шине питания +5В. Опытным путем удалось выяснить, что конденсатор К10-17Б емкостью 1 мкФ вполне решает эту проблему (как раз тот самый С4, но с бОльшим номиналом; а лучше поставить оба). Ставим — устройство запустилось, но нет информации от микросхемы DS1307. Причина — от одной только батарейки CR2032 микросхема питаться не хочет (оказывается, даташиты тоже полезно иногда читать), поэтому восьмую ножку микросхемы подключаем к шине питания +5В. На этот раз все заработало как надо, и все довольны.

DSC05870

Небольшой апдейт: из схемы исключен стабилизатор U3, т.к. глупо питать устройство напряжением 12 вольт от внешнего источника питания и понижать его до пяти, когда можно найти соответствующий пятивольтовый блок питания.

'****************************************
'простой термометр на attiny2313 и 18b20
'с эффективным энергосбережением
'Sherman inc. for Avrproject.ru 2012 ;)
'применен индикатор с общим анодом
'подключение разрядов индикатора
'A-PortB.1
'B-PortB.0
'C-PortB.2
'D-PortB.4
'E-PortB.6
'F-PortB.3
'G-PortB.5
'подключение разрядов индикатора слева направо
'1-PortD.4
'2-PortD.3
'3-PortD.6
'подключение датчика температуры к PortA.1
'питание датчика температуры (+5V) PortA.0
'*****************************************
$regfile = "attiny2313.dat" 'используемый микроконтроллер
$crystal = 8000000 'частота работы 8 МГц (фьюз CKDIV8 снят)

Config 1wire = Porta.1 'настройка порта для подключения датчика

Config Watchdog = 64 'настройка ватчдога

Config Int0 = Low Level 'настройка внешнего прерывания по низкому уровню
On Int0 Wakeup

Config Portb = Output
Config Portd = Output
Config Porta.0 = Output

Portb = &B11111111
Portd = &B11111111

Power18b20 Alias Porta.0 'питание датчика от ноги микроконтроллера

Dim N1 As Integer
Dim N2 As Integer
Dim N3 As Integer

Dim M1 As Integer
Dim M2 As Integer
Dim M3 As Integer

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

Power18b20 = 1 'подача питания на датчик

Gosub 18b20 'идем и узнаем температуру

Enable Interrupts
Enable Int0

'ГЛАВНЫЙ ЦИКЛ
'в нем на индикатор виводится значение температуры
Do

Portd = &B11101111 'первый разряд
Portb = Lookup(n1 , Numbers)
Waitms 5

Portd = &B11110111 'второй разряд
Portb = Lookup(n2 , Numbers)
Waitms 5

Portd = &B10111111 'третий разряд
Portb = Lookup(n3 , Numbers)
Waitms 5

Wr = Wr + 1 'считаем сколько раз прошел цикл

Loop Until Wr = 333 'если прошло 333 интерации (примерно 5сек) выходим

Waitms 10
Power18b20 = 0 'отключим питание датчика

Portb = &B11111111 'гасим индикатор полностью
Portd = &B11111111

Powerdown 'погружение микроконтроллера в режим энергосбережения

'прерывание от баттона на INT0
Wakeup:

Start Watchdog 'запускаем пса
Gifr = 64
'после того как пес запущен, пройдет примерно 64мс и он сбросит микроконтроллер
'что вызовет повторное выполнение всей программы, тоесть опрос датчика и вывод показаний на индикатор на 5 сек
Return

If Err = 1 Then 'Ошибочка? значит датчик не подключен

T = 255 'в таком случае на индикаторе будет три черточки
N1 = 10
N2 = 10
N3 = 10
Return

Else 'если все нормально идем дальше

1wwrite &HCC
1wwrite &H44

1wreset
1wwrite &HCC
1wwrite &HBE

If Byte1 > 248 Then
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Sign = "-"

Else
Sign = "+"
End If

T1 = Byte0 / 16
T2 = Byte1 * 16

'Коррекция полученных значений
If Sign = "-" Then
T = T + 1
End If

If Sign = "+" And T = 0 Then
Sign = " "
End If

M1 = T
M2 = T
M3 = T
M1 = M1 / 100 'сотки
N1 = Abs(m1)
M2 = M2 Mod 100 'десятки
M2 = M2 / 10
N2 = Abs(m2)
M3 = M3 Mod 10 'единицы
N3 = Abs(m3)
End If

'подготовка данных на вывод индикатора

If T 9 And Sign = "+" Then 'если температура положительная и занимает два разряда
N1 = N2 'первый разряд десятки градусов
N2 = N3 'на второй разряд единицы градусов
N3 = 11 'третий разряд символ градуса
End If

If T 9 And Sign = "-" Then 'если температура отрицательна и занимает два разряда
N1 = 10 'первый разряд символ минус, остальные как и должны быть
End If

If Sign = " " Then
N1 = 12 'первый разряд пустой
N2 = 0 'просто ноль
N3 = 11 'третий разряд символ градуса
End If

'теперь информация будет хорошо смотреться на индикаторе при любых значениях

'массив откуда берутся данные для зажигания отдельных сегментов
Numbers:

Data &B10100000 '0
Data &B11111010 '1
Data &B10001100 '2
Data &B11001000 '3
Data &B11010010 '4
Data &B11000001 '5
Data &B10000001 '6
Data &B11111000 '7
Data &B10000000 '8
Data &B11000000 '9
Data &B11011111 'минус
Data &B11010100 'градус
Data &B11111111 'пустой разряд

Также сделал так чтобы и питание на датчик шло через ножку микроконтроллера (через PortA.0), таким образом в ждущем режиме датчик не жрет впустую энергию
Как подключаются индикатор и датчик прокоментировано в коде, если нужно будет набросаю схему.
С фотками тоже чуть попозже :)

Читайте также: