Беспроводные часы-термометр


Всем привет! Сегодня хочу рассказать о своем опыте в работе с AVR-микроконтроллерами.


Предыстория
И так, дело началось с момента ремонта кухни и ванной комнаты.
Ремонтом занимался Папа, и во время ремонта решил установить в комнатах теплый пол. Было решено устанавливать нагревательный кабель в качестве источника тепла. До установки тесты кабеля не проводились потому в теплый пол был еще добавлен один датчик DS18b20 (да, одного безусловно мало, но не было претензий к очень точному измерению температуры, да и цена последних составляет 1$), с заделом на установку на нагревательный элемент регулировки нагрева, но как оказалось в итоге не так он сильно греется чтобы его регулировать. Еще, один температурный датчик был выведен на улицу.
В результате получилось три сигнальных провода от датчиков DS18b20, ну и по три «+» и «-».
Все это дело было помещено в тумбочку под раковиной и зафиксировано до лучших времен (что он собирался делать с ними я не знаю, так как с программированием он почти сталкивался очень мало, старая школа радиотехники — только аналоговые элементы с добавлением интегральных схем).
Спустя некоторое время на просторах интернета мною была замечена интересная платка которая называлась “ARDUINO”. На то время я закончил университет по направлению «Радиотехника», и во время учебы нам что-то пытались рассказать о схемотехнике но не очень успешно, за-то дела с цифровой техникой и МК обстояли лучше и кое-какие знания остались.
В итоге из интереса был сделан заказ на китайском сайте самой дешевой копии платы “ARDUINO”. Так и началось тесное знакомство МК.
Изначально были попытки собрать 3Д-куб, потом был семисегментный элемент, часы на МК + семисегментном элементе. Далее попробовал часы-термометр на микросхеме RTC DS1307, МК и семисегментном элементе, потом это же на графическом LCD 128х64 точек.





Первое время пробовал писать на стандартном Arduino IDE, но очень быстро перешел на Atmel Studio 6.0 (в связи с чем был еще куплен программатор USBasp_H6). Переход также был обусловлен необходимостью сменить частоту работы МК, так как DS1307 на 16 МГц работать отказался (подружить частоту 1МГц и Arduino IDE мне не удалось). Программатор USBasp_H6 оказался кстати так как МК что был в комплекте я успешно спалил, и заказал 5 новых «чистых» без бутлоадера Arduino.


Вдоволь наигравшись было решено сделать часы, которые кроме времени будут показывать температуру с датчиков, которые были установлены в пол, выведен на улицу ну и температуру внутри помещения.
Задуманная идея.

Порывшись в интернете и в китайских интернет магазинах была заказана пара беспроводных модулей NRF24l01. Для начала собирал все на макетной плате и пытался передавать цифры.

Первой проблемой оказался размер LCD-дисплея (64х128 точек). Как оказалось нарисовать что-то на нем — занимает много места. После этого я узнал что 32Кб — это не память программ, а память энергонезависимая и дело пошло проще, все картинки оформил отдельным файлом и все записал в EEPROM.
Далее начались попытки написать что-то для передающей стороны. Тут все вышло не так гладко — кривое использование радио модулей. Запустить их смог только для передачи 8 бит информации, потому пришлось бить данные
следующим кодом.
//измерить и послать с определенного пина
void mSend(char pin)
{
int T=0;
//int x;
char code0,code1,code2;
char pack[3]={0,0,0};
switch (pin){
case 4:
T=temp_18b20_4();
code0=0x10;
code1=0x20;
code2=0x30;
break;
case 3:
T=temp_18b20_3();
code0=0x40;
code1=0x50;
code2=0x60;
break;
case 2:
T=temp_18b20_2();
code0=0x70;
code1=0x80;
code2=0x90;
break;
}
pack[0]=((T>>8)&0x0F)|code0;
pack[1]=((T>>4)&0x0F)|code1;
pack[2]=(T&0x0F)|code2;
for(char i=0;i<3;i++){
nrf24l01_FLUSH_TX;//очищаем буфер передатчика
nrf24l01_Sent_data_Ret(pack[i]);
_delay_ms(100);
}}


