Часы-термометр LED с радиодатчиком

1. Часы-термометр LED с радиодатчиком

      Если для питания часов и приемника применяется один общий стабилизатор напряжения, то 

скорее всего (да не скорее всего, а точно) приемник начнет сильно шуметь из-за динамической 

индикации, что приведет к полной потере приема данных! Необходимо применить ДВА ОТДЕЛЬНЫХ стабилизатора 7805/78L05 как показано на схеме!

      

    Здравствуйте!

    Ну вот я и отважился на написание статьи.

  Все началось 3 года назад с изучения ASM’a и структуры PIC’ов, мигания светодиодами в Протеусе посредством PICBasic Pro и дошло до банального термометра PIC16F630 + 3LED с датчиком DS18S20, висевшим за окном. Его жизненный цикл закончился через три зимне-весенних месяца, после того как в очередной раз на DSку попала вода (хотя датчик находился под тремя!!! слоями разнокалиберной термоусадки) и отвалилась одна из ног, я решился на разработку безпроводного герметичного датчика.

   Система состояла из основного блока PIC16F630 + DS18S20 + 3LED + RCR-433-MPR и радиодатчика PIC12F629 + DS18S20 + RCT-433-AS. Корпусом для последнего послужило «яйцо» от больничных бахил. Данная конструкция проработала безотказно больше года при температуре -25… +35 *С (никаких следов окисления обнаружено не было). Батарейка датчика CR2032 (компьютерная) немного подсела с 3,3 до 3,2 вольт при посылке температуры раз в 10 минут.

    Все было хорошо, жизнь продолжалась, температура менялась, но тут неожиданно сдохли старые, собранные моим батей, часы на КР145ИК1901. Вывод напросился сам собой. Надо было только заменить PIC16F630 на что-то помощнее, ну и индикатор. Выбор пал на PIC16LF628. Через месяц трудов и еще одного месяца отладки и реализации новых функций родились они, Часы-термометр с радиодатчиком. Давайте пробежимся по возможностям данного девайса 

           PIC16LF628 + DS18S20 + 4LED_OA + RCR-433-MPR:

 

1.  Часы/день недели.

2.  Температура дома.

3.  Температура с радиодатчика.

4.  Будильник.

5.  Радиозвонок

6.  Коррекция хода.

7.  Кольцевое отображение данных.

8.  Резервное питание.

 

Дополнительные функции:

—  уменьшение яркости индикатора ночью.

—  при обрыве датчика температура_1 не отображается.

—  если сигнала с радиодатчика нет 25 минут – загорается точка при отображении температуры_2, если нет 50 минут, то температура_2 не отображается.

— выход будильника настраивается (длинный 0, короткий 0, секундные 0, генератор с настраиваемым тоном). Сигнал «каждый час» , ночью отключается.

—  коррекция хода +/-96мс…12сек в сутки или +/-180мс…24 сек/сутки.

—  отображение данных: Часы->День->Температура_1-> Температура _2.

—  время отображения данных настраивается: 1-20сек часы, 0-10сек день и температура.

—  резервное питание: CR2032, ток потребления 0,7мА, будильник работает.

Схема. 

    В часах применен индикатор CA56-12GWA (14.2мм 4х7 зеленый ОА, 10.5мКд), в его анодах стоят эмиттерные повторители КТ3102. В каналах сегментов резисторы 100-120 Ом. Пищалка взята от компьютера с последовательно включенным резистором 20 Ом. Питание часов осуществляется от телефонной зарядки. Потребляемый ток примерно 50-70мА.

    Индикатор в дежурном режиме:

—  отображение по кольцу.

—  любой пункт можно убрать, кроме часов.

—  время отображения любого пункта можно настроить.

    Пункты меню настройки:

—   вход/выход осуществляется по длинному нажатию на кнопку «МЕНЮ».

—   отображение меню по кольцу по короткому нажатию на кнопку «МЕНЮ».

—   регулировка параметров кнопками «МИНУС» и «ПЛЮС».

—  кнопки регулировки работают по такому принципу: нажал — параметр изменился, держим дальше; после некоторой задержки (0,5сек) включается автоповтор нажатия (8Гц).

—  кнопка «МИНУС» (слева) прибавляет параметр в 2х старших разрядах индикатора, уменьшает одиночный параметр или отключает будильник в дежурном меню.

—  кнопка «ПЛЮС» (справа) прибавляет параметр в 2х младших разрядах индикатора, увеличивает одиночный параметр, сбрасывает секунды в ноль или включает будильник в дежурном меню.

—  при включенном будильнике горит точка в младшем разряде индикатора.

—  при настройке тона будильника звучит сигнал.  За качество сигнала сильно не ругайте, сделал, как мог. Можно поставить внешнюю пищалку с генератором или музыкальную открытку, для этого и сделан выбор режима будильника.

    В ходе работы и появившихся вопросов по поддержке датчиков DS18B20 и расширения диапазонов коррекции хода был добавлен пункт меню SET

    Он выглядит так: «S X Y Z»

Значения переменных:

X=0 — коррекция двойная

X=1 — коррекция одинарная

Y=0 — датчик температуры DS18B20

Y=1 — датчик температуры DS18S20

Z=0 — кварц 4.000 МГц

Z=1 — кварц 4.096 МГц

Значение переменных корректируется кнопками + и — по двоичному закону.

Значения переменных меню «SET» и «Коррекция хода» заносятся в EEPROM.

    В дальнейшем мой друг @SUS предложил добавить к часам радиозвонок, что и было сделано. Был добавлен еще один пункт меню ALAR.

    В нем выбирается серийный номер звонка (0..7), в звонке этот номер выбирается тремя джамперами.Значения переменных меню «ALAR«, «SET» и «Коррекция хода» заносятся в EEPROM.

      Ну тут вроде все понятно, теперь перейдем к софту.

    Программа написана на PIC Basic Proton, занимает в памяти контроллера 99%, последнюю память потратил на звонок, который я добавил буквально вчера. В программе часов задействованы все 3 таймера, организован программный протокол 1Wire из библиотеки Basic’а. 

    По переполнению таймера_0 (4мсек) происходит аппаратное прерывание, в котором полностью рассчитываются значения часов, минут, секунд и дня недели, корректируется ход. Я достаточно долго подбирал алгоритм коррекции хода часов, но более менее оптимальный оказался как всегда на самом виду. В начале каждого часа (0 минут, 0 секунд), когда четырех миллисекундный счетчик достигнет значения 125, к нему прибавляется/отнимается константа 0…124. Получился достаточно широкий диапазон корректировки (+/-96мс…12сек в сутки).

    Так же с помощью этого прерывания организована динамическая индикация и сканирование кнопок. Когда кнопки отпущены – счетчик антидребезга равен 0, во время нажатия, значение кнопки сохраняется как старое, а счетчик начинает прибавляться при совпадении старого и нового значения кнопок. При достижении счетчика 4х, кнопка считается нажатой. Далее счетчик тикает до 30, сбрасывается в ноль и доходит до 4х – автоповтор. Но второй счетчик (я его назвал автоповтор) не даст сделать 1,2…7 автоповторы. То есть первая реакция на кнопку произойдет через 20мс, а вторая реакция — только через 840мс и далее с частотой примерно 8 Гц.

    Протокол радиопередачи слизан с IR SONY с 

немного измененными временными интервалами (хорошая синхронизация, проще декодировать по сравнению с RC5). 

    Данные радиодатчика температуры содержат следующие байты: 

—   Серийный номер (00000000).

—   Значение знака температуры

—   Значение температуры 

—   Байт CRC8. 

    Данные с радиозвонка:

—   Серийный номер (00000001).

—   Значение номера звонка

—   Нулевой байт 

—   Байт CRC8. 

    Единица передается импульсом 1200 мкс с паузой 600 мкс, 0 – 600/600, между байтами пауза 1800мкс. Перед посылкой байтов отправляется преамбула из 8-ми нулей и опознавательный сигнал длительностью 10мс. Общее время передачи составляет приблизительно 75 мсек. На пульты от автомобильных сигнализаций декодер приемника не реагирует. Во время приема (после опознавания «своего сигнала» по импульсу 10мс) индикатор гаснет на 50 мс. Это конечно минус, но использовать еще одно прерывание и декодировать сигнал в нем мне показалось довольно таки сложным и запутанным занятием.

    Теперь по радиодатчику (PIC12F629 + DS18S20 + RCT-433-AS + CR2032).

