A história de um estudante coreano que recebeu um prêmio do ministério por um sistema de monitoramento de filas

Quando eu estava no ensino fundamental no ensino médio (de março a dezembro de 2016), fiquei muito irritado com a situação que se desenvolveu em nossa cafeteria da escola.

Problema 1: aguardando muito tempo na fila

Que problema eu observei? Aqui está um:



Muitos estudantes acumularam-se na distribuição e tiveram que ficar muito tempo (cinco a dez minutos). Obviamente, esse é um problema comum e um esquema justo de serviço: quanto mais tarde você chegar, mais tarde você será atendido. Então você pode entender por que você tem que esperar.

Problema dois: condições desiguais de espera

Mas, é claro, isso não era tudo: eu tinha que observar mais um problema mais sério. Tão sério que, no final, decidi tentar encontrar uma saída para a situação. Alunos do ensino médio (ou seja, todos que estudam pelo menos uma série mais alta) e professores foram à distribuição sem esperar na fila. Sim, sim, e você, como aluno da escola primária, não podia contar nada a eles. Nossa escola tinha uma política bastante rígida em relação às relações entre as classes.

Portanto, meus amigos e eu, quando éramos recém-chegados, chegamos à sala de jantar primeiro, estávamos prestes a pegar comida - e então alunos ou professores do ensino médio apareceram e simplesmente nos afastaram (alguns que eram mais gentis nos permitiram ficar em nosso lugar na fila). Tivemos que esperar mais quinze a vinte minutos, embora chegássemos mais cedo do que todos os outros.

Tivemos uma hora do almoço especialmente ruim. Durante o dia, absolutamente todos (professores, alunos, funcionários) correram para a sala de jantar, para que nós, como alunos do ensino médio, nunca tivéssemos uma alegria.

Soluções comuns

Mas, como os recém-chegados não tiveram escolha, criamos duas maneiras de reduzir o risco de sermos jogados no final da linha. O primeiro é chegar à sala de jantar muito cedo (ou seja, literalmente antes de a comida ser servida). O segundo é matar especificamente o tempo em um pingue-pongue ou basquete e apresentar um longo atraso (vinte minutos após o início do jantar).

Até certo ponto, isso funcionou. Mas, francamente, ninguém estava ansioso para correr para a sala de jantar com todas as pernas, apenas para poder comer ou comer as sobras que restavam atrás do resto, porque ele estava entre as últimas. Precisávamos de uma solução que nos informasse quando há poucas pessoas na sala de jantar.

Seria ótimo se algum adivinho previsse o futuro para nós e dissesse exatamente quando ir à sala de jantar para que não precisássemos esperar muito. O problema era que todos os dias as coisas eram diferentes. Não podíamos simplesmente analisar os padrões e identificar o melhor momento. Tínhamos apenas uma maneira de descobrir como as coisas estão indo na sala de jantar - chegar lá a pé, e o caminho pode ter várias centenas de metros, dependendo de onde você estiver. Então, se você vier, olhe para a fila, volte e continue com o mesmo espírito até que fique curto, você perderá muito tempo. Em geral, a classe elementar vivia nojenta, e nada podia ser feito a respeito.

Eureka - a ideia de criar um sistema de monitoramento de cantinas

E de repente, já no próximo ano acadêmico (2017), eu disse a mim mesmo: “E se criarmos um sistema que mostre a duração da fila em tempo real (ou seja, detecte um engarrafamento)?” Se eu tivesse sucesso, o quadro seria o seguinte: os alunos do ensino fundamental simplesmente olhavam para o telefone para obter os dados mais recentes sobre o nível atual de carga de trabalho e tiravam conclusões se faz sentido seguir agora.

Em essência, esse esquema suavizou a desigualdade por meio do acesso à informação. Com a ajuda deles, os jovens poderiam escolher o que deveriam fazer de melhor - ir e alinhar (se não for muito longo) ou passar um tempo com mais benefícios, e depois escolher um momento mais adequado. Fiquei muito animado com esse pensamento.

