Aller au contenu

Boite de médicament électrique

Pendant une période de maladie, il peut être embêtant de se souvenir de la dernière prise d’un médicament et donc de respecter les intervalles entre les prises. Pour des médicaments à prise fixe, il est facile d’oublier de les prendre.
L’objectif est donc de créer une boîte de médicaments permettant de résoudre ces deux problèmes.
La boîte doit pouvoir aider le patient à respecter les délais entre chaque prise de médicament, ainsi qu’à prendre ses médicaments à l’heure.

Fonctionnalités

La boîte comporte les fonctionnalités suivantes :

  • Un espace pour stocker les plaquettes
  • Des boutons pour naviguer dans le menu
  • La possibilité de voir l’heure de la prochaine prise
  • La possibilité d’enregistrer une prise et de définir le délai avant la suivante
  • Une autonomie suffisante

Composants et matériels

  • Mini D1 ESP32 : un microcontrôleur qui envoie, traite et reçoit les données. C’est le « CPU » de notre boîte à médicaments. Nous l’avons choisi pour sa petite taille, ce qui constitue une contrainte importante pour un design compact.
  • Boutons (x3) : ils permettent de naviguer dans le menu via le microcontrôleur.
  • Module horloge (DS3231) : permet de suivre le temps et sert de minuteur.
  • Écran e-ink : affiche le menu, l’heure de la dernière prise et celle de la prochaine.
  • Buzzer : sonne lorsqu’il est temps de prendre le médicament.
  • Imprimante 3D : utilisée pour fabriquer la structure de la boîte.

Les différents aspects du projet

Notre projet se divise en 2 parties: une partie mécanique et une partie électronique et informatique.

Partie mécanique:

Cette partie prend notamment en charge la fermeture et l’ouverture du couvercle (de type coulissant), ainsi que l’intégration de la plaquette de médicaments et des composants électroniques.

La structure de la boîte est entièrement en plastique, choisi pour sa rigidité et la précision qu’offre l’impression 3D, ce qui permet d’obtenir une bonne qualité de finition.

  • La boîte est divisée en deux compartiments distincts : un compartiment destiné aux plaquettes de médicaments, pouvant contenir jusqu’à deux plaquettes standards (11 × 5 × 0,5 cm), et un second compartiment dédié aux composants électroniques.
  • L’ouverture s’effectue grâce à une porte coulissante, conçue également pour permettre la détection de l’ouverture via un interrupteur à levier. Initialement, ce système devait permettre de couper l’alimentation lorsque la boîte est fermée, afin de réduire la consommation énergétique. Cependant, nous avons réussi à implémenter un mode veille du microcontrôleur, ce qui répond déjà à cet objectif. Néanmoins, la détection mécanique de l’ouverture reste pertinente pour l’ajout de fonctionnalités futures.

La boîte a été conçue pour être facile à utiliser, notamment par des personnes âgées. Le choix d’un mécanisme coulissant permet une ouverture simple, nécessitant peu d’effort.

Cependant, la boîte pourrait être optimisée en termes de dimensions. Nous rencontrons actuellement des contraintes liées au nombre de fils : l’écran e-ink étant équipé de connecteurs femelles, il ne peut pas être relié directement au microcontrôleur, qui possède également des connecteurs femelles. Nous avons donc utilisé des fils intermédiaires, ce qui a doublé le câblage et augmenté l’encombrement global de la boîte.

Partie électronique et informatique

L’électronique de ce projet est plutôt simple : chaque élément nécessaire est branché sur la carte.
Néanmoins, tout le fonctionnement de l’électronique est défini par le code.

Explication du code:

Le code est en C++ et utilise fortement le paradigme orienté objet.
Il est divisé en quatre grandes parties :

  • État de la boite
  • Affichage
  • Logique de gestion des entrées
  • Logique de gestion de veille
État de la boite:
  • box.cpp / box.hpp : gestion de la mise à jour de l’état de la boîte.
  • box_state.cpp / box_state.hpp : état de la boîte. Gère l’état de tous les compartiments de la boîte.
  • compartment_state.cpp / compartment_state.hpp : état d’un compartiment de la boîte.
  • time.cpp / time.hpp : classe permettant la gestion du temps et des heures.
Affichage:
  • screen.cpp / screen.hpp : classe permettant l’abstraction de l’API de l’écran.
  • flat_menu.cpp / flat_menu.hpp : affichage du menu.
  • uitext.cpp / uitext.hpp : abstraction permettant d’afficher du texte.
  • uimessage.cpp / uimessage.hpp : passerelle entre l’affichage et l’état de la boîte.
Gestion des entrées:
  • input_type.hpp : définition des différents types d’entrée.
  • input_manager.cpp / input_manager.hpp : déclaration et gestion de l’ensemble des boutons. Réception des entrées via les boutons.
  • button.cpp / button.hpp: Abstaction pour l’utilisation des bouttons.
Gestion de veille:
  • power_manager.cpp / power_manager.hpp : permet de configurer les boutons autorisés à réveiller la carte. Gère le timer d’inactivité et la logique de mise en veille.

