#701
01-10-2014, 04:00 PM
hola una cosa si alguien puede echarme una mano con mi codigo porque quiero que amanecer empiece por ejemplo a las 12:30 pero solo puedo hacerlo en horas enteras que pudo poner para minutos gracias
/**********************************************************************************************/
/* */
/* Programa : Atenuador de Luces para acuario. */
/* Autor : William Alvez */
/* Pais de Origen : España */
/* Fecha de Inicio : XX Septiembre de 2014 */
/* Fecha de Termino : XX Septiembre de 2014 */
/* version : 0.60 */
/* Comentarios : Este programa se maneja con un reloj de tiempo real y una pantalla LCD */
/* Para fijar la hora de amanecer , dia y atardecer del acuario. Utiliza */ /* iluminacion de led. */
/* */
/**********************************************************************************************/
#include <LiquidCrystal.h>
#include <Wire.h>
#define DS1307_I2C_ADDRESS 0x68
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}
//*****************************************************************************
// Convierte BCD (binario decimal codificado) a números normales decimales
//*****************************************************************************
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}
void setDateDs1307(
byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second)); // 0 a bit 7 inicia el reloj
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour)); // Si usted quiere 12 hora am/pm usted tiene que poner el
// bit 6 (tambien tiene que cambiar readDateDs1307)
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
//*********************************************************
// Establece la fecha y el tiempo del ds1307
//*********************************************************
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
// Resetea el registro puntero
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
// Alguno de estos necesitan enmascarar porque ciertos bits son bits de control
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f); // Need to change this if 12 hour am/pm
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
LiquidCrystal lcd(24, 23, 28, 27, 26, 25);
//****************************************************************
// ILUMINACION LUCES *
//****************************************************************
int led1 = 2; // Pin digital PWM
int led2 = 3; // Pin digital PWM
int led3 = 4; // Pin digital PWM
int led4 = 5; // Pin digital PWM
int led5 = 6; // Pin digital PWM
//****************************************************************
// Potencias *
//****************************************************************
int pamanecer= 20; // Potencia amanecer 0-100%
int pdia= 50; // Potencia luz dia 0-100%
int psol= 95; // Potencia luz Sol 0-100%
int patardecer= 25; // Potencia atardecer 0-100%
int pluna= 1; // Potencia de luna (1-10 valores PWM solo leds azules)
//****************************************************************
// Horas *
//****************************************************************
int hamanecer= 13; // Hora fase amanecer
int hdia= 14; // Hora fase día
int hsol= 16; // Hora fase Sol
int tsol= 5; // Duracion de Sol , horas
int hatardecer= 21; // Hora atardecer
int hluna= 22; // Hora fase luna
int tluna= 1; // Duración luna , horas
int vpwm= 2; // Tiempo del efecto en cada fase, minutos
//****************************************************************
// Calculos para el programa (no modificar) *
//****************************************************************
int pwm=0;
int pwmamanecer=(pamanecer*2.55);//Calculamos la potencia de salida
int pwmdia=(pdia*2.55);
int pwmsol=(psol*2.55);
int pwmatardecer=(patardecer*2.55);
int pwmluna=(pluna*2.55);
int faseluz = 0;
int delayamanecer=(vpwm*700000)/(pwmamanecer);//Calculamos cada cuanto tiempo da un paso de intensidad
int delaydia=(vpwm*600000)/(pwmdia-pwmamanecer);
int delaysol=(vpwm*800000)/(pwmsol-pwmdia);
int delayatardecer=(vpwm*300000)/(pwmsol-pwmatardecer);
int delayluna=(vpwm*800000)/(pwmatardecer-pwmluna);
//****************************************************************
// Setup() *
//****************************************************************
void setup()
{
//RELOJ//
Wire.begin();
Serial.begin(9600);
lcd.begin(16,2); // DEfine pantalla LCD de 16x2
/*
second = 00;
minute = 57;
hour = 12;
dayOfWeek = 3;
dayOfMonth = 1;
month = 10;
year = 14;
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
*/
//****************************************************************
// ILUMINACION *
//****************************************************************
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
}
//****************************************************************
// Loop () (Programa Principal) *
//****************************************************************
void loop()
{
/************************************************************/
/* Obtiene la hora desde el reloj de tiempo real */
/************************************************************/
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
lcd.setCursor(0,1);
if (dayOfMonth < 10)
lcd.print("0");
lcd.print(dayOfMonth, DEC);
lcd.setCursor(2,1);
lcd.print("/");
lcd.setCursor(3,1);
if (month < 10)
lcd.print("0");
lcd.print(month, DEC);
lcd.setCursor(5,1);
lcd.print("/");
if (year < 10)
lcd.print("0");
lcd.print(year, DEC);
lcd.setCursor(2,0);
if (hour < 10)
lcd.print("0");
lcd.print(hour, DEC);
lcd.setCursor(5,0);
lcd.print(":");
lcd.setCursor(7,0);
if (minute < 10)
lcd.print("0");
lcd.print(minute, DEC);
lcd.setCursor(10,0);
lcd.print(":");
if (second < 10)
lcd.print("0");
lcd.print(second, DEC);
lcd.setCursor(8,1);
switch (dayOfWeek)
{
case 1:
lcd.print(" Lunes");
break;
case 2:
lcd.print(" Martes");
break;
case 3:
lcd.print(" Miercoles");
break;
case 4:
lcd.print(" Jueves");
break;
case 5:
lcd.print(" Viernes");
break;
case 6:
lcd.print(" Sabado");
break;
case 7:
lcd.print(" Domingo");
break;
} // Cierre del switch
/*********************************************/
/* Ejecuta la subrutina de Luz */
/*********************************************/
luz();
}
/*********************************************************/
/* Subrutina de Luz() */
/*********************************************************/
void luz ()
{
//FASE 1 - AMANECER
if (hour >= hamanecer && hour < hdia && faseluz ==0){ //FASE1
if (pwm!=pwmamanecer) { //Hasta que el valor de pwm no llege al valor pwmamanecer ira aumentandolo
analogWrite (led1,pwm);//Escribimos la potencia
analogWrite (led2,pwm);//Lo mismo
pwm++;//sube un paso la intensidad
delay(delayamanecer);//Esperamos para cumplir el tiempo de dimeado deseado
}
else
{faseluz = 1;}//Cuando el valor pwm ya ha llegado al deseado pasaremos a la siguiente fase
}
//FASE 2 - DIA
if (hour >= hdia && hour < hsol && faseluz <2) { //FASE2
if (pwm!=pwmdia){
analogWrite (led1,pwm);//Escribimos la potencia en el canal de leds azules
analogWrite (led2,pwm);//Lo mismo para el blanco
analogWrite (led3,pwm);//Escribimos la potencia en el canal de leds azules
analogWrite (led4,pwm);//Lo mismo para el blanco
analogWrite (led5,pwm);//Escribimos la potencia en el canal de leds azules
pwm++;
delay(delaydia);
}
else
{faseluz = 2;}
}
//FASE 3 - SOL
if (hour >= hsol && hour < hatardecer && faseluz <3) { //FASE3
if (pwm!=pwmsol) {
analogWrite (led1,pwm);//Escribimos la potencia en el canal de leds azules
analogWrite (led2,pwm);//Lo mismo para el blanco
analogWrite (led3,pwm);//Escribimos la potencia en el canal de leds azules
analogWrite (led4,pwm);//Lo mismo para el blanco
analogWrite (led5,pwm);//Escribimos la potencia en el canal de leds azules
pwm++;
delay(delaysol);
}
else
{faseluz = 3;}
}
//FASE 4 - ATARDECER I
if (hour >= hsol+tsol && hour < hatardecer && faseluz <4) { //FASE4
if (pwm!=pwmdia){
if (pwm==255){
pwm=pwmdia-1;
} //Por si reiniciamos en esta fase
analogWrite (led1,pwm);//Escribimos la potencia en el canal de leds azules
analogWrite (led2,pwm);//Lo mismo para el blanco
analogWrite (led3,pwm);//Escribimos la potencia en el canal de leds azules
analogWrite (led4,pwm);//Lo mismo para el blanco
analogWrite (led5,pwm);//Escribimos la potencia en el canal de leds azules
pwm--;
delay(delaysol);
}
else
{faseluz = 4;}
}
//FASE 5 - ATARDECER II
if (hour >= hatardecer && hour < hluna && faseluz <5){ //FASE5
if (pwm!=pwmatardecer){
if (pwm==0){
pwm=pwmatardecer+1;
} //Por si reiniciamos en esta fase
analogWrite (led1,pwm);//Escribimos la potencia en el canal de leds azules
analogWrite (led2,pwm);//Lo mismo para el blanco
analogWrite (led3,pwm);//Escribimos la potencia en el canal de leds azules
analogWrite (led4,pwm);//Lo mismo para el blanco
analogWrite (led5,pwm);//Escribimos la potencia en el canal de leds azules
pwm--;
delay(delayatardecer);
}
else
{faseluz = 5;}
}
//FASE 6 - LUNA
if (hour >= hluna && hour < hluna+tluna && faseluz <6){ //FASE6
if (pwm!=pwmluna) {
if (pwm==255){
pwm=pwmluna-1;
} //Por si reiniciamos en esta fase
analogWrite (led1,pwm);//Escribimos la potencia en el canal de leds azules
analogWrite (led2,pwm);//Lo mismo para el blanco
analogWrite (led3,pwm);//Escribimos la potencia en el canal de leds azules
analogWrite (led4,pwm);//Lo mismo para el blanco
analogWrite (led5,pwm);//Escribimos la potencia en el canal de leds azules
pwm--;
delay(delayluna);
}
else
{
faseluz = 6;
analogWrite (led2,0);//Lo mismo para el blanco
analogWrite (led3,0);//Escribimos la potencia en el canal de leds azules
analogWrite (led4,0);
}
}
//FASE 7 - APAGADO
if (hour >=hluna+tluna && faseluz==6) {
if (pwm!=0){
pwm--;
analogWrite (led5,pwm);
analogWrite (led1,pwm);
delay(delayluna);
}
else
{faseluz = 0;}
}
Serial.print("pwm:");
Serial.print(pwm);
Serial.print(" pwmamanecer:");
Serial.print(pwmamanecer);
Serial.print(" pwmdia:");
Serial.print(pwmdia);
Serial.print(" pwmsol:");
Serial.print(pwmsol);
Serial.print(" pwmatardecer:");
Serial.print(pwmatardecer);
Serial.print(" pwmluna:");
Serial.print(pwmluna);
Serial.print(" fase luz:");
Serial.println(faseluz);
delay(1000);
} /* Cierre de loop () */