



Em várias ocasiões é necessário ter o horário em que o Sol nasce/se põe, seja para uma estação meteorológica ou mesmo para controle de gerenciamento de energia solar.
Neste post, iremos detalhar como fazer o cálculo para descobrir o horário em que o Sol nasce e se põe utilizando-se de fórmulas de astronomia para calcular a duração do dia, que será necessária para obter os horários, os quais ainda precisarão passar por correção de longitude, através de outra fórmula.
Para obtenção destes dados, se fará uso de um Módulo GPS NEO-6M com Antena que fornece, além de outros dados, a hora UTC da posição atual (horas / minutos / segundos / segundos decimais), a latitude e a longitude.
O sistema será controlado pelo microcontrolador integrado ESP32, que irá efetuar os cálculos com os dados e também exibirá o resultado (horários de nascimento/poente do Sol) em um display Display OLED 128x64 0.96" I2C - Azul/Amarelo.

Para este post, foi utilizado:
Para um entendimento completo das fórmulas astronômicas e dos sistema para cálculo, se faz necessário saber alguns conceitos.
A latitude tem seu ponto de origem na Linha do Equador (0°). A medida de distância da Latitude é, usualmente, em graus (°), partindo do "ponto zero" (Linha do Equador) até o paralelo de um determinado ponto. A distância é em graus pois se mede o ângulo formado partindo-se do ponto central da esfera da Terra até o paralelo do referido ponto.
Esta medida de distância varia de 0° a 90° (um dos polos geográficos da Terra: Sul ou Norte). Também deve-se indicar a posição do ponto da Latitude no hemisfério, o qual pode ser sul (S [Sul ou South]) ou norte (N [Norte ou North]).
A longitude tem seu "ponto zero" no Meridiano de Greenwich (0°). A medida de distância da Longitude, usualmente, também é em graus (°), partindo do ponto de origem (Meridiano de Greenwich) até o meridiano de um determinado local. A distância é em graus pois se mede o ângulo formado partindo-se do ponto central da esfera da Terra até o meridiano do referido ponto.
Esta medida de distância varia de 0° a 180° (Antimeridiano: Linha Internacional de Data). Também deve-se indicar a posição do ponto da Longitude no hemisfério, o qual pode ser oeste (O [Oeste] ou W [West]) ou leste (L [Leste] ou E [East]).
Existem vários modos para designar uma localização exata em qualquer ponto na superfície do globo terrestre. Aqui estão alguns:
fazendo o desdobramento do cálculo:
temos, como resultado que 1° é equivalente à 111.13294 km. Transformando o grau para minuto,
e transformando o resultado em km para metros,
temos que um minuto (') equivale a 1852.21 m. Ao transformar o minuto para segundo,
temos que um segundo (") equivale a 30.87 m. Já para a latitude, há um valor específico para cada posição, que aumenta de, 0 na Linha do Equador, até aos Polos, onde está o seu valor máximo (90° de amplitude do ângulo).
Exemplo - Latitude seguida de Longitude:
temos que cada fuso possui 15° de largura longitudinal. Isto significa que a cada hora que se passa, a Terra se desloca 15°. No meridiano de Greenwich, o fuso horário é 0. A partir deste meridiano, em sentido Leste, o fuso soma-se em 1 hora (+1, +2, +3...+12) a cada 15° até o meridiano 180°E (também chamado 180°W: Antimeridiano). No sentido Oeste, o fuso subtrai-se em 1 hora (-1, -2, -3...-12) a cada 15° até o meridiano 180°W (também chamado 180°E: Antimeridiano).
Este valor, 23°27', é equivalente a 23.45°. A declinação solar varia entre +23°27' (quando o sol está no Hemisfério Norte) e - 23°27' (quando o sol está no Hemisfério Sul). Para um determinado observador, dependendo do hemisfério ao qual se encontra, pode ser Solstício ou Equinócio.
Observador no Hemisfério Sul
Para calcular o horário do nascer e do poente, é necessário seguir alguns passos:
onde,
onde,
onde,
onde,
onde,
Latitude em Graus-Decimal resulta em -23.5503944;
Longitude em Graus-Decimal resulta em -46.63395833;
Ao já sabermos o dia do ano, 213 (para 1 de agosto de 2021), poderemos aplicar a fórmula:
a qual resulta 17.91318808° de declinação.
e obtemos o resultado de 10.91981912 horas de luz solar.
que resulta em 6.54009044.
Também fazemos o cálculo para descobrirmos o horário de poente do sol, que ainda está no formato Graus-Decimal:
que resulta em 17.45990956.
Sabendo o meridiano do fuso, devemos calcular a diferença de fusos (dF):
Como a localização da longitude (-46.63395833) de São Paulo não está exatamente sobre o meridiano do fuso horário local (-45), devemos obter o tempo de correção (tC) da Longitude:
Com o tempo de correção obtido, devemos subtrair tC de nS e de pS, pois dF é menor que 0 (zero):
obtendo 6.649020995 para nS,
e obtendo 17.56884012 para pS.
Horário de Nascimento: 6h38m56s
Horário de Poente: 17h34m7s O Hardware utilizado é composto pelo seguinte esquemático:
O microcontrolador utilizado é o ESP32, módulo que possui o chip ESP-WROOM-32, que trabalha com 3,3V. Este microcontrolador foi escolhido por possuir mais de uma porta Serial de Hardware, funcionalidade que é necessária para obter os dados do módulo GPS NEO-6M sem nenhuma perda.
Os seguintes artigos são recomendados para melhor compreender o ESP32:
Faça o download do arquivo Descubra_o_horario_de_nascimento_e_de_poente_do_Sol_com_ESP32.zip e abra-o na IDE Arduino:
Em seguida, com o arquivo .ino aberto, faça o upload para a placa.
As bibliotecas podem ser baixadas nos seguintes links:
Em seguida, são incluídas as configurações do display OLED:
Logo após, são configurados os pinos de conexão com o módulo GPS:
Logo em seguida, é feita a instanciação dos objetos das classes:
Abaixo, são feitso os protótipos da funções utilizadas:
Em seguida, é definido o tempo, em milissegundos, de deslocamento do fuso horário. Para -3, é utilizado -10800 (-3 * 3600 = -10800):
Em void setup, iniciamos a Serial com velocidade de baud-rate de 115200 bits por segundo.
Após iniciar o display OLED com sucesso, imprimimos no display o logo do blog Eletrogate. O objetivo deste post não é mostrar como imprimir um bitmap no display. Para isso, acesse o outro post aqui do blog da Eletrogate: blog.eletrogate.com/guia-completo-do-display-oled-parte-2-como-programar-3
Em seguida, mostramos no display a mensagem de que o display foi iniciado.
Também iniciamos a Serial2 para obtermos dados do módulo GPS NEO 6M.
Ainda dentro de void setup, informamos que a Serial2 foi iniciada.
Logo após, exibimos, no display, a animação de carregamento para esperar os dados GPS chegarem.
Já dentro de void loop, passamos, para o manipulador da classe TinyGPS++, os dados GPS recebidos da Serial2 através da função gps.encode(recebido).
Em seguida, verificamos se os dados GPS foram atualizados sem erro.
controleTela tem o valor false. Caso tenha o valor false, limpamos o display OLED. Logo após, definimos o valor para a varável controleTela para true, além de atualizar o valor de tempo da varável tempo com o valor atual de millis().
Ainda dentro de void loop, exibimos na Serial os dados de localização atual do módulo GPS. No vídeo de Funcionamento Final, não são exibido os dados de localização por motivos de segurança.
Também exibimos no display OLED os dados de localização. Pelos mesmos motivos acima descritos, não exibiremos os dados de localização no display no vídeo de Funcionamento Final. Também criamos um buffer para ajudar a converter os dados de localização de double para String.
Logo após, através da função dtostrf, convertemos a latitude em double para String. A função dtostrf possui alguns parametros que devem ser informados:
dtostrf(float float_value, int min_width, int num_digits_after_decimal, char where_to_store_string);
float_value: número de ponto flutuante que se deseja converter no tipo String;min_width: a largura mínima do campo.num_digits_after_decimal: o número de dígitos a serem exibidos após o ponto decimal.where_to_store_string: matriz de caracteres onde se deseja armazenar a string de saída.
Também convertemos a longitude em double para String através da função dtostrf. Logo após a conversão, exibimos no display a longitude convertida para String.
Ainda dentro da verificação de que os dados GPS são válidos, configuramos a hora do sistema com os dados de tempo do GPS. Também setamos o fuso horário do sistema com o fuso horário configurado anteriormente. Estas funções de tempo são fornecidas através da biblioteca TimeLib.h.
horario para concatenarmos os dados de dia, mês, ano, hora, minuto e segundo e então os exibirmos na Serial. Estes dados de tempo também são fornecidos através da biblioteca TimeLib.h.
Também exibimos na Serial a Quantidade de dias passados no ano.
Exibimos, em seguida, no display OLED os dados de data obtidos da biblioteca TimeLib.h.
Criamos duas variáveis locais do tipo DateTime para armazenarmos os horários de nascimento e de poente calculados através da função horariosSol, em que devemos passar o objeto gps do tipo TinyGPSPlus e os endereços das variáveis do tipo DateTime, criados há agora pouco.
Ainda dentro da verificação de se os dados GPS são válidos, exibimos na Serial e no display OLED dos dados de horário de Nascimento do Sol.
Também exibimos na Serial e no display OLED os dados de horário de Poente do Sol.
Damos um espaçamento (pula-linha) na Serial e também exibimos as informações passadas para o display até agora
Damos ,então, após as verificações e antes do fim do loop, uma pausa de 200 milissegundos.
Após o void loop, está o desenvolvimento das funções.
Na função converteGrausParaRadianos(), convertemos o valor informado em Graus para Radianos e então o retornamos para a chamada da função. Isso se pode obter com a seguinte fórmula:
onde se deve multiplicar o valor informado em graus (x°) por π /180 que resultará no valor desejado em radianos (EmRadianosrad). Fórmula pode ser vista em www.google.com/search?q=graus+para+radianos
Na função converteRadianosParaGraus(), convertemos o valor informado em Radianos para Graus e então o retornamos para a chamada da função. Isso se pode obter com a seguinte fórmula:
onde se deve multiplicar o valor informado em radianos (xrad) por 180/π que resultará no valor desejado em Graus (EmGraus°). Fórmula pode ser vista em www.google.com/search?q=radianos+para+graus
Na função converteDecimaisParaGraus(), convertemos o valor informado em Decimais para Graus e então o passamos para o endereço do ponteiro informado nos parâmetros.
Na função horariosSol(), passamos o objeto gps da classe TinyGPSPlus e os ponteiros para os horários de nascimento e poente do sol, ambas variáveis do tipo DateTime, da classe RTClib.h.
Dentro da função, criamos duas variáveis locais para armazenar a latitude e a longitude. Também criamos uma variável para armazenar a declinação Solar no dia do ano atual. Todas medidas trigonométricas devem estar convertidas para radianos, pois o Framework Arduino trabalha trigonometria com radianos. Também calculamos o tempo de duração do dia.
Em seguida, convertermos o tempo de duração do dia de Decimais para Graus e o exibimos na Serial.
Então, logo após, calculamos o horário de nascimento e poente do Sol sem nenhuma correção de longitude.
Após o cálculo, exibimos na Serial o horário de nascimento do Sol e o passamos para o ponteiro de horário,
além de também exibirmos na Serial o horário de poente do Sol e passarmos o valor para o ponteiro de horário.
Após a exibição na Serial, criamos variáveis locais para armazenar o cálculo do fuso Horário do meridiano do Fuso e da diferença de Fusos.
Se a diferença de fusos entre o meridiano e o meridiano do fuso for diferente de zero, será necessário realizar a correção de Longitude.
Logo em seguida, mostramos, na Serial, o horário de nascer do Sol com a correção de Longitude e passamos o valor do horário para o ponteiro de horário do Nascer.
Também mostramos na Serial o horário de poente do Sol com a correção de Longitude e passamos o valor do horário para o ponteiro de horário do Poente.
Caso a condição seja false (diferencaDeFusos != 0), Informamos ao usuário que não foi necessário realizar nenhuma correção de Longitude.
Após as verificações das condições, chegamos ao fim da função horariosSol().
validacaoGPS(), verificamos se os dados obtidos do módulo GPS estão válidos. Caso os dados se mostrem válidos, retornamos true.
A função diaDoAno(), retorna o dia atual do ano (1 a 365 [ou 366 se bissexto]). Para isso, somamos os dias dos messes completos + os dias do mês atual.
A função exibicaoCarregamento(), mostra no display OLED a animação de carregamento. A animação começa com laço de repetição em que se cria primeiro um círculo completo de tamanho 20 da cor azul. Em seguida é criado um círculo sem cor do tamanho 17. Logo após é criado um círculo de tamanho que varia de 17 a 20, para criar o efeito de movimento. O segundo laço de repetição cria este efeito, só que ao contrário: em vez de o círculo crescer de 17 a 20, o círculo decresce de 20 a 17.
A função anoEBissexto(), verifica se o ano informado é bissexto ou não. Para isso, deve se conferir algumas regras (Fonte: pt.wikipedia.org/wiki/Ano_bissexto):
A função qtdDiasDoMes(), retorna a quantidade de dias de um determinado mês. Devemos passar para esta função se o ano atual é bissexto ou não, pois, se for bissexto, o mês de fevereiro tem 29 dias.
Veja no vídeo abaixo o funcionamento final do projeto:
IBGE. Coordenadas Geográficas. Atlas Geográfico Escolar, c2021. Disponível em: <https://atlasescolar.ibge.gov.br>. Acesso em: 30 de dez. de 2021. Coordenadas Geográficas. Wikipédia, 2021. Disponível em: <https://pt.wikipedia.org/wiki/Coordenadas_geográficas>. Acesso em: 30 de dez. de 2021. IBGE. 4. Fuso horário Civíl. Portal de Mapas, 2012. Disponível em: <https://portaldemapas.ibge.gov.br>. Acesso em: 30 de dez. de 2021. GALVANI, EMERSON. Relações Astronômicas Terra – Sol parte introdutória da Radiação solar. USP - Departamento de Geografia, [s.d.]. Disponível em: <https://edisciplinas.usp.br/pluginfile.php/4250294/mod_resource/content/1/ Radiacao_solar_estacoes_do_ano.pdf> BORGES, Roberto Cabral de Mello. Cálculo do Nascer e Pôr do Sol. Instituto de Informática - UFRGS, [s.d.]. Disponível em: <https://www.inf.ufrgs.br/~cabral/Nascer_Por_Sol.html>
Com os conceitos aprendidos neste post, é possível criar projetos mais avançados, como o controle de gerenciamento de carregamento de bateria com energia solar ou até mesmo projetos de previsão do tempo. Curtiu o post? Avalie e deixe um comentário! Siga-nos também no Instagram e nos marque quando fizer algum projeto nosso: @eletrogate. Até a próxima! Tenha a Metodologia Eletrogate na sua Escola! Conheça nosso Programa de Robótica Educacional.
|
Descubra neste post como obter o horário de nascimento e de poente do sol utilizando um ESP32 e um módulo GPS.
Encontre tudo na Loja Eletrogate com frete grátis para compras acima de R$ 200