То-есть при таком способе разбивки во время передачи можно получить только 16 переменных, которые можно различить приемником.
Так же, как Вы могли заметить, не очень хорошо организован способ опроса датчиков DS18b20, а именно новая функция для нового датчика(но так как использовался Atmega328p, и проблем с местом не было, то это не стало большой проблемой), но увы разобраться как подвешать на одну шину несколько устройств мне не удалось, также как и не удалось в ходе работы программы менять значения макроса указывающего на пин на котором висит датчик.

Получивши более-менее готовый код, занялся изготовлением плат (благо платы нас тоже пытались научить делать во время учебы).
Cхема электрическая принципиальная для передатчика
image
По которой была создана печатная плата (посредством ЛУТ)image

При проектировании платы передатчика было условие сделать её не очень большой, без особых требований по размерам. Сделав плату, установив все компоненты в нужные места, проверил на работоспособность, и как ни странно запустилась с первого раза.
Готовый передатчик
image


При проектировании же платы приемника, стал очевидный вопрос корпуса часов. Так как 3Д принтера я вообще в живую не видел, было решено искать что-то в форме прямоугольного параллелепипеда. Потому на роль коробки для часов была выбрана настенная Ethernet-розетка (начальных фото к сожалению нету). Путем не хитрых
манипуляций с ножом
image

отверстие под порты Ethernet стали размером с LCD-экран. Так как внутреннее устройство коробки оказалось специфическим, появились новые требования к форме и размерам платы.
Внутреннее устройство коробки
image

Схема электрическая принципиальная приемника
image
Печатная плата приемника
image
Протравленая плата
image

Процесс сборки приемника оказался сложнее из-за больших размеров и наличия DS1307 в корпусе SO (пока припаял, думал, что те часы сгорели несколько раз), кроме того вышла небольшая промашка с размерами.
Сделав плату, установив все компоненты в нужные места, проверил на работоспособность, и почему-то LCD ничего не показывал. Но к счастью это было лишь большое сопротивление на резисторе что отвечал за контрастность дисплея.
Собраная плата приемника
image

Как должно выглядеть готовое устройство
image
image
image

Вот вроде и все. Осталось только проделать отверстия под кнопки, и по мере возможности закрепить все платы внутри коробки.
Информация
Код написан в Atmel Studio 6.0. Программировалось через SinaProg2.1.1. Рисовалось в Splan70 и layout 6.0 (хотя я думаю это очевидно). Картинки для LCD делались с помощью LCDAssistant.
При создании кода активно использовал данный ресурс — www.doneathome.ru/
Библиотеки для работы со всеми устройствами были взяты оттуда.
Ссылка на полный проект на GitHub

Для создания устройства было заказано
NRF24l01 — 2 шт — 2,92$

NRF24l01 — 5 шт — думал что спалил предыдущие два — 3.95$

ATMEGA328P — 5 шт — 8,15$

Панельки для МК — 17шт-1.20$

Программатор — 2,21$

Breadboard+питание+кабели 4,40$

ICL7660S- 10 шт — 1.5$

DS18b20 — 1 шт — 0,99$
Все элементы рабочие, так что их могу рекомендовать к покупке. Единственный минус — панельки для МК, которые очень плохого качества (но 17 шт за 1,20$). Кроме того китаец очень оригинально подошел к упаковке. Панельки пришли в коробке длиной в 17 панелек =\, я даже с начала не понял что это такое мне пришло.
Все остальные комплектующие были найдены дома.


Плюсы :
— конфигурация необходимая в конкретном случае;
— обучение, правка рук;

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

UPD Полностью собранное устройство.
Планирую купить +13 Добавить в избранное +24 +49
+
avatar
  • fantom
  • 03 августа 2015, 13:58
0
Насяльника! Йеззай к нам, будиш Глявным боссом! До… я юаней зяплятим, аднака!
Fuzhou Huixia Precision Instrument Co., Ltd.
+
avatar
  • reedcat
  • 03 августа 2015, 14:08
0
как самоделка и средство от скуки вполне неплохо.
Но… Как вижу, питание от внешнего БП? Т.е. привязка к розетке, что и некошерно, и неэкологично.
+
avatar
  • BeJIuk
  • 03 августа 2015, 14:12
0
Да. Питается передатчик и приемник от внешнего БП. Но задачи сделать автономное устройство не было.
+
avatar
  • reedcat
  • 03 августа 2015, 15:12
+2
все равно плюс :)
+
avatar
  • Kartus
  • 03 августа 2015, 17:58
0
Ну наконец то кончились платья и купальники)))
Хороший обзорец нарисовался, правильный.
+
avatar
  • DDimann
  • 03 августа 2015, 14:35
