Шкільний дзвінок .NET Micro Framework з віддаленим керуванням

Пост розкриває реалізацію подачі шкільного дзвінка з використанням налагоджувальної плати FEZ Domino. Управління розкладом здійснюється через веб-сторінку. На FEZ Domino портована платформа .NET Micro Framework. Мова програмування C#. Передісторія поста така…
Хабровчан prostosergik опублікував пост Новорічна малина — прикручуємо екран HD44780 до Raspberry Pi. В коментарях між мною і prostosergik зав'язалася суперечка про доцільність використання для цих завдань Raspberry Pi. prostosergik в коментарях повідомив про вже готовому проекті шкільного дзвінка на Raspberry Pi.
Пізніше був опублікований пост Шкільний дзвінок на Raspberry Pi з віддаленим керуванням. Тепер настала моя черга у реалізації цієї задачі.

За підсумком листування сформував наступне ТЗ:
Мета: включати дзвінок відповідно до розкладу шкільних дзвінків у навчальному заклад
Механізм роботи: дзвінок подається у відповідність з поданим сигналом «1» на контактному реле. При замикання реле, дзвенить дзвінок.
Вимоги
  • Можливість зміни розкладу дзвінків через Web-інтерфейс
  • Синхронізація часу з NTP-сервером мережі Інтернет
  • Наявність кнопка скидання «заводським» налаштувань
  • Час подачі дзвінка не змінюється, і завжди 5 секунд
  • Безпека. Завдання списку IP-адрес, з яких можливе управління системою. Авторизація по логін/пароль(не було реалізовано, але технічно можливо)
  • Час розклад дзвінків на кожен робочий день, однаково
  • Кнопка подачі дзвінка в будь-який час
Реалізація
Відразу скажу, з-за технічний обмежень на Arduino UNO R3, не вдалося реалізувати цей проект повною мірою.
При виборі контролера керувався наступними правилами:
  • Arduino-сумісний з шилдам та методології роботи.
  • Відсутність Linux в будь-якому прояв
  • Доступна ціна
  • для сегмента промисловості
У заголовку не згадується FEZ Domino, не випадково. Програмний код між мікроконтролерами працюють на .NET Micro Framework, практично без змін переносимо завжди, при дотримання версії. В даному випадку FEZ Domino легко замінюється на плату NET Duino Plus 2, без збитку у функціональності.

Список використовуваних компонентів:
  • Налагоджувальна плата FEZ Domino або аналог з характеристиками
  • Реле — для подачі дзвінка
  • Світлодіод — спалахує в момент подачі дзвінка
  • Кнопка — для скидання до заводських налаштувань
  • Кнопка — ручної подачі дзвінка
  • LCD дворядковий — відображення службової інформації
  • SD-карта на 8 Гб
  • Щит підключення — підключення кнопок, LCD, реле, LED
  • Ethernet Shield — локальна мережа
Всі компоненти можна врозтіч купити на Aliexpress.com, буде суттєво дешевше.
Специфікація FEZ Domino:
image
  • Arduino сумісні контакти з Arduino
  • 72Mhz 32-bit ARM7 LPC2388 процесор
  • USBizi-144 Chipset
  • ~148KB доступної пам'яті Флеш
  • ~62KB доступної пам'яті RAM
  • Порт USB Host (USB-розгалужувачі, джойстик, клавіатура, миша, принтер, CDC, віртуальний послідовний інтерфейс і т. д.)
  • Порт USB client (для налагодження, вибірково для емуляції клавіатури, миші або CDC)
  • Підтримка карт пам'яті microSD (SDHC support, 4-bit SD Bus, підтримка більше 2GB, успішно використовувалася microSDHC 8 GB Transcend class 10)
  • RTC realtime clock — годинник реального часу
  • Підтримка TCP/IP використовуючи Ethernet shield (WIZnet W5100 chip)
  • 30 програмованих IOs
На жаль FEZ Domino давно знята з виробництва, тому нижче найближчі аналоги
Схема підключення
image
Фото пристрою:Вид зверху
image
Зв'язка Fez Domino, Ethernet Shield, I/O Expansion Shield, в режимі стека
image
image

Запуск пристрою
При запуску встановлюється 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, але у мене не вийшло запустити.
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 1 59,95 59,95
2 Relay Module 1 1,74 1,74
3 RGB 3 Color Full Color LED будь-який колір 1 1,99 1,99
4 Standard Button Switch Sensor Module 2 1,29 2,58
5 LCD module Blue screen IIC/I2C 2004 5V 1 7,6 7,6
6 Карта пам'яті MicroSD 1 3,14 3,14
7 Основа для монтажу, дроти 1 10 10
      РАЗОМ 87
Відео:
Скріншоти:image
image
image

Код:
FEZ_Domino_Zvonok.zip

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.