ShIoTiny: um relógio sem mola ou em tempo real e como trabalhar com ele



Sobre o que é este artigo

Continuamos a série de artigos sobre ShIoTiny - um controlador visualmente programável baseado no chip ESP8266 .

Este artigo fala sobre o relógio em tempo real no controlador ShIoTiny , sincronização de horário e o uso de nós para trabalhar com o relógio.

Site do Projeto ShIoTiny

Artigos anteriores da série.

ShIoTiny: pequena automação, a Internet das coisas ou "seis meses antes das férias"

ShIoTiny: nós, links e eventos ou recursos de programas de desenho

ShIoTiny: ventilação em salas úmidas (exemplo de projeto)

ShIoTiny e o mundo ao redor: conectando sensores a entradas binárias, rejeição de contato e outros problemas

ShIoTiny e o mundo: sensores analógicos ou ADCs para os menores

Firmware binário, circuitos do controlador e documentação

Entrada


Hoje falamos sobre tempo. Não é sobre o tempo, no sentido em que os filósofos discutem sobre isso há séculos e a extremidade não é visível para esse debate. E sobre a hora que vemos no relógio e de acordo com a qual vamos trabalhar, ir à escola ou às pressas em um encontro.

O problema é que o relógio não volátil em tempo real no chip ESP8266 e no controlador ShIoTiny estão ausentes. Esta lesão no nascimento do controlador ShIoTiny é inteiramente minha culpa. Mas o que foi feito está feito.

Assim que o firmware viu a luz, o público, indignado com a minha atitude em tempo real, começou a cutucar meu nariz com essa falha.

Como os erros precisam ser corrigidos e, desta vez, pelo menos não com sangue, fui encontrar o número cada vez maior de usuários do meu firmware e fiz o que pude. Nomeadamente, adicionei nós ao firmware do controlador ShIoTiny que tornam mais ou menos conveniente trabalhar com isso em tempo real.

Sobre o ShIoTiny Watch


Como já mencionado, não há "horas com bateria" no ShIoTiny . Mas, ao mesmo tempo, a contagem regressiva de segundos a partir de 1º de janeiro de 1970 é implementada.

É o mesmo horário chamado UNIX-time, armazenado em variáveis ​​do tipo time_t nas linguagens C / C ++ e que deve terminar em 19 de janeiro de 2038 em sistemas de 32 bits.

Mas não tenha medo. Acho que até 2038 todos terão tempo para fazer o time_t digitar 64 bits e o problema será resolvido nos próximos 292 bilhões de anos. Bem, há outra coisa que vamos apresentar.

Observe que às vezes o tempo no formato time_t é chamado (também no meu artigo) - carimbo de data / hora ou, em russo, carimbo de data / hora .

Mas voltando ao nosso controlador. Portanto, há um relógio nele, mas esse relógio é redefinido para 0 após desligar a energia. Isso leva à conclusão trivial de que o principal problema da contagem do tempo no controlador ShIoTiny é a necessidade de sincronizar o relógio do controlador quando a energia é ligada. O resto são problemas puramente técnicos.

Sincronização de tempo


Uma maneira estabelecida há muito tempo de sincronizar o tempo na Internet são os servidores NTP . E a primeira idéia foi criar um nó que sincronize o tempo com um determinado servidor NTP .

Mas, respirando um pouco de ar fresco e ponderando minha abóbora, percebi que essa abordagem é ideologicamente errada.

Não é fato que o usuário queira retirar o controlador com o firmware ShIoTiny na Internet. E o tempo para sincronização pode ser enviado não apenas do servidor NTP , mas também via multicast UDP ou com uma qualidade de conexão conhecida - via MQTT .

Portanto, foi tomada uma decisão fatídica - separar os nós para receber a hora do servidor NTP e definir a hora do sistema.

No total, dois nós foram desenvolvidos para sincronização de horário: o nó para receber horário do servidor NTP NTP Time



e Nó de Instalação do Relógio do Sistema Set Time



O nó que recebe o tempo do servidor NTP como parâmetros recebe o nome ou o endereço IP do servidor NTP e, separado por vírgula, o período de tempo do servidor NTP em minutos. Por padrão, o tempo é solicitado no servidor NTP a cada 60 minutos ou 1 hora. Na saída, esse nó define 0 até que a hora seja sincronizada ou o registro de data e hora seja o resultado da última sincronização com o servidor.

O nó de instalação do relógio do sistema recebe um registro de data e hora como entrada e define o relógio do sistema de acordo com esta etiqueta.

O esquema mais simples para sincronizar o relógio do sistema com um servidor NTP é mostrado na figura.



O período de sincronização não está definido e é de 60 minutos por padrão. A figura mostra o carimbo de hora.

Observo que não pode haver mais de um nó para receber tempo de um servidor NTP e mais de um nó para definir o horário do sistema no esquema do programa.

Se você precisar de um esquema de sincronização exótico, poderá usar o UDP-multicast ou o MQTT . Os esquemas são completamente semelhantes.

Para sincronização UDP-multicast , aproximadamente o mesmo que na figura.



E para sincronização via MQTT (eu não aconselho, é claro, mas em casos extremos) - tal.



Espero que agora tudo esteja claro com a sincronização do relógio do sistema do controlador ShIoTIny . Vamos para os nós de tempo de recebimento e processamento.

Que horas são?


A pergunta é simples, mas às vezes não é fácil responder. Afinal, o tempo em todos os pontos da Terra é diferente. Nossa vasta pátria inclui de Kaliningrado a Kamchatka até 11 fusos horários.

O servidor NTP , dependendo das configurações, pode retornar um carimbo de data / hora associado a diferentes fusos horários. Normalmente, esse registro de data e hora está vinculado ao UTC - horário universal.

Mas geralmente precisamos da hora local da região onde nosso controlador trabalha. Como estar aqui?

E é muito simples - para obter o registro de data e hora do relógio do sistema do controlador ShIoTIny , o nó Get Time foi desenvolvido, no qual você pode definir o fuso horário como um horário de -12 horas a +12 horas em relação ao relógio do sistema do controlador.

Suponha que recebamos a hora do servidor pool.ntp.org e sincronizemos o relógio do sistema, como no exemplo anterior. Este servidor retorna o tempo universal. Precisamos de local, como Tomsk, como o meu. Eu sei que Tomsk está no fuso horário UTC + 7 . Então, vamos definir o tempo que recebe a unidade para compensar +7 ou apenas 7. Como na figura abaixo.



E se morássemos na província canadense de Alberta, o turno seria de -7 horas. Lembre-se do principal: o fuso horário é definido no nó para obter o tempo em horas . E é definido na forma de um deslocamento em relação à hora do relógio do sistema. O registro de data e hora é definido na saída da unidade receptora de tempo. Pode haver vários nós para obter tempo em um circuito.

Verifique o relógio


É muito conveniente para a máquina trabalhar com hora no formato de timestamps time_t . Afinal, este é apenas um número inteiro que mostra o número de segundos em relação ao ponto inicial - 1 de janeiro de 1970. Nesse formato, você pode encontrar facilmente a distância entre dois pontos no tempo, períodos de contagem e assim por diante. Esta é apenas a adição e subtração de números inteiros.

Mas o homem não é uma máquina. Ele se sente muito mais à vontade com a representação usual de tempo na forma de ano, mês, dia, horas, minutos e segundos. Então nós humanos estamos dispostos.

Portanto, foram introduzidos os nós da tradução do registro de data e hora nas unidades de tempo familiares à pessoa e vice-versa, a síntese do registro de data e hora a partir das unidades de mudança de tempo compreensíveis para a pessoa. Esses nós são chamados, respectivamente, Split Time e Synth Time .

Como tudo isso funciona está claro na figura abaixo.



Observo que os nós Split Time e Synth Time meses (mês) e dias da semana (wday) são contados a partir de zero. Durante meses: 0-janeiro, 11-dezembro. Para os dias da semana 0 a domingo, 6 a sábado.
Outras saídas: dia do mês (dia), ano (ano), hora (hora), min (minuto), seg (segundo) - são contadas da forma usual. Horas, minutos, segundos - de 0 a 59. Dia do mês - dependendo do mês do primeiro dia aos 30 ou 31 e, para fevereiro, aos 28 ou 29.
Bem, um ano - ele é o ano. 2019 agora.
Espero que esteja tudo claro.

Exemplo de sistema


Para não ser infundado, darei um exemplo do uso de relógios. Claro, simplificado.

Suponha que tenhamos uma sala úmida que queremos ventilar à força. Mas nem sempre, mas apenas quando a umidade é superior a um determinado nível e somente à noite. À noite - para não incomodar as pessoas durante o dia com o barulho dos fãs. Bem, aqui estamos nós e nos preocupamos com as pessoas.

Vamos tentar implementar isso.



Todas as partes do circuito são familiares para nós. A hora é sincronizada no servidor NTP . Enquanto não estiver sincronizado, o nó NTP Time retorna 0 e o relé de ativação do ventilador é desativado. Para isso, o elemento superior AND é responsável pelo esquema.

Depois que a hora é sincronizada, a ativação / desativação do ventilador é determinada pela hora atual e pelo nível de umidade. Assim que o nível de umidade exceder 70% e o tempo for das 23:00 às 06:00 , o ventilador liga e não ventila a sala.

Obviamente, é melhor substituir as constantes de tempo e umidade em um projeto real pelos parâmetros armazenados no FLASH e definir, por exemplo, de acordo com o MQTT . Sim, e o estado atual do sistema - nível de umidade, corrente, hora, status do ventilador - também não custa publicar na rede para controlar o sistema a partir de um smartphone. Mas isso já deixo espaço para sua imaginação.

Conclusão


Por isso, apresentamos nosso controlador em tempo real mais próximo.

Quero agradecer a todos que me enviaram cartas de críticas construtivas e conselhos sobre atualizações de software. Obrigado pessoal!

Como sempre - críticas construtivas são bem-vindas. Além disso, comentários e sugestões são bem-vindos.

Você pode enviar todas as críticas, comentários, sugestões, como de costume, em um comentário ou pelo correio: shiotiny@yandex.ru .

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


All Articles