Это устройство в принципе тоже можно назвать в некотором роде моим первым опытом... нет-нет, не в создании приборов на платформе AVR, к тому времени я уже кой-чего умел, а в плане пайки SMD-компонентов. О том, чем и как я паял эту плату, я расскажу в другой раз - это тема отдельной статьи, пока же остановимся на самом термометре. Его принципиальная электрическая схема довольно проста:
Собственно, эта схема не является каким-либо откровением - интернет пестрит подобными устройствами, но я решил изобрести велосипед и разработал ее сам: и аппаратную, и программную часть. Единственным требованием к разработке была миниатюрность, у меня в наличии был корпус типа "спичечный коробок" и я решил во что бы то ни стало запихнуть туда этот самый термометр. Забегая вперед, скажу, что мне это таки удалось :) Итак, что мы имеем на схеме: довольно распространенный и относительно недорогой микроконтроллер DD1 ATTiny2313-20SU (в SOIC-корпусе для поверхностного монтажа), светодиодный трехразрядный семисегментный индикатор HG1 типа RL-T3610RCAW (но можно применить любой с общим катодом или при соответствующей переделке прошивки с общим анодом), цифровой датчик температуры DS18B20 фирмы Dallas Semiconductor (успешно выкупленной фирмой Maxim), позволяющий измерять температуру с точностью 0,5 градусов, а индицировать ее с точностью 0,1 градус (вот такой вот парадокс жизни). Остальные детали - это пассивные компоненты - конденсаторы C1 (10...33 мкФ) и С2 (0,1 мкФ) предназначены для фильтрации помех, резисторы R1-R8 (100...270 Ом) - токоограничительные, предназначены для защиты светодиодов индикатора HG1, резистор R9 (4,7 кОм) нужен по спецификации протокола 1-Wire, по которому датчик передает измеренную температуру на микроконтроллер, и изменять его номинал не рекомендуется. GB1 - литиевая батарейка типоразмера CR2032 на 3 В (такие используются в материнских платах, так что вещь не дефицитная). SB1 - кнопка подачи питания. ХР1 - штекерная часть разъема для подключения программатора с интерфейсом ISP. В таблице для удобства приведен перечень используемых деталей
Обозначение
Номинал
R1, R2, R3, R4, R5, R6, R7, R8
100...270 Ом, 0,125 Вт
R9
4,7 кОм, 0,125 Вт
С1
0,068...0,15 мкФ
С2
10...33 мкФ х 6,3В
DD1
ATTiny2313-20SU
DD2
DS18B20
HG1
RL-T3610RCAW (или аналогичный с общим катодом)
GB1
CR2032
SB1
Тактовая типоразмера 301
ХР1
Разъем-штекер IDC5x2М
Собственно, в обычном состоянии термометр обесточен. Для того, чтобы посмотреть температуру, необходимо нажать кнопку SB1. При этом первые полсекунды ничего не произойдет - не переживайте, все работает, просто датчику нужно время для пересчета температуры в цифровой код. После получения данных от датчика контроллер немедленно выводит температуру на экран. Диапазон измерения термометра (теоретически) от -55 до 100 градусов Цельсия, он разбит на два поддиапазона: 1) от -55 до 0 градусов с точностью индикации 1 градус (надо ж куда-то выводить знак минус :)) 2) от 0 до 99,9 градусов с точностью индикации 0,1 градус (тут используются все три разряда). Вот в общем и все - устройство крайне простое в эксплуатации. Внешний вид платы со стороны монтажа и с лицевой стороны приведен ниже
Готовое устройство в сборе выглядит так
Если вы спросите, что это такое болтается на проводке, отвечу - это тот самый датчик DS18B20. Уже упомянутый в прошлой статье внимательный читатель может возмутиться и сказать, что он ни разу не похож на датчик, а похож скорее на старый советский электролитический конденсатор. Тут мы вспомним замечательную сказку Антуана де Сент Эклюпери "Маленький принц", когда главный герой безуспешно рисовал барашка, и плюнув в итоге, нарисовал прямоугольник, сказал, что это ящик, и барашек внутри. Собственно, к чему я веду. Для защиты датчика от внешних воздействий я действительно засунул его в корпус от старого советского электролитического конденсатора (коих у меня довольно много), предварительно высверлив и удалив все внутренности, а затем залил все внутри эпоксидной смолой. После этого, я измерял этим датчиком и температуру воды, и температуру воздуха в морозилке - датчику хоть бы хны, работает себе, не зная горя. Фотография прибора в работе приведена ниже
Вот такая вот жара сейчас у меня в комнате - 28,9 градусов, поэтому если что, не судите строго за вольный стиль написания - мозги плавятся... Вот, в принципе, и все. Схему, печатную плату в формате DipTrace, прошивку с подробно комментированными исходниками можно скачать здесь. Если у вас возникнут вопросы, задавайте их на форуме или здесь в виде комментариев к статье :) Удачного конструирования!
Спасибо за ответ! Не могли бы Вы подсказать, какие изменения нужно внести в программу, чтобы термометр мог в редкие реального времени измерять температуру? Я только начинаю изучать микроконтроллеры и пока не могу сам разобраться. Спасибо Вам за цикл статей о микроконтроллерах. Дошёл уже до пятого урока. И ещё вопрос: чем Вы компилирцете исходники в hex файл?
Доброго вечера! Функцию main необходимо изменить следующим образом:
Код
int main (void) { init(); //Инициализация контроллера while (1) //Бесконечный цикл с прерываниями { cli(); //запрет прерываний convert_t(); //Запрос на расчет температуры sei(); //Разрешение прерываний _delay_ms(800); //Задержка 800 мс для расчета температуры cli(); //запрет прерываний temp = read_temp(); //Считывание температуры из датчика sei(); //Разрешение прерываний } return 0; }
А исходники я собираю программой WinAVR. Я о ней в какой-то ранней статье писал. Но по ней полно информации в интернете.
Здравствуйте! Собрал Ваш термометр и заметил, что показания изменяются только, если его выключить и потом снова включить. Я собрал термометр с постоянным питанием от блока питания 5 вольт и на контроллере в DIP корпусе. Программа контроллера предусматривает непрерывное измерение температуры или только однократно при включении?
Здравствуйте! Программа измеряет температуру только один раз при включении, потому что этот термометр задумывался как переносной с минимальным временем нахождения во включенном состоянии. Для непрерывного изменения температуры необходимо внести минимальные изменения в исходный код программы, который доступен дня скачивания в тексте статьи.
Проверьте внимательно монтаж, не перепутаны ли выводы датчика? Правильного ли номинала резистор R9. Также проверьте фьюза контроллера, они должны быть по умолчанию.
Доброй ночи! так и не заработал Ваш прибор, даже бубен не помог :)) подозревал, что МК запорот, вот за час переделал вашу схему на схему http://eldigi.ru/site/term/16.php, перепрошил Тиньку (благо, есть Ваш Microprog), выставил фьюзы и все заработало. Индикатор у меня с ОК. так что возможно ошибки где-то у Вас... или на сайте. Хотелось бы узнать о других ваших разработках на МК, на сайте всего 3 устройства! я вот планирую в ближайшее время собрать аналог Ambilight, не могли бы порекомендовать проверенную и желательно недорогую схему?
Олег, вот честно, так и не смог найти ошибки. В схеме и программе ее точно нет, и доказательством тому - работающий уже третий год термометр, переживавший даже не самые лучшие условия. Да и странно, что больше никто не делал замечаний по поводу неработающего устройства. То ли никто не повторял конструкцию, то ли таки ошибку где-то у Вас... Разработанных мною устройств не так и много на самом деле. Во-первых, это видов пять термометров разных типов и размеров. Еще таймер автоматического включения-выключения сетевой нагрузки по встроенным часам. Устройство, включающее нагрузку по сигналу от мобильного телефона. "Умная розетка", измеряющаяя ток и напряжение, и управляемая от компьютера через USB. Ну и так по мелочам разные подпрограммки - для управления шаговым двигателем от USB, для вывода информации на дисплей от Нокии 3310... Насчет Ambilight, к сожалению, ничего подсказать не могу, не интересовался этим вопросом.
Фьюзы микроконтроллера надо оставлять по умолчанию. Выкладываю скриншот: http://sokolsp.at.ua/fuses.jpg То, что непонятка на индикаторе, может быть обусловлено тем, что у Вас используется индикатор с общим анодом, а не с общим катодом, как в данной конструкции.
Добрый день! продолжаю повторять Ваши конструкции. вопрос: фьюзы МК термометра не надо устанавливать, оставлять по умолчанию??? у меня без фьюзов на индикаторе непонятка и на датчик не реагирует.
Вот как раз сейчас я разрабатываю преобразователь для термопар, правда на несколько иной архитектуре контроллеров. О результатах потом сообщу, но, думаю, что все получится
Хорошее устройство... А как насчет увеличения измеряемой температуры до..скажем 700 градусов - возможно ли это на подобной элементарной базе? Возможно ли применение в качестве датчиков термопар?
Перечитывая вышенаписанное, понимаю, что я погорячился, когда говорил, что 28,9 градусов - это жара... Верните мне эту температуру!!!! Сейчас этот термометр показывает 33,5 градуса... И это в комнате в 12 часов ночи... Мозги, кажется, расплавились уже...