Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Relógio Arduino com horas de oração islâmica

Componentes e suprimentos

Arduino UNO
× 1
Tela Nokia 5510
× 1
Pi RTC visto (DS1307)
× 1

Ferramentas e máquinas necessárias

Fios de jumper macho / macho Premium, 40 x 3 "(75 mm )
Breadboard, 400 Pin

Aplicativos e serviços online

Arduino IDE

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

  1. Relógio de visão pov do Arduino
  2. DIY mais simples relógio IV9 Numitron com Arduino
  3. Simple Word Clock (Arduino)
  4. Relógio mestre
  5. Aceitar moeda de controle com Arduino
  6. Arduino Temp. Monitor e relógio em tempo real com tela 3.2
  7. Arduino com Bluetooth para controlar um LED!
  8. Exibindo uma imagem em uma tela LCD TFT com o Arduino UNO!
  9. Despertador simples com DS1302 RTC
  10. Controle de ventilador PWM de 4 pinos de 25 kHz com Arduino Uno