| Цифровой термометр с эффективным энергосбережением | 
| 
				
			 | 
| 
| 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 |  |   Группа: Администраторы Сообщений: 720 
 Статус: 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, протеуса сейчас нет проверить, но уверен дело в нем и его кривой симуляции. 
 
 |  
 |  |  |  |