Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Reloj Arduino con tiempos de oración islámicos

Componentes y suministros

Arduino UNO
× 1
Pantalla Nokia 5510
× 1
Seeed Pi RTC (DS1307)
× 1

Herramientas y máquinas necesarias

Cables de puente macho / macho premium, 40 x 3 "(75 mm )
Placa de pruebas, 400 pines

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

Este es un reloj en tiempo real con la capacidad de mostrar la fecha gregoriana y los tiempos de oración diarios. Para este circuito simple, necesitamos usar un Arduino UNO (o cualquier placa Arduino), un RTC DS1307 y un LCD NOKIA 5110.

Puede comprar las piezas aquí (enlaces de afiliados):

  • Arduino UNO
  • DS1307
  • NOKIA 5110 LCD

Materiales

Arduino UNO

El Arduino Uno es una placa de microcontrolador de código abierto basada en el microcontrolador ATmega328P. Esta placa está equipada con conjuntos de GPIO (entrada / salida de uso general) analógicos y digitales que pueden conectarse a varios sensores, actuadores, placas de expansión y otros circuitos.

El Arduino UNO tiene:

  • 14 pines de entrada / salida digital (de los cuales 6 se pueden usar como salidas PWM)
  • 6 entradas analógicas
  • Resonador cerámico de 16 MHz
  • 32 KB de memoria flash (0,5 KB utilizados por el gestor de arranque)
  • 2 KB de SRAM
  • 1 KB de EEPROM
  • Conector de alimentación de CC y puerto USB

DS1307

El reloj en tiempo real (RTC) en serie DS1307 es un reloj / calendario decimal codificado en binario completo (BCD) de baja potencia.

El reloj / calendario proporciona información sobre segundos, minutos, horas, día, fecha, mes y año. La fecha de fin de mes se ajusta automáticamente para los meses con menos de 31 días, incluidas las correcciones por año bisiesto.

El DS1307 funciona en formato de 24 horas o de 12 horas con indicador AM / PM. Tiene un circuito de detección de energía incorporado que detecta fallas de energía y cambia automáticamente al suministro de batería.

Función de clavija del DS1307

  • VCC, GND: Se proporciona alimentación de CC al dispositivo en estos pines.
  • SCL (entrada de reloj en serie): utilizado para sincronizar el movimiento de datos en la interfaz serial.
  • SDA (entrada / salida de datos en serie): SDA es el pin de entrada / salida para la interfaz serial de 2 cables. El pin SDA es un drenaje abierto que requiere una resistencia pullup externa.
  • SQW / OUT (onda cuadrada / controlador de salida): Cuando está habilitado, el bit SQWE se establece en 1, el pin SQW / OUT emite una de las cuatro frecuencias de onda cuadrada (1Hz, 4kHz, 8kHz, 32kHz). El pin SQW / OUT es un drenaje abierto y requiere una resistencia pull-up externa. Funcionará con Vcc o Vbat aplicado.
  • X1, X2: Conexiones para un cristal de cuarzo estándar de 32,768 kHz. El circuito del oscilador interno está diseñado para funcionar con un cristal que tiene una capacidad de carga especificada de 12,5 pF

NOKIA 5110 LCD

Nokia 5110 LCD es una pantalla monocromática de 84 * 48 píxeles, viene con luz de fondo y se puede usar para dibujar texto, gráficos o imágenes. La pantalla LCD utiliza el controlador PCD8544 (el mismo que se usa en el Nokia 3310 LCD), este controlador se conecta a los microcontroladores a través de una interfaz de bus serie similar a SPI.

Configuración de pines LCD Nokia 5110

  • VCC, GND: Se proporciona alimentación de CC al dispositivo en estos pines.
  • RST: restablece la pantalla. Es un pin bajo activo. También puede conectar este pin al reinicio de Arduino para que reinicie la pantalla automáticamente.
  • CE (Chip habilitado): un pin bajo activo, ayuda a seleccionar uno de los muchos dispositivos conectados que comparten el mismo bus SPI.
  • D / C (datos / comando): le dice a la pantalla si está recibiendo o mostrando datos. La señal ALTA es para datos y la señal BAJA para comando.
  • DIN: es un pin de datos en serie para la interfaz SPI, enviará los datos desde el microcontrolador a la pantalla LCD.
  • CLK (Reloj): la pantalla LCD y el microcontrolador requerirán un reloj común para funcionar debido a su comunicación SPI. este alfiler ayudará a hacerlo.
  • BL (luz de fondo): controla la luz de fondo de la pantalla. Puede controlar su brillo agregando un potenciómetro o conectándolo a un pin Arduino compatible con PWM (Pin n. ° 3, 5, 6, 9, 10 y 11).

¿Cómo editar el programa?

Debe adaptar la línea 161 del código:

  calcPrayerTimes (año, mes, dayOfMonth, 41.3, 20.6, 3, -18.5, -19, fajr, sunRise, zuhr, asr, maghrib, isha);  