+2
Основное, как мне показалось — начать, что успешно сделано.
За что и поставил плюс.
+
avatar
  • kalobyte
  • 03 августа 2015, 14:50
0
трансиверы работают нестабильно из-за помех от влан
нужно опытным путем искать стабильный канал
ну и расположение трансивера неправильное — сигнал будет поглощаться дорожками под антенной и рядомстоящими деталями
+
avatar
  • BeJIuk
  • 03 августа 2015, 15:37
0
Как я написал в тексте — радиомодули настроены криво, и если у Вас есть опыт полноценного запуска, буду благодарен.
+
avatar
  • CLX
  • 03 августа 2015, 17:39
0
NR24L01+ работают великолепно даже на минимальной мощности. И работать с ними — одно удовольствие.
Честно передают пакеты до 32 байт.
Ноочень (очень) капризная к питанию. 3.3В электролитом 10-50 мкф и керамикой или плёнкой 0.1мкф
На минимальной мощности и скорости 1мбит по всей квартире достаёт.
В своё время реализовал некий сетевой протокол обмена для этих модулей и вполне успешно использую его в разных проектах. В частности и метеостанции.
+
avatar
  • BeJIuk
  • 03 августа 2015, 18:34
0
Какой библиотекой пользовались? Можно ссылку?
+
avatar
  • CLX
  • 03 августа 2015, 20:17
0
Fork библиотеки от maniacbug (хотя и его работала нормально)
+
avatar
  • kalobyte
  • 03 августа 2015, 19:07
0
там нет настройки криво или некриво
мои не работали даже рядом друг с другом и потом я просто стал менять каналы и нашел без помех
скорость лучше ставить 250кбит

минус еще может быть в поддельных трансиверах без плюса которые
там нет плюшки и ошибка в железе, а так же плохое чутье
у меня вроде бы такие поддельные 10 штук
+
avatar
  • CLX
  • 03 августа 2015, 20:15
0
Скорость лучше НЕ ставить 250 кбит, т.к. именно на 250 могут вылезть проблемы. Ставьте 1 мб.
Свободный канал найти просто (в сети есть скетчи простых сканеров).
А не работали или работали плохо, скорее всего, из за плохого питания. Как писал выше — очень важно.
+
avatar
  • kalobyte
  • 03 августа 2015, 23:40
0
а в чем суть 1мбит?

питание там улучшил сразу, читал про гимор с питанием
+
avatar
  • CLX
  • 04 августа 2015, 09:23
0
При 250 кбит чувствительность приёмника повышается. Ловит все помехи.
Насчёт питания: мне не помогло простое навешивание ёмкостей на сам модуль (параллельно пинам). Пришлось дополнительно шунтировать 3.3. на самих ардуинах (если нет отдельного стаба).
+
avatar
+4
ATMEGA328P — 5 шт — 8,15$
Дорого. Pro Mini дешевле стоит. Так на ней уже и кварц и светодиоды и кнопка сброса.

по средству ЛУТ
Посредством ЛУТ

Вообще обзор читается трудновато, но все равно держите плюс. За то, что пытаетесь творить, а не только потреблять. Нынче это такая редкость.
+
avatar
  • sergk
  • 03 августа 2015, 20:02
0
Однозначно согласен! Как китайцы этого добиваются, но в собранном виде и с приятной средой разработки получается не намного дороже чистой микросхемы, а если учесть элементную базу…

Я себе купил несколько таких «прошек» — шнурок для заливки получился отличный из кабеля к мобильнику, вот только «прошки» лучше подходят для конечного продукта, а для отладки лучше добавить немного и взять с заливкой по USB.
+
avatar
  • Vipeg
  • 03 августа 2015, 16:01
0
Отличная идея. Неплохая реализация. Программерские способности подтянутся, главное не забрасывать, а творить ещё и ещё.
Плюсану за правильное направление и за старание.
P. S. Слово watch обозначает наручные часы. Всё остальное — clock.
+
avatar
  • BeJIuk
  • 03 августа 2015, 16:12
0
Слово watch обозначает наручные часы. Всё остальное — clock.
Изменил.
+
avatar
  • sergk
  • 03 августа 2015, 19:58