Basse consommation

Un point mis à l’honneur dans ce projet est la basse consommation. Afin de concevoir un objet disposant de la meilleure autonomie possible, nous avons utilisé plusieurs éléments :

  • Veille profonde automatique :
    Un avantage de l’ESP32 est la possibilité de le mettre en veille profonde. Notre objet ne nécessite pas une interaction constante, donc nous souhaitons utiliser cette fonctionnalité lorsqu’il n’y a pas d’interaction, c’est-à-dire 99 % du temps.
    Lorsque l’ESP32 est en veille prolongée, il consomme entre 10 et 20 µA*, alors qu’il consomme entre 80 et 200 mA lorsqu’il est actif.
    Afin de profiter au maximum de la veille prolongée, nous avons mis en place un système de timer. Ce timer compte le temps écoulé depuis la dernière interaction utilisateur. Si la dernière interaction date de plus d’une minute, la carte passe automatiquement en veille profonde.
  • Interruptions :
    Afin de réveiller la carte uniquement lorsque cela est nécessaire, nous utilisons des interruptions. Lorsque la carte est en veille et qu’un bouton est appuyé, une interruption est déclenchée et la carte se réveille. Une autre interruption réveille également la carte lorsqu’il est l’heure de prendre un médicament.
  • Écran e-ink :
    Cet écran, qui consomme très peu lors de l’utilisation, peut être mis en veille, ce qui permet de conserver le dernier affichage sans consommation supplémentaire.
  • Boutons :
    Une amélioration simple pour réduire la consommation consiste à utiliser des boutons en mode pull-down. Cela signifie que la carte détecte l’état du bouton uniquement lorsque le courant passe. Ainsi, comme le courant ne circule que lorsque le bouton est appuyé, la consommation est réduite.
  • Fréquence du CPU :
    La charge de calcul de notre boîte étant très faible, il est possible de réduire la fréquence du CPU de 240 MHz à 80 MHz. Il est estimé que ce changement de fréquence permet de diviser par deux voire trois* la consommation globale de la carte.
  • Désactivation du Wi-Fi et du Bluetooth :
    Il s’agit d’une amélioration sans compromis. Ni le Wi-Fi ni le Bluetooth ne sont utilisés dans ce projet, leur désactivation permet donc un gain important lorsque la carte est active. La désactivation du Wi-Fi permet une réduction de 50 à 100 mA*. Celle du Bluetooth entraîne une réduction de 10 à 30 mA*.

*Nous tenons à préciser qu’il s’agit de valeurs de référence et non de valeurs que nous avons pu constater nous-mêmes.

DIY

La totalité de ce projet est publique. La liste des composants nécessaire est disponible plus hauts.

Schéma électronique du projet:

Tableau de branchement:

Comment installer le projet ?

  • Brancher l’ESP32, l’écran e-ink, le module horloge, le buzzer et les boutons en suivant les tableaux de branchement ci-dessus.
  • Connecter l’ESP32 via un câble USB-C et s’assurer que tous les modules partagent une masse et une alimentation communes.
  • Récupérer le code source sur GitHub (à faire).
  • Ouvrir le code dans Arduino IDE, puis :
    • sélectionner la carte ESP32 Dev Module,
    • choisir le port correspondant au câble USB.
  • Uploader le programme et tester la navigation sur l’écran à l’aide des boutons.

Points d’amélioration

Dans la perspective d’une reprise de ce projet, nous proposons plusieurs axes d’amélioration :

  • Fonctionnement sur batterie :
    Malheureusement, nous n’avons pas eu la possibilité de faire fonctionner notre boîte sur batterie. Une bonne base a toutefois été mise en place afin de réduire au maximum la consommation, ce qui permettrait une autonomie optimale lors de cette amélioration.
  • Amélioration de la boîte :
    Le design de la boîte laisse clairement à désirer. Nous n’avions pas anticipé un nombre de branchements aussi important. De ce fait, nous avons dû conserver un ESP32 de taille conséquente plutôt que de passer à un modèle plus compact, comme par exemple l’ESP32 S3 Zero.
  • Commande par application mobile :
    Il est clair que les boutons ne sont pas pratiques pour la navigation dans le menu. Une piste d’amélioration serait donc de développer une application permettant les mêmes fonctionnalités que l’interface à boutons.
  • Augmentation du nombre de compartiments :
    Il serait possible d’augmenter le nombre de compartiments et de configurer un compte à rebours ou des rappels pour chacun d’entre eux.
  • Unité centrale et compartiments indépendants :
    Il semble intéressant de séparer une unité centrale (microcontrôleur, buzzer, horloge) des compartiments. Cela permettrait de concevoir un module unique adaptable à différents types de boîtes. On pourrait ainsi créer des versions avec plus ou moins de compartiments, de tailles différentes, etc.
  • Automatisation depuis une ordonnance :
    En lien avec l’application mobile, il serait intéressant de pouvoir entrer son ordonnance et de laisser la boîte se configurer automatiquement en conséquence.