De quoi parle cet articleNous 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 ShIoTinyArticles 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 dessinShIoTiny: 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èmesShIoTiny et le monde: capteurs analogiques ou ADC pour les plus petitsMicrologiciel binaire, circuits de contrôleur et documentationEntré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 .