Projetando um sistema de monitoramento de sala de jantar


Em setembro de 2017, eu precisava enviar um projeto para um curso de programação orientada a objetos e declarei esse sistema como meu projeto.



Plano inicial do sistema (setembro de 2017)

Seleção de hardware (outubro de 2017)



Interruptor tátil simples com resistor pull-up. Um circuito com cinco escudos em três linhas para reconhecer uma linha em três linhas

Encomendei apenas cinquenta comutadores de membrana, uma mini placa Wemos D1 baseada no ESP8266, bem como vários grampos de anel, nos quais planejava conectar fios esmaltados.

Prototipagem e desenvolvimento (outubro de 2017)

Comecei com a placa de ensaio - montei um circuito e testei. Eu estava limitado na quantidade de materiais, então me limitei a um sistema com cinco estribos.

Para o software que escrevi em C ++, defino estas metas:

  1. Trabalhe continuamente e envie dados apenas nos períodos em que a comida é servida (café da manhã, almoço, jantar, lanche da tarde).
  2. Reconheça a situação com os congestionamentos de fila / tráfego na sala de jantar em tais frequências, para que os dados possam ser usados ​​em modelos de aprendizado de máquina (por exemplo, 10 Hz).
  3. Envie dados para o servidor de maneira eficiente (o tamanho do pacote deve ser pequeno) e em intervalos curtos.

Para alcançá-los, eu precisava fazer o seguinte:

  1. Use o módulo RTC (Real Time Clock) para monitorar continuamente a hora e determinar a hora em que as refeições são servidas na sala de jantar.
  2. Use o método de compactação de dados para registrar o estado do escudo em um caractere. Tratando os dados como código binário de cinco dígitos, vinculei vários valores aos caracteres ASCII, para que eles representassem elementos de dados.
  3. Use o ThingSpeak (ferramenta de IoT para análises e gráficos on-line), enviando solicitações HTTP usando o método POST.

Claro, houve alguns erros. Por exemplo, eu não sabia que o operador sizeof () retorna o valor 4 para o objeto char * e não o comprimento da string (porque não é uma matriz e, portanto, o compilador não calcula o comprimento) e fiquei muito surpreso por minhas solicitações HTTP conterem apenas quatro caracteres de todo o URL!

Além disso, não coloquei os colchetes no estágio #define, e isso levou a resultados inesperados. Bem, digamos:

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

Aqui, vale a pena esperar que A seja igual a 3 (10/3 = 3), mas, de fato, foi calculado de maneira diferente: 2 (2 * 5/3 = 2).

Finalmente, outro bug notável com o qual lidei é o Reset em um cão de guarda. Com esse problema, sofri por muito tempo. Como se viu depois, tentei acessar o registro de baixo nível no chip ESP8266 da maneira errada (por engano, registrei um valor NULL para um ponteiro para uma estrutura).



O estribo que eu projetei e montei. Quando a foto foi tirada, ele já havia sobrevivido cinco semanas pisoteando

Ferragens (estribos)

Para que os escudos possam sobreviver às duras condições de jantar, eu defino os seguintes requisitos:

  • Os escudos devem ser fortes o suficiente para suportar constantemente o peso humano.
  • Os escudos devem ser finos para não interferir nas pessoas na fila.
  • O interruptor deve sempre trabalhar na ofensiva.
  • Os escudos devem ser à prova d'água. A sala de jantar está sempre úmida.

Para atender a esses requisitos, decidi por um projeto com uma estrutura de duas camadas - o corte acrílico a laser foi para a base e a tampa superior e usei material de cortiça como camada protetora.

O layout do escudo que fiz no AutoCAD; tamanhos - 400 por 400 milímetros.



À esquerda está o design que foi trabalhar. À direita está a opção com uma conexão lego