Los parámetros necesarios son:

  • Longitud / latitud / zona horaria del lugar deseado.
  • Fajr Twilight / Esha Twilight difieren en los cálculos de un país a otro.

También puede obtener las coordenadas geográficas de su ciudad, como latitud y longitud, que el programa necesita para calcular los tiempos de oración visitando el sitio web de IslamicFinder y luego busque su ciudad.

Como notamos en la imagen de arriba, después de buscar la ciudad de El Cairo, aparecieron horas de oración además de alguna información. Lo que nos importa es la latitud, la longitud, el ángulo de Isha y el ángulo de Fajr, cambiará esos números en el programa para que se adapten a su ciudad.

¿Cómo funciona el programa?

La función toma los datos de Año / Mes / Día / Longitud / Latitud / Zona horaria / FajrTwilight / IshaTwilight más 6 referencias a variables dobles (Fajr / SunRise / Zuhr / Asr / Maghrib / Isha). Estas 6 variables son a las que se deben devolver los datos. también hay algunas funciones para ayudar en algunas conversiones de números (por ejemplo, radianes a grados y viceversa).

Entonces, si tomamos El Cairo como ejemplo:

  • Longitud:30,2
  • Latitud:30
  • Zona horaria:+2
  • Fajr Crepúsculo:-19,5
  • Esha Crepúsculo:-17,5

Deberíamos adaptar la línea 161 así:

  calcPrayerTimes (año, mes, dayOfMonth, 30.2, 30, 2, -19.5, -17.5, fajr, sunRise, zuhr, asr, maghrib, isha);  

Tenga en cuenta que estos tiempos de oración siguen siendo "dobles" y deben convertirse a un formato de hora. Mahmoud Adly Ezzat creó la función doubleToHrMin (puede encontrarla antes de la función calcPrayerTimes) que divide el número en horas y minutos. Toma las referencias dobles y dos a las variables int.

No olvides levantar el pulgar si lo encuentras útil.

P.S: el algoritmo de cálculo del tiempo de oración está escrito por Mahmoud Adly Ezzat. Puede leer más sobre esto en la publicación de su blog.

Código

  • Reloj Arduino con tiempos de oración islámicos