+2
Плюс за реализацию! Немного бы понятнее написать о реализации, не все прятать под спойлеры. Спойлеры на мой взгляд нужны для раскрытия дополнительных фоток, не совсем имеющего отношения к теме текста, в общем того без чего обзор ничего не потеряет, но если кому-то будут нужны подробности…

Зы: немного непонятно почему это в блоге Али… Собственно куплен только МК (ссылка), но это вопрос конечно не к автору темы, скорее к админам муськи. Раздел бы что-ли создали отдельный, «сделано руками, какая собственно разница где куплены микросхемы или резисторы? Где я только это добро не покупал, всего и не упомнишь на ибее и али только в последние годы подсел, а вот статеек бы можно было накорябать, но форма требует ссылку на товар, магазин и т.д. Чем бороться с этим безобразием — его надо направить в нужное русло ;)))
+
avatar
  • BeJIuk
  • 03 августа 2015, 20:13
0
Реализация — передатчик меряет три температуры и передает. Приемник — принимает три температуры, меряет четвертую, смотрит на часы и показывает это все на экран.
А добавил в Али, так как большинство элементов куплено именно там (хотя и не все).
+
avatar
  • sergk
  • 04 августа 2015, 00:03
0
теперь немного более понятно. но во первых не помешала бы принципиальная схема не под спойлером, перечень элементов — я так понимаю что дисплей куплен не на али, поэтому в обзор даже его марка не попала :)
Напишите в начале статьи о чем собственно статья, ваши метания можно спрятать под спойлер значительно ниже. Схема, принцип работы. А уж потом элементная база и реализация. Просто есть веками устоявшаяся форма подачи такого материала и все что не вписывается в нее воспринимается очень плохо.

ЗЫ: кстати, обзорчик после публикации можно править, желательно в лучшую сторону ;)

ЗЫЫ: ни в коем случае не воспринимайте это за наезд, просто не так много людей которые что-то могут и хотят в наше время делать руками и вам же будет приятнее, если большее количество радиолюбителей заинтересует ваша статья и конечное устройство.
+
avatar
  • BeJIuk
  • 04 августа 2015, 09:05
0
Дисплей остался из старых кассовых аппаратов. Марка — MTG-s12864. Собрано два поля 64х64 на двух чипах KS0107.
+
avatar
  • Kevolech
  • 03 августа 2015, 21:22
+1
Надо больше спойлеров! Слишком много спойлеров которые не скрыты спойлерами.
+
avatar
  • Demosfen
  • 03 августа 2015, 22:10
0
Автору рекомендую посмотреть в сторону esp8266. Дешево и сердито. А если еще и с прошивкой от home-smart, то только нужные компоненты соединить.
+
avatar
  • BeJIuk
  • 04 августа 2015, 12:55
0
Как раз такой лежит в тумбочке, в корпусе 07 ( с керамической антенной). Правда еще не пробовал что-то делать с ним.
+
avatar
  • Demosfen
  • 04 августа 2015, 13:02
0
Лучше любая модификация 12го. Там 4 метра флешка стоит. В стандартную на 512к мало что входит :( Хотя при желании можно сдуть флешку и поставить на 4 метра. Недавно на али видел 5 штук с доставкой за 2.5 бакса.
+
avatar
-1
А знает ли автор, что на ГТ и хабре не приветствуют создания одинаковых статей на разных ресурсах? Если бы модераторы тамошние знали, что данная статья есть где то еще, то она бы и сгнила в песочнице.
Поддостали уже эти самоделки на муське. С тем же успехом можно выбирать любую схему, например, с радиокота, заказать детальки на ебее и написать статью.
+
avatar
-1
Ссылка на правила и вырезка из них:
Чем не является Geektimes
Geektimes — не место для копипастеров. Размещение полностью скопированного контента с других сайтов запрещено — даже при использовании гиперссылки на источник. Мы за авторские материалы.
Geektimes — не ЖЖ и не центр мирового кросспостинга. Не нужно копировать публикации из других блогов и сайтов, указывая, что ранее они были опубликованы в другом месте.
Да, явно правила не запрещают публикацию СВОИХ же записей повторно, но то, что это не очень хорошо и ежу понятно.
+
avatar
  • BeJIuk
  • 04 августа 2015, 09:02
0
Статья изначально публиковалась там.
Сюда же я добавил из-за большого количества элементов, которые были куплены в китайских магазинах и оказались рабочими.
+
avatar
0
куплены в китайских магазинах и оказались рабочими.
Да, это чудо.