Table des matières:

Gestionnaire des tâches - un système de gestion des tâches ménagères : 5 étapes (avec photos)
Gestionnaire des tâches - un système de gestion des tâches ménagères : 5 étapes (avec photos)

Vidéo: Gestionnaire des tâches - un système de gestion des tâches ménagères : 5 étapes (avec photos)

Vidéo: Gestionnaire des tâches - un système de gestion des tâches ménagères : 5 étapes (avec photos)
Vidéo: Comment gérer ses tâches (Le manager organisé) 2024, Juillet
Anonim
Gestionnaire de tâches - un système de gestion des tâches ménagères
Gestionnaire de tâches - un système de gestion des tâches ménagères
Gestionnaire de tâches - un système de gestion des tâches ménagères
Gestionnaire de tâches - un système de gestion des tâches ménagères

Je voulais essayer d'aborder un vrai problème rencontré dans notre ménage (et, j'imagine, celui de beaucoup d'autres lecteurs), qui est de savoir comment répartir, motiver et récompenser mes enfants pour leur aide aux tâches ménagères.

Jusqu'à présent, nous avons conservé une feuille de papier A4 plastifiée collée sur le côté du réfrigérateur. Il y a une grille de tâches imprimée dessus, avec des montants d'argent de poche associés qui pourraient être gagnés pour accomplir cette tâche. L'idée est que chaque fois qu'un de nos enfants aide à une corvée, il coche cette case et, à la fin de chaque semaine, nous additionnons l'argent gagné, essuyons le tableau et recommençons. Cependant, la liste des tâches est obsolète et difficile à modifier, nous ne nous souvenons parfois pas de nettoyer le tableau chaque semaine, et certaines tâches doivent être effectuées à des fréquences différentes - certaines devraient idéalement être effectuées quotidiennement, alors que d'autres peuvent n'être qu'une fois par mois. J'ai donc commencé à créer un appareil basé sur Arduino pour résoudre ces problèmes - mon intention était de créer quelque chose qui permette d'ajouter/supprimer/mettre à jour facilement des tâches, un mécanisme simplifié pour enregistrer lorsqu'une tâche avait été effectuée et allouer du crédit au personne appropriée, et un moyen de garder une trace des différents horaires et de la fréquence avec laquelle différentes tâches doivent être effectuées, et de mettre en évidence les tâches en retard. Et cette instructable montrera comment le périphérique "Task Manager" résultant est sorti.

Étape 1: Matériel

Matériel
Matériel
Matériel
Matériel

Le projet utilise plusieurs composants matériels bien utilisés et documentés:

  • Arduino UNO/Nano - c'est le "cerveau" du système. La mémoire EEPROM intégrée sera utilisée pour enregistrer l'état des tâches même lorsque le système est hors tension. Pour faciliter le câblage, j'ai monté le Nano sur un blindage à vis, mais vous pouvez plutôt souder ou utiliser des connexions serties sur les broches GPIO si vous préférez.
  • Module d'horloge en temps réel (RTC) - utilisé pour enregistrer l'horodatage auquel les tâches ont été effectuées et, en comparant la dernière fois à l'heure actuelle, déterminer quelles tâches sont en retard. A noter que l'appareil que j'ai reçu a été conçu pour être utilisé avec une batterie LiPo rechargeable (LIR2032). Cependant, j'utilise une batterie CR2032 non rechargeable, j'ai donc dû faire quelques modifications pour désactiver le circuit de charge (vous ne voulez pas essayer de recharger une batterie non rechargeable, ou vous pourriez faire face à une explosion….). Plus précisément, j'ai supprimé les résistances R4, R5 et R6 et la diode marquée D1. J'ai ensuite créé un pont de soudure pour court-circuiter là où R6 avait été. Ces changements sont illustrés sur la photo ci-dessous.
  • Lecteur RFID ISO14443 + une étiquette par utilisateur - pour "gamifier" le système, chacun de mes enfants a sa propre étiquette RFID unique. Sélectionner une tâche, puis faire glisser son étiquette sur le lecteur sera le mécanisme utilisé pour marquer une tâche comme terminée
  • Écran LCD 16x2 - utilisé pour fournir l'interface utilisateur au système. En utilisant une carte dotée d'un sac à dos PCF8574A intégré, la carte peut être connectée via une interface I2C à l'Arduino, ce qui simplifie considérablement le câblage.
  • Encodeur rotatif - sera le bouton de commande principal que les utilisateurs tourneront pour sélectionner différentes tâches disponibles
  • Connecteurs Wago - ces connecteurs à fermeture rapide sont un moyen pratique de câbler des composants ensemble ou de créer des bus simples pour plusieurs modules qui nécessitent chacun une mise à la terre commune ou une alimentation 5 V.

