Hola a todos.
Después de mucho cacharrear y leer los códigos de los demás, decidí usarlos en mi propio beneficio copiando y pegando las partes que necesitaba y adaptando lo que no me valía, amos que soy un jeta de cuidao
Necesito que alguien que sepa más que yo me revise y me corrija el resultado ya que hay un par de fallos garrafales que no encuentro.
Mi intención fue usar el código de jmcadsl pero simplificarlo:
-sólo hay 3 horas: encendido apagado y apagado de luna
-tres duraciones diferentes de dimeo
-tres potencias de canales de leds: azules blancos y mezcla (aqui ya veremos pero creo que seran 2 blancos, 2 azules, 2 rosas y 2 morados o actínicos) para poner el acuario del color que mas me guste.
Algo que parece sencillo pero no lo es tanto para alguien que nunca ha programado nada y hasta el dia 15 de enero nisiquiera sabía lo que era arduino
Lo compila bien y los problemas vienen al ejecutar:
a) cada vez que da una vuelta el loop, el pwm se pone a 0, suma 1, se vuelve a poner a 0, suma 1..........
b) los tiempos de delay entre cada paso estan calculados y he repasado la cuenta un montón de veces, pero el
tiempo de ciclo no se corresponde con el que debería o al menos me da a mi esa impresión, al abrir el serial
monitor el refresco de datos tarda un huevo.
Este es el código:
Después de mucho cacharrear y leer los códigos de los demás, decidí usarlos en mi propio beneficio copiando y pegando las partes que necesitaba y adaptando lo que no me valía, amos que soy un jeta de cuidao
Necesito que alguien que sepa más que yo me revise y me corrija el resultado ya que hay un par de fallos garrafales que no encuentro.
Mi intención fue usar el código de jmcadsl pero simplificarlo:
-sólo hay 3 horas: encendido apagado y apagado de luna
-tres duraciones diferentes de dimeo
-tres potencias de canales de leds: azules blancos y mezcla (aqui ya veremos pero creo que seran 2 blancos, 2 azules, 2 rosas y 2 morados o actínicos) para poner el acuario del color que mas me guste.
Algo que parece sencillo pero no lo es tanto para alguien que nunca ha programado nada y hasta el dia 15 de enero nisiquiera sabía lo que era arduino
Lo compila bien y los problemas vienen al ejecutar:
a) cada vez que da una vuelta el loop, el pwm se pone a 0, suma 1, se vuelve a poner a 0, suma 1..........
b) los tiempos de delay entre cada paso estan calculados y he repasado la cuenta un montón de veces, pero el
tiempo de ciclo no se corresponde con el que debería o al menos me da a mi esa impresión, al abrir el serial
monitor el refresco de datos tarda un huevo.
Este es el código:
Código:
///////////////////////////////////////////////////////
// FRONKONSTIN REEF CONTROLER V1.0 //
///////////////////////////////////////////////////////
// El nombre es en honor a la peli de Mel Brooks "El jovencito Frankestein"
// basicamente porque esta echo a base de cortar, copiar, cacharrear y pegar
// de momento solo hay control de leds y casi todo esta basado en el "L&S Compact Reef"
// gracias a sus creadores.
// Mas adelante (segun lleguen los cacharritos) incorporare control de temperatura de Ph
// cuatro peristalticas (tres para el balling y otra de reposicion), pantalla SLCD...
/*
Arduino MEGA (Luces Led PWM)
Pines(I/O)
D5 - (PWM) Canal Led Azul
D6 - (PWM) Canal Led Blanco
D7 - (PWM) Canal Led Mezcla
D13 - LED Control
D20 - (SDA) Reloj
D21 - (SCL) Reloj
*/
#include <Wire.h> // Esta es la libreria de comunicacion I2C
#define DS1307_I2C_ADDRESS 0x68 //reloj
//VARIOS //
byte ledcontrolv = 13;//led control
//RELOJ //
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
byte decToBcd(byte val) // Convierte números normales decimales a BCD (binario decimal codificado)
{
return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val) // Convierte BCD (binario decimal codificado) a números normales decimales
{
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((uint8_t) 0);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
// Establece la fecha y la hora 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((uint8_t) 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);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
// ILUMINACION //
byte ledazul = 5 , ledblanco = 6 , ledmezcla = 7; //Luces
//Potencias
int pmaxazul= 100; // Poténcia máxima luz azul 0-100%
int pmaxblanco= 100; // Poténcia máxima luz blanca 0-100%
int pmaxmezcla= 100; // Poténcia máxima luz mezcla 0-100%
int pluna= 10; // Potencia de luna (1-10 valores PWM solo leds azules)
//Horas
int hamanecer= 12; // Hora amanecer
int hatardecer= 22; // Hora atardecer
int hfinluna= 23; // Hora fin luna
int duraman= 5; // Duración del amanecer en minutos
int duratar= 5; // Duración del atardecer en minutos
int durafinluna= 5; // Duracion del fin de luz de luna en minutos
//Calculos para el programa no modificar
int pwmazul=0;
int pwmblanco=0;
int pwmmezcla=0;
int pwmmaxazul=(pmaxazul*2.55);
int pwmmaxblanco=(pmaxblanco*2.55);
int pwmmaxmezcla=(pmaxmezcla*2.55);
int pwmluna=pluna;
int delayamanecer=(duraman*60000)/((pwmmaxazul+pwmmaxblanco+pwmmaxmezcla)/3);//Calculamos cada cuanto tiempo da un paso de intensidad
int delayatardecer=(duratar*60000)/((pwmmaxazul+pwmmaxblanco+pwmmaxmezcla)/3);
int delayluna=(durafinluna*60000)/(pwmluna);
void setup()
{
//VARIOS//
pinMode (ledcontrolv, OUTPUT);//leds control
//RELOJ//
Wire.begin();
Serial.begin(9600);
//ILUMINACION//
pinMode (ledazul, OUTPUT);
pinMode (ledblanco, OUTPUT);
pinMode (ledmezcla, OUTPUT);
}
void loop()
{
ledvoff();//Apagamos led control
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); //Miramos la hora
monitorserie();//Mostramos reloj en monitor serie
luz();// Ejecutamos el programa Luz
ledvon(); //Encendemos led control
delay(100); //Pausa de 0,1 segundo
}
void luz()
{
if (hour >= hamanecer && hour < hatardecer)
{
if (pwmazul <= pwmmaxazul)
{
analogWrite(ledazul,pwmazul);
pwmazul++;
Serial.println(" Led Azul:");
Serial.println(pwmazul);
}
if (pwmblanco <= pwmmaxblanco)
{
analogWrite(ledblanco,pwmblanco);
pwmblanco++;
Serial.println(" Led Blanco:");
Serial.println(pwmblanco);
}
if (pwmmezcla <= pwmmaxmezcla)
{
analogWrite(ledmezcla,pwmmezcla);
pwmmezcla++;
Serial.println(" Led Mezcla:");
Serial.println(pwmmezcla);
}
delay(delayamanecer);
}
if (hour >= hatardecer && hour < hfinluna)
{
if (pwmazul > pwmluna)
{
analogWrite(ledazul,pwmazul);
pwmazul--;
Serial.println(" Led Azul:");
Serial.println(pwmazul);
}
if (pwmazul < pwmluna)
{
analogWrite(ledazul,pwmazul);
pwmazul++;
Serial.println(" Led Azul:");
Serial.println(pwmazul);
}
if (pwmblanco > 0)
{
analogWrite(ledblanco,pwmblanco);
pwmblanco--;
Serial.println(" Led Blanco:");
Serial.println(pwmblanco);
}
if (pwmmezcla > 0)
{
analogWrite(ledmezcla,pwmmezcla);
pwmmezcla--;
Serial.println(" Led Mezcla:");
Serial.println(pwmmezcla);
}
delay(delayatardecer);
}
if (hour = hfinluna)
{
if (pwmazul > 0)
{
analogWrite(ledazul,pwmazul);
pwmazul--;
}
if (pwmblanco > 0)
{
analogWrite(ledblanco,pwmblanco);
pwmblanco--;
}
if (pwmmezcla > 0)
{
analogWrite(ledmezcla,pwmmezcla);
pwmmezcla--;
}
delay(delayluna);
}
}
void ledvon()
{
digitalWrite (ledcontrolv, HIGH);
}
void ledvoff()
{
digitalWrite (ledcontrolv, LOW);
}
void monitorserie()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
Serial.print("20");
if (year < 10) Serial.print("0");
Serial.print(year, DEC);
Serial.print("/");
if (month < 10) Serial.print("0");
Serial.print(month, DEC);
Serial.print("/");
if (dayOfMonth < 10) Serial.print("0");
Serial.print(dayOfMonth, DEC);
Serial.print(" ");
if (hour < 10) Serial.print("0");
Serial.print(hour, DEC);
Serial.print(":");
if (minute < 10) Serial.print("0");
Serial.print(minute, DEC);
Serial.print(":");
if (second < 10) Serial.print("0");
Serial.print(second, DEC);
Serial.print(" Dia de la semana:");
// Serial.println(dayOfWeek, DEC); Lo elimino para que no ponga el numero en el serial monitor "cosas mias"
switch (dayOfWeek)
{
case 1:
Serial.println(" Lunes");
break;
case 2:
Serial.println(" Martes");
break;
case 3:
Serial.println(" Miercoles");
break;
case 4:
Serial.println(" Jueves");
break;
case 5:
Serial.println(" Viernes");
break;
case 6:
Serial.println(" Sabado");
break;
case 7:
Serial.println(" Domingo");
break;
}
Serial.println(" Led Azul:");
Serial.println(pwmazul);
Serial.println(" Led Blanco:");
Serial.println(pwmblanco);
Serial.println(" Led Mezcla:");
Serial.println(pwmmezcla);
delay(1000); //Pausa durante 1 segundo
}