Reloj Arduino con tiempos de oración islámicos Arduino
- Tiempo de oración en la pantalla Nokia 5510/3310 de Hatem Zehir
- El cálculo del tiempo de oración es de 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 // Esta es la dirección I2C de la anteriorMillis =0; // almacenará la última vez que se actualizó la hora byte segundo, minuto, hora, dayOfWeek, dayOfMonth, mes, año; intervalo largo =200; int displayx, displayy, displayradius, x2, y2, x3, y3; int zero =0; char * Día [] ={"", "Sol", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"}; doble fajr, amanecer, zuhr, asr, maghrib, isha; // Convierte números decimales normales a decimales con codificación binaria decToBcd (byte val) {return ((val / 10 * 16) + (val% 10));} // Convierte números decimales codificados en binario a decimales normalesbyte bcdToDec (byte val) { return ((val / 16 * 10) + (val% 16));} // Obtiene la fecha y la hora del ds1307 e imprime resultvoid getDateDs1307 () {// Restablece el puntero de registro Wire.beginTransmission (DS1307_I2C_ADDRESS); //Wire.write(0x00); Wire.write (cero); 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 ()); mes =bcdToDec (Wire.read ()); año =bcdToDec (Wire.read ());} void setDateDs1307 () {Wire.beginTransmission (DS1307_I2C_ADDRESS); Wire.write (cero); Wire.write (decToBcd (segundo)); // 0 al bit 7 inicia el reloj Wire.write (decToBcd (minuto)); Wire.write (decToBcd (hora)); // para 12 horas am / pm, es necesario establecer el bit 6 (también es necesario cambiar readDateDs1307) Wire.write (decToBcd (dayOfWeek)); Wire.write (decToBcd (dayOfMonth)); Wire.write (decToBcd (mes)); Wire.write (decToBcd (año)); 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 (mes / 10 + 0x30)); display.print (char (mes% 10 + 0x30)); display.print ("/"); display.print ("20"); display.print (char (año / 10 + 0x30)); display.print (char (año% 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 (); retraso (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 (); retraso (5000);} configuración vacía () {Wire.begin (); display.begin (); display.clearDisplay (); display.setContrast (25); xegg =(display.width ()) / 2; yegg =(display.height ()) / 2; display.setTextColor (NEGRO); display.setTextSize (1); display.setCursor (22, 18); display.print ("Hatem"); display.display (); retraso (500); display.setCursor (24, 28); display.print ("ZEHIR"); display.display (); retraso (500); getDateDs1307 ();} bucle vacío () {getDateDs1307 (); calcPrayerTimes (año, mes, dayOfMonth, 39.8, 21.4, 3, -18.5, -19, fajr, sunRise, zuhr, asr, maghrib, isha); // año, mes, día, longitud, latitud, zona horaria, crepúsculo Fajr, crepúsculo Esha unsigned long currentMillis =millis (); if (currentMillis - previousMillis> intervalo) {previousMillis =currentMillis; // getDateDs1307 (); printTime (); }} / * ---------------------------------------------- --------------------------------------- * /// TIEMPO DE ORACIÓN (por Mahmoud Adly Ezzat , Cairo) // convertir Grados a Radiandouble degToRad (doble grado) {return ((3.1415926 / 180) * degree);} // convertir Radian a Degreedouble radToDeg (doble radianes) {return (radian * (180 / 3.1415926)); } // asegúrese de que un valor esté entre 0 y 360double moreLess360 (double value) {while (value> 360 || value <0) {if (value> 360) value - =360; si no (valor <0) valor + =360; } return value;} // asegúrese de que un valor esté entre 0 y 24double moreLess24 (double value) {while (value> 24 || value <0) {if (value> 24) value - =24; si no (valor <0) valor + =24; } return value;} // convierte el número doble en Horas y Minutesvoid doubleToHrMin (número doble, int &hours, int &minutes) {hours =floor (moreLess24 (number)); minutes =floor (moreLess24 (number - hours) * 60);} void calcPrayerTimes (int year, int mes, int day, double longitude, double latitude, int timeZone, double fajrTwilight, double ishaTwilight, double &fajrTime, double &sunRiseTime, double &zuhrTime , double &asrTime, double &maghribTime, double &ishaTime) {doble D =(367 * año) - ((año + (int) ((mes + 9) / 12)) * 7/4) + (((int) (275 * mes / 9)) + día - 730531.5); doble L =280,461 + 0,9856474 * D; L =másMenos360 (L); doble M =357,528 + (0,9856003) * D; M =másMenos360 (M); doble Lambda =L + 1.915 * sin (degToRad (M)) + 0.02 * sin (degToRad (2 * M)); Lambda =moreLess360 (Lambda); doble oblicuidad =23,439 - 0,0000004 * D; doble Alfa =radToDeg (atan ((cos (degToRad (Oblicuidad)) * tan (degToRad (Lambda))))); Alfa =másMenos360 (Alfa); Alfa =Alfa - (360 * (int) (Alpha / 360)); Alpha =Alpha + 90 * (piso (Lambda / 90) - piso (Alpha / 90)); ST doble =100,46 + 0,985647352 * D; Dec doble =radToDeg (asin (sin (degToRad (Oblicuidad)) * sin (degToRad (Lambda)))); double Durinal_Arc =radToDeg (acos ((sin (degToRad (-0.8333)) - sin (degToRad (Dec)) * sin (degToRad (latitud))) / (cos (degToRad (Dec)) * cos (degToRad (latitud)) ))); mediodía doble =Alfa - ST; Mediodía =moreLess360 (mediodía); double UT_Noon =Mediodía - longitud; ////////////////////////////////////////////// // Cálculo de arcos de tiempos de oración &Times // ////////////////////////////////////////////// // 2) Hora de Zuhr [mediodía local] zuhrTime =UT_Noon / 15 + timeZone; // Asr Hanafi // doble Asr_Alt =radToDeg (atan (2 + tan (degToRad (latitud - Dec)))); doble Asr_Alt =radToDeg (atan (1.7 + tan (degToRad (latitud - Dec)))); // Asr Shafii // doble Asr_Alt =radToDeg (atan (1 + tan (degToRad (latitud - Dec)))); double Asr_Arc =radToDeg (acos ((sin (degToRad (90 - Asr_Alt)) - sin (degToRad (Dec)) * sin (degToRad (latitud))) / (cos (degToRad (Dec)) * cos (degToRad (latitud) )))); Asr_Arc =Asr_Arc / 15; // 3) Asr Time asrTime =zuhrTime + Asr_Arc; // 1) Hora de 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 (latitud))) / (cos (degToRad (Dec)) * cos (degToRad (latitud))) )); // 5) Isha Time ishaTime =zuhrTime + (Esha_Arc / 15); // 0) Fajr Time double Fajr_Arc =radToDeg (acos ((sin (degToRad (fajrTwilight)) - sin (degToRad (Dec)) * sin (degToRad (latitude))) / (cos (degToRad (Dec)) * cos ( degToRad (latitud))))); fajrTime =zuhrTime - (Fajr_Arc / 15); volver;} 

Esquemas


Proceso de manufactura

  1. Reloj de visión pov de Arduino
  2. El reloj IV9 Numitron más simple de bricolaje con Arduino
  3. Reloj de palabras simple (Arduino)
  4. Reloj maestro
  5. Controlar el aceptador de monedas con Arduino
  6. Arduino Temp. Monitor y reloj en tiempo real con pantalla 3.2
  7. ¡Arduino con Bluetooth para controlar un LED!
  8. ¡Visualización de una imagen en una pantalla LCD TFT con Arduino UNO!
  9. Persistencia de la visión
  10. Reloj despertador simple con DS1302 RTC
  11. Control de ventilador PWM de 4 pines y 25 kHz con Arduino Uno