Étape 2: Câblage

Câblage
Câblage

L'écran LCD 16x2 et le DS1307 RTC utilisent tous deux une interface I2C, ce qui est pratique car cela simplifie beaucoup le câblage, ne nécessitant qu'une paire de fils allant aux broches A4 (SDA) et A5 (SCL) de l'Arduino

Le lecteur RFID MFRC-522 utilise une interface SPI, qui utilise les broches matérielles fixes 11 (MOSI), 12 (MISO) et 13 (SCK). Il nécessite également une ligne de sélection et de réinitialisation d'esclave, que j'ai attribuée aux broches 10 et 9 respectivement

L'encodeur rotatif nécessite une paire de broches. Pour des performances optimales, il est préférable que ces broches puissent gérer les interruptions externes. J'utilise donc les broches numériques 2 et 3. Vous pouvez également cliquer sur l'encodeur en tant que commutateur, et je l'ai câblé à la broche 4. Même si ce n'est pas le cas actuellement utilisé dans le code, vous pourriez le trouver utile pour ajouter des fonctionnalités supplémentaires

Pour plus de commodité, j'utilise des blocs de connexion de la série WAGO 222. Ce sont des connecteurs à fermeture rapide qui offrent un moyen robuste et facile de connecter n'importe où entre 2 et 8 fils ensemble, et sont très pratiques pour les projets Arduino qui nécessitent plusieurs modules pour partager une ligne de terre ou 5V, ou lorsque vous avez plusieurs appareils sur le même bus I2C ou SPI, disons

Le schéma montre comment tout est câblé ensemble.

Étape 3: Construction

J'ai créé un boîtier imprimé en 3D très basique pour abriter l'électronique. J'ai placé des aimants à l'arrière afin que l'unité puisse être fixée sur le côté du réfrigérateur, tout comme l'était la liste imprimée précédente. J'ai également laissé la prise USB exposée, car elle serait utilisée si de nouvelles tâches devaient être ajoutées au système, ou pour se connecter et télécharger un ensemble de données montrant les tâches terminées, etc.

Je n'ai pas enregistré les fichiers STL après l'impression, mais il existe de nombreux cas similaires (et probablement meilleurs !) disponibles sur thingiverse.com. Alternativement, vous pouvez construire une jolie boîte en bois ou simplement utiliser une vieille boîte en carton ou un récipient en tupperware pour abriter l'électronique.

Étape 4: Coder

Code
Code

Le code entièrement commenté est joint en téléchargement ci-dessous. Voici quelques-uns des points les plus importants à noter:

J'ai créé une structure personnalisée, "task", qui est une unité de données qui encapsule toutes les propriétés d'une tâche dans une seule entité. Les tâches consistent en un nom, qui sera la façon dont elles apparaîtront sur l'écran LCD (et donc limitées à 16 caractères), la fréquence à laquelle elles doivent être exécutées, et quand et par qui elles ont été effectuées pour la dernière fois

