[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Цифровой термометр с эффективным энергосбережением
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), таким образом в ждущем режиме датчик не жрет впустую энергию
Как подключаются индикатор и датчик прокоментировано в коде, если нужно будет набросаю схему.
С фотками тоже чуть попозже :)
Прикрепления: termo.bas (6.9 Kb)




Сообщение отредактировал 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
Да, уже собранный и проверенный, работает!
нелегкое это дело схемы рисовать biggrin
во, что вышло


разводку платы приводить не буду потомушта жадный потому что использовал одинарные индикаторы, и они у меня все соединены лапшой из проводков biggrin

фотки как и обещал будут, но позжже
Прикрепления: 4368000.png (77.1 Kb)




Сообщение отредактировал sherman - Четверг, 17.05.2012, 15:57
 
exersizzeДата: Четверг, 17.05.2012, 19:34 | Сообщение # 4
Группа: Администраторы
Сообщений: 723

Статус: Offline
Отличный проект, сам хотел чтото подобное собрать :) А показания нормально показывает, не действует на датчик то что постоянно питание включается и сразу запрос?

 
shermanДата: Четверг, 17.05.2012, 20:03 | Сообщение # 5
Группа: Проверенные
Сообщений: 55

Статус: Offline
не, все отлично! хотя можно добавить задержку перед опросом после подачи питания.
обещанные фотки.
общий вид, питается двумя полторавольтовыми батарейками


замер комнатной температуры


холодная куриная тушка)


вид сзади


потом все это дело запихну в корпус, поэтому особо не парюсь по поводу эстетического вида сзади smile

Добавлено (17.05.2012, 19:55)
---------------------------------------------
ни как не получается добавить видео(

Добавлено (17.05.2012, 20:03)
---------------------------------------------
слил видео на другой хостинг, ссылка
http://vimple.ru/4f91f82a34ea497f9c683486589e3105
Прикрепления: 3322283.jpg (149.3 Kb) · 8452947.jpg (175.1 Kb) · 3448380.jpg (167.5 Kb) · 8851235.jpg (198.1 Kb)




Сообщение отредактировал sherman - Четверг, 17.05.2012, 20:03
 
RD3AVJДата: Пятница, 18.05.2012, 00:04 | Сообщение # 6
Группа: Свой человек
Сообщений: 175

Статус: Offline
Плюсую, проект понравился. С разрешения автора хотелось бы повторить (для дачи smile ) Только вопрос: можно ли заменить 2313 другим контроллером, например 8й мегой?

 
shermanДата: Пятница, 18.05.2012, 13:57 | Сообщение # 7
Группа: Проверенные
Сообщений: 55

Статус: Offline
разрешения спрашивать не обязательно biggrin собирайте на здоровье! wink на восьмой тоже можно. Кстати, память у тиньки занята на 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
Рискну пожалуй. Сейчас как раз раводкой платы занимаюсь под эти индикаторы wacko

 
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
будут.
Прикрепления: termo.hex (4.9 Kb)


 
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
Зачетный термометр, пользуюсь подобным (а может и этим же но с радиокота), батарею держит годами. Тестю собрал и второй год уже батарею не меняю, если сядет, то скорей от саморазряда  biggrin .
Спасибо автору!


 
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"
Показания появляются на некоторое время.
При нажатии на кнопку не появляются, что-то ещё надо сделать или так ведёт себя протеус.
Прикрепления: Ter18b20_2313.dsn (81.8 Kb) · 0052855.png (3.0 Kb)




Сообщение отредактировал boring - Четверг, 24.03.2016, 18:30
 
shermanДата: Четверг, 24.03.2016, 21:52 | Сообщение # 23
Группа: Проверенные
Сообщений: 55

Статус: Offline
boring, протеуса сейчас нет проверить, но уверен дело в нем и его кривой симуляции.

 
  • Страница 1 из 1
  • 1
Поиск: