Horário de Verão Brasileiro

Escrevi um pequeno código para identificar e corrigir automaticamente o fuso horário de acordo com o horário de verão brasileiro. No meu caso eu utilizo para sincronizar o RTC com um servidor NTP.
Segue abaixo para quem se interessar.

int timeZone() {
  int previousSunday = day() - weekday();
  if (month() < 2 || month() > 10) return -2;
  else if (month() == 2 && previousSunday < 14) return -2;
  else if (month() == 10 && previousSunday >= 14) return -2;
  else return -3;
}

Bastante prático, mas está me gerando o seguinte erro:

C:\Users\Daniel\AppData\Local\Temp\arduino_modified_sketch_30943\relogio_digital_copia.ino: In function 'time_t getNtpTime()':

D:\Documents\Arduino\libraries\Time-master/TimeLib.h:68:40: error: invalid operands of types 'int()' and 'long unsigned int' to binary 'operator*'

 #define SECS_PER_HOUR ((time_t)(3600UL))

                                        ^

C:\Users\Daniel\AppData\Local\Temp\arduino_modified_sketch_30943\relogio_digital_copia.ino:873:56: note: in expansion of macro 'SECS_PER_HOUR'

       return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;

Alguma ideia de como contornar isso?

A memoria do Arduino e algo fragil... e fazer esses calculos todos encadeados nao me parece uma boa ideia.
Experimenta isto para comecar:

unsigned long adjustment = 0;

adjustment = SECS_PER_HOUR * timeZone;
adjustment = adjustment + 2208988800UL


return (secsSince1900 - adjustment);

Também uso a sincronização com o servidor NTP, e posso ter implementado errado. O que eu fiz foi remover a linha do const int timeZone no início do código para não dar confilto e colei o seu código. Fiz certo?

Sim… :o
Só que precisa declarar como uma função e colocar os parêntesis no call né. Pela mensagem de erro que você postou parece que estava sem os parêntesis…

time_t getNTP() {
  byte NTP_PORT = 123;
  byte packetLength = 0;
  unsigned long startMillis = 0;
  unsigned long secsSince1970 = 0;
  char timeServer[] = {"time.nist.gov"};
  byte packetBuffer[48] = {0b11100011, 0, 6, 0xEC, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0x4E, 49, 52};
  udp.begin(UDP_PORT);
  udp.beginPacket(timeServer, NTP_PORT);
  udp.write(packetBuffer, 48);
  udp.endPacket();
  startMillis = millis();
  while (millis() - startMillis <= 2500) {
    packetLength = udp.parsePacket();
    if (packetLength >= 48) {
      udp.read(packetBuffer, 48);
      secsSince1970 = (unsigned long)packetBuffer[40] << 24;
      secsSince1970 |= (unsigned long)packetBuffer[41] << 16;
      secsSince1970 |= (unsigned long)packetBuffer[42] << 8;
      secsSince1970 |= (unsigned long)packetBuffer[43];
      secsSince1970 = secsSince1970 - 2208988800UL + timeZone() * SECS_PER_HOUR;
      break;
    }
  }
  udp.stop();
  return secsSince1970;
}

int timeZone() {
  int previousSunday = day() - weekday();
  if (month() < 2 || month() > 10) return -2;
  else if (month() == 2 && previousSunday < 14) return -2;
  else if (month() == 10 && previousSunday >= 14) return -2;
  else return -3;
}

Verdade, esqueci os parêntesis na call. Agora funcionou :smiley:

Olá,

Eu montei um código, com ajuda de alguns sites da internet, e postei aqui:

Um usuário fez referencia a este post aqui, dizendo que é "fácil" calcular, mas eu estou com dúvida, o código leva em conta, os 'poréns' da regra?

Cito a regra:

– O início do horário de verão é no terceiro domingo de outubro, em determinados estados;
– O término ser dará no terceiro domingo de fevereiro do ano seguinte. PORÉM, CASO O MESMO COINCIDA COM O CARNAVAL, A TROCA SERÁ NO DOMINGO SEGUINTE.

o Carnaval, ...é regulado pelo calendário lunar.

Pra quem nunca se interessou em saber sobre o motivo da Semana Santa e do Carnaval ser em dias diferentes a cada ano, aí vai uma breve explicação:

O Domingo de Páscoa é sempre no primeiro domingo de lua cheia após o equinócio da primavera no hemisfério norte (21 de março). O Carnaval é o sétimo domingo antes dessa data.

Fonte: Algoritmo para Calcular o Período do Horário de Verão | Blog do Bettiol

Sim, eu que fiz esse código, e eu que comentei no seu outro post.

Faz algum tempo que fiz isso, e uso até hoje, nunca mais me preocupei com isso, fiz alguns testes para os próximo anos e estava batendo com as informações que achei na internet, ou seja, considerei todas essas particularidades.

Olá gostaria de salientar que houve mudança na regra do horário de verão brasileiro:

Início: primeiro domingo do mês de novembro,
Fim: terceiro domingo do mês de fevereiro (do ano seguinte, óbvio)

Sendo que durante o horário de verão, ele está com uma hora adiantada.

Decreto N° 9.242 de 15 de dezembro de 2017:
http://pcdsh01.on.br/DecHV9242_20171215.pdf

Desta forma, será necessário atualizar o código, que está obsoleto, não utilizem!