Ingénierie des cadeaux



En dehors de la fenêtre il pleut, décembre est au calendrier. Le temps des vacances approche et donc celui des cadeaux. Le collègue Pavel veut un nouvel ordinateur portable pour lui-même, et sa petite amie Masha veut une maison au bord de la mer. Et malgré le salaire digne de la profession de programmeur tyzh, nous ne vivons pas dans un monde de possibilités infinies, ce qui signifie que je ne peux pas donner à ces gens exactement ce qu'ils veulent le plus (même si Pacha est peut-être mon meilleur Pavel, qui Je sais, mais Masha va très bien).

C'est là que le problème des «cadeaux bon marché» apparaît. Cela ne fonctionne pas de donner un cadeau cher à tout le monde, mais je ne veux pas donner une autre boîte de chocolats, une bougie ou une figurine indistincte. Vous devez donc combiner affaires et plaisir - j'aime faire les choses de mes propres mains, et le résultat est excellent comme cadeau. Ceci est une histoire sur la façon dont j'ai de nouveau prétendu être ingénieur et fabriqué plusieurs cadeaux à la main.

Une petite digression du sujet principal


Je ne peux pas aller directement au sujet principal, je vais donc partir de loin. Il y a quelques années, le jeu «The Witcher 3» est sorti. Mon ami m'a conseillé de jouer, et en général j'ai vraiment admiré le jeu. Ensuite, j'ai décidé quoi faire et lui donner quelque chose de thématique lié au jeu ... Je n'entrerai pas trop dans la description du jeu (Google aidera tout le monde) ou je dirais que peu de choses me sont venues à l'esprit pour les mots clés "The Witcher, Engineer, Gift".

Le personnage principal du jeu a un cheval nommé "Roach" (en voix russe), le héros la conduit de temps en temps avec la phrase "Move, Roach". J'ai décidé de fabriquer un jouet mécanique sur le thème des "cafards émouvants".

Naturellement, le cadeau a été conçu comme une chose complètement inutile, stupide mais drôle, donc le plan était le suivant:

  1. Il y a une boîte qui cache le mécanisme en soi.
  2. Le mécanisme est un arbre en rotation que le cheval déplace.
  3. La «ténacité» maximale du mouvement du cheval est la bienvenue. Au départ, on pensait même que le cheval devait se déplacer comme un poisson, et non comme un cheval (après tout, un gardon), mais le résultat était «quelque chose entre les deux».
  4. Tout cela sera fait à partir de contreplaqué, qui selon les dessins peut être coupé avec précision avec un laser.

Le principal inconvénient du choix du matériau et du fait que la découpe sera réalisée sur commande est le fait que j'ai perdu l'opportunité de créer un prototype, ce qui signifie que tous les problèmes de mains tordues et de non-respect de la règle des «sept fois la mesure» se sont fait sentir assez rapidement:



Bien qu'à la fin, le fait que de nombreux détails du mécanisme de jeu en raison de trop grands écarts aient aidé à compenser le fait que j'ai connecté les pièces et l'arbre de façon assez tordue. Ici, comme on dit, «moins moins donne plus» et le mécanisme dans son ensemble a fonctionné comme prévu:



Après il n'y avait plus qu'une petite peinture et le résultat était une telle boîte:



Ensuite, quelqu'un dira qu'il était nécessaire de rendre la boîte transparente pour qu'il soit possible d'observer le travail de l'intérieur, mais en fait j'ai d'abord pensé que je ne pouvais pas assembler l'ensemble du mécanisme et de la boîte si propre et soigneusement de l'intérieur qu'il ne ferait pas de mal regardez à travers les parois transparentes de la boîte. Par conséquent, une boîte opaque est une mesure nécessaire.

Il ne reste plus qu'à l'emballer, à nouer un noeud sur une boite et le cadeau est prêt:



Mais afin de ne pas déranger l'enfant intérieur, qui voulait se sentir comme un ingénieur dans une situation où en fait j'ai collé quelques morceaux de contreplaqué, j'ai décidé de faire un «dessin». Pardonnez-moi tous ceux qui comprennent quelque chose dans les dessins techniques, car Je comprends que c'est plus une parodie du dessin qu'un vrai dessin, mais comme il me semblait, il a ajouté de la valeur à un simple jouet:



Aujourd'hui, je ...