A propósito, eu finalmente recusei o design certo, porque com um sistema de fixação desse tipo, verificou-se que deveria haver 40 centímetros entre os escudos, o que significa que eu não conseguia cobrir a distância necessária (mais de dez metros).





Para conectar todos os interruptores, usei fios esmaltados - todos eles mediram mais de 70 metros! No centro de cada escudo, coloquei um interruptor de membrana. Dois clipes se projetavam dos slots laterais para o exterior, para a esquerda e direita do comutador.

Bem, para impermeabilização, usei fita isolante. Muita fita isolante.

E tudo funcionou!


O período de 5 de novembro a 12 de dezembro



Foto do sistema - todos os cinco escudos são visíveis aqui. À esquerda está o sistema eletrônico (D1-mini / Bluetooth / RTC)

No dia 5 de novembro, às oito da manhã (hora do café da manhã), o sistema começou a coletar dados atualizados sobre a situação na sala de jantar. Eu não podia acreditar nos meus olhos. Há cerca de dois meses, esbocei o esquema geral, sentado em casa, de pijama, e agora, por favor, todo o sistema funciona sem problemas, sem problemas ... ou não.

Erros no software durante o teste

Obviamente, havia bugs suficientes no sistema. Aqui estão os que eu lembro.

O programa não verificou os pontos Wi-Fi disponíveis ao tentar conectar o cliente à API ThingSpeak. Para corrigir o erro, adicionei uma verificação de disponibilidade de Wi-Fi como uma etapa adicional.

Na função de configuração, chamei constantemente “WiFi.begin” até aparecer uma conexão. Mais tarde, descobri que o firmware do ESP8266 instala a conexão e a função begin é usada apenas ao configurar o Wi-Fi. Corrigi a situação, começando a chamar a função apenas uma vez, durante a instalação.

Descobri que a interface da linha de comando que eu criei (foi projetada para definir horário, alterar configurações de rede) não funciona em repouso (ou seja, fora do café da manhã, almoço, jantar e lanche da tarde). Também vi que, quando não há registro, o loop interno é excessivamente acelerado e os dados seriais são lidos muito rapidamente. Portanto, defino um atraso para que o sistema aguarde a chegada de comandos adicionais quando forem esperados.

Ode to Watchdog

E, depois disso, sobre o problema com o cronômetro do watchdog - eu decidi na fase de teste nas condições de "campo". Sem exagero, só pensei nisso por quatro dias. A cada intervalo (com duração de dez minutos), corria para a sala de jantar, apenas para experimentar a nova versão do código. E quando a distribuição foi aberta, fiquei sentado no chão por uma hora, tentando pegar um inseto. Eu não pensei em comida! Obrigado por todo o bom cronômetro ESP8266!

Como lidei com o WDT



Um trecho de código que eu lutei

Eu encontrei um programa, ou melhor, uma extensão para o Arduino, que analisa a estrutura de dados do software quando o Wdt-reset ocorre, referindo-se ao arquivo ELF do código compilado (correlação entre funções e ponteiros). Quando isso foi feito, o erro pode ser corrigido da seguinte maneira:



Que diabos! Bem, quem sabia que corrigir bugs em um sistema em tempo real é tão difícil! No entanto, eu removi o bug, e acabou sendo um bug idiota. Por inexperiência, escrevi um loop while no qual a matriz foi além dos limites da matriz. Ufa! (índice ++ e ++ são duas grandes diferenças).



Problemas de hardware em teste

Obviamente, o equipamento, isto é, estribo, estava longe de ser o ideal. Como esperado, um dos interruptores travou.



Em 7 de novembro, durante o almoço, o interruptor do terceiro escudo ficou preso

Acima, fiz uma captura de tela de um gráfico on-line no site da ThingSpeak. Como você pode ver, algo aconteceu por volta das 12h25, após o qual o escudo número três saiu de ordem. Como resultado, o comprimento da fila foi definido como 3 (o valor é 3 * 100), mesmo quando na verdade não atingiu o terceiro escudo. A correção foi que eu adicionei mais revestimento (sim, fita isolante) para tornar o interruptor mais espaçoso.

