Quando frequentavo il penultimo anno di liceo (da marzo a dicembre 2016), ero molto irritato dalla situazione che si era creata nella mensa della nostra scuola.
Problema uno: tempi di attesa in coda troppo lunghi
Quale problema ho osservato? Questo:

C'erano molti studenti al punto di distribuzione e hanno dovuto aspettare in piedi a lungo (dai cinque ai dieci minuti). Naturalmente, questo è un problema comune e un sistema di servizio equo: più tardi arrivi, più tardi sarai servito. Quindi era comprensibile il motivo per cui si dovesse aspettare.
Problema due: condizioni diseguali per chi aspetta
Ma ovviamente non è tutto, ho dovuto constatare un altro problema, più serio. Così serio che alla fine ho deciso di cercare una via d'uscita dalla situazione. Gli studenti delle superiori (ovvero tutti coloro che avevano studiato almeno un anno più in alto) e gli insegnanti si sono recati alla distribuzione senza fare la fila. Sì, sì, e tu, come studente delle elementari, non potevi dire loro nulla. La nostra scuola aveva una politica piuttosto rigida riguardo ai rapporti tra le classi.
Quindi, quando eravamo nuovi, io e i miei amici eravamo i primi ad arrivare alla mensa, sul punto di prendere il nostro cibo, ma poi arrivavano studenti più grandi o insegnanti che semplicemente ci spingevano da parte (alcuni dei più gentili ci lasciavano stare al nostro posto in fila). Dovevamo aspettare altri quindici o venti minuti, anche se eravamo i primi ad arrivare.
La situazione era particolarmente difficile all'ora di pranzo. Durante il giorno, tutti (insegnanti, studenti, personale) si precipitavano in mensa, quindi per noi, studenti più giovani, il pranzo non era mai una gioia.
Soluzioni convenzionali al problema
Ma poiché i nuovi arrivati non avevano scelta, abbiamo escogitato due modi per ridurre il rischio di essere scaraventati in fondo alla fila. Il primo era arrivare alla mensa molto presto (ovvero, letteralmente prima ancora che il cibo venisse servito). Il secondo era ammazzare il tempo giocando a ping-pong o a basket e arrivare molto tardi (circa venti minuti dopo l'inizio del pranzo).
In un certo senso ha funzionato. Ma, a dire il vero, nessuno aveva voglia di correre in mensa solo per mangiare qualcosa, o di finire gli avanzi freddi degli altri perché erano tra gli ultimi. Avevamo bisogno di una soluzione che ci avvisasse quando c'erano poche persone in mensa.
Sarebbe fantastico se qualche indovino potesse predirci il futuro e dirci esattamente quando andare alla mensa, così non dovremmo aspettare a lungo. Il problema era che ogni giorno era diverso. Non potevamo semplicemente analizzare gli schemi e capire il momento migliore. L'unico modo per scoprire come andavano le cose alla mensa era andarci a piedi, e la distanza poteva essere di diverse centinaia di metri, a seconda di dove ci si trovava. Quindi, se si arrivava, si guardava la fila, si tornava indietro e si continuava con lo stesso spirito finché non si accorciava, si perdeva un sacco di tempo. In generale, la vita era disgustosa per la classe elementare, e non c'era niente che si potesse fare al riguardo.
Eureka: l'idea di creare un sistema di monitoraggio delle mense
E all'improvviso, già nell'anno scolastico successivo (2017), mi sono detto: "E se creassimo un sistema che mostrasse la lunghezza della coda in tempo reale (ovvero identificasse un "ingorgo")?" Se ci fossi riuscito, il quadro sarebbe stato questo: gli studenti delle elementari avrebbero semplicemente dato un'occhiata ai loro telefoni per ottenere dati aggiornati sul livello di congestione attuale e avrebbero tratto conclusioni sul fatto che abbia senso per loro andare subito.
In sostanza, questo schema ha attenuato le disuguaglianze attraverso l'accesso alle informazioni. Gli studenti più giovani potevano usarlo per decidere autonomamente cosa sarebbe stato meglio per loro: andare a fare la fila (se non era troppo lunga) o impiegare il loro tempo in modo più utile e scegliere un momento più opportuno in seguito. Ero molto entusiasta di questa idea.
Progettazione del sistema di monitoraggio della mensa
Nel settembre 2017 ho dovuto presentare un progetto per un corso di programmazione orientata agli oggetti e ho presentato questo sistema come mio progetto.

Piano iniziale del sistema (settembre 2017)
Selezione dell'attrezzatura (ottobre 2017)

Semplice interruttore tattile con resistenza di pull-up. Circuito con cinque schermi su tre file per riconoscere la coda su tre linee.
Ho ordinato solo cinquanta interruttori a membrana, una scheda Wemos D1 mini ESP8266 e alcuni morsetti ad anello ai quali avevo intenzione di collegare i fili smaltati.
Prototipazione e sviluppo (ottobre 2017)
Ho iniziato con una breadboard, ci ho costruito il circuito e l'ho testato. Avendo a disposizione una quantità limitata di materiali, mi sono limitato a un sistema con cinque footboard.
Per il software che ho scritto in C++, mi sono prefissato i seguenti obiettivi:
- Lavorare ininterrottamente e inviare dati solo durante gli orari in cui viene servito il cibo (colazione, pranzo, cena, spuntino pomeridiano).
- Riconoscere code/ingorghi nella mensa a frequenze che possono essere utilizzate nei modelli di apprendimento automatico (ad esempio, 10 Hz).
- Inviare i dati al server in modo efficiente (la dimensione del pacchetto deve essere ridotta) e a intervalli brevi.
Per realizzarli ho dovuto fare quanto segue:
- Utilizzare il modulo RTC (Real Time Clock) per monitorare costantemente l'ora e determinare quando il cibo viene servito nella mensa.
- Utilizzare un metodo di compressione dati per rappresentare lo stato dello scudo in un singolo carattere. Trattando i dati come un codice binario a cinque cifre, ho mappato i vari valori in caratteri ASCII in modo che rappresentassero gli elementi dei dati.
- Utilizzare ThingSpeak (uno strumento di analisi IoT e di creazione di grafici online) inviando richieste HTTP tramite il metodo POST.
Naturalmente, c'erano alcuni bug. Ad esempio, non sapevo che l'operatore sizeof() restituisse 4 per un oggetto char *, non la lunghezza della stringa (perché non è un array e quindi il compilatore non calcola la lunghezza) e sono rimasto molto sorpreso dal fatto che le mie richieste HTTP contenessero solo quattro caratteri dell'intero URL!
Inoltre, non ho inserito le parentesi nel passaggio #define, e questo ha portato a risultati inaspettati. Supponiamo:
#define _A 2 * 5
int a = _A / 3;Qui ci si aspetterebbe che A fosse uguale a 3 (10 / 3 = 3), ma in realtà è stato calcolato diversamente: 2 (2 * 5/ 3 = 2).
Infine, un altro bug degno di nota che ho dovuto affrontare è stato il reset del watchdog timer. Ho avuto davvero difficoltà con questo problema. A quanto pare, stavo cercando di accedere a un registro di basso livello sul chip ESP8266 nel modo sbagliato (ho scritto erroneamente un valore NULL per il puntatore alla struttura).

La pedana che ho progettato e costruito. Quando ho scattato questa foto, aveva già resistito a cinque settimane di calpestio.
Ferramenta (pedane)
Per garantire che gli scudi potessero sopravvivere alle dure condizioni della mensa, ho stabilito i seguenti requisiti:
- Gli scudi devono essere sufficientemente resistenti da sostenere il peso umano in ogni momento.
- Gli scudi devono essere sottili per non intralciare le persone in coda.
- L'interruttore deve essere attivato quando viene premuto.
- Gli scudi devono essere impermeabili. La sala da pranzo è sempre umida.
Per soddisfare queste esigenze, ho optato per un design con una struttura a due strati: acrilico tagliato al laser per la base e il coperchio superiore e sughero come strato protettivo.
Ho realizzato un modello dello scudo in AutoCAD; le dimensioni sono 400 per 400 millimetri.

A sinistra il progetto entrato in produzione. A destra la versione con connessione tipo Lego.
A proposito, ho finito per abbandonare il progetto corretto perché con un tale sistema di fissaggio si è scoperto che tra gli scudi dovevano esserci 40 centimetri, il che significava che non potevo coprire la distanza richiesta (più di dieci metri).


Per collegare tutti gli interruttori ho utilizzato fili smaltati, per un totale di oltre 70 metri! Ho posizionato un interruttore a membrana al centro di ogni pannello. Due morsetti sporgevano dalle fessure laterali, a sinistra e a destra dell'interruttore.
Beh, per l'impermeabilizzazione ho usato del nastro isolante. Tanto nastro isolante.
E tutto ha funzionato!
Il periodo dal 5 novembre al 12 dicembre

Foto del sistema: qui sono visibili tutti e cinque gli scudi. L'elettronica si trova a sinistra (D1-mini / Bluetooth / RTC).
Il 5 novembre alle 8 del mattino (ora di colazione) il sistema ha iniziato a raccogliere dati aggiornati sulla situazione in mensa. Non potevo credere ai miei occhi. Solo due mesi fa stavo abbozzando lo schema generale, seduto a casa in pigiama, ed ecco fatto, l'intero sistema funziona senza intoppi... o forse no.
Bug del software durante i test
Naturalmente, il sistema aveva la sua dose di bug. Ecco quelli che mi sono rimasti impressi.
Il programma non verificava la disponibilità di hotspot Wi-Fi durante il tentativo di connessione di un client all'API ThingSpeak. Per correggere l'errore, ho aggiunto un ulteriore passaggio per verificare la disponibilità del Wi-Fi.
Nella funzione di configurazione, continuavo a chiamare "WiFi.begin" finché non si stabiliva una connessione. In seguito ho scoperto che la connessione viene stabilita dal firmware ESP8266 e la funzione begin viene utilizzata solo durante la configurazione del Wi-Fi. Ho risolto il problema chiamando la funzione una sola volta, durante la configurazione.
Ho scoperto che l'interfaccia a riga di comando che avevo creato (progettata per impostare l'ora e modificare le impostazioni di rete) non funzionava quando era inattiva (ad esempio, al di fuori dell'orario di colazione, pranzo, cena e spuntino). Ho anche scoperto che quando non c'era alcun logging in corso, il ciclo interno accelerava troppo e i dati seriali venivano letti troppo velocemente. Quindi ho impostato un ritardo in modo che il sistema attendesse i comandi aggiuntivi quando erano previsti.
Ode al cane da guardia
Ah, e un'altra cosa sul problema del watchdog timer: l'ho risolto in fase di test sul campo. Non ho pensato ad altro per quattro giorni. Ogni pausa di dieci minuti correvo in mensa solo per provare la nuova versione del codice. E quando la distribuzione è stata aperta, sono rimasto seduto per terra per un'ora intera cercando di individuare il bug. Non ho nemmeno pensato al cibo! Grazie per tutto il bel lavoro, watchdog timer ESP8266!
Come ho capito WDT

Il frammento di codice con cui avevo difficoltà
Ho trovato un programma, o meglio un'estensione per Arduino, che analizza la struttura dei dati software quando si verifica un reset Wdt, facendo riferimento al file ELF del codice compilato (correlazioni tra funzioni e puntatori). Fatto questo, ho scoperto che l'errore può essere eliminato come segue:

Oh merda! Chi avrebbe mai pensato che correggere i bug in un sistema in tempo reale fosse così difficile! Comunque, ho corretto il bug, e si è rivelato un bug stupido. A causa della mia inesperienza, ho scritto un ciclo while che ha superato i limiti dell'array. Uff! (index++ e ++index sono due cose molto diverse).

Problemi hardware durante i test
Naturalmente, l'equipaggiamento, ovvero le pedane, era tutt'altro che ideale. Come previsto, uno degli interruttori si inceppò.

Il 7 novembre, durante la pausa pranzo, l'interruttore del terzo pannello si è inceppato.
Qui sopra c'è uno screenshot di un grafico online di ThingSpeak. Come potete vedere, intorno alle 12:25 è successo qualcosa che ha causato il guasto dello scudo numero tre. Di conseguenza, la lunghezza della coda è stata segnalata come 3 (il valore è 3 * 100), anche se in realtà non ha raggiunto lo scudo numero tre. La soluzione è stata aggiungere più spazio (sì, nastro isolante) per dare più spazio allo switch.
A volte il mio sistema veniva letteralmente sradicato quando un cavo rimaneva impigliato in una porta. Carrelli e pacchi venivano spinti attraverso la porta della mensa, quindi il sistema trascinava con sé il cavo mentre si chiudeva, strappandolo dalla sua presa. In questi casi, notavo un'improvvisa interruzione nel flusso dati e immaginavo che il sistema fosse stato scollegato dalla fonte di alimentazione.
Diffondere informazioni sul sistema in tutta la scuola
Come accennato, ho utilizzato l'API ThingSpeak, che visualizza i dati sul sito sotto forma di grafici, il che è molto comodo. In pratica, ho semplicemente pubblicato un link al mio grafico sul gruppo Facebook della scuola (ho passato mezz'ora a cercare questo post e non l'ho trovato, molto strano). Ho però trovato un post sul mio gruppo, la comunità scolastica, del 2017 novembre XNUMX:


La reazione è stata tempestosa!
Li ho pubblicati per suscitare interesse nel mio progetto. Ma anche solo guardarli è piuttosto divertente. Ad esempio, qui si può vedere chiaramente che il numero di persone è aumentato vertiginosamente al minuto 6:02 ed è praticamente sceso a zero al minuto 6:10.

Qui sopra ho allegato un paio di grafici relativi all'orario del pranzo e della merenda. È interessante notare che il picco di congestione durante il pranzo si verificava quasi sempre alle 12:25 (la coda raggiungeva il quinto tabellone). E per la merenda, la folla non è affatto tipica (la coda è lunga al massimo un tabellone).
Sapete qual è la cosa divertente? Questo sistema è ancora attivo (https://thingspeak.com/channels/346781)! Ho effettuato l'accesso all'account che usavo prima e ho visto questo:

Nel grafico qui sopra, ho visto che l'afflusso di persone il 3 dicembre è stato significativamente inferiore. E non sorprende: era domenica. In questo giorno, quasi tutti vanno da qualche parte, perché nella maggior parte dei casi, è solo di domenica che si può uscire dal cortile della scuola. È chiaro che non vedrete anima viva in mensa durante il giorno libero.
Come ho vinto il primo premio del Ministero dell'Istruzione coreano per il mio progetto
Come potete vedere, non ho lavorato a questo progetto perché volevo vincere premi o riconoscimenti. Volevo solo mettere a frutto le mie competenze per risolvere un problema cronico che affrontavo a scuola.
Tuttavia, la nutrizionista della nostra scuola, la Sig.ra O, con cui ero diventata molto amica durante la pianificazione e lo sviluppo del mio progetto, una volta mi chiese se fossi a conoscenza del concorso di idee per la mensa. All'epoca, pensai che fosse un'idea un po' strana quella di partecipare a un concorso per idee per la mensa. Ma lessi l'opuscolo informativo e scoprii che la scadenza per la presentazione delle candidature era il 24 novembre! Oddio! Rifinii rapidamente il concept, i dati e i grafici e inviai la mia candidatura.
Modifiche all'idea originale del concorso
A proposito, il sistema che ho elaborato alla fine era un po' diverso da quello già implementato. In pratica, ho adattato il mio metodo originale (misurare la lunghezza della coda in tempo reale) a scuole coreane molto più grandi. Per fare un paragone, la nostra scuola ha trecento studenti, mentre altre scuole ne hanno altrettanti in una sola classe! Dovevo capire come adattare il sistema alle esigenze di tutti.
Così ho elaborato un concetto più manuale. Ora, le scuole coreane hanno una routine per i pasti che viene rigorosamente rispettata per tutte le classi, quindi ho creato un altro schema segnale-risposta. In questo caso, quando il gruppo davanti a te raggiungeva una certa lunghezza della fila (cioè la fila era corta), ti inviavano manualmente un segnale tramite un pulsante o un interruttore a parete. Il segnale veniva trasmesso allo schermo del televisore o alle luci a LED.
Volevo solo risolvere un problema che si stava verificando in tutte le scuole del paese. Mi sono convinto ancora di più della mia intenzione quando ho sentito una storia dalla Sig.ra O. – ve la racconto ora. A quanto pare, in alcune scuole grandi la fila si estende oltre la mensa, a venti o trenta metri di distanza, anche d'inverno, perché nessuno riesce a organizzare il processo in modo adeguato. E a volte capita che per diversi minuti nessuno si presenti in mensa – e anche questo è un problema. Nelle scuole con un gran numero di studenti, il personale ha a malapena il tempo di servire tutti, anche se non si spreca nemmeno un minuto del tempo assegnato al pasto. Pertanto, coloro che arrivano per ultimi alla distribuzione (di solito si tratta di studenti delle scuole elementari) semplicemente non hanno abbastanza tempo per mangiare.
Quindi, anche se ho dovuto inviare la mia app in fretta, ho comunque pensato molto attentamente a come adattarla per un uso più ampio.
Un messaggio che mi informa che ho vinto il primo premio!
Per farla breve, sono stato invitato a presentare il mio progetto a funzionari governativi. Così ho messo a frutto tutte le mie capacità con PowerPoint, sono venuto e ho presentato!

Inizio della presentazione (estrema sinistra – ministro)
È stata un'esperienza interessante: ho appena inventato qualcosa per un problema in mensa e, in qualche modo, sono riuscito a vincere il concorso. Anche stando sul palco, continuavo a pensare: "Hmm, cosa ci faccio qui?". Ma nel complesso, questo progetto mi è stato molto utile: ho imparato molto sullo sviluppo di sistemi embedded e sull'implementazione di progetti nella vita reale. E, naturalmente, ho vinto un premio.
conclusione
C'è un po' di ironia in tutto questo: non importa a quanti concorsi e fiere scientifiche mi sia iscritto di proposito, non ne è venuto fuori nulla di buono. E invece l'opportunità mi ha semplicemente trovato e ha dato buoni risultati.
Questo mi ha fatto riflettere sui motivi che mi motivano ad accettare progetti. Inizio un progetto per "vincere" o per risolvere un problema reale nel mondo che mi circonda? Se è la seconda ipotesi, vi incoraggio vivamente a perseverare. Con questo approccio, potrete trovare opportunità inaspettate lungo il percorso e non sentirete la pressione di dover vincere: la vostra passione sarà la vostra principale motivazione.
E, cosa più importante: se riesci a implementare una soluzione decente, potrai testarla immediatamente nel mondo reale. Nel mio caso, la piattaforma era una scuola, ma col tempo l'esperienza si accumula e chissà, forse la tua applicazione verrà utilizzata da un intero Paese o addirittura dal mondo intero.
Ogni volta che ripenso a questa esperienza, mi sento persino un po' orgoglioso di me stesso. Non so spiegare perché, ma il processo di implementazione del progetto mi ha semplicemente portato grande piacere, e il premio è stato un ulteriore bonus. Inoltre, ero contento di essere riuscito a risolvere un problema per i miei compagni di classe che stava rovinando loro la vita ogni giorno. Un giorno, uno degli studenti si è avvicinato a me e mi ha detto: "Il tuo sistema è molto comodo". Ero al settimo cielo!
Penso che anche senza premi sarei orgoglioso del mio percorso di crescita, anche solo per questo. Forse è stato aiutare gli altri a darmi tanta soddisfazione... comunque, adoro i progetti.
Cosa speravo di ottenere con questo articolo
Spero che alla fine di questo articolo siate stati ispirati a fare qualcosa che possa essere utile alla vostra comunità o anche solo a voi stessi. Vi incoraggio a usare le vostre competenze (la programmazione è sicuramente una di queste, ma ce ne sono altre) per cambiare in meglio la realtà che vi circonda. Vi assicuro che l'esperienza che acquisirete in questo processo sarà ineguagliabile.
Può anche aprire strade che non ti saresti mai aspettato, come è successo a me. Quindi, per favore, fai ciò che ami e lascia il segno nel mondo! L'eco di una singola voce può scuotere il mondo, quindi credi in te stesso.
Ecco alcuni link relativi al progetto:
- )
- sulle risorse di notizie
Fonte: habr.com
