Paso 4: Programar el reloj
Cómo cada componente del programa:Reloj en tiempo real
Después de ejecutar el SetTime inicial, es muy fácil de utilizar del DS1307. Asegúrese de incluir los archivos DS1307RTC.h y el Time.h e incluir la declaración "tmElements_t tm";. Para leer la hora del reloj, crear un if declaración diciendo "if(RTC.read(tm))" para comprobar si se puede leer el tiempo RTC. En eso si declaración puede obtener cualquier poción del tiempo escribiendo a cualquiera de los siguientes:
TM. Hora
TM. Minutos
TM. Día
TM. Mes
TM. Año
Zumbador
Usar la función tone() de Arduino para jugar notas de diferente frecuencia y duración en mi zumbador piezoeléctrico. PIN 9 sirve como una salida para el zumbador. La función de tono debe escribirse como sigue:
tono (pin, frecuencia, duración);
Me pareció que la mejor manera de jugar y la canción entera a crear 3 matrices que cuyos elementos individuales se accede en un bucle for. Fue un arreglo de discos para las frecuencias de cada nota, uno era para la duración de cada nota, y el último fue para las pausas entre las notas. Encontré toda esta información para el tema de Super Mario desde el puesto por recrear en este foro:
http://Arduino.CC/Forum/index.php/Topic, 8409.0.html
Él o ella utiliza una biblioteca separada de tono en su código, por lo que acaba de copiar las frecuencias, duraciones y pausas en mis propios arreglos. También he añadido 100 milisegundos a cada pausa y duración ya que la melodía era un poco rápida.
Pantalla LCD
Descargar la biblioteca Adafruit RGB LCD protector encontrado en el siguiente enlace:
https://github.com/Adafruit/Adafruit-RGB-LCD-Shield-Library
En el código, son Adafruit_MCP23017.h y Adafruit_RGBLCDShield.h para manipular la pantalla LCD.
Cómo debería funcionar el producto final:
La pantalla inicial en la pantalla LCD debe leer "Pulse Select". Tecla select cambiará el reloj del modo de alarma de reloj normal o volver al modo reloj. Una vez en modo de alarma, pulsar el botón derecho le permitirá configurar la alarma activar o desactivar (controlado por el botón izquierdo), la hora de la alarma (controlada por el botón UP) o ajustar los minutos de la alarma (controlado por el botón de abajo). No te preocupes si todo esto no tiene sentido todavía. Cada paso tiene instrucciones sobre qué botón pulsar en el camino.
Una vez que la alarma se va, usted puede desactivarlo pulsando simplemente el botón extra (atado en el frente de mi reloj).
El código completo:
Mi bucle es bastante complicado, pero el reloj funciona! Si tiene sugerencias sobre cómo simplificar el código, me avisas. Me resultó más difícil para programar que el botón presiona como acciones separadas y para conseguir el reloj para imprimir la fecha y hora para que continuamente actualizaría.
Esperemos que podrá entender en el caso de que desee realizar ajustes para sus los propios en el reloj!
#include < DS1307RTC.h >
#include < Time.h >
#include < Wire.h >
#include < Adafruit_MCP23017.h >
#include < Adafruit_RGBLCDShield.h >
Código para un ciclo de sueño despertador
Utiliza la pantalla LCD, botón, sensor de movimiento PIR, zumbador piezoeléctrico, reloj en tiempo Real
Estos #defines hacerlo fácil establecer el color de luz de fondo
#define rojo 0 x 1
#define amarillo 0x3
#define verde 0 x 2
#define verde azulado 0x6
#define azul 0x4
#define violeta 0x5
#define blanco 0x7
Frecuencias de tonos en la melodía de la alarma
melodía de int [] = {660,660,510,660,770,380,510,380,320,440,480,450,
430,380,660,760,860,700,760,660,520,580,480,510,380,320,440,480,
450,430,380,660,760,860,700,760,660,520,580,480,500,760,720,680,
620,650,380,430,500,430,500,570,500,760,720};
duración de los tonos jugados en la melodía de la alarma de
duración de int [] = {200,200,200,200,200,200,200,200,200,200,180,200,
200,200,180,150,200,180,150,180,180,180,180,200,200,200,200,180,
200,200,200,180,150,200,180,150,180,180,180,180,200,200,200,200,
250,250,200,200,200,200,200,200,200,200,200};
retardo entre tonos
int delayTime [] = {175,250,250,150,250,375,387,325,300,350,250,265,
175,250,200,200,175,250,175,275,250,175,175,275,375,300,350,250,265,
175,250,200,200,275,250,175,275,250,175,175,350,250,150,175,175,250,
250,175,175,250,175,150,210,250,150};
int switchPin = 5;
pirPin int = 6;
int buzzerPin = 9;
Selecciona ya sea alarma modo juego o reloj
int accesibilidadseleccionar;
entero de elegir que parte de la alarma para configurar
int alarmSelect;
Entero para configurar la alarma a on o off
int alarmSetOnInt;
Entero para la hora del ajuste de alarma
int alarmHourSet;
Número entero de minutos de alarma
int alarmMinSet;
Entero que indica si el botón ha sido presionado
int buttonVal;
Movimiento de seguimiento detectada entero
int motionDetected;
Si es o no la alarma en
pérdidaEn boolean = false;
Si va o no el alam actualmente
Boolean alarmGoingOff = false;
valor booleano que es true una vez que ha pasado el tiempo de alarma
Boolean alarmCanGoOff = false;
tmElements_t tm;
Lcd de Adafruit_RGBLCDShield = Adafruit_RGBLCDShield();
void setup() {}
Wire.Begin();
Serial.Begin(9600);
LCD.Begin(16,2);
Set backlight y mensaje inicial
lcd.setBacklight(VIOLET);
lcd.setCursor(1,1);
LCD.Print ("presionar seleccionar");
pinMode (pirPin, entrada);
accesibilidadseleccionar = 0;
alarmSelect = 0;
alarmSetOnInt = 0;
alarmHourSet = -1;
alarmMinSet = -1;
motionDetected = 0;
alarmGoingOff = false;
uint8_t i = 0;
}
void loop() {}
botones de uint8_t = lcd.readButtons();
buttonVal = digitalRead(switchPin);
if(buttonVal == High) {}
LCD.Clear();
pérdidaEn = false;
alarmCanGoOff = false;
alarmGoingOff = false;
}
Si la alarma no se va, imprimir la fecha normal y el tiempo
{if(!alarmGoingOff)}
printDateTime();
}
Si es que la alarma se apaga y no es la hora de alarma, la alarma continúa
Si (alarmGoingOff & tm. Minuto! = alarmMinSet) {}
LCD.Clear();
pérdidaEn =! pérdidaEn;
alarmGoingOff =! alarmGoingOff;
}
If {}
Si select botón, elija un modo de
if(Buttons & BUTTON_SELECT) {}
if(modeSelect>1) {}
accesibilidadseleccionar = 0;
}
LCD.Clear();
accesibilidadseleccionar accesibilidadseleccionar = 1;
alarmSelect = 0;
Delay(1000);
if(modeSelect == 1) {}
LCD.Clear();
lcd.setCursor(1,0);
LCD.Print ("Alarm Set");
lcd.setCursor(1,1);
LCD.Print ("prensa de derecha");
Delay(1000);
}
}
Si el modo seleccionado, es alarma, habilitar a configuración de alarma
if(modeSelect == 1) {}
if(Buttons & BUTTON_RIGHT) {}
if(alarmSelect>2) {}
alarmSelect = 0;
}
alarmSelect = alarmSelect + 1;
Delay(1000);
Mostrar si la alarma está activada o desactivada
if(alarmSelect == 1) {}
LCD.Clear();
{if(!alarmOn)}
lcd.setCursor(1,0);
LCD.Print ("alarma desactivada");
lcd.setCursor(1,1);
LCD.Print ("prensa de izquierda");
Delay(1000);
} else {} if(alarmOn)
lcd.setCursor(1,0);
LCD.Print ("alarma activada");
print2digits(alarmHourSet,10,0);
lcd.setCursor(12,0);
LCD.Print(":");
print2digits(alarmMinSet,13,0);
}
} else if(alarmSelect == 2) {}
LCD.Clear();
lcd.setCursor(1,0);
LCD.Print ("hora fijada");
lcd.setCursor(1,1);
LCD.Print ("presionar para arriba");
} else if(alarmSelect == 3) {}
LCD.Clear();
lcd.setCursor(1,0);
LCD.Print "(minutos juego del);
lcd.setCursor(1,1);
LCD.Print ("Presione");
}
}
}
Si la alarma está activada o desactivada
if(alarmSelect == 1) {}
if(Buttons & BUTTON_LEFT) {}
pérdidaEn =! pérdidaEn;
LCD.Clear();
Delay(1000);
{if(alarmOn)}
LCD.Print ("alarma activada");
} else {} if(!alarmOn)
LCD.Print ("alarma desactivada");
}
}
}
Ajustar hora
if(alarmSelect == 2) {}
if(Buttons & BUTTON_UP) {}
LCD.Clear();
alarmHourSet = alarmHourSet + 1;
if(alarmHourSet>24) {}
alarmHourSet = 0;
}
Delay(500);
}
print2digits(alarmHourSet,14,0);
}
Minutos
if(alarmSelect == 3) {}
if(Buttons & BUTTON_DOWN) {}
LCD.Clear();
alarmMinSet = alarmMinSet + 1;
if(alarmMinSet>59) {}
alarmMinSet = 0;
}
Delay(100);
}
print2digits(alarmMinSet,14,0);
}
}
Alarma puede ir una vez que el tiempo de alarma es igual a la hora actual
Si (pérdidaEn & alarmMinSet == tm. Minutos y alarmHourSet == tm. Hora & accesibilidadseleccionar! = 1) {}
alarmCanGoOff = true;
Serial.println ("alarma pueda");
}
Si la alarma puede apagarse, y que el reloj está en modo de reloj, la alarma
apagará después de 3 consecutivas detecciones de movimiento
Si (alarmCanGoOff & accesibilidadseleccionar! = 1) {}
Serial.println(alarmCanGoOff);
pirVal int = digitalRead(pirPin);
if(pirVal == High) {}
motionDetected ++;
Serial.println ("movimiento detectado");
Delay(1000);
}
if(pirVal == Low) {}
motionDetected = 0;
}
{if(alarmCanGoOff)}
Si (motionDetected > 2 || tm. Hora == alarmHourSet + 1) {}
Alarm();
motionDetected = 0;
}
}
}
}
Método de alarma. Cambia la pantalla y toca la melodía
{} void alarm()
LCD.Clear();
lcd.setCursor(1,0);
LCD.Print ("WAKE UPPPP!");
alarmGoingOff = true;
para (int i = 0; i < 54; i ++) {}
buttonVal = digitalRead(switchPin);
{if(buttonVal!=High)}
Delay(delayTime[i]);
tono (buzzerPin, melody[i],duration[i]);
}
}
}
imprimir la fecha y hora
void printDateTime() {}
if(RTC.Read(TM) & accesibilidadseleccionar == 2) {}
print2digits(TM. Hora, 1, 0);
lcd.setCursor(3,0);
LCD.Print(":");
print2digits(TM. Minutos, 4, 0);
lcd.setCursor(6,0);
LCD.Print(":");
print2digits(TM. Segundo, 7, 0);
print2digits(TM. Mes, 1, 1);
lcd.setCursor(3,1);
LCD.Print("/");
print2digits(TM. Día, 4, 1);
Serial.println (tm. Día);
}
}
Imprimir números en una ubicación utilizando dos dígitos (para el formato de reloj apropiado)
void print2digits (int number, int columna, int fila) {}
Si (número > = 0 & & número < 10) {}
lcd.setCursor(column,row);
LCD.Print('0');
lcd.setCursor(column+1,row);
LCD.Print(Number);
}
else if (cantidad > = 10) {}
lcd.setCursor(column,row);
LCD.Print(Number);
}
}