Parfois, le destin joue avec nous et laisse entendre que quelque chose devrait arriver bientôt. L'histoire d'un de mes appareils commence exactement de la même manière. J'ai commandé quelques petits appareils électroniques d'une valeur d'environ 5 $, qui, comme d'habitude, ont passé un mois sur la route, après quoi j'ai reçu un SMS que le colis m'attendait au bureau de poste local. La boîte s'est avérée beaucoup plus grande que ce à quoi je m'attendais et a immédiatement soulevé des doutes quant à son contenu. Les doutes ont été confirmés - à l'intérieur, en plus des petites choses que j'ai commandées, il y avait aussi un écran e-ink tricolore avec une diagonale de 4,2 pouces. J'ai contacté le vendeur, il a confirmé qu'il avait gâché quelque chose lors de l'emballage, mais a dit que je peux considérer cela comme un cadeau et l'utiliser comme bon me semble.

Le destin m'a laissé entendre que le moment était venu de commencer un nouveau projet et que ce projet sera quelque chose avec un affichage à encre électronique. Après m'être brièvement familiarisé avec les spécifications de l'appareil et connecté l'écran au contrôleur, je me suis assuré que les spécifications ne me mentaient pas sur le temps de mise à jour. L'écran a été mis à jour pendant plus de 10 secondes, clignotant et essayant de me provoquer une crise d'épilepsie:


(Je n'ai pas de premières photos de la connexion de l'écran, alors ici, l'appareil a déjà un look plus significatif)

Il est devenu clair que vous avez besoin d'un appareil simple qui ne nécessitera pas d'animations complexes (et des animations en général). Et puis je suis tombé sur un calendrier d'humeur:


Le calendrier de l'humeur est un ensemble d'images simples et de signatures ironiques. J'ai décidé que je ferais un calendrier (qui n'est en fait pas du tout un calendrier) avec le nom "Today I" ... Ce sera un appareil simple qui affiche chaque jour une image caractérisant "l'état d'esprit" aujourd'hui et une description de celui-ci. De plus, le calendrier pourrait également avoir d'autres fonctions, mais le calendrier principal serait précisément le «calendrier» - sa propre image pour chaque jour.

Le module papier électronique permettait d'afficher trois couleurs (noir, rouge et blanc), qui devaient être transmises au module, comme deux images - noir et blanc et rouge et blanc. En fait, il serait plus correct de dire que l'écran attend simplement un bitmap monochrome, où chaque bit détermine la couleur d'un pixel (je ne suis pas sûr que ce terme soit applicable au papier électronique, mais j'espère que l'idée est claire). Un bitmap séparé peut être défini pour le canal noir ou rouge. Ainsi, il y a un ensemble d'octets où chaque bit qui est mis à 1 correspondra à un pixel de couleur, et tous les bits qui restent 0 seront des pixels blancs à l'écran. La résolution d'écran est de 400 x 300 pixels, soit pour une image en noir et blanc, 15 000 octets seront nécessaires (8 pixels sont encodés dans un octet). Pour les trois couleurs, il faudra 30 000 octets, si vous n'essayez pas de compresser l'image de manière plus compacte. Du point de vue de la mise en œuvre, les créateurs de l'affichage pourraient simplement sélectionner deux bits par pixel et stocker l'état réel des choses (où est le rouge, où est le noir et où est le blanc), mais cela nécessiterait les mêmes 30000 octets, mais même pour les images monochromes nécessiterait le transfert de 30 000 octets.

Comme dans n'importe lequel de mes autres «métiers», j'ai commencé à m'inventer des tâches pour que tout ne se transforme pas en «brancher le câblage et télécharger la bibliothèque». Même si nous prenons en compte la possibilité d'implémenter une sorte d'algorithme de compression d'image du côté du contrôleur, il est devenu clair que sans un stockage externe pour les fichiers d'image, le contrôleur serait très déprimé. Il a été décidé de prendre une carte SD et d'écrire un simple wrapper de code pour travailler avec FAT32. Bien sûr, il serait possible de se passer d'un système de fichiers et d'écrire directement des données sur une carte mémoire, mais il me semblait que c'était moins pratique pour ajouter de nouveaux fichiers, et il était intéressant pour moi de mettre en œuvre les opérations de base pour travailler avec FAT32 de mes propres mains.

Il est important de préciser que j'ai l'habitude d'écrire des choses moi-même (vous ne devriez pas me dire qu'il y a une mer de bibliothèques, je connais et avec Google) quand je fais de telles choses Avant cela, je n'avais pas eu le plaisir de travailler avec FAT32 à un niveau bas, c'était un processus plutôt amusant.

