Sommario:

Task Manager: un sistema di gestione delle faccende domestiche: 5 passaggi (con immagini)
Task Manager: un sistema di gestione delle faccende domestiche: 5 passaggi (con immagini)

Video: Task Manager: un sistema di gestione delle faccende domestiche: 5 passaggi (con immagini)

Video: Task Manager: un sistema di gestione delle faccende domestiche: 5 passaggi (con immagini)
Video: Rendere i prodotti ed i processi di produzione green attraverso l'uso della simulazione 2024, Luglio
Anonim
Task Manager: un sistema di gestione delle faccende domestiche
Task Manager: un sistema di gestione delle faccende domestiche
Task Manager: un sistema di gestione delle faccende domestiche
Task Manager: un sistema di gestione delle faccende domestiche

Volevo provare ad affrontare un problema reale affrontato nella nostra famiglia (e, immagino, quello di molti altri lettori), ovvero come allocare, motivare e premiare i miei figli per aver aiutato con le faccende domestiche.

Finora abbiamo tenuto un foglio laminato di carta A4 attaccato al lato del frigorifero. Ha una griglia di compiti stampati su di esso, con associati importi di paghetta che potrebbero essere guadagnati per il completamento di tale compito. L'idea è che ogni volta che uno dei nostri ragazzi aiuta con un lavoretto, ottenga un segno di spunta in quella casella e, alla fine di ogni settimana, facciamo la somma dei soldi guadagnati, puliamo la lavagna e ricominciamo. Tuttavia, l'elenco delle attività è obsoleto e difficile da modificare, a volte non ci ricordiamo di pulire la lavagna ogni settimana e alcune attività devono essere eseguite con frequenze diverse - alcune idealmente dovrebbero essere eseguite ogni giorno, mentre altri potrebbero essere solo una volta al mese. Quindi, ho iniziato a creare un dispositivo basato su Arduino per affrontare questi problemi: la mia intenzione era quella di creare qualcosa che consentisse una facile aggiunta/rimozione/aggiornamento delle attività, un meccanismo semplificato per la registrazione quando un'attività era stata eseguita e l'assegnazione del credito al persona appropriata e un modo per tenere traccia dei diversi orari e della frequenza con cui devono essere eseguite le diverse attività ed evidenziare le attività scadute. E questo istruibile mostrerà come è uscito il dispositivo "Task Manager" risultante.

Passaggio 1: hardware

Hardware
Hardware
Hardware
Hardware

Il progetto si avvale di diversi componenti hardware ben utilizzati e documentati:

  • Arduino UNO/Nano - questo è il "cervello" del sistema. La memoria EEPROM integrata verrà utilizzata per salvare lo stato delle attività anche quando il sistema è spento. Per facilitare il cablaggio, ho montato il Nano su una schermatura a vite, ma se preferisci puoi saldare o utilizzare connessioni crimpate ai pin GPIO.
  • Modulo Real-Time Clock (RTC) - utilizzato per registrare il timestamp in cui sono state eseguite le attività e, confrontando l'ultima volta con l'ora corrente, determinare quali attività sono scadute. Si noti che l'unità che ho ricevuto è stata progettata per essere utilizzata con una batteria LiPo ricaricabile (LIR2032). Tuttavia, sto usando una batteria CR2032 non ricaricabile, quindi avevo bisogno di apportare alcune modifiche per disabilitare il circuito di ricarica (non vuoi provare a ricaricare una batteria non ricaricabile, o potresti affrontare un'esplosione…). Nello specifico, ho rimosso i resistori R4, R5 e R6 e il diodo contrassegnato D1. Ho quindi creato un ponte di saldatura per cortocircuitare dove era stato R6. Questi cambiamenti sono illustrati nella foto qui sotto.
  • Lettore RFID ISO14443 + un tag per utente: per "gamificare" il sistema, ognuno dei miei figli ha il proprio tag RFID unico. La selezione di un'attività e quindi lo scorrimento del tag sul lettore sarà il meccanismo utilizzato per contrassegnare un'attività come completata
  • Display LCD 16x2 - utilizzato per fornire l'interfaccia utente al sistema. Utilizzando una scheda che ha uno zaino PCF8574A integrato, la scheda può essere collegata tramite un'interfaccia I2C ad Arduino, il che semplifica notevolmente il cablaggio.
  • Encoder rotativo: sarà la manopola di controllo principale che gli utenti gireranno per selezionare le diverse attività disponibili
  • Connettori Wago: questi connettori a scatto sono un modo conveniente per collegare i componenti o creare semplici bus per diversi moduli che richiedono ciascuno una messa a terra comune o un'alimentazione a 5 V.

