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 128×64 0.96″ I2C – Azul/Amarelo.
Pôr do Sol. Imagem de S. Hermann & F. Richter por Pixabay.
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.
Os paralelos são linhas imaginárias que circulam a Terra no sentido leste–oeste. São definidos por suas dimensões de latitude.
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]).
Os Meridianos são linhas imaginárias que cortam a Terra no sentido norte–sul, ligando um polo ao outro. São definidos por suas dimensões de longitude.
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]).
É um sistema de linhas imaginárias que permite localizar um determinado ponto na superfície terrestre, definido por meio da interseção de um meridiano e um paralelo.
Existem vários modos para designar uma localização exata em qualquer ponto na superfície do globo terrestre. Aqui estão alguns:
O valor de cada grau na Longitude é bem definido, pois o comprimento de qualquer meridiano possui 20003.93 km. Fazendo um cálculo de regra de três simples, :
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:
Neste sistema, cada grau é dividido em frações decimais. Há valores positivos e negativos. Os valores positivos são para o Norte (latitude) e o Leste (longitude) e não recebem um símbolo específico. Os valores negativos são para o Sul (latitude) e o Oeste (longitude), sendo acrescidos do símbolo – (Hífen).
Exemplo – Latitude seguida de Longitude:
Os fusos horários são uma divisão em que os países utilizam para definir os horários em diferentes posições longitudinais na Terra, de acordo com o movimento aparente do Sol. Como o planeta Terra possui como duração um tempo de 24 horas para uma rotação completa em seu eixo, os fuso horários são divididos em 24 faixas verticais, onde cada uma destas faixas é um fuso de 1 (uma) hora. Como a Terra possui 360° de circunferência,
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).
É o ângulo formado entre o equador terrestre e a linha imaginária que contém o plano do sol. Esta mesma declinação, que afeta o equador terrestre, é que resulta nas estações do ano, não a distância entre Terra e Sol.
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
Observador no Hemisfério Norte
Com a fórmula que será apresentada em Cálculo da declinação Solar, é possível gerar um gráfico para todos os dias do ano. No gráfico abaixo, é possível ver a declinação solar nos dias do ano:
GPS é a sigla curta para para NAVSTAR GPS que, em inglês, é o acrônimo de NAVigation System with Time And Ranging Global Positioning System, que significa Sistema de Navegação com Sistema de Posicionamento Global de Tempo e Alcance. GPS é um dos sistemas globais de navegação por satélite (GNSS) que fornece geolocalização e informações de tempo para um receptor GPS em qualquer lugar na Terra ou próximo a ela onde haja uma linha de visão desobstruída para quatro ou mais satélites GPS.
Para calcular o horário do nascer e do poente, é necessário seguir alguns passos:
Caso a Latitude e a Longitude estiverem no formato Grau-Minuto-Segundo, devemos primeiro converter para o formato Graus-Decimal. Para isso, utilizamos a seguinte fórmula:
onde,
Caso a medida Grau-Minuto-Segundo esteja no hemisfério Sul ou Oeste, o resultado em Graus-Decimal será negativo.
Para o cálculo da declinação Solar sobre a Terra, é utilizada a seguinte fórmula:
onde,
Para o Cálculo da duração do Dia, utiliza-se a seguinte fórmula:
onde,
Após o cálculo da duração do dia, é feito a obtenção da duração da metade do dia e o cálculo do horário de nascimento e poente do sol:
onde,
Com os horários obtidos, devemos fazer uma verificação para saber se é necessária a realização da Correção de Longitude.
Somente se a longitude da localidade não estiver na posição exata do meridiano do fuso horário é necessário realizar a Correção de Longitude. Caso fique exatamente na posição exata, não é necessário fazer a correção, já podendo ser feita a conversão para horário legível.
Para obter o tempo para correção, são utilizada as seguintes fórmulas:
onde,
onde,
Caso dF [a diferença de fusos] for igual a 0 (zero), não precisamos fazer nenhuma correção. Isso significa que a localidade está exatamente no meridiano do fuso horário (λ = mF ), já podendo ser feita a conversão para horário legível.
Caso dF seja diferente de 0 (zero), devemos fazer a correção de longitude, obtendo o tempo para correção através da seguinte fórmula:
onde,
Com o tempo de correção obtido, devemos somar ou subtrair tC de acordo com as seguintes condições:
Considere as seguintes variáveis para os cálculos:
Para convertermos o horário obtido para um horário legível, devemos fazer os seguintes cálculos:
Dados para o cálculo:
Como a Latitude e a Longitude estão no formato Grau-Minuto-Segundo, devemos, primeiro, converter para o formato Graus-Decimal:
Latitude em Graus-Decimal resulta em -23.5503944;
Longitude em Graus-Decimal resulta em -46.63395833;
Primeiro, iremos calcular a declinação solar de acordo com o dia do ano. Para sabermos o dia do ano, podemos somar todos os dias passados ou acessar o site calendario-365:
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.
Aplicamos a fórmula da duração do dia:
e obtemos o resultado de 10.91981912 horas de luz solar.
Fazemos o cálculo para descobrirmos o horário de nascimento do sol, que ainda está no formato Graus-Decimal:
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.
Realizamos o cálculo para obter o meridiano do fuso (mF), sabendo que o fuso de São Paulo é -3:
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.
Com os horários de nascente e de poente do Sol, já os podemos converter do formato Graus-Decimal para Graus-Minutos-Segundos, o que é mais legível para se ver as horas:
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:
Este mesmo módulo GPS capta informações da localização de onde o módulo está instalado. Ele possui interface Serial de 3,3V, não sendo necessário nenhum conversor de Tensão.
Os seguintes artigos são recomendados para melhor entendimento do módulo GPS NEO-6M:
Para mostrar os dados ao usuário, é utilizado um display OLED. O módulo display possui comunicação I2C e controlador SSD1306. A alimentação do módulo pode ser tanto 3,3V quanto 5V, não sendo necessário nenhum conversor de Tensão.
Os seguintes artigos são recomendados para melhor entendimento do display OLED SSD1306:
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.
O código começa com a inclusão das bibliotecas:
As bibliotecas podem ser baixadas nos seguintes links:
Para incluir a biblioteca .zip na IDE Arduino, vá à opção Sketch → Incluir Biblioteca → Adicionar Biblioteca .ZIP:
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):
Logo após, criamos as variáveis globais de uso no sketch:
Em void setup, iniciamos a Serial com velocidade de baud-rate de 115200 bits por segundo.
Ainda dentro de void setup, iniciamos o display OLED SSD1306, limpando-o em seguida.
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.
Também podemos enviar dados para configurar o módulo GPS, mas precisamos de um software chamado u-center da u-blox. Caso deseje, pode ser feito o download para Windows no seguinte link: www.u-blox.com/sites/default/files/u-centersetup_v21.09.zip
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.
Caso os dados GPS forem atualizados sem erros, verificamos se a variável 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.Após a conversão, exibimos, no display OLED, a latitude convertida para o tipo String.
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.
Logo em seguida, criamos uma variável do tipo String chamada 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
Caso a verificação de que os dados de GPS foram atualizados sem erro seja FALSE e a verificação de que o tempo atual está dentro dos limite mínimo de requisição (tempoMinimoEntreRequisicoes) seja TRUE,
verificamos se valor da varável controleTela seja true. Caso seja true, limpamos o display OLED. Também, em seguida, atribuímos o valor false para a variável controleTela. Então, exibimos no display a animação de que se está esperando receber dados GPS da Serial2.
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.
Dentro da condição, criamos uma variável para armazenar e calcular o tempo para correção de Longitude. Então, exibimos na Serial a correção de Longitude. Caso a correção de Longitude for menor que zero, devemos subtrair a correção de Longitude do horário de nascer e poente do Sol. Caso a correção de Longitude for maior que zero, devemos somar o horário de nascer e poente do Sol com 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()
.
Na função 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):
Para melhor entender:
Com estas regras, é possível testar as condições na programação. Para verificar se um número é múltiplo de outro, pegamos o resto (% operador módulo) da divisão do dividendo pelo divisor. Se o resto for 0, o dividendo é múltiplo.
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.
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!