Возникла необходимость быстро сделать простой и дешевый терморегулятор для террариума. Сроку - неделя, доступа на радиорынок нет (так как он у нас вторник/пятница, а я в это время работаю), поэтому покупать что-либо специфичное было некогда и негде, и я решил собрать железку из того, что нашлось под рукой (корпуса, транзисторы, кнопки и БП у нас на радиорынке и в воскресенье можно купить, что стало полезным бонусом). Схему я рисовал уже пост-фактум, когда железка была готова, а клепал её из подручных средств "по ходу".
Итак, что получилось за неделю:
Сердцем устройства стала ATMega16 в DIP-корпусе. В качестве датчика температуры используется
DS18B20. 4-х разрядный 7-ми сегментник для настройки и отображения текущей температуры. RTC
DS1307 для автоматического переключения день/ночь, с кварцем из старой материнки. Полевики
IRFZ48N для управления освещением (под рукой оказался метр RGB-ленты из 60-ти 5050-х светодиодов. Кроме того под рукой валялись ненужные RFM12B (сам я спрыгиваю на RFM70, поэтому 12-е мне больше не нужны) и USB приемник к нему, который я делал ещё в прошлом году (и который мне, опять же, больше не нужен). А, ну и симистор BTA26-700 (не релюшка, так как громко щелкает и ресурс у неё меньше). С небольшим радиатором он спокойно протягивает киловатт, кратковременно тестил на утюге с положительным результатом (утюг греется быстрее симистора, а в период отключения симистор успевает остыть) - в общем запас сумасшедший.
Управление конструкцией по 3-м кнопкам - +/-/set
+/- - следующий/предыдущий экран. set - переключение режима меню/редактирование
Список экранов:
0) текущая температура, текущий режим (день/ночь). Отображение текущего режима - смещением знака градуса: ввержу - режим 1, внизу - режим 2
1) установка температуры для режима 1. Диапазон: 15-40, шаг 0.1. Обозначение - t1S
2) установка гистерезиса для режима 1. Диапазон: 0.1-9.9, шаг 0.1. Обозначение - t1H
3) установка ЧЧ старта режима 1. Диапазон: 00-23, шаг 1. Обозначение - t1hh
4) установка ММ старта режима 1. Диапазон: 00-59, шаг 1. Обозначение - t1nn
5) установка температуры для режима 2. Диапазон: 15-40, шаг 0.1. Обозначение - t2S
6) установка гистерезиса для режима 2. Диапазон: 0.1-9.9, шаг 0.1. Обозначение - t2H
7) установка ЧЧ старта режима 2. Диапазон: 00-23, шаг 1. Обозначение - t2hh
8) установка ММ старта режима 2. Диапазон: 00-59, шаг 1. Обозначение - t2nn
9) установка коррекции термометра. Диапазон: +/-9.9, шаг 0.1. Префикс - E
10) установка ЧЧ. Диапазон: 00-23, шаг 1. Суффикс h
11) установка ММ. Диапазон: 00-59, шаг 1. Суффикс nn
12) установка СС. Диапазон: 00-59, шаг 1. Суффикс S
13) установка дня. Диапазон: 00-31, шаг 1. Суффикс d1
14) установка месяца. Диапазон: 00-12, шаг 1. Суффикс d2
15) установка года. Диапазон: 11-99, шаг 1. Суффикс d3
16) установка коррекции часов в секундах. Это значение прибавляется кажду неделю. Диапазон: +/-99, шаг 1. Префикс - C. За двое суток ни одной секунды не убежало, так что не особо нужная штукенция.
17) установка процента красного цвета для режима 1. Диапазон: 000-255. Обозначение: rEd1
18) установка процента зеленого цвета для режима 1. Диапазон: 000-255. Обозначение: GrE1
19) установка процента синего цвета для режима 1. Диапазон: 000-255. Обозначение: blu1
20) установка процента красного цвета для режима 2. Диапазон: 000-255. Обозначение: rEd2
21) установка процента зеленого цвета для режима 2. Диапазон: 000-255. Обозначение: GrE2
22) установка процента синего цвета для режима 2. Диапазон: 000-255. Обозначение: blu2
23) установка времени перехода между режимами освещения. Диапазон: 000-255 минут. Обозначение: tLI
Через ~10 секунд простоя выходим из режима редактирования и переходим к первому экрану
Измерение температуры и принятие всех решений (по обогревателю и по яркости) - 1 раз в секунду по прерыванию от часов
с усреднением 10 крайних измерений температуры
Самая правая точка горит при включении обогревателя (для диагностики)
Все редактируемые пункты меню хранятся в байтовой таблице data, что дает диапазон изменения температуры 25.5 градуса (храню, ессна, целые, точку рисую). Но так как диапазон 0-25.5 неинтересен, то к значениям температуры прибавляется 150 при отображении. Отсюда диапазон 15-45.5. Вся эта таблица при редактировании сгружается в память RTC, что даёт двойной профит: во-первых нас не беспокоит ресурс eeprom, во-вторых можно вытащить батарейку и вернуться к начальным значениям, если потерялся в настройках.
Это всё, что касается основной работы. Ввиду нехватки времени поленился сделать автоматический переход летнее/зимнее время и не сделал, как изначально собирался, таблицу с временем восход/закат, чтобы автоматически смещать время переключения режима по году.
Так как связь с компом - дополнительная плюшка, а времени у меня было мало, то софт я пока для неё не писал (и не уверен что буду), общался через realterm. Ниже описание протокола, если кто-то захочет повторить:
При изменении температуры (или режима работы день/ночь) по радиоканалу отправляется посылка виде
"26.1 D+" - первые три цифры - температура, затем пробел, D/N - день/ночь, +/- - включен/выключен нагреватель
Кроме того, по радиоканалу можно получать/сохранять данные памяти
В команде всегда должно быть ровно 6 байт. После получения 6-го байта и отправки пакета приходит "+" (от свистка, не от контроллера), обрамленный символами конца строки.
Таким образом, если получен +, а число переданных байт не равно 6, значит где-то нарушилась передача - надо оборвать передачу текущего пакета и отправить его заново
Контроллер принимает пакеты вида
T‹S/G›‹xx›‹yyy›, где G - команда получения, S - команда изменения, xx - адрес ячейки (в ASCII), yyy - значение байта (в ASCII) - при запросе GET эти три байта могут быть произвольными, они игнорируются
Номеря ячеек соответствуют пунктам меню, то есть, чтобы получить текущий гистерезис режима 2 надо оправить
TG06000
в ответ придет
+(от свистка)
CG06005 - где C - Confirm, 06 - адрес запрашиваемой ячейки, 005 - значение. Так ка все температуры хранятся в целых числах, то это значит, что текущий гистерезис режима 2 равен 0.5 градуса
Если запросить ячейку за диапазоном - придет код ошибки. Например просим TG46000, получаем EG46000
Дополнительно к ячейкам меню можно получить текущие значения цвета. R имеет код 24, G-25, B-26 (но эти ячейки нельзя напрямую установить, так как они вычисляются каждую секунду)
Пример изменения данных: установим часы включения режима на 18:00. Говорим TS07018, получаем в ответ CS07018, значит значение успешно записано.
Если вылетели за диапазон (например ставим 45 часов TG07045) - вернется ES07045
Аналогично, если вылетели за число ячеек.
Скорость общения по радиоканалу - 4800.Максимальное время отклика на запрос - одна секунда. Если через секунду после "+" ответа нет - можно повторять передачу.
Буфер отправки общий, приоритет имет текущий статус - то есть, если запрос пришел прямо перед прерыванием по часам и у нас изменилась температура, то вместо ответа на запрос придет сообщение со статусом :)
Скорость свистка - 115200, 8N1
В коде свистка - просто прием пакета из 6 байт по UART, дописывание к нему контрольной суммы и отправка, которая отмечается '+' в UART.
При приеме последовательность обратная - считаем CRC по 6 байтам, если OK - отправляем в UART.
Вот такая вот железка получилась за неделю (паять начал в прошлую субботу). Наверняка есть уйма недочетов, возможно есть ошибки. Но в целом стабильно работает, двое суток уже коммутирует лампочку и подсветку, вроде пока без сбоев. В архиве схемы в формате Eagle, исходники под 5-ю студию и hex-ы (для USB-мастера и собственно для железки). USB и RFM совершенно необязательны - без них устройство совершенно самодостаточно.
Задавайте любые вопросы и вносите предложения - пока друг не забрал змейку, возможно успеем вместе улучшить конструкцию :)