Relógio Arduino com horas de oração islâmica
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Ferramentas e máquinas necessárias
| ||||
|
Aplicativos e serviços online
|
Sobre este projeto
Este é um relógio em tempo real com a capacidade de mostrar a data gregoriana e os tempos de oração diários. Para este circuito simples, precisamos usar um Arduino UNO (ou qualquer placa Arduino), um RTC DS1307 e NOKIA 5110 LCD.
Você pode comprar as peças aqui (links de afiliados):
- Arduino UNO
- DS1307
- NOKIA 5110 LCD
Materiais
Arduino UNO
O Arduino Uno é uma placa de microcontrolador de código aberto baseada no microcontrolador ATmega328P. Esta placa é equipada com conjuntos de GPIOs analógicos e digitais (entrada / saída de uso geral) que podem ter interface com vários sensores, atuadores, placas de expansão e outros circuitos.
O Arduino UNO tem:
- 14 pinos de entrada / saída digital (dos quais 6 podem ser usados como saídas PWM)
- 6 entradas analógicas
- ressonador de cerâmica de 16 MHz
- 32 KB de memória Flash (0,5 KB usado pelo bootloader)
- 2 KB SRAM
- 1 KB EEPROM
- Entrada de alimentação DC e porta USB
DS1307
O relógio em tempo real serial (RTC) DS1307 é um relógio / calendário BCD (decimal totalmente codificado em binário) de baixa potência.
O relógio / calendário fornece informações sobre segundos, minutos, horas, dia, data, mês e ano. A data do fim do mês é ajustada automaticamente para meses com menos de 31 dias, incluindo correções para ano bissexto.
O DS1307 opera no formato de 24 ou 12 horas com indicador AM / PM. Possui um circuito de detecção de energia integrado que detecta falhas de energia e alterna automaticamente para a alimentação da bateria.
Função Pin do DS1307
- VCC, GND: A energia DC é fornecida ao dispositivo nesses pinos.
- SCL (entrada serial de relógio): usado para sincronizar a movimentação de dados na interface serial.
- SDA (entrada / saída de dados seriais): SDA é o pino de entrada / saída da interface serial de 2 fios. O pino SDA é um dreno aberto que requer um resistor pullup externo.
- SQW / OUT (Square Wave / Driver de saída): Quando habilitado, o bit SQWE é definido como 1, o pino SQW / OUT emite uma das quatro frequências de onda quadrada (1Hz, 4kHz, 8kHz, 32kHz). O pino SQW / OUT é um dreno aberto e requer um resistor pull-up externo. Ele operará com Vcc ou Vbat aplicado.
- X1, X2: Conexões para um cristal de quartzo padrão de 32,768 kHz. O circuito do oscilador interno é projetado para operação com um cristal tendo uma capacitância de carga especificada de 12,5pF
NOKIA 5110 LCD
O LCD do Nokia 5110 é uma tela monocromática de 84 * 48 pixels, vem com luz de fundo e pode ser usado para desenhar texto, gráficos ou imagens. O LCD usa o controlador PCD8544 (o mesmo usado no LCD Nokia 3310), este controlador faz interface com microcontroladores por meio de uma interface de barramento serial semelhante ao SPI.
Nokia 5110 LCD Pinout
- VCC, GND: A energia DC é fornecida ao dispositivo nesses pinos.
- RST: ele redefine a exibição. É um pino baixo ativo. Você também pode conectar este pino à redefinição do Arduino para que ele redefina a tela automaticamente.
- CE (Ativar Chip): um pino baixo ativo, ajuda a selecionar um dos muitos dispositivos conectados que compartilham o mesmo barramento SPI.
- D / C (Dados / Comando): diz ao monitor se está recebendo ou exibindo dados. O sinal HIGH é para dados e o sinal LOW para comando.
- DIN: é um pino de dados serial para a interface SPI, ele enviará os dados do microcontrolador para o LCD.
- CLK (relógio): o LCD e o microcontrolador exigirão um relógio comum para operar por causa de sua comunicação SPI. este alfinete ajudará a fazer isso.
- BL (luz de fundo): ele controla a luz de fundo da tela. Você pode controlar seu brilho adicionando um potenciômetro ou conectando-o a um pino Arduino compatível com PWM (pinos 3, 5, 6, 9, 10 e 11).
Como editar o programa?
Você deve adaptar a linha 161 do código:
calcPrayerTimes (year, month, dayOfMonth, 41.3, 20.6, 3, -18.5, -19, fajr, sunRise, zuhr, asr, maghrib, isha);
Os parâmetros necessários são:
- Longitude / latitude / fuso horário do local desejado.
- Fajr Twilight / Esha Twilight diferem nos cálculos de um país para outro.
Você também pode obter as coordenadas geográficas de sua cidade, como latitude e longitude, de que o programa precisa para calcular os tempos de oração visitando o site IslamicFinder e, em seguida, pesquise sua cidade.
Como notamos na imagem acima, após uma busca pela cidade do Cairo, surgiram horários de oração além de algumas informações. O que importa para nós é a latitude, longitude, ângulo Isha e ângulo Fajr, você vai alterar esses números no programa para se adequar à sua cidade.
Como funciona o programa?
A função leva os dados de Ano / Mês / Dia / Longitude / Latitude / TimeZone / FajrTwilight / IshaTwilight mais 6 referências para variáveis duplas (Fajr / SunRise / Zuhr / Asr / Maghrib / Isha). Essas 6 variáveis são aquelas para as quais os dados devem ser retornados. também existem algumas funções para ajudar em algumas conversões de número (por exemplo, Radianos para Graus e vice-versa).
Portanto, se tomarmos o Cairo como exemplo:
- Longitude:30,2
- Latitude:30
- Fuso Horário:+2
- Fajr Twilight:-19,5
- Esha Twilight:-17,5
Devemos adaptar a linha 161 assim:
calcPrayerTimes (year, month, dayOfMonth, 30.2, 30, 2, -19.5, -17.5, fajr, sunRise, zuhr, asr, maghrib, isha);
Observe que esses tempos de oração ainda são "duplos" e devem ser convertidos para um formato de hora. Mahmoud Adly Ezzat fez a função doubleToHrMin (você pode encontrá-la antes da função calcPrayerTimes) que divide o número em horas e minutos. Leva as referências double e two para variáveis int.
Não se esqueça de apontar o dedo, se achar útil.
P.S .: o algoritmo de cálculo do tempo de oração foi escrito por Mahmoud Adly Ezzat. Você pode ler mais sobre isso em sua postagem no blog.
Código
- relógio Arduino com horas de oração islâmicas
Relógio Arduino com horas de oração islâmicas Arduino
- Momento de oração no display Nokia 5510/3310 de Hatem Zehir- O cálculo do tempo de oração é feito em http://3adly.blogspot.com/2010/07/prayer-times-calculations-pure-c-code.html
#include "Wire.h" #include#include Adafruit_PCD8544 display =Adafruit_PCD8544 (7, 6, 5, 4, 3); int xegg, yegg; #define DS1307_I2C_ADDRESS 0x68 // Este é o endereço I2Clong previousMillis =0; // armazenará a última hora em que a hora foi atualizada em segundo, minuto, hora, dayOfWeek, dayOfMonth, month, year; long interval =200; int displayx, displayy, displayradius, x2, y2, x3, y3; int zero =0; char * Dia [] ={"", "Sol", "Seg", "Ter", "Quarta", "Qui", "Sex", "Sáb"}; duplo fajr, nascer do sol, zuhr, asr, maghrib, isha; // Converte números decimais normais em decimais codificados em binário decToBcd (byte val) {return ((val / 10 * 16) + (val% 10));} // Converte decimais codificados em binários em números decimais normaisbyte bcdToDec (byte val) { return ((val / 16 * 10) + (val% 16));} // Obtém a data e hora do ds1307 e imprime resultvoid getDateDs1307 () {// Redefine o ponteiro de registro Wire.beginTransmission (DS1307_I2C_ADDRESS); //Wire.write(0x00); Wire.write (zero); Wire.endTransmission (); Wire.requestFrom (DS1307_I2C_ADDRESS, 7); segundo =bcdToDec (Wire.read () &0x7f); minuto =bcdToDec (Wire.read ()); hora =bcdToDec (Wire.read () &0x3f); dayOfWeek =bcdToDec (Wire.read ()); dayOfMonth =bcdToDec (Wire.read ()); mês =bcdToDec (Wire.read ()); ano =bcdToDec (Wire.read ());} void setDateDs1307 () {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (zero); Wire.write (decToBcd (segundo)); // 0 ao bit 7 inicia o relógio Wire.write (decToBcd (minuto)); Wire.write (decToBcd (hora)); // para 12 horas am / pm, é necessário definir o bit 6 (também é necessário alterar readDateDs1307) Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (mês)); Wire.write (decToBcd (ano)); Wire.endTransmission ();} void printTime () {int horas, minutos; char s [12]; display.clearDisplay (); display.setCursor (0, 16); display.print (Day [dayOfWeek]); display.print (":"); display.print (char (dayOfMonth / 10 + 0x30)); display.print (char (dayOfMonth% 10 + 0x30)); display.print ("/"); display.print (char (mês / 10 + 0x30)); display.print (char (mês% 10 + 0x30)); display.print ("/"); display.print ("20"); display.print (char (ano / 10 + 0x30)); display.print (char (ano% 10 + 0x30)); display.setCursor (18, 26); display.print (char (hora / 10 + 0x30)); display.print (char (hora% 10 + 0x30)); display.print (":"); display.print (char (minuto / 10 + 0x30)); display.print (char (minuto% 10 + 0x30)); display.print (":"); display.print (char (segundo / 10 + 0x30)); display.print (char (segundo% 10 + 0x30)); display.display (); atraso (1000); doubleToHrMin (fajr, horas, minutos); display.clearDisplay (); display.setCursor (1, 1); display.print ("Fajr"); display.print (horas); display.print (":"); display.print (minutos); display.display (); doubleToHrMin (zuhr, horas, minutos); display.setCursor (1, 10); display.print ("Zuhr"); display.print (horas); display.print (":"); display.print (minutos); display.display (); doubleToHrMin (asr, horas, minutos); display.setCursor (1, 20); display.print ("Asr"); display.print (horas); display.print (":"); display.print (minutos); display.display (); doubleToHrMin (maghrib, horas, minutos); display.setCursor (1, 30); display.print ("Maghrib"); display.print (horas); display.print (":"); display.print (minutos); display.display (); doubleToHrMin (isha, horas, minutos); display.setCursor (1, 40); display.print ("Isha"); display.print (horas); display.print (":"); display.print (minutos); display.display (); atraso (5000);} configuração vazia () {Wire.begin (); display.begin (); display.clearDisplay (); display.setContrast (25); xegg =(display.width ()) / 2; yegg =(display.height ()) / 2; display.setTextColor (BLACK); display.setTextSize (1); display.setCursor (22, 18); display.print ("Hatem"); display.display (); atraso (500); display.setCursor (24, 28); display.print ("ZEHIR"); display.display (); atraso (500); getDateDs1307 ();} void loop () {getDateDs1307 (); calcPrayerTimes (ano, mês, dayOfMonth, 39,8, 21,4, 3, -18,5, -19, fajr, sunRise, zuhr, asr, maghrib, isha); // ano, mês, dia, longitude, latitude, fuso horário, Fajr Crepúsculo, Esha Crepúsculo unsigned long currentMillis =millis (); if (currentMillis - previousMillis> intervalo) {previousMillis =currentMillis; // getDateDs1307 (); printTime (); }} / * ---------------------------------------------- --------------------------------------- * /// TEMPO DE ORAÇÃO (por Mahmoud Adly Ezzat , Cairo) // converter Grau em Radianduplo degToRad (duplo grau) {return ((3.1415926 / 180) * grau);} // converter Radiano em Grau duplo radToDeg (duplo radiano) {return (radiano * (180 / 3.1415926)); } // certifique-se de que um valor está entre 0 e 360dobro moreLess360 (valor duplo) {while (value> 360 || value <0) {if (value> 360) value - =360; senão se (valor <0) valor + =360; } valor de retorno;} // certifique-se de que um valor está entre 0 e 24dobro maisMenos24 (valor duplo) {enquanto (valor> 24 || valor <0) {if (valor> 24) valor - =24; senão se (valor <0) valor + =24; } valor de retorno;} // converter o número duplo em Horas e Minutosvoid doubleToHrMin (número duplo, int &horas, int &minutos) {hours =floor (moreLess24 (number)); minutes =floor (moreLess24 (number - hours) * 60);} void calcPrayerTimes (int year, int month, int day, double longitude, double latitude, int timeZone, double fajrTwilight, double ishaTwilight, double &fajrTime, double &sunRiseTime, double &zuhrTime , double &asrTime, double &maghribTime, double &ishaTime) {double D =(367 * ano) - ((ano + (int) ((mês + 9) / 12)) * 7/4) + (((int) (275 * mês / 9)) + dia - 730531,5); duplo L =280,461 + 0,9856474 * D; L =maisLess360 (L); duplo M =357,528 + (0,9856003) * D; M =maisLess360 (M); Lambda duplo =L + 1,915 * sin (degToRad (M)) + 0,02 * sin (degToRad (2 * M)); Lambda =maisLess360 (Lambda); Obliquidade dupla =23,439 - 0,0000004 * D; Alpha duplo =radToDeg (atan ((cos (degToRad (Obliquity)) * tan (degToRad (Lambda))))); Alpha =moreLess360 (Alpha); Alpha =Alpha - (360 * (int) (Alpha / 360)); Alpha =Alpha + 90 * (floor (Lambda / 90) - floor (Alpha / 90)); ST duplo =100,46 + 0,985647352 * D; double Dec =radToDeg (asin (sin (degToRad (Obliquity)) * sin (degToRad (Lambda)))); duplo Durinal_Arc =radToDeg (acos ((sin (degToRad (-0,8333)) - sin (degToRad (Dec)) * sin (degToRad (latitude))) / (cos (degToRad (Dec)) * cos (degToRad (latitude)) ))); Meio-dia duplo =Alfa - ST; Meio-dia =maisMenos360 (meio-dia); duplo UT_Noon =meio-dia - longitude; ////////////////////////////////////////////////// // Calculando os tempos de oração Arcs &Times // ////////////////////////////////////////////// // 2) Zuhr Time [meio-dia local] zuhrTime =UT_Noon / 15 + timeZone; // Asr Hanafi // double Asr_Alt =radToDeg (atan (2 + tan (degToRad (latitude - Dez)))); duplo Asr_Alt =radToDeg (atan (1,7 + tan (degToRad (latitude - dezembro)))); // Asr Shafii // double Asr_Alt =radToDeg (atan (1 + tan (degToRad (latitude - Dez)))); double Asr_Arc =radToDeg (acos ((sin (degToRad (90 - Asr_Alt)) - sin (degToRad (Dec)) * sin (degToRad (latitude))) / (cos (degToRad (Dec)) * cos (degToRad (latitude) )))); Asr_Arc =Asr_Arc / 15; // 3) Tempo de Asr asrTime =zuhrTime + Asr_Arc; // 1) Tempo Shorouq sunRiseTime =zuhrTime - (Durinal_Arc / 15); // 4) Maghrib Time maghribTime =zuhrTime + (Durinal_Arc / 15); double Esha_Arc =radToDeg (acos ((sin (degToRad (ishaTwilight)) - sin (degToRad (Dec)) * sin (degToRad (latitude))) / (cos (degToRad (Dec)) * cos (degToRad (latitude))) )); // 5) Isha Time ishaTime =zuhrTime + (Esha_Arc / 15); // 0) Fajr Tempo duplo Fajr_Arc =radToDeg (acos ((sin (degToRad (fajrTwilight)) - sin (degToRad (Dec)) * sin (degToRad (latitude)))) / (cos (degToRad (Dec)) * cos ( degToRad (latitude))))); fajrTime =zuhrTime - (Fajr_Arc / 15); return;}
Esquemas
Processo de manufatura
- Relógio de visão pov do Arduino
- DIY mais simples relógio IV9 Numitron com Arduino
- Simple Word Clock (Arduino)
- Relógio mestre
- Aceitar moeda de controle com Arduino
- Arduino Temp. Monitor e relógio em tempo real com tela 3.2
- Arduino com Bluetooth para controlar um LED!
- Exibindo uma imagem em uma tela LCD TFT com o Arduino UNO!
- Despertador simples com DS1302 RTC
- Controle de ventilador PWM de 4 pinos de 25 kHz com Arduino Uno