- PVSM.RU - https://www.pvsm.ru -
Пост раскрывает реализацию подачи школьного звонка с использованием отладочной платы FEZ Domino [1]. Управление расписанием осуществляется через веб-страницу. На FEZ Domino портирована платформа .NET Micro Framework [2]. Язык программирования C#. Предистория поста такова…
Хабровчан prostosergik [3] опубликовал пост Новогодняя малина — прикручиваем экран HD44780 к Raspberry Pi [4]. В комментариях между мною и prostosergik [3] завязался спор о целесообразности использования для этих задач Raspberry Pi. prostosergik [3] в комментариях сообщил о уже готовом проекте школьного звонка на Raspberry Pi.
Позже был опубликован пост Школьный звонок на Raspberry Pi с удаленным управлением [5]. Теперь настала моя очередь в реализации этой задачи.
По итогу переписки сформировал следующее ТЗ:
Цель: включать звонок в соответствии с расписанием школьных звонков в учебном заведение
Механизм работы: звонок подается в соответствие с поданным сигналом «1» на контактном реле. При замыкания реле, звенит звонок.
Требования
Реализация
Сразу скажу, из-за технический ограничений на Arduino UNO R3, не удалось реализовать этот проект в полной мере.
При выборе контроллера руководствовался следующими правилами
В заголовке не упоминается FEZ Domino, не случайно. Программный код между микроконтроллерами работающие на .NET Micro Framework, практически без изменений переносим всегда, при соблюдение версии. В данном случае FEZ Domino легко заменяется на плату NET Duino Plus 2 [6], без ущерба в функциональности.
Список используемых компонентов:
Все компоненты можно врассыпную купить на Aliexpress.com [13], будет существенно дешевле.
Спецификация FEZ Domino:
К сожалению FEZ Domino давно снята с производства, поэтому ниже ближайшие аналоги
Схема подключения
Запуск устройства
При запуске устанавливается WatchDog на 20 секунда, в случае зависание устройства.
//Enable Watchdog
GHI_LowLevel.Watchdog.Enable(1000 * 20);
Сброс счётчика осуществляется
GHI_LowLevel.Watchdog.ResetCounter();
Инициализация прерываний на кнопки
//Кнопка подачи звонка в ручном режиме
FEZ_Components.Button Button_ManualCall = new FEZ_Components.Button(FEZ_Pin.Interrupt.Di5);
//Кнопка аппаратного сброса и перезагрузки
FEZ_Components.Button Button_HardReset = new FEZ_Components.Button(FEZ_Pin.Interrupt.Di6);
// установление прерывания на кнопку
Button_ManualCall.ButtonPressEvent += new FEZ_Components.Button.ButtonPressEventHandler(Button_ManualCall_ButtonPressEvent);
// установление прерывания на кнопку
Button_HardReset.ButtonPressEvent += new FEZ_Components.Button.ButtonPressEventHandler(Button_HardReset_ButtonPressEvent);
Затем устанавливается ждущий режим на 5 с для сброса настроек по умолчанию. Горит светодиод и высвечивается надпись на экране “Starting ...”.
Чтение настроек с SD карты памяти
//загрузка настроек
appset = new AppSettings();
appset.ReadSettings();
Инициализация сети
netinter = new netinteface();
Чтение времени из RTC. RTC интегрирован в чип. Для обеспечения хода часов необходимо подключит батарейку v3.3 к контактам
Utility.SetLocalTime(RealTimeClock.GetTime());
Запуск потока синхронизации времени с NTP сервером. Интервал синхронизации задается в настройках.
Thread ThreadUpdateTimeNTP = new Thread(UpdateTimeNTPThread);
ThreadUpdateTimeNTP.Start();
Запуск потока подачи звонка. Сопоставляет текущее время и время звонков. В случае совпадения подает звонок.
Thread ThreadTimeBells = new Thread(TimeBells);
ThreadTimeBells.Start();
Запуск Web сервера
Webserver server = new Webserver();
подготовка массива для передачи. Небольшой велосипед для экономии памяти
string[] confstr = {appset.SyncTimeDelayMin.ToString(),
appset.CurTimeBell[0].ToString("HH:mm"),
…
appset.CurTimeBell[7].ToString("HH:mm")};
server.StartServer(confstr);
Особенности реализации
От Arduino UNO пришлось практически сразу отказаться по следующим причинам:
Одновременно не поддерживается работа с сетью и SD картой. Есть реализация у ladyada Arduino Ethernet+SD [15], но к у меня не получилось запустить.
Arduino поддерживает два параллельных потока или два прерывания.
В моей реализации получилось 4 потока: прерывание на кнопку для ручной подачи звонка, синхронизация с NTP сервером, поток отслеживания времени подачи звонка, поток обслуживания http сервера. Для Arduino UNO это слишком много.
По сравнению с проектом на Raspberry pi, простота реализации поддержки Watchdog.
К сожалению, не работает отслеживание состояния Ethernet кабеля. При отключение кабеля, необходимо проводить инициализацию сети. Как вариант решения этой проблему периодически опрашивать ping какой ни будь узел в сети. В случает отсутствия ответа, заново инициализировать сеть. Но это недоработка CLR для микроконтроллера FEZ Domino.
Отслеживание времени звонка осуществляется с секундной точность. Поэтому, для того что бы звонок не проскочил, сохраняется предыдущее время и новое. Если время звонка попадает в этот интервал, звенит звонок. Процедура засыпает на 1 секунду, но так же еще тратится время на выполнение самой процедуры, поэтому и был сделан интервал.
public static void TimeBells()
{
string NowLocalTime = "";
DateTime NewTime;
DateTime OldTime = DateTime.Now.ToLocalTime();
OpredCallZvon ocz;
while (true)
{
//текущее время
NewTime = DateTime.Now.ToLocalTime();
//отображение текущего времени
NowLocalTime = NewTime.ToString("HH:mm:ss");
//проверка подачи звонка
foreach (DateTime dt in appset.CurTimeBell)
{
ocz=new OpredCallZvon(NewTime,OldTime,dt);
if (ocz.isCall)
{
LCD.setCursor(0, 1);
LCD.print("NOW ZVONOK ");
RunBell();
}
}
OldTime = NewTime;
Thread.Sleep(1000);
}
}
В момент подачи звонка горит светодиод.
RTC встроен. Достаточно подвести питание на пины VBAT IN и Ground.
Для упрощения шаблоны html страниц были помещены в ресурсы к проекту.
Использовались библиотеки:
На реализацию ушло 3 дня x 4 часа = 12 человеко-часов.
Иногда при http запросах получалось исключение о превышение оперативной памяти(~62KB). Из-за этого пришлось применять новые настройки только при перезагрузке, не в оперативном режиме.
Смета расходов
№ | Название | кол-во | цена | Сумма, $ |
1 | Netduino Plus 2 [22] | 1 | 59,95 | 59,95 |
2 | Relay Module [23] | 1 | 1,74 | 1,74 |
3 | RGB 3 Color Full Color LED любой цвет [24] | 1 | 1,99 | 1,99 |
4 | Standard Button Switch Sensor Module [25] | 2 | 1,29 | 2,58 |
5 | LCD module Blue screen IIC/I2C 2004 5V [26] | 1 | 7,6 | 7,6 |
6 | Карта памяти MicroSD | 1 | 3,14 | 3,14 |
7 | Основа для монтажа, провода | 1 | 10 | 10 |
ИТОГО | 87 |
Видео:
Код:
FEZ_Domino_Zvonok.zip [27]
Автор: devzona
Источник [28]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/arduino/78242
Ссылки в тексте:
[1] FEZ Domino: http://devdotnet.org/post/2013/05/05/Otladochnaya-plata-FEZ-Domino-ot-GHI-Electronics.aspx
[2] .NET Micro Framework: http://old.devdotnet.org/post/2013/05/03/Nemnogo-o-platforme-NET-Micro-Framework-dlya-vstraivaemih-sistem.aspx
[3] prostosergik: http://habrahabr.ru/users/prostosergik/
[4] Новогодняя малина — прикручиваем экран HD44780 к Raspberry Pi: http://habrahabr.ru/post/206782
[5] Школьный звонок на Raspberry Pi с удаленным управлением: http://habrahabr.ru/post/207138
[6] NET Duino Plus 2: http://www.netduino.com/netduinoplus2/specs.htm
[7] Реле: http://www.dfrobot.com/index.php?route=product/product&product_id=64&search=relay&description=true
[8] Светодиод: http://www.dfrobot.com/index.php?route=product/product&product_id=492&search=LED+Blue&description=true&category_id=48&page=5
[9] Кнопка : http://www.dfrobot.com/index.php?route=product/product&product_id=73&search=button&description=true
[10] LCD двухстрочный: http://www.dfrobot.com/index.php?route=product/product&product_id=590&search=LCD&description=true
[11] Шилд подключения: http://www.dfrobot.com/index.php?route=product/product&product_id=1134&search=shield+expansion&description=true&category_id=48&page=4
[12] Ethernet Shield: http://www.dfrobot.com/index.php?route=product/product&product_id=455&search=Ethernet+Shield&description=true
[13] Aliexpress.com: http://ru.aliexpress.com/ru_home.htm
[14] GHI FEZ Cerbuino Net: https://www.ghielectronics.com/catalog/product/473
[15] Arduino Ethernet+SD: http://www.ladyada.net/learn/arduino/ethfiles.html
[16] Panda based web server: https://www.ghielectronics.com/community/codeshare/entry/116) от Dave (https://www.ghielectronics.com/community/user/1396
[17] Dave: https://www.ghielectronics.com/community/user/1396
[18] NTP time adjustement for Wiz5100: https://www.ghielectronics.com/community/codeshare/entry/244
[19] Nicolas3: https://www.ghielectronics.com/community/user/2604
[20] String.Replace(): https://www.ghielectronics.com/community/codeshare/entry/152
[21] William: https://www.ghielectronics.com/community/user/1606
[22] Netduino Plus 2: http://www.seeedstudio.com/depot/Netduino-Plus-2-p-1348.html?cPath=6_9
[23] Relay Module: http://ru.aliexpress.com/item/ShangMart-original-brand-5V-Indicator-Light-LED-One-1-Channel-Relay-Module-For-Arduino-ARM-PIC/32238746612.html?isOrigTitle=true
[24] RGB 3 Color Full Color LED любой цвет: http://ru.aliexpress.com/item/-/1950296671.html?isOrigTitle=true
[25] Standard Button Switch Sensor Module: http://ru.aliexpress.com/item/Wholesale-Retail-1pc-Standard-Button-Switch-Sensor-Module-Electronic-Brick-For-Arduino-Compatible/1762189907.html?isOrigTitle=true
[26] LCD module Blue screen IIC/I2C 2004 5V: http://ru.aliexpress.com/item/Special-promotions-LCD-module-Blue-screen-IIC-I2C-2004-5V-LCD-for-arduino-blue-screen/32213945286.html?isOrigTitle=true
[27] FEZ_Domino_Zvonok.zip: http://devdotnet.org/files/FEZ_Domino_Zvonok.zip
[28] Источник: http://habrahabr.ru/post/246853/
Нажмите здесь для печати.