Às vezes, meu sistema era literalmente desenraizado quando um fio se agarrava a uma porta. Os carrinhos eram transportados por essa porta para a sala de jantar e os pacotes eram trazidos, então ela carregou o fio atrás dela, fechando-o e puxou-o para fora do compartimento. Nesses casos, notei uma falha inesperada no recebimento de dados e imaginei que o sistema estava desconectado da fonte de energia.

Difusão do sistema escolar

Como já mencionado, usei a API ThingSpeak, que visualiza os dados no site na forma de gráficos, o que é muito conveniente. Na verdade, eu apenas joguei o link da minha agenda no grupo da escola no Facebook (procurei este post por meia hora e não o encontrei - é muito estranho). Mas então eu encontrei um post na minha comunidade escolar, de 5 de novembro de 2017:





A reação foi tempestuosa!

Postei essas postagens para aumentar o interesse no meu projeto. No entanto, apenas olhando para eles em si é bastante divertido. Digamos que seja claramente visível aqui que o número de pessoas saltou acentuadamente às 6:02 e quase caiu a zero às 6:10.



Acima, anexei alguns horários relacionados à hora do almoço e chá da tarde. É interessante notar que o pico de congestionamento na hora do almoço quase sempre caía às 12:25 (a fila alcançava o quinto escudo). E para um lanche da tarde, um grande congestionamento de pessoas geralmente não é característico (a fila tem no máximo um escudo de comprimento).

