1. Часы-термометр LED с радиодатчиком
Здравствуйте!
Ну вот я и отважился на написание статьи.
Все началось 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. Температура дома (-55..+99 ⁰С).
3. Температура с радиодатчика (-55..+99 ⁰С).
4. Будильник с автоповтором.
5. Радиозвонок.
6. Коррекция хода.
7. Кольцевое отображение данных.
8. Резервное питание.
Дополнительные функции:
- уменьшение яркости индикатора ночью (время ночи и яркость настаиваются).
- при обрыве датчика температура_1 не отображается.
- если сигнала нет 50 минут, то температура_2 не отображается.
- выход будильника настраивается (длинный 0, секундные 0, генератор с настраиваемым тоном). Сигнал «каждый час», ночью отключается.
- коррекция хода +/-12 секунд в сутки с шагом 0,1сек.
- отображение данных: Время->День->Температура_1-> Температура _2.
- время отображения данных настраивается: 1-20сек время, 0-10сек день и температура.
- резервное питание: CR2032, ток потребления 0,7мА, будильник работает.
Схема.
В устройстве применен индикатор CA56-12GWA (14.2мм 4х7 зеленый ОА, 10.5мКд), в его анодах стоят эмиттерные повторители КТ3102. В каналах сегментов резисторы 100-160 Ом. Пищалка взята от компьютера с последовательно включенным резистором 20 Ом (лучше поставить транзистор). Питание осуществляется от телефонной зарядки. Потребляемый ток примерно 50-70мА.
Схема с ОА (это старая схема, новая лежит вместе с прошивками начиная с версии 4,0)
Схема с ОК (это старая схема, новая лежит вместе с прошивками начиная с версии 4,0) Схема радиодатчика и радиозвонка (в архиве с прошивкой может быть другая схема):
Proteus:
Индикатор в дежурном режиме:
- отображение по кольцу.
- любой пункт можно убрать, кроме времени.
- время отображения любого пункта можно настроить.
![]() Пункты меню настройки:
- вход/выход осуществляется по длинному нажатию на кнопку «МЕНЮ» (1сек).
- если меню разделено на два, то вход во второе меню (мало используемое) осуществляется по более длинному нажатию «МЕНЮ» (6сек). - смена пунктов меню по кольцу по короткому нажатию на кнопку «МЕНЮ».
- регулировка параметров кнопками «МИНУС» и «ПЛЮС».
- кнопки регулировки работают по такому принципу: нажал - параметр изменился, держим дальше; после некоторой задержки (0,5сек) включается автоповтор нажатия (8Гц).
- кнопка «МИНУС» (слева) в зависимости от пункта меню:
a - прибавляет параметр в 2х старших разрядах индикатора
b - уменьшает одиночный параметр c - по короткому нажатию выключает звук будильника d - по длинному нажатию отключает будильник - кнопка «ПЛЮС» (справа) в зависимости от пункта меню:
a - прибавляет параметр в 2х младших разрядах индикатора
b - увеличивает одиночный параметр c - сбрасывает секунды в ноль d - включает будильник - при включенном будильнике горит точка в младшем разряде индикатора.
- при приеме сигнала с радиодатчика эта точка мигает. - при настройке тона будильника звучит сигнал. За качество сигнала сильно не ругайте, сделал, как мог. Можно поставить внешнюю пищалку с генератором или музыкальную открытку, для этого и сделан выбор режима будильника.
![]() Пояснения:
- "ALAr" - будильник
- "ArPt" - авторепит, автоповтор будильника (2-60 минут) - "CLoc" - часы/минуты
- "SEC" - минуты/секунды
- "dAY" - день недели
- "Corr" - коррекция хода (+/-12 секунд в сутки с шагом 0,1) - "niGH" - время ночи (ХХ.YY, где ХХ - начало ночи, YY - конец ночи) - "LIGH" - яркость индикатора в ночное время - "tCLC" - сколько времени отображаются часы
- "tdAY" - сколько времени отображается день недели
- "ttEr" - сколько времени отображается температура
- "ton" - тональность звукового сигнала будильника
- "dAt" - выбор датчика температуры (DS18S20/DS18B20/нет датчика)
Значения переменных меню "Corr", "LIGH", "ton" и "dAt" заносятся в EEPROM через 20 секунд после отпускания всех кнопок.
При прошивке часов необходимо настроить EEPROM: частота кварца, номер радиозвонка, режим будильника, отображение знака градуса, отображение символов перед температурой и тд.
Ну тут вроде все понятно, теперь перейдем к софту.
Программа написана на PIC BasicProton+, занимает в памяти контроллера 99%. В программе часов задействованы все 3 таймера, организован программный протокол 1Wire.
По переполнению таймера_0 (4мсек) происходит аппаратное прерывание, в котором полностью рассчитываются значения часов, минут, секунд и дня недели, корректируется ход.
Так же с помощью этого прерывания организована динамическая индикация и сканирование кнопок. Когда кнопки отпущены – счетчик антидребезга равен 0, во время нажатия, значение кнопки сохраняется как старое, а счетчик начинает прибавляться при совпадении старого и нового значения кнопок. При достижении счетчика 4х, кнопка считается нажатой. Далее счетчик тикает до 30, сбрасывается в ноль и доходит до 4х – автоповтор. Но второй счетчик (я его назвал автоповтор) не даст сделать 1,2…7 автоповторы. То есть первая реакция на кнопку произойдет через 20мс, а вторая реакция - только через 840мс и далее с частотой примерно 8 Гц.
![]() Протокол радиопередачи слизан с IR NEC (хорошая синхронизация, проще декодировать по сравнению с RC5).
Данные радиодатчика температуры последней версии содержат следующие байты:
- Серийный номер (0х65 - настраивается).
- Тип параметра (0 - температура 1 с десятыми долями, 40 - звонок). - Значение знака температуры (для звонка 0х01).
- Значение температуры. - Значение десятых долей температуры.
- Байт контрольной суммы (+ по всем байтам).
Данные с радиозвонка (старая версия; новая версия звонка объединена с термодатчиком):
- Серийный номер (0х65-1).
- Значение номера звонка
- Нулевой байт - Нулевой байт
- Байт контрольной суммы (XOR по всем байтам).
В последней версии протокола единица передается импульсом 1500 мкс с паузой 500 мкс, 0 – 500/500. Перед посылкой байтов отправляется преамбула из 64-х импульсов 1500/1500мкс (иначе приемник DRA887RX работает некорректно) и опознавательный сигнал длительностью 4мс. На пульты от автомобильных сигнализаций декодер приемника не реагирует. Индикатор, как в предыдущих прошивках, во время приема радиосигнала не подмигивает.
Теперь по радиодатчику (PIC12F629 + DS18S20 + RCT-433-AS + CR2032).
PIC12F629 работает от внутреннего генератора 4МГц (+/-2%). Кстати на качество декодирования это не сказывается, т.к. в декодере приемника допустим разброс временных интервалов +/-15%. Модуль питается от литиевого элемента CR2032 (уже больше года). Корпусом служит «яйцо» от больничных бахил. Передатчик отправляет данные о температуре, серийный номер и LRC либо каждую секунду, либо троекратно через 5 минут (+/- 1 минута), для переключения времени в схеме предусмотрен джампер. Остальное время контроллер спит и потребляет ток порядка 0,02 мА (насколько позволил измерить мой китайский мультиметр).
Звонок построен на PIC12F629 или PIC12F675, питается от одного элемента CR2032. В звонке с помощью джамперов можно выбрать порядковый номер и соответственно в часах такая настройка тоже имеется. При нажатии кнопки звонка, три раза подряд в радиоэфир передается последовательность байтов, которую и примут часы. Если кнопка все еще нажата, то эта последовательность повторяется. При отпускании кнопки контроллер засыпает.
Платы для этих устройств на начальном этапе не разрабатывались. Все было выполнено на односторонних монтажках посредством провода МГТФ. И, как я убедился, работает на ура и без глюков!
В дальнейшем устройство было усовершенствовано, об этом читай во второй статье.
Плата часов:
![]() Несколько фоток от @SUS (Bezkz.su): ![]() ![]() ![]() ![]() Плата радиомодуля под батарейный отсек 3ААА (плата универсальная, поэтому на ней стоят лишние резисторы. Радиодатчик необходимо собирать по схеме из статьи):
Фотка:
Перед прошивкой контроллера PIC12F629/675 обязательно считать данные с него и записать на листочек (лучше на корпусе контроллера) калибровочную константу внутреннего генератора! Она находится в последней ячейке памяти, выглядит как 34XX (например 3430, 347F). При дальнейшем программировании этого контроллера необходимо вписать эту константу в последнюю ячейку памяти. Восстановление константы. В прошивках 2.0/2.1 прописывается серийный номер, по умолчанию 65 hex.
HEX, исходник радиодатчика версия 1.3 (Датчик 18S20 или 18B20, контроллер PIC12F629 или PIC12F675)
HEX, исходник радиодатчика версия 1.4 (подходит для часов версий 3.3 и 3.4)
HEX, исходник радиодатчика версия 1.5 (подходит для версий 3.5 и 3.6)
HEX, исходник радиодатчика версия 2.0 (подходит для версии 4.0)
HEX, исходник радиодатчика версия 2.1 (подходит для версии 4.1)
HEX, исходник радиозвонка версия 1.1 (Контроллер PIC12F629 или PIC12F675)
HEX, исходник радиозвонка версия 1.2 (подходит для часов версий 3.3 и 3.4)
HEX, исходник радиозвонка версия 1.3 (подходит для версий 3.5 и 3.6)
HEX, исходник радиозвонка версия 2.0 (подходит для версии 4.0)
HEX, исходник радиозвонка версия 2.1 (подходит для версии 4.1)
Кварц с частотой 4.000 МГц лучше не использовать, ход времени будет не точный, это связано с особенностью TMR0, используемого для формирования временных интервалов часов (относится к версиям ниже 4.1).
Обновление 30.12.2011
Обновление 07.01.2012
Собрал все в кучу и засунул в одну прошивку (датчики, кварцы, коррекцию, нули, перевернутые индикаторы, звонок, яркость - все находится в меню SET)
Прошивка, исходник v2.4 (расширено меню SET, читай подробности в архиве)
Обновление 11.01.2012
Прошивка, исходник v2.4а (первые пол минуты будильник звучит с периодом 1 сек, остальные пол минуты с периодом 0,5 сек; в меню изменения ночной яркости индикатор меняет яркость; читай подробности в архиве)
Обновление 29.01.2012
Исправлено меню SET (теперь отображает числа больше 99)
Прошивка, исходник v2.5 (Добавлено: в меню "Yarc" индикатор меняет яркость)
Обновление 23.05.2012
Убрал: меню SET, звонок ALAr, настройка выхода bSET и кварца Cvar через меню
Добавил: термометры с шагом 0,1 градуса, настройка кварца и выхода при программировании EEPROM, коррекция +/- 24,9 секунды в сутки с шагом 0,1 секунда.
Коррекция хода: XX.Y сек/сутки.
XX - добавляется/отнимается XX секунд каждый день
Y - добавляется/отнимается Y секунд каждые 10 дней
Коррекция происходит не сразу (отнять/добавить несколько секунд сразу), а постепенно не более +/-1 секунды в час в течение суток. При манипуляциях в меню Corr счетчики часов коррекции и дней коррекции сбрасываются.
Прошивка, исходник v3.0 (описание в архиве , читать перед заливкой в контроллер); версия радиодатчика 1.4
Обновление 29.07.2012
Обновление 24.08.2012 - перезалил прошивку (улучшена точность хода с кварцем 4.000 МГц)
Изменения:
- переработан алгоритм контроля напряжения сети
- переработан алгоритм опроса датчика температуры (маскирует мигание индикаторов)
- "минус" при отображении температуры теперь стоит перед цифрами, а не только в левом знакоместе
- Обращение к датчику будет происходить только во время переключения индикации из режима
"Температура1" в режим "Температура2" и из режима "Температура2" в режим "Время"
- возможность выбора отображения знака градуса
- можно выбрать буквы из знакогенератора перед температурой
- вернулся звонок (настройка номера звонка в EEPROM, программа на модуль звонка v1.2)
- коррекция +/-24,0 секунды в сутки, шаг 0,1 секунда ( каждые 6 минут по 0,1 секунде, до 240 раз в сутки )
- запись в EEPROM через 20 секунд после изменения параметра, который надо записывать
- будильник пищит 1 минуту, потом через минуту еще 2 минуты. (по другому я его утром просыпаю :D )
Прошивка, исходник v3.3 (описание в архиве, читать перед заливкой в контроллер); версия радиодатчика 1.4
Обновление 22.12.2012 - Помехозащищенный алгоритм передачи данных по радиоканалу
- Небольшие исправления при отображении температуры
- будильник пищит 1 минуту, потом через минуту еще 2 минуты. Прошивка, исходник v3.5 (описание в архиве, читать перед заливкой в контроллер); версия радиодатчика 1.5
Обновление 29.07.2012
Обновление 24.08.2012 - перезалил прошивку (улучшена точность хода с кварцем 4.000 МГц)
Изменения:
- будильник пищит 1 минуту, потом автоповторы через каждые 5 минут (период НЕ настраивается в меню)
- звук отключается коротким нажатием на минус, будильник полностью отключается длинным нажатием
Прошивка, исходник v3.4 (описание в архиве, читать перед заливкой в контроллер)
Обновление 22.12.2012
Изменения: - Помехозащищенный алгоритм передачи данных по радиоканалу
- Небольшие исправления при отображении температуры
Прошивка, исходник v3.6 (описание в архиве, читать перед заливкой в контроллер); версия радиодатчика 1.5
Обновление 02.03.2013
Изменения: - настраивается автоповтор будильника от 2 до 60 минут
Прошивка, исходник v3.9 (описание в архиве, читать перед заливкой в контроллер); версия радиодатчика 1.5
Обновление 07.01.2014 - v4.0
Обновление 25.01.2014 - v4.0 (были перепутаны сегменты индикатора, добавил схему)
Обновление 01.02.2014 - v4.0 (переделал платы)
Изменения:
- переделан алгоритм приема/передачи данных по радиоканалу (тайминги)
- индикаторы не подмигивают при приеме сигнала по радиоканалу (мигает правая точка)
- работает с радиодатчиком v2.0 и радиозвонком v2.0 (см.выше)
- в часах, радиомодулях можно менять серийный номер в EEPROM
- убран одноимпульсный режим срабатывания будильника ( -_--------------- )
- при включении будильника отображается время будильника на 1 секунду
- при приеме сигнала с радиозвонка, на индикаторе отображается ALAR
- диапазон коррекции хода уменьшен до +/-12секунд в сутки с шагом 0,1 секунда
- меню разделено на два:
(0.9 секунды на кнопку "меню")
1 - будильник
- автоповтор будильника
- часы/минуты
- минуты/секунды
- день недели
- коррекция хода
- время ночи
- яркость индикатора ночью
(6.0 секунд на кнопку "меню")
2 - время отображения часов в "режиме индикации"
- время отображения дня недели в "режиме индикации"
- время отображения температуры в "режиме индикации"
- тон сигнала будильника
- датчик температуры 18b20/18s20
- в протеусе уход частоты внутреннего генератора контроллеров на +/-8% (3,7..4,3МГц) не влияет
на качество приема сигнала с датчиков.
Прошивки, исходники, схема, платы v4.0 (описание в архиве, читать перед заливкой в контроллер. Старые платы в конце статьи)
Обновление 12.05.2015 - v4.1
Обновление 29.11.2015 - v4.1 Изменения:
- полностью устранен неконтролируемый уход времени при использовании кварца 4,000 МГц.
TMR0 не предустанавливается.
- начало и конец ночи настраиваются на любое время.
При равенстве значений, яркость остается максимальной.
- добавлен режим "без десятых долей градуса.
- переделан ШИМ яркости (прерывание).
- оптимизирована программа, обрезан знакогенератор, меню перенесено в EEPROM.
- один Радиодатчик v2.1, один Радиозвонок v2.1
- исправлена коррекция (работала только в минус) Прошивки, исходники, схема, платы v4.1 (описание в архиве, читать перед заливкой в контроллер. Старые платы в конце статьи)
Обновление 24.07.2015 - v4.2
Обновление 29.11.2015 - v4.2 Изменения:
- поддерживается один радиодатчик с кнопкой звонка Radiomodul_DS18_bell_v1.0- функция звонка отключается в EEPROM - исправлена коррекция (работала только в минус) Прошивки, исходники, схема, платы v4.2 (описание в архиве, читать перед заливкой в контроллер. Старые платы в конце статьи)
Модификация_1 от 29.11.2015 - v4.2_mod1
Изменения:
- поддерживается два радиодатчика с кнопкой звонка Radiomodul_DS18_bell_v1.0- нет проводного датчика - исправлена коррекция (работала только в минус) Прошивки, исходники, схема, платы v4.2_mod1 (описание в архиве, читать перед заливкой в контроллер. Старые платы в конце статьи)
Форум | |
Категория: Часы | Добавил: Boroda (05.07.2011) W | |
Просмотров: 30872 | Комментарии: 84 | |
Всего комментариев: 83 | 1 2 3 » | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|