ProHoster > Блог > Новости интернета > История корейского школьника, который получил приз от министерства за систему мониторинга очередей
История корейского школьника, который получил приз от министерства за систему мониторинга очередей
Когда я учился в начальном классе старшей школы (с марта по декабрь 2016 года), меня сильно раздражала ситуация, которая сложилась в нашей школьной столовой.
Проблема первая: слишком долгое время ожидания в очереди
Какую проблему я наблюдал? Вот такую:
У раздачи скапливалось очень много учеников и им приходилось выстаивать подолгу (пять-десять минут). Само собой, это распространенная проблема и справедливая схема обслуживания: чем позже придешь, тем позже тебя обслужат. Так что можно было понять, почему приходится ждать.
Проблема вторая: неравные условия для ожидающих
Но, конечно, это еще не все, мне приходилось наблюдать и еще одну, более серьезную проблему. Настолько серьезную, что я в конце концов решил попытаться найти выход из положения. Старшеклассники (то есть все, кто учится хоть на класс выше) и учителя проходили к раздаче без очереди. Да-да, и ты, как ученик начальных классов, ничего им не мог сказать. У нас в школе была довольно жесткая политика касательно отношений между классами.
Поэтому мы с друзьями, пока были новичками, приходили в столовую самыми первыми, уже вот-вот должны были получить еду – и тут появлялись старшеклассники или учителя и попросту отодвигали нас (некоторые, кто подобрее, позволял нам оставаться на своем месте в очереди). Нам приходилось ждать еще лишних пятнадцать-двадцать минут, хотя пришли-то раньше всех мы.
Особенно плохо нам приходилось в обеденное время. Днем в столовую бросались абсолютно все (учителя, ученики, персонал), поэтому нам, как младшеклассникам, обед никогда не был в радость.
Обычные пути решения проблемы
Но, так как выбора у новичков не было, мы придумали два способа снизить риск того, что нас выкинут в конец очереди. Первый – приходить в столовую очень рано (то есть буквально еще до того, как еду вообще начнут подавать). Второй – специально убивать время за пинг-понгом или баскетболом и приходить с большой задержкой (через минут двадцать после начала обеда).
В какой-то мере это работало. Но, честно говоря, никто не горел желанием мчаться со всех ног в столовую, чтобы только удалось поесть, или доедать остывшие остатки за остальными, потому что оказался в числе последних. Нам нужно было решение, которое позволило бы узнавать, когда в столовой мало людей.
Было бы здорово, если бы какая-нибудь гадалка предсказывала нам будущее и говорила, когда именно стоит идти в столовую, чтобы не пришлось долго ждать. Вся беда была в том, что каждый день все складывалось по-разному. Мы не могли просто проанализировать закономерности и выявить наилучший момент. У нас был только один способ узнать, как обстоят дела в столовой – дойти туда ногами, а путь мог составлять несколько сотен метров, в зависимости от того, где находишься. Так что если приходить, смотреть на очередь, возвращаться и продолжать в том же духе, пока она не станет короткой, потеряешь уйму времени. В общем, начальному классу жилось отвратно, и ничего поделать с этим было нельзя.
Эврика – идея создания Системы Мониторинга Столовой
И вдруг, уже в следующем учебном году (2017), я сказал себе: «А что если сделать систему, которая будет в реальном времени показывать длину очереди (то есть выявлять «пробку»)?». Если бы мне бы это удалось, картина сложилась бы такая: ученики младших классов просто кидали бы взгляд на телефон, чтобы получить актуальные данные о текущем уровне загруженности, и делали бы выводы, имеет ли им смысл идти сейчас.
По сути, эта схема сглаживала неравенство через доступ к информации. Младшеклассники могли с ее помощью сами выбирать, как им лучше поступить – пойти и встать в очередь (если она не слишком длинная) или же потратить время с большей пользой, а позже выбрать более подходящий момент. Меня очень взволновала эта мысль.
Проектирование Системы Мониторинга Столовой
В сентябре 2017 года мне нужно было представить проект для курса объектно-ориентированного программирования, и я заявил эту систему в качестве своего проекта.
Изначальный план системы (сентябрь 2017 года)
Выбор аппаратуры (октябрь 2017 года)
Простой тактильный переключатель с подтягивающим резистором. Схема с пятью щитами в три ряда, чтобы распознавать очередь по трем линиям
Я заказал только пятьдесят мембранных выключателей, плату Wemos D1 mini на базе ESP8266, а также несколько кольцевых зажимов, к которым планировал крепить эмалированные провода.
Создание прототипа и разработка (октябрь 2017)
Я начал с макетной платы – собрал на ней схему и протестировал. Я был ограничен в количестве материалов, поэтому ограничился системой с пятью подножными щитами.
Для ПО, которое я писал на C++, я поставил такие цели:
Работать непрерывно и отсылать данные только в те периоды, когда подают еду (завтрак, обед, ужин, полдник).
Распознавать ситуацию с очередью/пробками в столовой на таких частотах, чтобы данные потом могли использоваться в моделях машинного обучения (скажем, 10 Гц).
Отсылать данные на сервер эффективным способом (размер пакетов должен быть небольшим) и с короткими интервалами.
Для их достижения мне нужно было сделать следующее:
Использовать модуль RTC (Real Time Clock, или часов реального времени), чтобы непрерывно следить за временем и определять сроки, когда в столовой подают еду.
Использовать метод сжатия данных, чтобы прописать состояние щита в одном символе. Рассматривая данные как двоичный пятиразрядный код, я привязал различные значения к символам ASCII, так что они представляли элементы данных.
Использовать 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 – две большие разницы).
Проблемы с аппаратной частью на стадии тестирования
Разумеется, и аппаратура, то есть подножные щиты, была далека от идеала. Как и следовало ожидать, один из переключателей заело.
Седьмого ноября во время обеда переключатель на третьем щите заело
Выше я привел скриншот онлайн-графика с сайта 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, приехал и представил!
Начало презентации (крайний слева — министр)
Это был интересный опыт – просто чего-то там придумал для столовской проблемы, и вот каким-то образом оказался в победителях конкурса. Даже стоя на сцене, я все думал: «Хмм, а что я тут вообще делаю?». Но вообще этот проект принес мне большую пользу – я многое узнал о разработке встраиваемых систем и внедрении проектов в реальную жизнь. Ну и приз получил, конечно.
Заключение
Тут есть какая-то ирония: сколько я ни участвовал во всяких состязаниях и научных ярмарках, на которые записывался целенаправленно, ничего путного из этого не вышло. А тут возможность просто нашла меня сама и дала хорошие результаты.
Это заставило меня задуматься о причинах, которые побуждают меня браться за проекты. Зачем я начинаю работу – чтобы «выиграть» или чтобы решить реально существующую в окружающем мире проблему? Если в вашем случае действует второй мотив, я изо всех сил призываю вас не бросать проект. С таким подходом к делу вы можете встретить на своем пути неожиданные возможности и не будете ощущать давления от потребности обязательно победить – вашим главным мотиватором станете увлеченность своим делом.
И самое главное: если у вас получится реализовать достойное решение, вы сразу сможете опробовать его в реальном мире. В моем случае площадкой стала школа, но по ходу времени опыт накапливается, и кто знает – может быть, ваше приложение будет использовать целая страна или даже весь мир.
Каждый раз, вспоминая об этом опыте, я даже вроде как собой горжусь. Не могу объяснить почему, но процесс реализации проекта попросту приносил мне большое удовольствие, а приз стал дополнительным бонусом. К тому же, мне было приятно, что я сумел решить для одноклассников проблему, которая портила им жизнь каждый день. Один раз ко мне подошел один из учеников и сказал: «С твоей системой очень удобно». Я был на седьмом небе!
Думаю, даже без всяких наград я бы за одно это испытывал гордость за свою разработку. Может, это помощь другим принесла мне такое удовлетворение… в общем, люблю проекты.
Чего я надеялся добиться этой статьей
Надеюсь, дочитав мою статью до конца, вы вдохновились на то, чтобы сделать что-то, что принесет пользу вашему сообществу или даже только вам самим. Призываю вас использовать свои навыки (программирование, безусловно, к ним относится, но есть и другие), чтобы менять окружающую действительность к лучшему. Могу вас уверить, что опыт, который вы получите в процессе, ни с чем не сравнить.
Также это может открыть перед вами пути, которых вы совсем не ожидали – так случилось со мной. Так что прошу вас, делайте то, что вам нравится, и оставляйте свой след в мире! Эхо от одного-единственного голоса может потрясти весь мир, так что верьте в себя.
Вот несколько ссылок, имеющих отношение к проекту: