ShIoTiny: une horloge sans ressort ni temps réel et comment travailler avec



De quoi parle cet article

Nous continuons la série d'articles sur ShIoTiny - un contrôleur visuellement programmable basé sur la puce ESP8266 .

Cet article parle de l'horloge en temps réel dans le contrôleur ShIoTiny , de la synchronisation de l'heure et de l'utilisation de nœuds pour travailler avec l'horloge.

Site du projet ShIoTiny

Articles précédents de la série.

ShIoTiny: petite automatisation, Internet des objets, ou «six mois avant les vacances»

ShIoTiny: nœuds, liens et événements ou caractéristiques des programmes de dessin

ShIoTiny: ventilation de pièce humide (exemple de projet)

ShIoTiny et le monde environnant: connexion de capteurs aux entrées binaires, rebond de contact et autres problèmes

ShIoTiny et le monde: capteurs analogiques ou ADC pour les plus petits

Micrologiciel binaire, circuits de contrĂ´leur et documentation

Entrée


Aujourd'hui, nous parlons du temps. Pas à propos du temps, dans le sens où les philosophes se disputent à ce sujet depuis des siècles et le bout du fil n'est pas visible dans ce débat. Et sur l'heure que nous voyons sur l'horloge et selon laquelle nous allons au travail, à l'école ou à la hâte sur une date.

Le fait est que l'horloge en temps réel non volatile de la puce ESP8266 et le contrôleur ShIoTiny sont manquants. Cette blessure à la naissance du contrôleur ShIoTiny est entièrement de ma faute. Mais ce qui a été fait est fait.

Dès que le firmware a vu le jour, le public, indigné par mon attitude en temps réel, a commencé à me taper le nez sur cette faille.

Comme les erreurs doivent être corrigées, et cette fois du moins pas avec du sang, je suis allé rencontrer le nombre toujours croissant d'utilisateurs de mon firmware et j'ai fait ce que j'ai pu. À savoir, j'ai ajouté des nœuds au firmware du contrôleur ShIoTiny qui le rendent plus ou moins pratique pour travailler avec cela en temps réel.

Ă€ propos de la montre ShIoTiny


Comme déjà mentionné, il n'y a pas «d'heures avec une batterie» dans ShIoTiny . Mais en même temps, le compte à rebours des secondes à partir du 1er janvier 1970 est mis en œuvre.

Il s'agit de la même heure appelée UNIX-time, stockée dans des variables de type time_t dans les langages C / C ++ et qui devrait se terminer le 19 janvier 2038 dans les systèmes 32 bits.

Mais n'ayez pas peur. Je pense que d'ici 2038, tout le monde aura le temps de faire le type time_t 64 bits et le problème sera résolu dans les 292 milliards d'années à venir. Eh bien, nous allons trouver autre chose.

Notez que l'heure au format time_t est parfois appelée (dans mon article aussi) - horodatage ou, en russe, horodatage .

Mais revenons à notre contrôleur. Donc, il y a une horloge, mais cette horloge est remise à 0 après avoir coupé l'alimentation. Cela conduit à la conclusion triviale que le principal problème du comptage du temps dans le contrôleur ShIoTiny est la nécessité de synchroniser l'horloge du contrôleur lorsque l'alimentation est allumée. Le reste est purement technique.

Synchronisation horaire


Les serveurs NTP constituent un moyen établi depuis longtemps de synchroniser l'heure sur Internet. Et la première idée était de créer un nœud qui synchronise l'heure avec un serveur NTP donné.

Mais, en respirant un peu d'air frais et en réfléchissant à ma citrouille, j'ai réalisé que cette approche était idéologiquement erronée.

Ce n'est pas un fait que l'utilisateur souhaite retirer le contrôleur avec le firmware ShIoTiny sur Internet. Et le temps de synchronisation peut être envoyé non seulement depuis le serveur NTP , mais également via la multidiffusion UDP, ou avec une qualité de connexion connue - via MQTT .

Par conséquent, une décision fatidique a été prise - séparer les nœuds pour recevoir l'heure du serveur NTP et régler l'heure du système.

Au total, deux nœuds ont été développés pour la synchronisation de l'heure: le nœud de réception de l'heure du serveur NTP NTP Time



et noeud d'installation de l'horloge système Set Time



Le nœud recevant l'heure du serveur NTP en tant que paramètres reçoit le nom ou l'adresse IP du serveur NTP et, séparés par une virgule, la période de temps du serveur NTP en minutes. Par défaut, l'heure est demandée au serveur NTP toutes les 60 minutes ou 1 heure. En sortie, ce noeud définit 0 jusqu'à ce que l'heure soit synchronisée ou que l'horodatage soit le résultat de la dernière synchronisation avec le serveur.

Le noeud d'installation d'horloge système reçoit un horodatage en entrée et règle l'horloge système conformément à cette étiquette.

Le schéma le plus simple pour synchroniser l'horloge système avec un serveur NTP est illustré dans la figure.



La période de synchronisation n'est pas définie et est de 60 minutes par défaut. La figure montre l'horodatage.

Je note qu'il ne peut y avoir plus d'un nœud pour recevoir l'heure d'un serveur NTP et plus d'un nœud pour régler l'heure système dans le schéma du programme.

Si vous avez besoin d'un schéma de synchronisation exotique, vous pouvez utiliser la multidiffusion UDP ou MQTT . Les schémas sont complètement similaires.

Pour la synchronisation UDP-multicast , approximativement la mĂŞme que sur la figure.



Et pour la synchronisation via MQTT (je ne conseille pas, bien sûr, mais dans les cas extrêmes) - tel.