PIC12F629 работает от внутреннего генератора 4МГц (+/-2%). Кстати на качество декодирования это не сказывается, т.к. в декодере приемника допустим разброс временных интервалов +/-15%. Модуль питается от литиевого элемента 3В CR2032 (уже больше года). Корпусом служит «яйцо» от больничных бахил. Передатчик отправляет данные о температуре (DS18S20), серийный номер и CRC8 либо каждую секунду, либо троекратно через 5 минут, для переключения в схеме предусмотрен джампер (есть еще одна свободная нога). Остальное время контроллер спит и потребляет ток порядка 0,02 мА (насколько позволил измерить мой китайский мультиметр). В ходе работы прошивка обновилась — появилась поддержка PIC12F675, появился джампер на GPIO.3 для переключения между DS18S20 и DS18B20 (0 — DS18B20, 1 — DS18S20)

    Звонок в реальных условиях еще не тестировался. Построен на PIC12F629 или PIC12F675, питается от одного элемента CR2032. В звонке с помощью джамперов можно выбрать порядковый номер и соответственно в часах такая настройка тоже имеется. При нажатии кнопки звонка, три раза подряд в радиоэфир передается последовательность байтов, которую и примут часы. Если кнопка все еще нажата, то эта последовательность повторяестя. При отпускании кнопки контроллер засыпает.

    Платы для этих устройств на начальном этапе не разрабатывались. Все было выполнено на односторонних монтажках посредством провода МГТФ. И, как я убедился, работает на ура и без глюков! В последствии эти часы собрал @SUS, и помог выловить несколько багов. Благодаря его идеям в часы добавилось множество функций.

    В дальнейшем часы были усовершенствованы, об этом читай во второй статье.

 

    Удачи Вам! Быстрых контроллеров, побольше Flash, компактных программ!

 

    P.S. Несколько фоток. By @SUS (Bezkz.su)

    Перед прошивкой контроллера PIC12F629/675 обязательно считать данные с него и записать на листочек (лучше на корпусе контроллера) калибровочную константу внутреннего генератора! Она находится в последней ячейке памяти, выглядит как 34XX (например 3430, 347F). При дальнейшем программировании этого контроллера необходимо вписать эту константу в последнюю ячейку памяти.

Прошивка, исходник радиодатчика (Датчик 18S20 или 18B20, контроллер PIC12F629 или PIC12F675)

Прошивка, исходник радиозвонка (Контроллер PIC12F629 или PIC12F675)

Обновление 30.12.2011

Обновление 07.01.2012
Прошивка, исходник часов v2.4 (расширено меню SET, читай подробности в архиве)
Обновление 11.01.2012
Прошивка, исходник часов v2.4а (первые пол минуты будильник звучит с периодом 1 сек, остальные пол минуты с периодом 0,5 сек; читай подробности в архиве)

Плата 12 вольт (более предпочтительна)

Плата 5 вольт (могут быть неполадки с приемником)

— Прошивки обновил до версии 1.8 (исправлена коррекция)

— Прошивки обновил до версии 1.9 (исправлен периодически возникающий звуковой сигнал)

— Добавлена прошивка с удвоенным интервалом коррекции под кварц 4.000 МГц (х2)

— Прошивка теперь будет одна версии 2.0  (исправлены некоторые баги, добавлен пункт меню SET)

— Прошивку обновил до версии 2.1 (добавлен радиозвонок, пункт меню ALAR)

— Прошивка звонка обновлена до версии 1.1 (прошлый не работал)

— Прошивку обновил до версии 2.2 (исправлен будильник в режимах 0,1,2; введен ночной уровень яркости до 100%)

— Прошивку обновил до версии 2.2a (исправлено меню SET)

— Прошивку обновил до версии 2.2b (Уменьшено время прерывания — датчик должен работать стабильно. Уменьшено время звучания сигнала «каждый час» и выхода из меню с 400мс до 100мс)

— Прошивка версии 2.2g (убраны незначащие нули, оптимизирован опрос проводного датчика температуры, но при «-0,5 градусах» датчик считается отключенным, думаю это не критично для домашнего термометра)

— Прошивка версии 2.3 (исправлен баг с DS18B20)

— Обновлена прошивка радиодатчика до версии 1.2 (исправлена некорректная передача знака температуры)

1 ответ