Você sabe o que é engraçado? Este sistema ainda está ativo (https://thingspeak.com/channels/346781)! Entrei na conta que usei antes e vi o seguinte:



No gráfico acima, vi que em 3 de dezembro o fluxo de pessoas é significativamente menor. E não é de admirar - era domingo. Neste dia, quase todo mundo vai a algum lugar, porque na maioria dos casos é apenas no domingo que você pode deixar o recinto da escola. É claro que no fim de semana na sala de jantar você não verá uma alma viva.

Como recebi pelo meu projeto o primeiro prêmio do Ministério da Educação da Coréia


Como você pôde ver, eu não trabalhei nesse projeto porque estava tentando ganhar algum tipo de prêmio ou reconhecimento. Eu só queria aplicar minhas habilidades para resolver o problema crônico que encontrei na escola.

No entanto, nossa nutricionista escolar, Srta. O, com quem me tornei muito próxima ao planejar e desenvolver meu projeto, uma vez me perguntou se eu sabia sobre um concurso de idéias para a sala de jantar. Então eu pensei que era algum tipo de idéia estranha - medir idéias para a sala de jantar. Mas li o folheto informativo e descobri que o projeto deve ser enviado antes de 24 de novembro! Bem, bem. Eu rapidamente me lembrei do conceito, dados e gráficos e enviei um aplicativo.

Mudanças na ideia original da competição

A propósito, o sistema que propus no final era um pouco diferente do já implementado. Na verdade, adaptei meu método original (medindo o comprimento da fila em tempo real) para escolas coreanas significativamente maiores. Para comparação: em nossa escola, existem trezentos alunos e, em outros, tantas pessoas estudam em apenas uma classe! Eu precisava entender como dimensionar o sistema.

Por isso, propus um conceito baseado mais no controle manual. Atualmente, as escolas coreanas já introduziram a ordem de comer para todas as classes, que é estritamente respeitada, então construí outra estrutura do tipo "sinal-resposta". Supunha-se que quando o grupo que visita a sala de jantar à sua frente atingir um certo limite no comprimento da fila (ou seja, a fila fica curta), eles enviarão manualmente um sinal usando o botão ou o interruptor na parede. O sinal será transmitido para a tela da TV ou através de lâmpadas LED.

Eu realmente queria resolver o problema que surgiu em todas as escolas do país. Tornei-me ainda mais forte em minha intenção quando ouvi da senhorita O uma história - vou lhe contar agora. Acontece que em algumas escolas grandes a linha vai além da lanchonete, para a rua de vinte a trinta metros, mesmo no inverno, porque ninguém pode construir adequadamente o processo. E às vezes acontece que por alguns minutos ninguém aparece na sala de jantar - e isso também é ruim. Nas escolas com um grande número de alunos, a equipe mal consegue servir a todos, mesmo que nem um minuto do tempo destinado à alimentação desapareça. Portanto, aqueles que se aproximam da distribuição até o final (geralmente são alunos do ensino fundamental) simplesmente não têm tempo suficiente para comer.

Portanto, mesmo tendo de enviar meu aplicativo com pressa, ainda considerava com muito cuidado como adaptá-lo para uso mais amplo.

A mensagem que eu ganhei o primeiro prêmio!

Em resumo, fui convidado a vir e enviar meu projeto a funcionários do governo. Então, esforcei todos os meus talentos no campo de Power Point, vim e apresentei!



Início da apresentação (mais à esquerda - Ministro)

Foi uma experiência interessante - acabei de criar algo para o problema de Stolov e, de alguma forma, acabei nos vencedores da competição. Mesmo de pé no palco, fiquei pensando: "Hmm, o que estou fazendo aqui?" Mas, em geral, esse projeto me trouxe um grande benefício - aprendi muito sobre o desenvolvimento de sistemas embarcados e a implementação de projetos na vida real. Bem, eu recebi o prêmio, é claro.

Conclusão


Há alguma ironia aqui: não importa o quanto eu participei de competições e feiras científicas, nas quais me inscrevi propositadamente, nada de bom veio disso. E aqui a oportunidade acabou de me encontrar e deu bons resultados.

Isso me fez pensar nas razões que me levaram a assumir projetos. Por que estou começando a trabalhar - para "vencer" ou resolver um problema que realmente existe no mundo ao nosso redor? Se o segundo motivo se aplicar ao seu caso, peço que você não abandone o projeto. Com essa abordagem aos negócios, você pode encontrar oportunidades inesperadas ao longo do caminho e não sentirá a pressão da necessidade de vencer - seu principal motivador será a dedicação ao seu trabalho.

E o mais importante: se você conseguir implementar uma solução decente, poderá experimentá-la imediatamente no mundo real. No meu caso, a escola se tornou a plataforma, mas a experiência se acumula com o tempo e quem sabe - talvez todo o seu país ou até o mundo inteiro use seu aplicativo.

A cada vez, recordando essa experiência, pareço até me orgulhar. Não sei explicar por que, mas o processo de implementação do projeto simplesmente me trouxe um grande prazer, e o prêmio foi um bônus adicional. Além disso, fiquei satisfeito por poder resolver para os colegas um problema que estragava suas vidas todos os dias. Uma vez, um dos alunos veio até mim e disse: "É muito conveniente com o seu sistema". Eu estava no sétimo céu!
Eu acho que mesmo sem nenhum prêmio, eu ficaria orgulhoso desse desenvolvimento apenas por isso. Talvez essa ajuda para outras pessoas tenha me trazido tanta satisfação ... em geral, eu amo projetos.

O que eu esperava alcançar com este artigo

Espero que, depois de ler meu artigo até o final, você esteja inspirado a fazer algo que beneficiará sua comunidade ou até apenas você. Peço que você use suas habilidades (é claro que a programação se aplica a elas, mas existem outras) para mudar a realidade circundante para melhor. Posso garantir que a experiência que você terá no processo não pode ser comparada a nada.

Também pode abrir diante de você caminhos que você não esperava - aconteceu comigo. Então eu pergunto, faça o que quiser e deixe sua marca no mundo! Os ecos de uma única voz podem chocar o mundo inteiro, então acredite em si mesmo.

Aqui estão alguns links relacionados ao projeto:

Source: https://habr.com/ru/post/pt482178/


All Articles