Главная » Микроконтроллеры
Призовой фонд
на октябрь 2017 г.
1. Термометр Relsib WT51
Рэлсиб
2. 1000 руб
PCBWay
3. Регулируемый паяльник 60 Вт
Паяльник
4. 100 руб.
От пользователей

Похожие статьи:


Необычный термометр на ATtiny13 и DS18B20

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

В качестве сердца устройства выступает микроконтроллер ATtiny13. Был выбран именно этот микроконтроллер, так как  в данном случае размеры платы очень критичны. Датчик для измерения температуры - DB18B20. Он использует исключительно 1-Wire протокол – при этом формируется соединение, которое осуществляет коммуникацию на шине, используя всего один управляющий сигнал. Таким образом, у микроконтроллера осталось целых 4 свободных вывода (четыре, потому что вывод reset я не рискнул использовать). К трем из них подключаются светодиоды. Четвертый планировалось использовать как вход, для измерения уровня освещенности (посредством фоторезистора), но для этого не хватило памяти (сказывается плохая оптимизация в mikroPascal). В итоге (по той же причине нехватки памяти, в начале хотел реализовать что то вроде софтверного PWM) устройство в зависимости от температуры светится синим, зеленым или красным светом.

На рисунке ниже представлена схема прибора:

Схема прибора

Как видите, проще было уже просто некуда. Хотя, можно было бы убрать резисторы R1 - R3, но тогда потребляемый ток сильно возрастет. Резистор R4 убирать нельзя, тогда датчик температуры будет работать некорректно (скорее всего вообще работать не будет).

Что касается платы, то она, на мой взгляд, получилась легкой. Да, все детали в smd исполнении (за исключением DS18B20), но разводка дорожек действительно не сложная. Плата выполнена в виде круга диаметром 20 мм (именно такой диаметр у батареек типа CR2032) из двухстороннего фольгированного текстолита.

рис.2 (плата)

Батарейка находится на обратной стороне платы и прижимается к ней металлической (жестяной) скобой.

рис.3 (крепление)

Теперь можно перейти к программе. Как уже упоминалось выше, программа написана в среде mikroPascal. Ниже приведен ее (программы) исходный код.

program TLED;

var rez: integer;
    count: byte;

procedure OneWireRead(); iv IVT_ADDR_TIM0_OVF; ics ICS_AUTO;                    //Прерывание по переполнению T0. При конфигурации TCCR0B.CS02:=1; вызывается более 70-ти раз
var rec: array [0..1] of byte;                                                  //в секунду, а точнее 73. Для интревала ~3с нужно 197 раз перепонить таймер (вообще то больше, но иначе в число 255 не уложимся).
begin
     TCCR0B.CS02:=0;
     if count=197 then begin                                                    //
          ow_reset(PORTB, 4);                                                   //Этим действие мы "сбрасываем" шину, далее инициализируем датчик.
          ow_write(PORTB, 4, 0xCC);                                             //
          ow_write(PORTB, 4, 0x44);                                             //
          delay_us(120);                                                        //Ждем, пока он "проработает" команду и даем ему задачу - преобразовать температуру.
          ow_reset(PORTB, 4);                                                   //
          ow_write(PORTB, 4, 0xCC);                                             //
          ow_write(PORTB, 4, 0xBE);                                             //
     end else if count=255 then begin                                           //Далее ждем еще 1с и считываем данные (в датчике они хранятся в 2-х регистрах, вот оба и считываем).
         rec[0]:=ow_read(PORTB, 4);                                             //
         rec[1]:=ow_read(PORTB, 4);                                             //
         rez:=((rec[1] shl 8)+rec[0]) shr 4;                                    //Приводим к нормальному виду и проверяем на предмет отрицательного значения температуры.
         if rez>1000 then rez:=-(4096 -rez );                                   //
         count:=0;                                                              //
     end;

     if rez > 25 then PORTB:=0x06;
     if (rez > 20) and (rez < 25) then PORTB:=0x05;
     if rez < 20 then PORTB:=0x03;
     TCCR0B.CS02:=1;

     inc(count);
end;

procedure ConfigReg;
begin
     TCCR0B.CS02:=1;                                                            //Задаем предделитель 256, разрешаем прерывания по таймеру T0 (по переполнению).
     TIMSK0.TOIE0:=1;                                                           //
     SREG_I_bit:=1;                                                             //
     DDB4_bit:=0;                                                               //
     DDRB:=0x07;                                                                //
     PORTB:=0x07;
end;
                                                                                //
begin                                                                           //
     ConfigReg;
     While TRUE do begin
     end;                                                                       //
end.

Программа тоже не сложная. Отчасти это обусловлено маленькой памятью микроконтроллера ATtiny13, отчасти тем, что компилятор mikroPascal достаточно прожорлив. Кстати, при компилировании заметил интересную особенность: если включен уровень оптимизации "5", то свободных байт памяти остается 54, если же уровень оптимизации "0" - 62. Где тут оптимизация - не понятно :)

Что касается fuse битов, то их нужно выставить в соответсвии со скрином:

Коротко о работе программы:

  1. ​Настраиваем регистры прерываний.
  2. Настраиваем порт микроконтроллера.
  3. Далее просто крутимся в бесконечном цикле, который пуст.
  4. При переполнении таймера T0 прыгаем в прерывание и выполняем процедуру.
  5. Как только насчитаем 197 переполнений, "попросим" датчик преобразовать для нас значение температуры.
  6. Еще считаем переполнения, если их 255, то считываем данные, которые нам дает датчик и сбрасываем количество переполнений.
  7. ​Начинаем с п.3

​В устройстве и деталей то нет, чтобы что то заменять, но все же: микроконтроллер заменить можно ATtiny13A, резисторы R1 - R3 можно взять с номиналом меньше 560 Ом (но следите за током!), датчик тоже заменить нельзя. 

Ну и то что должно получиться:

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
U1 МК AVR 8-бит
ATtiny13
1 Замена ATtiny13AПоиск в LCSCВ блокнот
U2 Датчик температуры
DS18B20
1 Не заменяетсяПоиск в LCSCВ блокнот
R1-R3 Резистор
560 Ом
3 Можно взять с меньшим сопротивлениемПоиск в LCSCВ блокнот
R4 Резистор
4.7 кОм
1 Лучше не заменятьПоиск в LCSCВ блокнот
D1 СветодиодУльтраяркий SMD 0805 (синий)1 ЛюбойПоиск в LCSCВ блокнот
D2 СветодиодУльтраяркий SMD 0805 (зеленый)1 ЛюбойПоиск в LCSCВ блокнот
D3 СветодиодУльтраяркий SMD 0805 (красный)1 ЛюбойПоиск в LCSCВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: Изменена: 06.07.2015 0 0
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 1 чел.

Комментарии (4) | Я собрал (0) | Подписаться

0
Сергей #
При какой температуре горит каждый светодиод?
Ответить
0

[Автор]
zeconir #
if rez > 25 then PORTB:=0x06; //Тут мы выводим информацию на светодиоды.
if (rez > 20) and (rez < 25) then PORTB:=0x05;
if rez < 20 then PORTB:=0x03;
Числа (20, 25) - температура в цельсиях
Ответить
0
Viktor #
Скажите переключение цветов плавно или резко. Хотелось бы что бы цвета могли смешиваться
Ответить
0

[Автор]
zeconir #
Переключение не плавное. Может руки дойдут, переделаю. Но обещать ничего не буду.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
Ручной фен 450 Вт с регулировкой температуры UNI-T UT-61A
вверх