Цифровой термометр с эффективным энергосбережением
|
|
sherman | Дата: Четверг, 17.05.2012, 12:50 | Сообщение # 1 |
Группа: Проверенные
Сообщений: 55
Статус: Offline
| Пришла и моя очередь делать термометр на микроконтроллере AVR ))) Захотелось собрать простой и удобный портативный термометр с хорошей индикацией на семисегментных индикаторах. А ввиду того что индикаторы потребляют много, решил выводить температуру не постоянно а при нажатии на кнопку. Большую часть времени ведь все равно на него никто смотреть не будет. Поэтому во время простоя микроконтроллер находится в энергосберегающем режиме. При нажатии на кнопку в обработчике прерывания INT0 запускается сторожевой пес который сбрасывает микроконтроллер через 64мс. Тот в свою очередь заново выполняет программу (опрашивает датчик, выводит показания и через 5 секунд уходит в Powerdown)
Code '**************************************** 'простой термометр на 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
Dim Wr As Word
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
Wr = 0
Powerdown 'погружение микроконтроллера в режим энергосбережения
End
'прерывание от баттона на INT0 Wakeup:
Start Watchdog 'запускаем пса Gifr = 64 'после того как пес запущен, пройдет примерно 64мс и он сбросит микроконтроллер 'что вызовет повторное выполнение всей программы, тоесть опрос датчика и вывод показаний на индикатор на 5 сек Return
'опрос датчика 18b20, все как обычно '************************************ 18b20:
1wreset
If Err = 1 Then 'Ошибочка? значит датчик не подключен
T = 255 'в таком случае на индикаторе будет три черточки N1 = 10 N2 = 10 N3 = 10 Return
Waitms 100
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 T2 = Byte1 * 16
T = T1 + T2
'Коррекция полученных значений 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 < 10 And Sign = "+" Then 'если температура положительная и занимает один разряд N1 = 12 'первый разряд пустой N2 = N3 'второй разряд значение температуры N3 = 11 'третий разряд символ градуса End If
If T > 9 And Sign = "+" Then 'если температура положительная и занимает два разряда N1 = N2 'первый разряд десятки градусов N2 = N3 'на второй разряд единицы градусов N3 = 11 'третий разряд символ градуса End If
If T < 10 And Sign = "-" Then 'если температура отрицательна и занимает один разряд N1 = 10 'первый разряд символ минус 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
'теперь информация будет хорошо смотреться на индикаторе при любых значениях
Return
'массив откуда берутся данные для зажигания отдельных сегментов 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), таким образом в ждущем режиме датчик не жрет впустую энергию Как подключаются индикатор и датчик прокоментировано в коде, если нужно будет набросаю схему. С фотками тоже чуть попозже :)
Сообщение отредактировал sherman - Четверг, 17.05.2012, 12:53 |
|
| |
RD3AVJ | Дата: Четверг, 17.05.2012, 14:11 | Сообщение # 2 |
Группа: Свой человек
Сообщений: 175
Статус: Offline
| А можно фото и разводку со схемой в студию? Проект судя по все готовый, раз в этой теме?
Сообщение отредактировал RD3AVJ - Четверг, 17.05.2012, 14:16 |
|
| |
sherman | Дата: Четверг, 17.05.2012, 15:54 | Сообщение # 3 |
Группа: Проверенные
Сообщений: 55
Статус: Offline
| Да, уже собранный и проверенный, работает! нелегкое это дело схемы рисовать во, что вышло
разводку платы приводить не буду потомушта жадный потому что использовал одинарные индикаторы, и они у меня все соединены лапшой из проводков
фотки как и обещал будут, но позжже
Сообщение отредактировал sherman - Четверг, 17.05.2012, 15:57 |
|
| |
exersizze | Дата: Четверг, 17.05.2012, 19:34 | Сообщение # 4 |
Группа: Администраторы
Сообщений: 723
Статус: Offline
| Отличный проект, сам хотел чтото подобное собрать :) А показания нормально показывает, не действует на датчик то что постоянно питание включается и сразу запрос?
|
|
| |
sherman | Дата: Четверг, 17.05.2012, 20:03 | Сообщение # 5 |
Группа: Проверенные
Сообщений: 55
Статус: Offline
| не, все отлично! хотя можно добавить задержку перед опросом после подачи питания. обещанные фотки. общий вид, питается двумя полторавольтовыми батарейками
замер комнатной температуры
холодная куриная тушка)
вид сзади
потом все это дело запихну в корпус, поэтому особо не парюсь по поводу эстетического вида сзади
Добавлено (17.05.2012, 19:55) --------------------------------------------- ни как не получается добавить видео(
Добавлено (17.05.2012, 20:03) --------------------------------------------- слил видео на другой хостинг, ссылка http://vimple.ru/4f91f82a34ea497f9c683486589e3105
Сообщение отредактировал sherman - Четверг, 17.05.2012, 20:03 |
|
| |
RD3AVJ | Дата: Пятница, 18.05.2012, 00:04 | Сообщение # 6 |
Группа: Свой человек
Сообщений: 175
Статус: Offline
| Плюсую, проект понравился. С разрешения автора хотелось бы повторить (для дачи ) Только вопрос: можно ли заменить 2313 другим контроллером, например 8й мегой?
|
|
| |
sherman | Дата: Пятница, 18.05.2012, 13:57 | Сообщение # 7 |
Группа: Проверенные
Сообщений: 55
Статус: Offline
| разрешения спрашивать не обязательно собирайте на здоровье! на восьмой тоже можно. Кстати, память у тиньки занята на 97% и больше туда запихнуть ничего не вышло. Хотел еще добавить кнопку чтобы постоянно включала индикацию. С мегой можно это воплотить ))
|
|
| |
RD3AVJ | Дата: Вторник, 22.05.2012, 15:08 | Сообщение # 8 |
Группа: Свой человек
Сообщений: 175
Статус: Offline
| Коллеги, подскажите, буду делать этот же проект, только на меге 8А и вот с такими индикаторами: http://www.chipdip.ru/product/kcsa02-105.aspx можно ли НЕ использовать транзисторы в цепи питания анодов? Просто приделать к ногам контроллера.
|
|
| |
sherman | Дата: Среда, 23.05.2012, 11:14 | Сообщение # 9 |
Группа: Проверенные
Сообщений: 55
Статус: Offline
| Привет! Так делать крайне не желательно, придется ставить резистор а из-за него яркость свечения индикатора может быть низкой. Хотя можно попробовать, красные индикаторы вроде хорошо светят
|
|
| |
RD3AVJ | Дата: Среда, 23.05.2012, 15:53 | Сообщение # 10 |
Группа: Свой человек
Сообщений: 175
Статус: Offline
| Рискну пожалуй. Сейчас как раз раводкой платы занимаюсь под эти индикаторы
|
|
| |
domrustika | Дата: Пятница, 26.07.2013, 00:46 | Сообщение # 11 |
Группа: Пользователи
Сообщений: 16
Статус: Offline
| вопрос такой зачем тут в схеме стоят транзисторы?
Сообщение отредактировал domrustika - Пятница, 26.07.2013, 12:10 |
|
| |
RD3AVJ | Дата: Пятница, 26.07.2013, 16:20 | Сообщение # 12 |
Группа: Свой человек
Сообщений: 175
Статус: Offline
| На выходе пинов микроконтроллеров этого семейства не должно быть более 40мА. Транзисторы позволяют подключить без потери работоспособности авр данный по схеме индикатор. В принципе, можно попробовать и без них, но это уже будет рулетка...
|
|
| |
domrustika | Дата: Пятница, 26.07.2013, 17:36 | Сообщение # 13 |
Группа: Пользователи
Сообщений: 16
Статус: Offline
| ясно спасибо.
|
|
| |
tolp | Дата: Суббота, 27.12.2014, 05:30 | Сообщение # 14 |
Группа: Пользователи
Сообщений: 3
Статус: Offline
| а hex файла нет? как прошивать? И будет ли он показывать отрицательную температуру?
Сообщение отредактировал tolp - Суббота, 27.12.2014, 05:55 |
|
| |
sany2 | Дата: Суббота, 27.12.2014, 09:00 | Сообщение # 15 |
Группа: Проверенные
Сообщений: 107
Статус: Offline
| будут.
|
|
| |
tolp | Дата: Среда, 14.01.2015, 16:36 | Сообщение # 16 |
Группа: Пользователи
Сообщений: 3
Статус: Offline
| а можно ли использовать датчик DS 1820?он без буковки (В) В ЧЕМ У НИХ РАЗНИЦА МЕЖДУ DS 18B20???
|
|
| |
sany2 | Дата: Среда, 14.01.2015, 20:43 | Сообщение # 17 |
Группа: Проверенные
Сообщений: 107
Статус: Offline
| http://tec.org.ru/publ....-1-0-14
|
|
| |
tolp | Дата: Пятница, 16.01.2015, 00:06 | Сообщение # 18 |
Группа: Пользователи
Сообщений: 3
Статус: Offline
| а есть прошивка в формате (НЕХ) для датчика DS 1820? а то получается они не заменяемые
|
|
| |
time4rc | Дата: Вторник, 27.01.2015, 16:50 | Сообщение # 19 |
Группа: Пользователи
Сообщений: 1
Статус: Offline
| Проект давний, но все равно добавлю пару слов. Мне кажется со сторожевой собакой - это лишнее. Можно же кнопку просто на reset подключить. Получится то же самое, только еще код поменьше станет, из-за отсутствия необходимости активировать Int0 и Watchdog. Неоднократно проверено на схемах, где требуется выполнение какого-то кода с последующим засыпанием. И еще по поводу сокращения размера программы: на первый взгляд использовать переменные типа Integer нет необходимости. Если использовать Byte или Word, это дает ощутимую экономию флэш-памяти.
Сообщение отредактировал time4rc - Вторник, 27.01.2015, 16:55 |
|
| |
LexResident | Дата: Вторник, 22.03.2016, 15:39 | Сообщение # 20 |
Группа: Пользователи
Сообщений: 3
Статус: Offline
| Зачетный термометр, пользуюсь подобным (а может и этим же но с радиокота), батарею держит годами. Тестю собрал и второй год уже батарею не меняю, если сядет, то скорей от саморазряда . Спасибо автору!
|
|
| |
sherman | Дата: Среда, 23.03.2016, 00:05 | Сообщение # 21 |
Группа: Проверенные
Сообщений: 55
Статус: Offline
| Да у меня тоже годами работает, за 4 года всего второй комплект батареек сменил. ЗЫ на радиокоте не мой.
|
|
| |
boring | Дата: Четверг, 24.03.2016, 13:26 | Сообщение # 22 |
Группа: Пользователи
Сообщений: 8
Статус: Offline
| Здравствуйте sherman.
Попробывал Ваш проект в протеусе, что то не хочет работать. Мигают среднии чёрточки. Протеус использовал 7.9 SP1. Может что не так нарисовал.
Приложил файл протеуса и копию экрана.
P.S. В Протеусе в настройках делитель на 8 нужно поставить "Unprogrammed" Показания появляются на некоторое время. При нажатии на кнопку не появляются, что-то ещё надо сделать или так ведёт себя протеус.
Сообщение отредактировал boring - Четверг, 24.03.2016, 18:30 |
|
| |
sherman | Дата: Четверг, 24.03.2016, 21:52 | Сообщение # 23 |
Группа: Проверенные
Сообщений: 55
Статус: Offline
| boring, протеуса сейчас нет проверить, но уверен дело в нем и его кривой симуляции.
|
|
| |