tâche de structure {

char nom_tâche[16]; // Le nom court et "convivial" de cette tâche tel qu'il apparaîtra à l'écran int repeatEachXDays; // Régularité, en jours, avec laquelle cette tâche est répétée. 1=Quotidien, 7=Hebdomadaire etc. non signé long lastCompletedTime; // Horodatage de la dernière exécution de cette tâche int lastCompletedBy; // ID de la personne qui a terminé cette tâche en dernier };

La structure de données principale est appelée "taskList", qui est simplement un tableau de tâches distinctes. Vous pouvez définir ici les tâches que vous souhaitez, qui sont initialisées avec une valeur de 0 pour l'heure à laquelle elles ont été terminées pour la dernière fois, et -1 pour l'ID de l'utilisateur qui les a effectuées en dernier

tâche taskList[numTasks] = {

{ "Voiture propre", 7, 0, -1 }, { "Changer les feuilles", 14, 0, -1}, { "Tondre la pelouse", 7, 0, -1 }, { "Aspirer", 3, 0, -1 }, { "Promener le chien", 1, 0, -1 }, { "Chambres bien rangées", 7, 0, -1 }, { "Plantes aquatiques", 2, 0, -1 }, { "A l'étage toilettes", 7, 0, -1}, { "D/toilettes d'escalier", 7, 0, -1 }, { "Hoover", 3, 0, -1 }, { "Douche propre", 7, 0, -1 }, };

Dans la section des constantes en haut du code, il y a une valeur à un seul octet appelée "eepromSignature". Cette valeur est utilisée pour déterminer si les données stockées sur l'EEPROM sont valides. Si vous modifiez la structure de l'élément taskList, en ajoutant ou en supprimant des tâches, ou en ajoutant des champs supplémentaires, par exemple, vous devez incrémenter cette valeur. Vous pouvez le considérer comme un système de numérotation de version de base pour les données

octet const eepromSignature = 1;

Au démarrage, le programme ne tentera de charger les données stockées dans l'EEPROM que si elles correspondent à la signature des données définies dans le code.

void restoreFromEEPROM() {

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

L'écran LCD et le module RTC utilisent une interface I2C pour communiquer avec l'Arduino. Cela nécessite que chaque appareil ait une adresse I2C unique. J'ai essayé plusieurs cartes d'affichage 16x2, et certaines semblent utiliser l'adresse 0x27, tandis que d'autres, apparemment identiques, utilisent 0x3f. Si vous constatez que votre écran n'affiche qu'une série de carrés et aucun texte, essayez de modifier la valeur d'adresse définie dans le code ici:

LiquidCrystal_PCF8574 lcd (0x27);

Lorsqu'une étiquette RFID est détectée, le code lit l'identifiant à 4 octets et l'utilise pour tenter de rechercher l'utilisateur correspondant dans la table des utilisateurs connus. Si le tag n'est pas reconnu, l'identifiant de 4 octets sera envoyé à la console du moniteur série:

int GetUserFromRFIDTag(octet RFID){

for(int i=0; i<numusers; {<numUsers; i++) { if(memcmp(userList.rfidUID, RFID, sizeof userList.rfidUID) == 0) { return userList.userID; } } Serial.print(F("Carte RFID inconnue détectée: ")); for(byte i=0; i<4; i++) { Serial.print(RFID<0x10 ? " 0": " "); Serial.print(RFID, HEX); } retour -1; }

Afin d'attribuer une balise à un utilisateur, vous devez copier l'ID affiché et insérer la valeur de 4 octets dans le tableau des utilisateurs en haut du code, à côté de l'utilisateur correspondant:

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}}, };

Étape 5: Utilisation

Usage
Usage
Usage
Usage

Si vous êtes arrivé jusqu'ici, l'utilisation du système devrait être assez implicite à partir du code; à tout moment, l'utilisateur peut tourner le bouton rotatif pour faire défiler la liste des tâches disponibles. Les tâches en retard sont signalées par un astérisque après leur titre.

Après avoir sélectionné une tâche à effectuer, les utilisateurs peuvent ensuite numériser leur propre porte-clés RFID unique sur le lecteur pour marquer la tâche comme terminée. Leur identifiant et l'heure actuelle seront enregistrés et sauvegardés dans l'EEPROM de l'Arduino.

Afin de configurer d'abord les balises RFID correctes, vous devez exécuter le croquis avec le moniteur série Arduino connecté. Scannez chaque étiquette et notez la valeur UID hexadécimale à 4 octets affichée sur le moniteur série. Modifiez ensuite la liste d'utilisateurs déclarée en haut du code pour attribuer cet ID de balise à l'utilisateur approprié.

J'ai envisagé d'ajouter des fonctionnalités pour imprimer un rapport montrant toutes les tâches effectuées, par utilisateur, au cours de la dernière semaine afin d'allouer la récompense en argent de poche appropriée chaque semaine. Cependant, il se trouve que mes enfants semblent satisfaits de la nouveauté d'utiliser le système pour avoir complètement oublié les récompenses en argent de poche ! Ce serait un ajout assez simple cependant, et est laissé en exercice au lecteur:)

Conseillé: