Sobre o que é este artigoContinuamos 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 ShIoTinyArtigos 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 desenhoShIoTiny: 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 problemasShIoTiny e o mundo: sensores analógicos ou ADCs para os menoresFirmware binário, circuitos do controlador e documentaçãoEntrada
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 .