Pointeuse Yoctopuce

Pointeuse Yoctopuce

Il y a quelque temps, la commission de l'inspection paritaire des entreprises du canton de Genève nous a mis en demeure de mettre en place un enregistrement des horaires de travail pour tout le personnel. Jusqu'à présent, Yoctopuce fonctionnait sur la base de la confiance, et cela n'avait jamais posé le moindre problème. Mais bon, la loi c'est la loi, on a été obligé d'obtempérer :( Alors, tant qu'à devoir enregistrer les heures de travail, autant le faire à la façon Yoctopuce :)


Détection de présences

Avant de trouver l'idée finale, nous avons réfléchi à plusieurs solutions, allant des plus simplistes aux plus farfelues.

  • Notre première idée a naturellement été de noter les heures d'arrivée et de départ dans un tableau Excel. Mais nous nous sommes vite rendu compte que pour un usage quotidien, cette solution n'était pas très efficace.
  • Nous avons ensuite envisagé d'implanter une puce RFID à tous les employés et d'installer une grande antenne RFID à l'entrée... Mais on n'était pas sur que tout le monde soit d'accord.
  • Nous avons également songé à utiliser les téléphones portables des employés. L'idée était simple : dès qu'un téléphone est connecté au WiFi du bureau, l'employé est considéré comme présent. D'un point de vue éthique cette fois-ci, forcer les employés à connecter leur téléphone personnel au wifi de l'entreprise n'était idéal.

Finalement, nous nous sommes dit que la solution la plus simple était sans doute de fabriquer une véritable pointeuse... avec des modules Yoctopuce !

Pointeuse Yoctopuce

Nous nous sommes bien évidemment inspirés des badgeuses que l'on peut trouver sur le marché, avec un lecteur de carte et un écran. Pour le lecteur de carte, nous utilisons un Yocto-RFID-15693, capable de lire des tags RFID. Pour l'affichage, nous avons choisi un Yocto-Display-ePaper-C associé à un écran SE2290KS0F1 de Pervasive Displays. Nous utilisons également le buzzer et la LED du Yocto-RFID-15693 pour signaler à l'utilisateur que son badge a bien été lu. Le tout est piloté à distance par l'intermédiare d'un YoctoHub-Wireless-n. Chaque employé dispose d'un tag RFID contenant son nom et son prénom.

Schéma des modules utilisés
Schéma des modules utilisés



Le boîtier, quant à lui, est composé de deux plaques de plexiglas découpées à la découpeuse laser, qui viennent habiller et protéger l'ensemble des modules. Les deux plaques de plexiglas sont maintenues par des entretoises.


  
Boîtier de la pointeuse



Le principe est assez simple : un programme tourne en permanence sur un serveur et traite chaque arrivée et chaque départ des employés lors du scan de leur tag RFID. Il calcule automatiquement le temps de présence ainsi que les éventuelles pauses. Pour chaque employé, il crée un fichier si celui-ci n'existe pas encore, puis le met à jour avec les heures d'arrivée et de départ, la durée des pauses ainsi que le temps total travaillé pour chaque journée. Il calcule également le temps de travail total de la semaine et affiche le tout sur l'écran ePaper.

Nous avons également implémenté un système d'alerte qui se déclenche lorsqu'un employé dépasse son temps de travail journalier ou hebdomadaire : sur l'écran ePaper, le temps dépassé est affiché en gras sur fond noir, tandis que la LED clignote en violet et le buzzer émet un son pour signaler l'alerte. Les alertes sont effacées dès que l'utilisateur badge à nouveau et est considéré comme parti. Nous avons aussi mis en place une fonction qui vérifie, en fin de journée, si tout le monde a bien badgé son départ ; si ce n'est pas le cas, la journée est automatiquement clôturée et un scan de départ est simulé pour les utilisateurs qui ont oublié de badger le leur.

Ecran ePaper + Led Alerte
Ecran ePaper + Led Alerte



Les informations sont enregistrées dans un fichier texte, à raison d'un fichier par employé. Chaque ligne correspond à une journée de travail et contient les différentes plages horaires, le temps de pause ainsi que le temps de travail total. En fin de semaine, le programme ajoute également un récapitulatif du temps total travaillé.

06.07.2026 : Jean Dubois - 07:00->12:30/13:30->16:00 / Total 08:30 | Break 01:00 07.07.2026 : Jean Dubois - 08:00->12:15/13:00->16:30 / Total 07:45 | Break 00:45 08.07.2026 : Jean Dubois - 07:55->12:15/12:45->17:00 / Total 08:35 | Break 00:30 09.07.2026 : Jean Dubois - 07:30->11:30/12:30->16:00 / Total 07:30 | Break 01:00 10.07.2026 : Jean Dubois - 07:55->12:00/13:00->17:00 / Total 08:05 | Break 01:00 11.07.2026 : Jean Dubois - Total 00:00 | Break 00:00 12.07.2026 : Jean Dubois - Total 00:00 | Break 00:00 -- Week 06.07 au 12.07 : Total 39:55