J'espère que maintenant tout est clair avec la synchronisation de l'horloge système du contrôleur ShIoTIny . Passons aux nœuds de réception et de traitement.

Quelle heure est-il?


La question est simple, mais il n’est parfois pas facile de répondre. Après tout, le temps à chaque point de la Terre est différent. Notre vaste patrie comprend de Kaliningrad au Kamchatka jusqu'à 11 fuseaux horaires.

Le serveur NTP , selon les paramètres, peut renvoyer un horodatage associé à différents fuseaux horaires. En règle générale, cet horodatage est lié à UTC - heure universelle.

Mais généralement, nous avons besoin de l'heure locale de la région où travaille notre contrôleur. Comment être ici?

Et c'est très simple - pour obtenir l'horodatage de l'horloge système du contrôleur ShIoTIny , le nœud Get Time a été développé, dans lequel vous pouvez définir le fuseau horaire comme un décalage horaire de -12 heures à +12 heures par rapport à l'horloge système du contrôleur.

Supposons que nous obtenions l'heure du serveur pool.ntp.org et synchronisons l'horloge système, comme dans notre exemple précédent. Ce serveur renvoie l'heure universelle. Nous avons besoin de locaux, comme Tomsk, comme le mien. Je sais que Tomsk est dans le fuseau horaire UTC + 7 . Donc, définissons l'unité de réception de l'heure sur un décalage de +7 ou juste 7. Comme dans la figure ci-dessous.



Et si nous vivions dans la province canadienne de l'Alberta, le quart de travail serait de -7 heures. N'oubliez pas l'essentiel - le fuseau horaire est défini dans le nœud pour obtenir l'heure en heures . Et il est défini sous la forme d'un décalage par rapport à l'heure de l'horloge système. L'horodatage est réglé à la sortie de l'unité de réception de l'heure. Il peut y avoir plusieurs nœuds pour obtenir du temps sur un circuit.

Vérifiez l'horloge


Il est très pratique pour la machine de travailler avec l'heure au format d'horodatages time_t . Après tout, ce n'est qu'un entier qui indique le nombre de secondes par rapport au point de départ - 1er janvier 1970. Dans ce format, vous pouvez facilement trouver la distance entre deux points dans le temps, compter les périodes, etc. Ce n'est que l'addition et la soustraction d'entiers.

Mais l'homme n'est pas une machine. Il est beaucoup plus à l'aise avec la représentation habituelle du temps sous la forme d'une année, d'un mois, d'un jour, d'heures, de minutes et de secondes. Nous, les humains, sommes donc arrangés.

Par conséquent, les nœuds de la traduction de l'horodatage dans les unités de changement de temps familières à la personne ont été introduits, et vice versa, la synthèse de l'horodatage à partir des unités de changement de temps compréhensible pour la personne. Ces nœuds sont appelés respectivement Split Time et Synth Time .

Le fonctionnement de tout cela ressort clairement de la figure ci-dessous.



Je note que les nœuds Split Time et Synth Time mois (mois) et jours de la semaine (wday) sont comptés à partir de zéro. Pour les mois: 0-janvier, 11-décembre. Pour les jours de la semaine 0-dimanche, 6-samedi.
Autres sorties: jour du mois (jour), année (année), heure (heure), min (minute), sec (seconde) - sont comptées sous la forme habituelle. Heures, minutes, secondes - de 0 à 59. Jour du mois - selon le mois du premier jour au 30 ou 31 et, pour février, au 28 ou 29.
Eh bien, un an - il est l'année. 2019 maintenant.
J'espère que tout est clair.

Exemple de système


Afin de ne pas être infondé, je vais donner un exemple d'utilisation des montres. Bien sûr, simplifié.

Supposons que nous ayons une pièce humide que nous voulons ventiler de force. Mais pas toujours, mais seulement lorsque l'humidité est supérieure à un niveau donné et uniquement la nuit. La nuit - pour ne pas déranger les gens pendant la journée avec le bruit des ventilateurs. Eh bien, nous sommes ici des esthètes et nous nous soucions des gens.

Essayons d'implémenter cela.



Toutes les parties du circuit nous sont familières. L'heure est synchronisée à partir du serveur NTP . Bien qu'il ne soit pas synchronisé, le nœud de temps NTP renvoie 0 et le relais d'activation du ventilateur est désactivé. Pour cela, l'élément supérieur Et selon le schéma est responsable.

Une fois l'heure synchronisée, la mise en marche / arrêt du ventilateur est déterminée par l'heure actuelle et le niveau d'humidité. Dès que le taux d'humidité dépasse 70% et que l'heure est de 23h00 à 06h00 , le ventilateur se met en marche et ne ventile pas la pièce.

Bien sûr, il est préférable de remplacer les constantes de temps et d'humidité dans un projet réel par les paramètres stockés dans FLASH et définis, par exemple, selon MQTT . Oui, et l'état actuel du système - niveau d'humidité, courant, heure, état du ventilateur - ne fait pas de mal à publier sur le réseau pour contrôler le système à partir d'un smartphone. Mais déjà je laisse de la place à votre imagination.

Conclusion


Nous avons donc introduit notre contrôleur avec un temps réel plus proche.

Je tiens à remercier tous ceux qui m'ont envoyé des lettres de critiques constructives et des conseils sur les mises à niveau logicielles. Merci les gars!

Comme d'habitude, les critiques constructives sont les bienvenues. De plus, les commentaires et suggestions sont les bienvenus.

Vous pouvez envoyer toutes les critiques, commentaires, suggestions comme d'habitude dans un commentaire ou par mail: shiotiny@yandex.ru .

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


All Articles