Je n'entrerai pas dans les détails du travail avec FAT32 et la carte SD dans son ensemble, car Internet regorge d'articles sur ce sujet (et je ne veux pas transformer mon histoire en une nouvelle version des spécifications), mais je vais parler de certaines choses qui devaient être mises en œuvre. Il est nécessaire d'implémenter non seulement les fonctions de lecture d'un fichier et d'écriture dans un fichier (j'ai décidé de stocker certains paramètres et conditions sur la même carte SD, et non dans l'EEPROM), mais aussi les fonctions de recherche d'un fichier dans le système de fichiers si vous avez besoin de travailler avec de la manière habituelle.

Toutes les données de la carte mémoire sont divisées en grappes (l'unité adressable principale du système de fichiers FAT32) et les grappes sont déjà divisées en secteurs. Pour lire le fichier «habr.txt» de la carte SD en FAT32, vous avez besoin de:

  1. Initialisez la carte mémoire.
  2. Lisez le secteur à l'adresse zéro et vérifiez que le système de fichiers FAT32 a un certain en-tête (vous pouvez sauter cette étape si nous croyons en la chance).
  3. Lisez le secteur à l'adresse zéro et obtenez «Logical Block Addressing» (LBA).
  4. Lisez le secteur à l'adresse reçue (LBA) et obtenez-en les données nécessaires (quel cluster est la racine - le répertoire racine, combien de secteurs se trouvent dans le cluster, etc.).
  5. Lisez le cluster «Répertoire racine» (en fait, la lecture se fait par secteurs, il vous suffit de lire autant de secteurs qu'il y a de secteurs dans le cluster) par son numéro. Il a sa propre formule pour convertir les numéros de série du cluster en adresses physiques. Les informations sur les fichiers sont stockées ici, nous lisons donc les données à la recherche du fichier souhaité. Il y a une bagatelle de plus sur les noms de fichiers: le nom peut être court ou long, selon cela, les données sont stockées soit en un seul endroit (dans la même structure) soit dans un enregistrement supplémentaire, qui doit également être lu séparément. Lorsqu'un fichier portant le nom souhaité est trouvé, nous obtenons le cluster dans lequel se trouve son début (ou peut-être le fichier entier s'il tient dans la taille du cluster), ainsi que la taille du fichier. Si le fichier n'est pas trouvé dans ce cluster, nous recherchons le cluster suivant et répétons le processus de recherche de fichier.
  6. Lisez le cluster à l'adresse trouvée. Continuez à lire les clusters et recherchez le cluster suivant jusqu'à ce que toutes les données aient été lues.

Il me semble qu'il est plus facile de dire le principe du système de fichiers à ceux qui ont mis en place des listes chaînées au moins une fois, car en fait, le système de fichiers FAT32 est un ensemble de blocs de données et une sorte de tableau qui indique où chercher le prochain bloc de données. La lecture des données de FAT32 est un processus où nous lisons les données, recherchons l'adresse du bloc suivant, lisons les données, recherchons l'adresse du bloc suivant, etc.

Je n'ai pas implémenté tous les scénarios possibles et simplifié certaines choses:

  • Tous les fichiers sont à la racine de la carte mémoire et la navigation dans les répertoires n'est pas utilisée.
  • Tous les fichiers ont des noms courts.
  • Au démarrage, le contrôleur lit une liste de fichiers et les stocke en mémoire afin de ne pas rechercher à nouveau chaque fichier.
  • Le nombre maximum de fichiers est limité par une constante (et en fait je n'ai dessiné que quelques dizaines d'images).

En bref, tout ce qui précède est une raison convaincante de prendre une bibliothèque prête à l'emploi et de ne pas passer beaucoup de temps à lire la documentation, à développer et à déboguer. Je me conseillerais de mettre en œuvre de telles choses uniquement à des fins éducatives ou «pour le plaisir».

L'écran a également imposé certaines limitations, comme n'importe quelle image dessus est affichée de cette façon:

  1. Nous nous réveillons et initialisons l'écran (afin de prolonger sa durée de vie et d'économiser de l'énergie, l'écran dort essentiellement).
  2. Nous exposons le canal nécessaire (par exemple, noir).
  3. Nous transmettons 15 000 octets de l'image.
  4. Nous exposons le canal nécessaire (par exemple, rouge).
  5. Nous transmettons 15 000 octets de l'image.
  6. Nous disons à l'écran de tirer les données du tampon.
  7. Nous attendons que l'affichage ait fini de dessiner.
  8. Nous disons à l'écran de dormir.

Pour les images monochromes, vous pouvez ignorer les étapes 4 et 5. Pour une image en trois couleurs, l'ordre de transmission des images en noir et blanc et rouge-blanc n'est pas important, car le rouge est toujours peint sur le noir, le noir n'est que sur le blanc et seuls les pixels restent blancs, qui sont blanc et noir et blanc et rouge et blanc.

Pour plus de simplicité (afin de ne pas augmenter le nombre total de fichiers), j'ai décidé de stocker les images en noir et blanc et rouge-blanc en un seul fichier, où l'image en noir et blanc est immédiatement suivie de rouge-blanc:



Le résultat de la comparaison de ces images était quelque chose comme ça (il me semble que chacun de nous au moins une fois dans sa vie se sentait comme un cerf avec des cornes - une jambe):



En fait, les deux images ont été suivies d'une autre image qui contenait une description de l'état (en cliquant sur le bouton, vous pouvez obtenir une description qui correspond à l'image qui est affichée aujourd'hui).

En raison de la mémoire limitée du contrôleur, les données de la carte mémoire ne sont jamais lues entièrement dans la mémoire du contrôleur. L'image de la carte mémoire est lue en fragments qui sont déterminés par la taille du secteur (pour simplifier, nous supposons que cette taille est toujours statique et ne peut pas changer de carte en carte) et tombe dans le processus de traitement des données de la carte. Dans mon implémentation, la fonction de lecture d'un fichier prend en entrée le numéro de cluster, la taille du fichier et le rappel à "tirer" pour chaque secteur lu. Cette approche nous a permis d'utiliser plusieurs fonctions différentes de traitement de fichiers pour lire et afficher l'image elle-même ou sa description.

Ainsi, la logique suivante est tombée sur la fonction de rappel de lecture d'images à partir d'une carte mémoire:

  1. Définissez le canal requis (le canal est déterminé de manière aléatoire) avant d'envoyer des données à l'écran.
  2. Gardez une trace des données transmises pour changer de canal lorsque l'envoi des données pour le canal précédent est terminé.
  3. Envoyer les données reçues de la carte.
  4. Déterminez que les données nécessaires ont été transmises et que le reste des données (image avec description) peut être ignoré.

C'était compliqué par le fait que j'ai décidé de saisir des images contenant plus de données que ce qui devrait être affiché à l'écran. C'est-à-dire il y a une image, qui est l'arrière-plan et est toujours statique et correspond à la taille de l'écran, et il y a une image beaucoup plus grande à partir de laquelle vous devez prendre une zone aléatoire (la taille de l'écran) et l'afficher.

Une telle image imposait des exigences supplémentaires au gestionnaire - il était nécessaire de calculer combien d'octets de la ligne actuelle de l'écran ont été transférés, combien il fallait ajouter lors du prochain appel (si la ligne tombait à la frontière de la taille du secteur) et combien devaient être ignorés.

Visuellement, cette situation peut être montrée comme ceci:



Il y a un certain tampon dans lequel il y a une «fenêtre» de la taille requise (section verte) et il vous suffit de lire les données de cette fenêtre, en lisant les données du tampon en fragments de N octets. Il serait possible de visualiser un tel processus de lecture comme celui-ci:



En général, l'ajout de la logique de travail avec l'écran dans une fonction qui reçoit toujours un tampon de 512 octets et qui devrait déterminer lequel de ces 512 octets est nécessaire (si quelque chose est nécessaire) s'est avéré ne pas être une tâche aussi facile à résoudre «Sur le front». Plus précisément, la tâche n'était pas tellement compliquée que non standard par rapport aux solutions de tous les jours, donc, de façon surprenante, il était très intéressant de la résoudre. Pour moi, c'était comme une «tâche olympique», où il fallait calculer la quantité d'électricité nécessaire pour contracter les muscles afin de transférer l'eau d'un seau à l'autre avec deux cuillères (une cuillère dans chaque main).

Afin de mieux comprendre quelle est la difficulté ici, j'ajouterai une autre animation ici, uniquement «en termes de» le contenu du cluster, et non le fichier entier (toutes les autres informations doivent être stockées séparément):



Comme prévu, le calendrier devrait afficher une nouvelle image chaque jour, c'est-à-dire il doit pouvoir surveiller l'heure (même lorsqu'il est éteint), ce qui signifie qu'un module d'horloge en temps réel (RTC) est également nécessaire. Et malgré le fait que mon contrôleur dispose d'une horloge en temps réel intégrée, il est presque impossible de récupérer une batterie pour cela, car les contacts ne sont pas câblés à la carte. J'ai décidé de ne pas violer les jambes du contrôleur pour tenter de les souder et j'ai pris le RTC chinois externe. Travailler avec RTC était censé être complètement simple:

  • Une fois allumé, obtenez l'heure du RTC chinois.
  • Réglez l'heure en RTC interne.
  • Utilisez le RTC interne pour compter le temps et oublier les chinois jusqu'au prochain arrêt.

Mais ici, tout s'est avéré pas si simple, car le RTC interne du contrôleur fonctionne avec l'heure au format habituel (horodatage UNIX), et son ami chinois utilise le décimal codé binaire (BCD). Avant cela, je n'avais pas rencontré ce format et j'étais très surpris que même les modules modernes pour Arduino l'utilisent. L'essence du format est assez simple - il y a un octet, qui, par exemple, stocke le nombre de secondes. Les quatre bits de poids fort stockent des dizaines et les quatre bits de poids faible stockent des unités. Il s'avère que la représentation hexadécimale de cet octet lui-même contient un temps lisible - l'octet 0x49 correspond à une valeur de 49 secondes (bien que dans le système décimal, cet octet corresponde à 72).

Si je comprends bien, cela s'est produit si historiquement qu'il était plus facile d'utiliser RTC directement avec les encodeurs d'écran pour créer l'horloge, mais j'ai dû convertir le BDC en horodatage UNIX avec des stylos.

En plus de l'affichage, du module d'horloge en temps réel, de la carte mémoire et du système de fichiers pour cela, il était nécessaire d'envelopper tous ces presse-étoupe dans un boîtier, qui devait également être fabriqué, c'est-à-dire "Dessiner". Vous pouvez lire plus en détail sur toutes les douleurs que j'ai rencontrées dans ma dernière publication, tout était exactement le même ici:


(Je n'ai pas prévu de production de masse, tous les détails autour sont le résultat de mesures incorrectes ou de solutions mal pensées)

En conséquence, le boîtier et les détails nécessaires ont été dessinés (il n'y a pas de couverture sur l'image):



Les boutons ont été placés dans une pièce séparée pour faciliter l'assemblage (il semble que j'ai encore appris quelque chose du temps du dernier projet):



L'assemblage (à l'exception des couvertures avant et arrière) de l'appareil ressemble à ceci: l'



écran est attaché au boîtier avec des liens. Cela s'est avéré être une méthode beaucoup plus pratique que de la boulonner.

Eh bien, un petit enfer pour les perfectionnistes (une barbe de fils et de composants):



L'ensemble s'est avéré être un tel appareil, sur lequel j'ai fait un petit livre - instructions:



Le capot arrière est boulonné, ce qui vous permet de démonter l'appareil si une violence supplémentaire est requise sur son intérieur:



Oui, c'est plus facile d'acheter une maison en bord de mer!


Et puis quelqu'un qui a lu jusqu'ici dira: «Et est-ce une alternative aux cadeaux simples?! Oui, vous devez immédiatement investir 100 500 heures de votre temps, ce qui est beaucoup plus cher que l'argent! » Je ne discuterai pas de ce sujet, je dirai simplement que pour moi, c'est un processus méditatif et je tue deux oiseaux avec une pierre - d'une part, je fais des choses dont personne n'a besoin (peu me paieraient pour développer quelque chose tels), mais qui m'intéressent à faire, et une personne reçoit un objet unique en cadeau qui, bien qu'il ne porte pas une charge utile évidente, donne le sourire.

Cependant, pour qu'il n'y ait pas d'arrière-goût de solutions qui nécessitent beaucoup de temps, je vais partager quelques histoires plus courtes.

Maintenant, en général, il est devenu très à la mode d'imprimer des choses sur une imprimante 3D. Les appareils d'impression sont devenus beaucoup plus accessibles et le logiciel de création de modèles est assez simple à comprendre pour les enfants.

Crie à l'aide


Au travail, nous avons une blague sur le fait que si vous avez besoin d'aide, il vous suffit de crier la mouette et quelqu'un vous aidera certainement. En vérité, je ne sais pas à quoi elle est liée ni d'où vient cette blague, mais dans la correspondance interne des images de mouettes ont souvent commencé à apparaître, laissant entendre que quelqu'un avait besoin d'aide.

Cependant, le bureau de type ouvert et la modestie interne de certains collègues ne leur ont pas permis de profiter pleinement de la possibilité d'appeler à une telle aide. Ensuite, un «homme non ingénieur» a décidé de venir à la rescousse, prenant un «module de lecteur de musique MP3 pour Arduino» chinois chargé, un clone chinois d'Arduino Nano, quelques fils et quelques mp3 avec l'enregistrement des sons des goélands.

En général, il convient de noter ici que j'ai l'habitude de commander différents modules à rabais, ce qui, il me semble, peut être utile un jour, ou je reçois de tels appareils électroniques en cadeau d'amis / connaissances qui n'ont pas trouvé ces appareils électroniques utiles. Par conséquent, le mot «traîner» n'est pas accidentel, mais décrit très précisément l'état des choses.

Comme je suis une personne loin de la modélisation 3D, je viens de prendre un modèle tout prêt de la tête de la mouette et d'y apporter les modifications nécessaires. À savoir, à partir des changements, il était nécessaire:

  1. Séparez le bec de la tête pour imprimer le bec dans une couleur différente.
  2. Faites une «cavité» dans laquelle toute l'électronique se trouvera (haut-parleur, lecteur, arduino et fils).

Le résultat est quelque chose comme ça (le bec est divisé en deux parties pour une meilleure qualité d'impression):



je ne pense pas qu'il soit logique de parler du code, car en plus d'initialiser le lecteur, il n'y avait qu'un gestionnaire de clic de bouton et jouant l'un des enregistrements vocaux de mouette (en général: playSound (rand () & 3);).

Après cela, laissez simplement la mouette pour imprimer et collecter tout ensemble. En conséquence, nous avons un «simulateur de thé» à part entière (la couleur de la mouette est déterminée par le plastique qui était disponible), qui se connecte à l'USB et lorsque vous cliquez sur le bouton sur la tête de la mouette, il reproduit «l'appel à l'aide»:



Encore plus simple?


Une collègue s'est plainte d'avoir été constamment distraite pendant qu'elle passait des tests. Nous trouvons sur Internet un modèle 3D de lunettes et faisons de petits changements:



En conséquence, nous avons des lunettes - des oeillères. Nous ne sommes pas distraits par nous-mêmes et les autres comprennent que vous ne devriez pas être distrait:



Assez simple!


Donc, pour créer, vous avez besoin de:

  1. La possibilité de trouver ou de dessiner une béquille dans l'éditeur de vecteur.
  2. La possibilité de dessiner 2 cylindres dans l'éditeur 3D, l'un de plus que l'autre de ~ 0,4 mm.
  3. La possibilité de faire un simple morceau de papier - une étiquette.
  4. Imprimante 3D (votre propre service d'impression ou personnalisé).
  5. L'imprimante est ordinaire.

Et maintenant, dans l'ordre ... Nous dessinons une béquille:



Nous dessinons deux cylindres: Nous



imprimons les pièces et l'étiquette et obtenons un grand et simple cadeau pour "tyzhprogramistov":



C'était pour quoi tout ça?


«Parfois, le destin joue avec nous et laisse entendre que quelque chose devrait arriver bientôt.» Plusieurs fois dans ma vie, j'ai eu des idées que je voulais réaliser, mais j'ai attendu quelque chose. Je ne ferais pas de «calendrier» électronique si un écran gratuit ne venait pas de Chine, ce qui signifie que je ne traiterais pas de FAT32, je ne me renseignerais pas sur le format BCD utilisé dans RTC.

Peut-être que quelqu'un lira cette histoire (ou du moins regardera les photos) et pensera: "Merde, s'il pouvait le faire, alors je peux le faire encore mieux!" Et en conséquence, cela apportera de la joie à quelqu'un à proximité.

En dehors de la fenêtre il pleut, le calendrier est décembre. Le temps des vacances approche et donc celui des cadeaux. Faites et recevez des cadeaux intéressants, pas seulement une autre boîte de chocolats, une bougie ou une figurine.

Source: https://habr.com/ru/post/fr480792/


All Articles