RSS блога
Подписка
Беспроводные часы-термометр
Всем привет! Сегодня хочу рассказать о своем опыте в работе с AVR-микроконтроллерами.
Вдоволь наигравшись было решено сделать часы, которые кроме времени будут показывать температуру с датчиков, которые были установлены в пол, выведен на улицу ну и температуру внутри помещения.
Задуманная идея.
Порывшись в интернете и в китайских интернет магазинах была заказана пара беспроводных модулей NRF24l01. Для начала собирал все на макетной плате и пытался передавать цифры.
Первой проблемой оказался размер LCD-дисплея (64х128 точек). Как оказалось нарисовать что-то на нем — занимает много места. После этого я узнал что 32Кб — это не память программ, а память энергонезависимая и дело пошло проще, все картинки оформил отдельным файлом и все записал в EEPROM.
Далее начались попытки написать что-то для передающей стороны. Тут все вышло не так гладко — кривое использование радио модулей. Запустить их смог только для передачи 8 бит информации, потому пришлось бить данные
То-есть при таком способе разбивки во время передачи можно получить только 16 переменных, которые можно различить приемником.
Так же, как Вы могли заметить, не очень хорошо организован способ опроса датчиков DS18b20, а именно новая функция для нового датчика(но так как использовался Atmega328p, и проблем с местом не было, то это не стало большой проблемой), но увы разобраться как подвешать на одну шину несколько устройств мне не удалось, также как и не удалось в ходе работы программы менять значения макроса указывающего на пин на котором висит датчик.
Получивши более-менее готовый код, занялся изготовлением плат (благо платы нас тоже пытались научить делать во время учебы).
Cхема электрическая принципиальная для передатчика
По которой была создана печатная плата (посредством ЛУТ)
При проектировании платы передатчика было условие сделать её не очень большой, без особых требований по размерам. Сделав плату, установив все компоненты в нужные места, проверил на работоспособность, и как ни странно запустилась с первого раза.
При проектировании же платы приемника, стал очевидный вопрос корпуса часов. Так как 3Д принтера я вообще в живую не видел, было решено искать что-то в форме прямоугольного параллелепипеда. Потому на роль коробки для часов была выбрана настенная Ethernet-розетка (начальных фото к сожалению нету). Путем не хитрых
отверстие под порты Ethernet стали размером с LCD-экран. Так как внутреннее устройство коробки оказалось специфическим, появились новые требования к форме и размерам платы.
Схема электрическая принципиальная приемника
Печатная плата приемника
Процесс сборки приемника оказался сложнее из-за больших размеров и наличия DS1307 в корпусе SO (пока припаял, думал, что те часы сгорели несколько раз), кроме того вышла небольшая промашка с размерами.
Сделав плату, установив все компоненты в нужные места, проверил на работоспособность, и почему-то LCD ничего не показывал. Но к счастью это было лишь большое сопротивление на резисторе что отвечал за контрастность дисплея.
Вот вроде и все. Осталось только проделать отверстия под кнопки, и по мере возможности закрепить все платы внутри коробки.
Плюсы :
— конфигурация необходимая в конкретном случае;
— обучение, правка рук;
Минусы :
— дорого, в сравнении с китайскими метеостанциями.
— долго, как для человека, имеющего не большие знания в данной теме.
— плохая оптимизация кода.
UPD Полностью собранное устройство.
Предыстория
И так, дело началось с момента ремонта кухни и ванной комнаты.
Ремонтом занимался Папа, и во время ремонта решил установить в комнатах теплый пол. Было решено устанавливать нагревательный кабель в качестве источника тепла. До установки тесты кабеля не проводились потому в теплый пол был еще добавлен один датчик 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.
Ремонтом занимался Папа, и во время ремонта решил установить в комнатах теплый пол. Было решено устанавливать нагревательный кабель в качестве источника тепла. До установки тесты кабеля не проводились потому в теплый пол был еще добавлен один датчик 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);
}}
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хема электрическая принципиальная для передатчика
По которой была создана печатная плата (посредством ЛУТ)
При проектировании платы передатчика было условие сделать её не очень большой, без особых требований по размерам. Сделав плату, установив все компоненты в нужные места, проверил на работоспособность, и как ни странно запустилась с первого раза.
Готовый передатчик
При проектировании же платы приемника, стал очевидный вопрос корпуса часов. Так как 3Д принтера я вообще в живую не видел, было решено искать что-то в форме прямоугольного параллелепипеда. Потому на роль коробки для часов была выбрана настенная Ethernet-розетка (начальных фото к сожалению нету). Путем не хитрых
манипуляций с ножом
отверстие под порты Ethernet стали размером с LCD-экран. Так как внутреннее устройство коробки оказалось специфическим, появились новые требования к форме и размерам платы.
Внутреннее устройство коробки
Схема электрическая принципиальная приемника
Печатная плата приемника
Протравленая плата
Процесс сборки приемника оказался сложнее из-за больших размеров и наличия DS1307 в корпусе SO (пока припаял, думал, что те часы сгорели несколько раз), кроме того вышла небольшая промашка с размерами.
Сделав плату, установив все компоненты в нужные места, проверил на работоспособность, и почему-то LCD ничего не показывал. Но к счастью это было лишь большое сопротивление на резисторе что отвечал за контрастность дисплея.
Собраная плата приемника
Как должно выглядеть готовое устройство
Вот вроде и все. Осталось только проделать отверстия под кнопки, и по мере возможности закрепить все платы внутри коробки.
Информация
Код написан в Atmel Studio 6.0. Программировалось через SinaProg2.1.1. Рисовалось в Splan70 и layout 6.0 (хотя я думаю это очевидно). Картинки для LCD делались с помощью LCDAssistant.
При создании кода активно использовал данный ресурс — www.doneathome.ru/
Библиотеки для работы со всеми устройствами были взяты оттуда.
Ссылка на полный проект на GitHub
При создании кода активно использовал данный ресурс — 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 панелек =\, я даже с начала не понял что это такое мне пришло.
Все остальные комплектующие были найдены дома.
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 Полностью собранное устройство.
Самые обсуждаемые обзоры
+73 |
3703
145
|
+53 |
3870
69
|
+35 |
2978
56
|
Fuzhou Huixia Precision Instrument Co., Ltd.
Но… Как вижу, питание от внешнего БП? Т.е. привязка к розетке, что и некошерно, и неэкологично.
Хороший обзорец нарисовался, правильный.
За что и поставил плюс.
нужно опытным путем искать стабильный канал
ну и расположение трансивера неправильное — сигнал будет поглощаться дорожками под антенной и рядомстоящими деталями
Честно передают пакеты до 32 байт.
Ноочень (очень) капризная к питанию. 3.3В электролитом 10-50 мкф и керамикой или плёнкой 0.1мкф
На минимальной мощности и скорости 1мбит по всей квартире достаёт.
В своё время реализовал некий сетевой протокол обмена для этих модулей и вполне успешно использую его в разных проектах. В частности и метеостанции.
мои не работали даже рядом друг с другом и потом я просто стал менять каналы и нашел без помех
скорость лучше ставить 250кбит
минус еще может быть в поддельных трансиверах без плюса которые
там нет плюшки и ошибка в железе, а так же плохое чутье
у меня вроде бы такие поддельные 10 штук
Свободный канал найти просто (в сети есть скетчи простых сканеров).
А не работали или работали плохо, скорее всего, из за плохого питания. Как писал выше — очень важно.
питание там улучшил сразу, читал про гимор с питанием
Насчёт питания: мне не помогло простое навешивание ёмкостей на сам модуль (параллельно пинам). Пришлось дополнительно шунтировать 3.3. на самих ардуинах (если нет отдельного стаба).
Посредством ЛУТ
Вообще обзор читается трудновато, но все равно держите плюс. За то, что пытаетесь творить, а не только потреблять. Нынче это такая редкость.
Я себе купил несколько таких «прошек» — шнурок для заливки получился отличный из кабеля к мобильнику, вот только «прошки» лучше подходят для конечного продукта, а для отладки лучше добавить немного и взять с заливкой по USB.
Плюсану за правильное направление и за старание.
P. S. Слово watch обозначает наручные часы. Всё остальное — clock.
Зы: немного непонятно почему это в блоге Али… Собственно куплен только МК (ссылка), но это вопрос конечно не к автору темы, скорее к админам муськи. Раздел бы что-ли создали отдельный, «сделано руками, какая собственно разница где куплены микросхемы или резисторы? Где я только это добро не покупал, всего и не упомнишь на ибее и али только в последние годы подсел, а вот статеек бы можно было накорябать, но форма требует ссылку на товар, магазин и т.д. Чем бороться с этим безобразием — его надо направить в нужное русло ;)))
А добавил в Али, так как большинство элементов куплено именно там (хотя и не все).
Напишите в начале статьи о чем собственно статья, ваши метания можно спрятать под спойлер значительно ниже. Схема, принцип работы. А уж потом элементная база и реализация. Просто есть веками устоявшаяся форма подачи такого материала и все что не вписывается в нее воспринимается очень плохо.
ЗЫ: кстати, обзорчик после публикации можно править, желательно в лучшую сторону ;)
ЗЫЫ: ни в коем случае не воспринимайте это за наезд, просто не так много людей которые что-то могут и хотят в наше время делать руками и вам же будет приятнее, если большее количество радиолюбителей заинтересует ваша статья и конечное устройство.
Поддостали уже эти самоделки на муське. С тем же успехом можно выбирать любую схему, например, с радиокота, заказать детальки на ебее и написать статью.
Да, явно правила не запрещают публикацию СВОИХ же записей повторно, но то, что это не очень хорошо и ежу понятно.
Сюда же я добавил из-за большого количества элементов, которые были куплены в китайских магазинах и оказались рабочими.