Le choix d'un simple fichier texte peut sembler surprenant, mais il présente plusieurs avantages : il est lisible sans outil particulier, facile à sauvegarder et suffisamment souple pour ce type d'application.

Fonctionnement du programme

Le fonctionnement de la pointeuse est relativement simple. Lorsqu'un badge est présenté devant le lecteur RFID, le programme lit directement le prénom et le nom stockés dans la mémoire du tag. Si c'est la première fois que cet employé est détecté depuis le démarrage du programme, son historique est automatiquement chargé depuis le fichier correspondant.

Une fois l'employé identifié, le programme détermine s'il s'agit d'une arrivée ou d'un départ. Pour cela, il suffit de regarder le dernier pointage enregistré : si le dernier évènement est un départ (ou s'il n'existe encore aucun pointage), un nouveau pointage d'arrivée est créé. Dans le cas contraire, le pointage en cours est simplement complété avec l'heure de départ.

static void TagDetect(YFunction fct, string txt)
{
   List<string> list = rfid.get_tagIdList();
     string prenom = rfid.tagReadStr(list[0], 0, 10, options, ref statut).Replace("\0", "").Trim();
     string nom = rfid.tagReadStr(list[0], 3, 10, options, ref statut).Replace("\0", "").Trim();
     string nomComplet = $"{prenom} {nom}".Trim();

     if (!presences.ContainsKey(nomComplet))
     {
         presences[nomComplet] = PresenceJournaliere.ChargerDepuisFichier(dossierLogs, prenom, nom);
     }

     var presence = presences[nomComplet];
     bool estArrive = presence.DernierEtatEstDepart();

     if (estArrive)
     {
         presence.PointerArrivee();
     }
     else
     {
         presence.PointerDepart();
   }
}



Chaque employé est représenté par une instance de la classe PresenceJournaliere, qui conserve l'ensemble des pointages de la journée. Plutôt que de stocker séparément les heures de travail et les pauses, chaque pointage est simplement représenté par un couple (Arrivée, Départ). Cette structure permet ensuite de calculer très facilement le temps de présence en additionnant les différentes périodes de travail, tandis que les pauses sont déduites automatiquement des intervalles entre un départ et l'arrivée suivante.

public DateTime DateDuJour { get; set; }
public string Prenom { get; set; }
public string Nom { get; set; }
public List<(DateTime? Arrivee, DateTime? Depart)> Pointages { get; set; }
public TimeSpan TotalSemaineBase { get; set; }

public PresenceJournaliere(string prenom, string nom)
{
    DateDuJour = DateTime.Today;
    Prenom = prenom;
    Nom = nom;
    Pointages = new List<(DateTime?, DateTime?)>();
    TotalSemaineBase = TimeSpan.Zero;
}



Après chaque pointage, le fichier de l'employé est immédiatement mis à jour avec les nouvelles informations. Le programme recalcule également le total hebdomadaire afin que les données restent toujours cohérentes, même si le programme est arrêté puis redémarré.

string lignePointages = string.Join(" / ", Pointages.Select(p =>
{
    string arrivee = p.Arrivee?.ToString("HH:mm") ?? "--:--";
    string depart = p.Depart?.ToString("HH:mm") ?? "...";
    return $"{arrivee} -> {depart}";
}));

string nouvelleLigne = $"{DateDuJour:dd/MM/yyyy} : {Prenom} {Nom} - {lignePointages}" +
                       $" / Total {totalTravail:hh\:mm}" +
                       $" | Pause {(int)totalPause.TotalHours:00}:{totalPause.Minutes:00}";



Enfin, le buzzer et la LED du Yocto-RFID-15693 fournissent un retour immédiat à l'utilisateur pour confirmer que son badge a bien été pris en compte, tandis que l'écran ePaper est rafraîchi afin d'afficher les temps de présence mis à jour de tous les employés.


  
Notification de d'arrivée et de départ



Notez que l'employé n'a pas forcément besoin d'un vrai badge RFID qu'il risque d'oublier à la maison une fois sur deux. Une étiquette RFID collée au dos de son téléphone fonctionne tout aussi bien.

Conclusion

Au final, notre pointeuse maison remplit parfaitement son rôle : un simple passage de badge devant le Yocto-RFID-15693 suffit pour enregistrer une arrivée ou un départ, avec un retour sonore et lumineux immédiat, et un affichage clair des heures cumulées sur l'écran ePaper. Le tout tient dans un boîtier compact, entièrement construit avec des modules Yoctopuce.

Pointeuse Yoctopuce
Pointeuse Yoctopuce



Et le plus important : nos fichiers texte, aussi simples soient-ils, contiennent toutes les informations demandées par la commission de l'inspection paritaire des entreprises: heures d'arrivée, de départ, pauses et totaux journaliers et hebdomadaires, de quoi satisfaire pleinement leurs exigences de cette commission qui n'a, au demeurant, jamais pris la peine ni de venir nous voir, ni même de nous parler... Mais on est resté fidèle à l'esprit Yoctopuce : une solution simple, transparente et faite maison.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.