Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

Коли я навчався у початковому класі старшої школи (з березня по грудень 2016 року), мене дуже дратувала ситуація, що склалася у нашій шкільній їдальні.

Проблема перша: надто довгий час очікування у черзі

Яку проблему я спостерігав? Ось таку:

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

У роздачі накопичувалося дуже багато учнів, і їм доводилося вистоювати довго (п'ять-десять хвилин). Само собою, це поширена проблема і справедлива схема обслуговування: що пізніше прийдеш, то пізніше тебе обслужать. Тож можна було зрозуміти, чому доводиться чекати.

Проблема друга: нерівні умови для тих, хто очікує

Але, звичайно, це ще не все, мені доводилося спостерігати і ще одну серйознішу проблему. Настільки серйозну, що я зрештою вирішив спробувати знайти вихід зі становища. Старшокласники (тобто всі, хто навчається хоч на клас вище) та вчителі проходили до роздачі без черги. Так-так, і ти, як учень початкових класів, нічого їм не міг сказати. У нас у школі була досить жорстка політика щодо відносин між класами.

Тому ми з друзями, поки були новачками, приходили до їдальні найпершими, вже ось-ось мали отримати їжу – і тут з'являлися старшокласники чи вчителі і просто відсували нас (деякі, хто добріший, дозволяв нам залишатися на своєму місці в черзі). Нам доводилося чекати ще зайвих п'ятнадцять-двадцять хвилин, хоча прийшли раніше за всіх ми.

Особливо погано нам доводилося в обідню пору. Вдень у їдальню кидалися абсолютно всі (вчителі, учні, персонал), тому нам, як молодшим класникам, обід ніколи не був на радість.

Звичайні шляхи вирішення проблеми

Але оскільки вибору у новачків не було, ми придумали два способи знизити ризик того, що нас викинуть у кінець черги. Перший – приходити до їдальні дуже рано (тобто буквально ще до того, як їжу взагалі почнуть подавати). Другий – спеціально вбивати час за пінг-понгом або баскетболом та приходити з великою затримкою (за хвилин двадцять після початку обіду).

Якоюсь мірою це працювало. Але, чесно кажучи, ніхто не горів бажанням мчати з усіх ніг у їдальню, щоб тільки вдалося поїсти, або доїдати охололі залишки за іншими, бо опинився серед останніх. Нам потрібне було рішення, яке б дозволяло дізнаватися, коли в їдальні мало людей.

Було б чудово, якби якась ворожка передбачала нам майбутнє і говорила, коли саме варто йти до їдальні, щоб не довелося довго чекати. Все лихо було в тому, що щодня все складалося по-різному. Ми не могли просто проаналізувати закономірності та виявити найкращий момент. У нас був лише один спосіб дізнатися, як справи в їдальні – дійти туди ногами, а шлях міг становити кілька сотень метрів, залежно від того, де знаходишся. Так що якщо приходити, дивитися на чергу, повертатися і продовжувати в тому ж дусі, поки вона не стане короткою, втратиш багато часу. Загалом, початковому класу жилося огидно, і нічого вдіяти з цим не можна було.

Евріка – ідея створення Системи Моніторингу Їдальні

І раптом, вже наступного навчального року (2017), я сказав собі: «А що якщо зробити систему, яка в реальному часі показуватиме довжину черги (тобто виявляти «корок»)?». Якби мені це вдалося, картина склалася б така: учні молодших класів просто кидали б погляд на телефон, щоб отримати актуальні дані про поточний рівень завантаженості, і робили б висновки, чи має їм сенс йти зараз.

По суті, ця схема згладжувала нерівність через доступом до інформації. Молодокласники могли з її допомогою самі вибирати, як їм краще вчинити - піти і встати в чергу (якщо вона не дуже довга) або витратити час з більшою користю, а потім вибрати слушний момент. Мене дуже схвилювала ця думка.

Проектування Системи Моніторингу Їдальні

У вересні 2017 року мені потрібно було представити проект для курсу об'єктно-орієнтованого програмування, і я заявив цю систему як свій проект.

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

Початковий план системи (вересень 2017 року)

Вибір апаратури (жовтень 2017 року)

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

Простий тактильний перемикач з резистором, що підтягує. Схема з п'ятьма щитами в три ряди, щоб розпізнавати чергу за трьома лініями

Я замовив лише п'ятдесят мембранних вимикачів, плату Wemos D1 mini на базі ESP8266, а також кілька кільцевих затискачів, до яких планував кріпити емальовані дроти.

Створення прототипу та розробка (жовтень 2017)

Я почав із макетної плати – зібрав на ній схему та протестував. Я був обмежений у кількості матеріалів, тому обмежився системою із п'ятьма підніжними щитами.

Для ПЗ, яке я писав на C++, я поставив такі цілі:

  1. Працювати безперервно і надсилати дані лише у періоди, коли подають їжу (сніданок, обід, вечеря, полудень).
  2. Розпізнавати ситуацію з чергою/пробками у їдальні на таких частотах, щоб дані потім могли використовуватися в моделях машинного навчання (скажімо, 10 Гц).
  3. Надсилати дані на сервер ефективним способом (розмір пакетів має бути невеликим) та з короткими інтервалами.

Для їх досягнення мені потрібно було зробити таке:

  1. Використовувати модуль RTC (Real Time Clock, або годинника реального часу), щоб безперервно стежити за часом і визначати терміни, коли в їдальні подають їжу.
  2. Використовуйте метод стиснення даних, щоб прописати стан щита в одному символі. Розглядаючи дані як двійковий п'ятирозрядний код, я прив'язав різні значення символів ASCII, так що вони представляли елементи даних.
  3. Використовувати ThingSpeak (інструмент IoT для аналітики та побудови онлайн-графіків), надсилаючи запити HTTP методом POST.

Зрозуміло, без багів не обійшлося. Наприклад, я не знав, що оператор sizeof( ) повертає для об'єкта char * значення 4, а не довжину рядка (бо це не масив і, відповідно, компілятор не розраховує довжину) і дуже дивувався, чому мої HTTP запити містять лише чотири символи з усього URL!

Також я не проставив дужки на етапі #define, і це призвело до несподіваних результатів. Ну от скажемо:

#define _A    2 * 5 
int a = _A / 3;

Тут варто було б очікувати, що А дорівнюватиме 3 (10/3=3), проте насправді воно розраховувалося інакше: 2 (2*5/3=2).

Нарешті, ще один гідний згадки про баг, з яким я мав справу, це Reset на сторожовому таймері. З цією проблемою я дуже довго промучився. Як потім з'ясувалося, я намагався отримати доступ до низькорівневого реєстру на чіпі ESP8266 у неправильний спосіб (по помилці прописав значення NULL для вказівника на структуру).

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

Підніжний щит, який я спроектував та зібрав. На момент, коли зроблено знімок, він пережив уже п'ять тижнів тупцювання

Апаратна частина (підніжні щити)

Щоб щити виявилися здатними пережити суворі столовські умови, я виставив для них такі вимоги:

  • Щити мають бути досить міцними, щоб постійно витримувати людську вагу.
  • Щити мають бути тонкими, щоб не заважати людям у черзі.
  • Перемикач повинен обов'язково спрацьовувати під час наступу.
  • Щити мають бути водонепроникними. У їдальні вічно сиро.

Щоб задовольнити цим вимогам, я зупинився на дизайні з двошаровою структурою – акрил лазерного різання пішов на основу та верхню кришку, а як захисний шар я використовував пробковий матеріал.

Макет щита я зробив у AutoCAD; розміри – 400 на 400 мм.

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

Ліворуч дизайн, який пішов у роботу. Праворуч варіант з'єднання за типом лего

До речі, від правого дизайну я зрештою відмовився тому, що з такою системою фіксації виходило, що між щитами має бути 40 сантиметрів, а отже, я не міг покрити потрібну відстань (десять з гаком метрів).

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

Щоб підключити всі перемикачі я використав емальовані дроти – всього їх пішло більше 70 метрів! У центр кожного щита помістив мембранний перемикач. З бічних прорізів назовні висовувалися два затискачі – ліворуч і праворуч від перемикача.

Ну а для водонепроникності я використав ізоленту. Дуже багато ізольентів.

І все запрацювало!

Період з п'ятого листопада по дванадцяте грудня

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

Фото системи – тут видно всі п'ять щитів. Зліва розміщується електроніка (D1-mini/Bluetooth/RTC)

П'ятого листопада о восьмій ранку (час сніданку) система почала збирати актуальні дані про обстановку в їдальні. Я своїм очам не міг повірити. Загалом якихось два місяці тому я накидав загальну схему, сидячи вдома в піжамі, і ось, будь ласка, ціла система працює без сучка без задирки… чи ні.

Баги з ПЗ у період тестування

Зрозуміло, у системі вистачало багів. Ось ті, що мені запам'яталися.

Програма не перевіряла наявність доступних точок Wi-Fi під час спроби з'єднати клієнта з ThingSpeak API. Щоб усунути помилку, я додав перевірку доступності Wi-Fi додатковим кроком.

У функції setup я постійно викликав WiFi.begin, поки не з'являлося з'єднання. Згодом я дізнався, що з'єднання встановлює прошивка ESP8266, а функція begin використовується тільки при налаштуванні Wi-Fi. Я виправив положення тим, що почав викликати функцію лише один раз, під час налаштування.

Я виявив, що створений мною інтерфейс командного рядка (він був призначений для того, щоб виставляти час, змінювати мережеві налаштування) не працює у стані спокою (тобто за межами сніданку, обіду, вечері та полуденку). Також я побачив, що коли не відбувається логування, внутрішній цикл надмірно прискорюється і серійні дані зчитуються занадто швидко. Тому я виставив затримку, щоб система очікувала надходження додаткових команд, коли вони передбачаються.

Ода сторожовому таймеру

А, ще й навздогін про ту проблему з сторожовим таймером – я вирішив її саме на стадії тестування в «польових» умовах. Я без перебільшень тільки про це і думав упродовж чотирьох днів. Кожну зміну (тривалістю десять хвилин) я мчав у їдальню, щоб випробувати нову версію коду. А коли роздача відкривалася, я просиджував на підлозі биту годину, намагаючись виловити баг. Про їжу я і не думав! Дякую за все гарне, сторожовий таймер ESP8266!

Як я розібрався з WDT

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

Фрагмент коду, над яким я бився

Я знайшов програму, вірніше, розширення для Arduino, яке аналізує структуру даних ПЗ, коли відбувається Wdt-reset, звертаючись до ELF-файлу скомпільованого коду (кореляції між функціями та покажчиками). Коли це було зроблено, виявилося, що усунути помилку можна так:

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

Ось чорт! Ну, хто ж знав, що виправляти баги в системі, що працює в режимі реального часу, настільки складно! Проте баг я прибрав, і це виявився тупий баг. Через недосвідченість я написав цикл while, в якому відбувався вихід за межі масиву. Уф! (index++ та ++index – дві великі різниці).

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

Проблеми з апаратною частиною на стадії тестування

Зрозуміло, і апаратура, тобто підніжні щити, була далекою від ідеалу. Як і слід було очікувати, один із перемикачів заїло.

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

XNUMX листопада під час обіду перемикач на третьому щиті заїло

Вище я навів скріншот онлайн-графіка із сайту ThingSpeak. Як ви бачите, близько 12:25 сталося щось таке, після чого щит номер три вийшов з ладу. У результаті довжина черги визначалася як 3 (значення дорівнює 3 * 100), навіть коли насправді вона не доходила до третього щита. Полагодження полягало в тому, що я додав більше підкладки (так-так, ізоленти), щоб перемикачу було просторіше.

Іноді мою систему буквально виривали з коренем, коли провід чіплявся за двері. Через ці двері до їдальні провозили візки і вносили пакети, так що вона захоплювала провід за собою, зачиняючись, і висмикувала його з роз'єму. У таких випадках я помічав несподіваний збій у надходженні даних і здогадувався, що систему відключено від джерела живлення.

Поширення інформації про систему школи

Як уже згадувалося, я скористався ThingSpeak API, який візуалізує дані на сайті у вигляді графіків, що дуже зручно. Загалом, я, по суті, просто скинув посилання на свій графік до групи школи на Facebook (півгодини шукав цю посаду і не знайшов дуже дивно). Зате я знайшов пост на my Band, шкільному співтоваристві, від п'ятого листопада 2017 року:

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

Реакція була бурхливою!

Я розмістив ці пости, щоб розпалити інтерес до свого проекту. Однак навіть просто розглядати їх саме собою досить цікаво. Скажімо, тут добре видно, що кількість людей різко підскочила о 6:02 і практично впала до нуля до 6:10.

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

Вище я прикріпив пару графіків, які відносяться до часу обіду та полуденку. Цікаво відзначити, що пік завантаженості в обідню пору майже завжди припадав на 12:25 (черга доходила до п'ятого щита). А для полудня взагалі нехарактерне велике скупчення народу (черга максимум в один щит завдовжки).

Знаєте, що кумедно? Ця система досі жива (https://thingspeak.com/channels/346781)! Я зайшов в обліковий запис, який використав раніше і побачив ось що:

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

На графіці вище я побачив, що третього грудня приплив людей суттєво менший. І не дивно – це ж була неділя. Цього дня практично всі десь ходять, бо здебільшого лише у неділю можна залишити територію школи. Зрозуміло, що у вихідний у їдальні живої душі не побачиш.

Як я одержав за свій проект перший приз від Міністерства освіти Кореї

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

Однак наш шкільний дієтолог, міс О, з якою я дуже зблизився, поки планував і розробляв свій проект, якось запитала мене, чи знаю я про конкурс на ідеї для їдальні. Тоді я подумав, що це якась дивна витівка – мірятися ідеями для їдальні. Але я прочитав інформаційний буклет та дізнався, що проект потрібно подати до 24 листопада! Ну і ну. Я швидше довів до розуму концепцію, дані та графіки та відправив заявку.

Зміни вихідної ідеї для конкурсу

До речі, система, яку я зрештою запропонував, трохи відрізнялася від уже реалізованої. По суті, я пристосував свій початковий метод (вимір довжини черги в реальному часі) для значно більших корейських шкіл. Для порівняння: у нашій школі триста учнів, а в деяких інших стільки людей навчається лише в одному класі! Мені треба було зрозуміти, як масштабувати систему.

Тому я запропонував концепцію, більшою мірою засновану на «ручному» управлінні. Зараз у корейських школах вже введено порядок їди для всіх класів, якого суворо дотримуються, тож я вибудував інший фреймворк типу «сигнал — реакція». Тут передбачалося, що коли група, яка відвідує їдальню перед вами, дійде до певної межі у довжині черги (тобто чергу стане короткою), вони вручну відправлять вам сигнал з допомогою кнопки чи перемикача стіні. Сигнал передаватиметься на екран телевізора або через світлодіодні лампочки.

Мені просто дуже хотілося вирішити проблему, яка виникала у всіх школах країни. Ще сильніше я зміцнився у своєму намірі, коли почув від міс Про одну історію – зараз розповім. Виявляється, у деяких великих школах черга виходить за межі їдальні, на вулицю на двадцять-тридцять метрів, навіть узимку, бо ніхто не може належним чином збудувати процес. А іноді буває так, що кілька хвилин у їдальні взагалі ніхто не з'являється – і це також погано. У школах із великою кількістю учнів персонал ледве встигає обслужити всіх навіть у тому випадку, якщо жодна хвилина з часу, відведеного на їжу, не пропадає. Тому тим, хто підходить до роздачі останніми (зазвичай це учні початкових класів), просто не вистачає часу поїсти.

Так що, нехай мені й довелося відсилати свою програму поспіхом, я все-таки дуже ретельно обдумав, як можна пристосувати його для більш широкого використання.

Повідомлення про те, що я виграв перший приз!

Якщо коротко, мене запросили приїхати та представити свій проект перед урядовцями. Так що я напружив усі свої таланти у сфері Power Point, приїхав та представив!

Історія корейського школяра, який одержав приз від міністерства за систему моніторингу черг

Початок презентації (крайній ліворуч – міністр)

Це був цікавий досвід – просто чогось там вигадав для столовської проблеми, і ось якимось чином опинився у переможцях конкурсу. Навіть стоячи на сцені, я все думав: Хмм, а що я тут взагалі роблю? Але взагалі цей проект приніс мені велику користь – я багато чого дізнався про розробку вбудованих систем та впровадження проектів у реальне життя. Ну і приз отримав, звісно.

Висновок

Тут є якась іронія: скільки я не брав участь у будь-яких змаганнях та наукових ярмарках, на які записувався цілеспрямовано, нічого путнього з цього не вийшло. А тут можливість просто знайшла мене сама і дала добрі результати.

Це змусило мене замислитись про причини, які спонукають мене братися за проекти. Навіщо я починаю роботу – щоб «виграти» або щоб вирішити реальну проблему, що існує в навколишньому світі? Якщо у вашому випадку діє другий мотив, я щосили закликаю вас не кидати проект. З таким підходом до справи ви можете зустріти на своєму шляху несподівані можливості та не відчуватимете тиску від потреби обов'язково перемогти – вашим головним мотиватором станете захопленість своєю справою.

І найголовніше: якщо у вас вдасться реалізувати гідне рішення, ви одразу зможете випробувати його у реальному світі. У моєму випадку майданчиком стала школа, але по ходу часу досвід накопичується, і хто знає – можливо, ваш додаток використовуватиме ціла країна або навіть увесь світ.

Щоразу, згадуючи про цей досвід, я навіть начебто собою пишаюся. Не можу пояснити чому, але процес реалізації проекту приносив мені велике задоволення, а приз став додатковим бонусом. До того ж мені було приємно, що я зумів вирішити для однокласників проблему, яка псувала їм життя щодня. Одного разу до мене підійшов один із учнів і сказав: «З твоєю системою дуже зручно». Я був на сьомому небі!
Думаю, навіть без жодних нагород я за одне це відчував би гордість за свою розробку. Може, ця допомога іншим принесла мені таке задоволення… загалом люблю проекти.

Чого я сподівався досягти цієї статті

Сподіваюся, дочитавши мою статтю до кінця, ви надихнулися на те, щоб зробити щось, що принесе користь вашій спільноті або навіть вам самим. Закликаю вас використовувати свої навички (програмування, безумовно, до них відноситься, але є й інші), щоб міняти навколишню дійсність на краще. Можу запевнити вас, що досвід, який ви отримаєте в процесі, ні з чим не порівняти.

Також це може відкрити перед вами шляхи, на які ви зовсім не очікували – так сталося зі мною. Так що прошу вас, робіть те, що вам подобається, та залишайте свій слід у світі! Відлуння від одного-єдиного голосу може потрясти весь світ, так що вірте в себе.

Ось кілька посилань, які стосуються проекту:

Джерело: habr.com

Додати коментар або відгук