Passaggio 2: cablaggio

Cablaggio
Cablaggio

Il display LCD 16x2 e l'RTC DS1307 utilizzano entrambi un'interfaccia I2C, il che è conveniente in quanto rende il cablaggio molto più semplice, richiedendo solo una coppia di fili che vanno ai pin A4 (SDA) e A5 (SCL) dell'Arduino

Il lettore RFID MFRC-522 utilizza un'interfaccia SPI, che utilizza pin hardware fissi 11 (MOSI), 12 (MISO) e 13 (SCK). Richiede anche una linea di selezione e ripristino dello slave, che ho assegnato rispettivamente ai pin 10 e 9

L'encoder rotativo richiede una coppia di pin. Per prestazioni ottimali, è meglio se questi pin possono gestire gli interrupt esterni, quindi sto usando i pin digitali 2 e 3. Puoi anche fare clic sull'encoder come interruttore e l'ho collegato al pin 4. Anche se non lo è attualmente utilizzato nel codice, potresti trovarlo utile per aggiungere funzionalità aggiuntive

Per comodità, sto usando i blocchi connettore della serie WAGO 222. Questi sono connettori a scatto che forniscono un modo robusto e semplice di collegare tra 2 e 8 fili insieme e sono molto convenienti per i progetti Arduino che richiedono diversi moduli per condividere una linea di terra o 5V, o dove si hanno più dispositivi sul stesso bus I2C o SPI, diciamo

Il diagramma illustra come tutto è collegato insieme.

Passaggio 3: costruzione

Ho creato una custodia stampata in 3D molto semplice per ospitare l'elettronica. Ho posizionato dei magneti sul retro in modo che l'unità potesse essere fissata sul lato del frigorifero, proprio come era l'elenco stampato precedente. Ho anche lasciato esposta la presa USB, poiché sarebbe stata utilizzata se fosse necessario aggiungere nuove attività al sistema o per accedere e scaricare una serie di dati che mostrano le attività completate, ecc.

Non ho salvato i file STL dopo la stampa, ma ci sono molti casi simili (e probabilmente migliori!) disponibili su thingiverse.com. In alternativa, potresti costruire una bella scatola di legno, o semplicemente usare una vecchia scatola di cartone o un contenitore tupperware per alloggiare l'elettronica.

Passaggio 4: codice

Codice
Codice

Il codice completamente commentato è allegato come download di seguito. Ecco alcuni dei punti più importanti da notare:

Ho creato una struttura personalizzata, "attività", che è un'unità di dati che incapsula tutte le proprietà di un'attività in una singola entità. Le attività consistono in un nome, che sarà come appariranno sul display LCD (e quindi limitate a 16 caratteri), la frequenza con cui devono essere eseguite e quando e da chi sono state completate l'ultima volta

struttura compito {

char nomeattività[16]; // Il nome breve e "amichevole" per questa attività come apparirà sul display int repeatEachXDays; // Regolarità, in giorni, con cui si ripete questo compito. 1=Giornaliero, 7=Settimanale ecc. unsigned long lastCompletedTime; // Timestamp in cui questa attività è stata completata l'ultima volta int lastCompletedBy; // ID dell'ultima persona che ha completato questa attività };

La struttura dati principale si chiama "taskList", che è semplicemente un array di attività separate. Puoi definire le attività che desideri qui, che vengono inizializzate con un valore 0 per l'ora in cui sono state completate l'ultima volta e -1 per l'ID dell'utente che le ha eseguite per ultimo

task taskList[numTasks] = {

{ "Pulisci macchina", 7, 0, -1 }, { "Cambia lenzuola", 14, 0, -1}, { "Taglia il prato", 7, 0, -1 }, { "Aspira", 3, 0, -1 }, { "Cane da passeggio", 1, 0, -1 }, { "Camere in ordine", 7, 0, -1 }, { "Piante acquatiche", 2, 0, -1 }, { "Al piano di sopra WC", 7, 0, -1}, { "WC/scale", 7, 0, -1 }, { "Aspirapolvere", 3, 0, -1 }, { "Doccia pulita", 7, 0, -1 }, };

Nella sezione delle costanti nella parte superiore del codice, c'è un singolo valore di byte chiamato "eepromSignature". Questo valore viene utilizzato per determinare se i dati memorizzati su EEPROM sono validi. Se modifichi la struttura dell'elemento taskList, aggiungendo o rimuovendo attività o aggiungendo campi aggiuntivi, ad esempio, dovresti aumentare questo valore. Puoi pensarlo come un sistema di numerazione della versione di base per i dati

const byte eepromSignature = 1;

All'avvio, il programma tenterà di caricare i dati memorizzati in EEPROM solo se corrisponde alla firma dei dati definita nel codice.

void restoreFromEEPROM() {

int checkByte = EEPROM.read(0); if(checkByte == eepromSignature) { EEPROM.get(1, taskList); } }

Il display LCD e il modulo RTC utilizzano un'interfaccia I2C per comunicare con Arduino. Ciò richiede che ogni dispositivo abbia un indirizzo I2C univoco. Ho provato un paio di diverse schede display 16x2 e alcune sembrano utilizzare l'indirizzo 0x27, mentre altre schede apparentemente identiche usano 0x3f. Se trovi che il tuo display mostra solo una serie di quadrati e nessun testo, prova a cambiare il valore dell'indirizzo definito nel codice qui:

LiquidCrystal_PCF8574 lcd(0x27);

Quando viene rilevato un tag RFID, il codice legge l'identificatore a 4 byte e lo utilizza per cercare l'utente corrispondente dalla tabella degli utenti noti. Se il tag non viene riconosciuto, l'identificatore a 4 byte verrà inviato alla console del monitor seriale:

int GetUserFromRFIDTag(byte RFID){

for(int i=0; i<numutenti; {<numutenti; i++) { if(memcmp(userList.rfidUID, RFID, sizeof userList.rfidUID) == 0) { return userList.userID; } } Serial.print(F("Rilevata scheda RFID sconosciuta: ")); for(byte i=0; i<4; i++) { Serial.print(RFID<0x10 ? " 0": " "); Serial.print(RFID, HEX); } restituisce -1; }

Per assegnare un tag a un utente, è necessario copiare l'ID visualizzato e inserire il valore a 4 byte nell'array degli utenti nella parte superiore del codice, accanto all'utente corrispondente:

const user userList[numUsers] = { { 1, "Ginny", {0x00, 0x00, 0x00, 0x00}}, { 2, "Harry", {0x12, 0x34, 0x56, 0x78}}, { 3, "Ron", {0xE8, 0x06, 0xC2, 0x49}}, { 4, "Hermione", {0x12, 0x34, 0x56, 0x78}}, { 5, "Alastair", {0x12, 0x34, 0x56, 0x78}}, };

Passaggio 5: utilizzo

utilizzo
utilizzo
utilizzo
utilizzo

Se sei arrivato fino a questo punto, l'utilizzo del sistema dovrebbe essere abbastanza implicito dal codice; in qualsiasi momento, gli utenti possono ruotare la manopola per scorrere l'elenco delle attività disponibili. Le faccende che sono scadute sono contrassegnate da un asterisco dopo il titolo.

Dopo aver selezionato un compito da svolgere, gli utenti possono quindi scansionare il proprio telecomando RFID unico attraverso il lettore per contrassegnare l'attività come completata. Il loro ID e l'ora corrente verranno registrati e salvati nella EEPROM di Arduino.

Per impostare prima i tag RFID corretti, è necessario eseguire lo sketch con il monitor seriale Arduino collegato. Scansionare ogni tag e prendere nota del valore UID esadecimale a 4 byte visualizzato sul monitor seriale. Quindi modificare l'elenco utenti dichiarato nella parte superiore del codice per assegnare questo ID tag all'utente appropriato.

Ho preso in considerazione l'aggiunta di funzionalità per stampare un rapporto che mostra tutte le attività completate, dall'utente, durante l'ultima settimana al fine di assegnare ogni settimana la paghetta appropriata. Tuttavia, guarda caso, i miei figli sembrano essere soddisfatti della novità di utilizzare il sistema per essersi completamente dimenticati della paghetta! Questa sarebbe comunque un'aggiunta abbastanza semplice e viene lasciata come esercizio per il lettore:)

Consigliato: