Acuariofilia Madrid

Versión completa: Aula Arduino para principiantes.
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
si tengo ese lcd pero por ahora solo me sale la fecha y la hora yo quiero poder hacer el dimeo de los led y que el lcd me diga que face esta el dimeo algo de eso
William, las posibilidades del Arduino son muchas, casi las mismas que te desanimes y tires el LCD, Arduino y reloj por las ventana...

Antes en embarcarte en un proyecto tan ambicioso como es el CAO1, te aconsejo te familiarices con en entorno Arduino. Conecta el reloj, LCD, relés, el sensor de temoeratura, etc. Los códigos que aporta el ide Arduino son muy ilustrativos.

Te lo dice uno que hay dejado aparcado el Arduino varias veces.
hola mira yo no entiendo yo solo quiero si alguien puede echarme una mano para hacer un codigo para los led para hacer el amanecer sol atardecer
y que salga en la pantalla yo que salga la fecha y la hora si lo e echo ya me falta el tema de como se hace el tema de los led que los tengo en 5 canales
El código ya lo tienes CAO1.

Saludos
He estado desconectado de Internet, por eso tardo en contestar.

William, lo primero que deberías hacer es familiarizarte con los ejemplos que existen para las diferentes librerías que manejan el hardware tal y como te ha dicho Xavi.

No tiene sentido que pretendas programar un controlador de dimmeo porque ya lo tienes realizado en CAO1 en un módulo aparte, pero te cuento cual sería la forma de hacerlo.

A muy grandes rasgos tienes que ser capaz de hacer corresponder horas minutos y segundos con un dato de tipo entero para que sea algo manejable. Te cuento como lo hice yo.

Con el número de horas minutos y segundos puedes calcular el número de décimas de minuto del día Eso daría un número comprendido entre 0 (para las 00:00:00) y 14400 =24*60*10 (para las 24:00:00) Bueno en realidad iría entre 0 y 1439 porque después del 1439 viene el 0 nuevamente.

La zona (o fase) del día la tienes que definir tu determinando los límites de cada zona (o fase) y a cada momento del día entre 0 y 1439 le corresponderá un valor de dimeo para cada canal.

Habrá otras formas de hacerlo, pero en cualquier caso vas a tener que vértelas con un tipo de arimética un tanto especial. No es artimética de fechas ni aritmética de enteros, es algo diferente.


Quizás esto no habrá sido de gran ayuda pero intento explicarte que hay cosas que son difícilmente explicables en pocas y sencillas palabras porque si bien una idea puede parecer sencilla programarla puede costar algo más realizarla.

La correspondencia entre momento del día y la intensidad de dimeo en una salida de Arduino puedes imaginarla como una función donde tu pasas el momento del día y te devuelve un entero que es el valor de dimeo. Eso ocultaría toda la complejidad de esa función. Eso ya lo tienes hecho en Dimmer1C para un solo canal y en CAO1 para cuatro canales.

He subido el código de CAO1 versión 1.0.0 (BETA).

[attachment=1058]

Las instrucciones están en el fichero Leame.txt (o Leame.odt)

Si alguien lo quiere probar asumo que tendrá que preguntar algo más.
Estoy escribiendo un libro pero aún no lo he terminado.
[Imagen: LibroCAO1-768x1024.jpg]
../CAO1_LIB/Cao1_DS18x20.h ahi me da error
(22-09-2014, 09:04 PM)william escribió: [ -> ]../CAO1_LIB/Cao1_DS18x20.h ahi me da error

Lo probé antes de subirlo.

¿Qué tipo de error de da?
In file included from CAO1_1.ino:18:
Cao1_DS18x20.h:1: error: expected unqualified-id before '.' token
In file included from CAO1_1.ino:38:
CAO1_1.h:72: error: 'Cao1_Sensor' does not name a type
CAO1_1.h:73: error: 'Cao1_Sensor' does not name a type
CAO1_1:41: error: 'OneWire' does not name a type
CAO1_1:42: error: 'LiquidCrystal_I2C' does not name a type
CAO1_1:43: error: 'Cao1_Sensor' does not name a type
CAO1_1:44: error: 'Cao1_Sensor' does not name a type
CAO1_1:45: error: 'Cao1_Sensor' does not name a type
CAO1_1.ino: In function 'void SafeMode()':
CAO1_1:73: error: 'SensTempAcua' was not declared in this scope
CAO1_1:74: error: 'SensTempLeds' was not declared in this scope
CAO1_1:75: error: 'SensPhAn' was not declared in this scope
CAO1_1.ino: In function 'void CR(boolean)':
CAO1_1:126: error: 'Buzz' was not declared in this scope
CAO1_1:129: error: 'LCD' was not declared in this scope
CAO1_1.ino: In function 'void CaoMonitoringProc()':
CAO1_1:145: error: 'DateTime' was not declared in this scope
CAO1_1:145: error: expected `;' before 'now'
CAO1_1:148: error: 'SensTempAcua' was not declared in this scope
CAO1_1:149: error: 'SensTempLeds' was not declared in this scope
CAO1_1:150: error: 'SensPhAn' was not declared in this scope
CAO1_1:152: error: 'now' was not declared in this scope
CAO1_1:153: error: 'LCD' was not declared in this scope
CAO1_1:160: error: 'Dimmer' was not declared in this scope
CAO1_1:193: error: 'Buzz' was not declared in this scope
CAO1_1.ino: In function 'int GetTempAcu()':
CAO1_1:205: error: 'ds18x20' was not declared in this scope
CAO1_1.ino: In function 'int GetTempLeds()':
CAO1_1:214: error: 'ds18x20' was not declared in this scope
CAO1_1.ino: In function 'int GetPhAcu()':
CAO1_1:222: error: 'PhSh' was not declared in this scope
CAO1_1.ino: In function 'void LeerBotonera()':
CAO1_1:229: error: 'Pulsad' was not declared in this scope
CAO1_1:232: error: 'MenuPrincipal' was not declared in this scope
CAO1_1.ino: In function 'void setup()':
CAO1_1:256: error: 'Buzz' was not declared in this scope
CAO1_1:257: error: 'LCD' was not declared in this scope
CAO1_1:259: error: 'Pulsad' was not declared in this scope
CAO1_1:264: error: 'Confirm' was not declared in this scope
CAO1_1:285: error: 'Parm' was not declared in this scope
CAO1_1:288: error: 'Dimmer' was not declared in this scope
CAO1_1:290: error: 'RTC' was not declared in this scope
CAO1_1:292: error: 'ds18x20' was not declared in this scope
CAO1_1:296: error: 'CH_FONT_DEGRE' was not declared in this scope
CAO1_1:305: error: 'SensTempAcua' was not declared in this scope
CAO1_1:305: error: 'EP_MIN_TMP_ACU' was not declared in this scope
CAO1_1:311: error: 'SensTempAcua' was not declared in this scope
CAO1_1:311: error: 'EP_MIN_TMP_ACU' was not declared in this scope
CAO1_1:317: error: 'SensTempLeds' was not declared in this scope
CAO1_1:317: error: 'EP_MIN_TMP_LED' was not declared in this scope
CAO1_1:323: error: 'SensTempLeds' was not declared in this scope
CAO1_1:323: error: 'EP_MIN_TMP_LED' was not declared in this scope
CAO1_1:333: error: 'PhSh' was not declared in this scope
CAO1_1:335: error: 'SensPhAn' was not declared in this scope
CAO1_1:335: error: 'EP_MIN_PH' was not declared in this scope
CAO1_1:341: error: 'SensPhAn' was not declared in this scope
CAO1_1:341: error: 'EP_MIN_PH' was not declared in this scope
CAO1_1:348: error: 'SensTempAcua' was not declared in this scope
CAO1_1:349: error: 'SensTempLeds' was not declared in this scope
CAO1_1:350: error: 'SensPhAn' was not declared in this scope
CAO1_1:361: error: 'DelayPlus' was not declared in this scope
CAO1_1.ino: In function 'void loop()':
CAO1_1:373: error: 'DelayPlus' was not declared in this scope
CAO1_1:375: error: 'Dimmer' was not declared in this scope

esos errores a que se deben
Acabo de:
1) Crear una carpeta TEST
2) Dentro de esta creo dos carpetas.
3) En una he descargado el fichero Zip que subí a ciberdroide y en la otra el fichero Zip que subí a acuariofiliamadrid.org.
4) Compruebo con md5sum que ambos ficheros son idénticos.
5) Desempaqueto el de acuariofiliamadrid.
6) Lo compilo sin errores.
7) Activo em monitor. Solo me aparece el error relativo a un sensor que no tengo conectado.

Todo esto lo he grabado para que se vea lo fácil que en principio debería ser instalarlo una vez que se tiene el IDE bien configurado.

El vídeo que acabo de grabar con la captura de mis comprobaciones es ESTE VIDEO

No tiene audio pero sigue las comprobaciones que acabo de mencionar.

El error concreto que a ti te da no tiene mucha lógica. Dice que ese fichero tiene un error en la primera línea, pero todos mis ficheros empiezan con 9 líneas de comentarios muy parecidos. He mirado y no veo nada sospechoso.
Yo no estoy por casa y hasta mañana noche, en cuando pueda instalo CAO1 y comento el resultado.

Imagino que no tener el sensor PH no importará para la instalación del programa.

Saludos
hola comento lo que e echo asta ahora la pantalla funciona ahora si alguien puede echar una mano para hacer que por ejemplo el día de la semana no me sale en el lcd ese es uno el otro como tengo que hacer para que en el lcd aparte de la fecha y hora me valla diciendo también en la faces que esta la pantalla por ejemplo con la botonera gracias

#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) );
}

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(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);





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= 100; // 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);

void setup()
{
//RELOJ//

Wire.begin();
Serial.begin(9600);
lcd.begin(16,2); // DEfine pantalla LCD de 16x2
/*
second = 00;
minute = 32;
hour = 14;
dayOfWeek = 5;
dayOfMonth = 12;
month = 8;
year = 11;

setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
*/

//ILUMINACION//
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
}

void loop()
{

getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); //Miramos la hora


lcd.setCursor(0,0);
if (dayOfMonth < 10) lcd.print("0");
lcd.print(dayOfMonth, DEC);
lcd.setCursor(2,0);
lcd.print("/");
lcd.setCursor(3,0);
if (month < 10) lcd.print("0");
lcd.print(month, DEC);
lcd.setCursor(5,0);
lcd.print("/");
if (year < 10) lcd.print("0");
lcd.print(year, DEC);

lcd.setCursor(9,0);
if (hour < 10) lcd.print("0");
lcd.print(hour, DEC);
lcd.setCursor(11,0);
lcd.print(":");
lcd.setCursor(12,0);
if (minute < 10) lcd.print("0");
lcd.print(minute, DEC);
lcd.setCursor(14,0);
lcd.print(":");
if (second < 10) lcd.print("0");
lcd.print(second, DEC);
lcd.setCursor(14,0);

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;
}

luz();// Ejecutamos el programa Luz
delay(1000); //Pausa de 0,1 segundo

}

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 (led1,0);//Escribimos la potencia en el canal de leds azules
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);
delay(delayluna);
}
else
{faseluz = 0;}

}

o si ves que algo puede ser mas simple dime antonio
(22-09-2014, 10:36 PM)xavi escribió: [ -> ]Yo no estoy por casa y hasta mañana noche, en cuando pueda instalo CAO1 y comento el resultado.

Imagino que no tener el sensor PH no importará para la instalación del programa.

Saludos

No, no importa.
Lo importante es comprobar que compile, y ejecutarlo en un Arduino Mega 2560. Muchas gracias Xavi.
(23-09-2014, 12:26 AM)william escribió: [ -> ]hola comento lo que e echo asta ahora la pantalla funciona ahora si alguien puede echar una mano para hacer que por ejemplo el día de la semana no me sale en el lcd ese es uno el otro como tengo que hacer para que en el lcd aparte de la fecha y hora me valla diciendo también en la faces que esta la pantalla por ejemplo con la botonera gracias

#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) );
}

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(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);





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= 100; // 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);

void setup()
{
//RELOJ//

Wire.begin();
Serial.begin(9600);
lcd.begin(16,2); // DEfine pantalla LCD de 16x2
/*
second = 00;
minute = 32;
hour = 14;
dayOfWeek = 5;
dayOfMonth = 12;
month = 8;
year = 11;

setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
*/

//ILUMINACION//
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
}

void loop()
{

getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); //Miramos la hora


lcd.setCursor(0,0);
if (dayOfMonth < 10) lcd.print("0");
lcd.print(dayOfMonth, DEC);
lcd.setCursor(2,0);
lcd.print("/");
lcd.setCursor(3,0);
if (month < 10) lcd.print("0");
lcd.print(month, DEC);
lcd.setCursor(5,0);
lcd.print("/");
if (year < 10) lcd.print("0");
lcd.print(year, DEC);

lcd.setCursor(9,0);
if (hour < 10) lcd.print("0");
lcd.print(hour, DEC);
lcd.setCursor(11,0);
lcd.print(":");
lcd.setCursor(12,0);
if (minute < 10) lcd.print("0");
lcd.print(minute, DEC);
lcd.setCursor(14,0);
lcd.print(":");
if (second < 10) lcd.print("0");
lcd.print(second, DEC);
lcd.setCursor(14,0);

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;
}

luz();// Ejecutamos el programa Luz
delay(1000); //Pausa de 0,1 segundo

}

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 (led1,0);//Escribimos la potencia en el canal de leds azules
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);
delay(delayluna);
}
else
{faseluz = 0;}

}

o si ves que algo puede ser mas simple dime antonio

Tu programa no aparece indentado porque lo justifica todo a la izquierda, pero puedo ver la indentación mientras edito la respuesta incluyendo la cita. (algo es algo). De todas formas, no es un programa de fácil lectura.

Te recomiendo hacer la función loop() cortita, porque así podrás seguir mejor la lógica del programa. Loop() debería limitarse a llamar una serie de funciones que consuman poco tiempo. En el caso de que algunas de ellas tengan que ejecutarse simultáneamente, hay que establecer alguna política de turnos de ejecución.

Cuando no sabes lo que está ocurriendo hay que poner trazas de ejecución. Es decir, sentencias que envíen información al monitor conectado al puerto Serial.

Puedes poner en la primera línea de las funciones que parezcan no ejecutarse una sentencia del tipo Serial.println("Entramos en la funcion luz()");

Pon trazas de ese tipo dentro de cada fase de la función luz().
Una vez que sepas que la lógica es correcta puede que quieras sacar algo por el lcd.

Corrigeme si me equivoco. Creo que estás usando pausas de tiempo gigantescas. delays(ms) con valores muy altos y el programa se quedará como muerto durante un montón de tiempo sin hacer nada y no podrás actualizar el reloj a cada segundo.
si mietras esta en las pausas se queda el reloj parado pero es que sino ago esas pausas como tengo que hacer ? para que la luz suba poco a poco y eso que me dices de serial.printnl que lo ponga donde
(23-09-2014, 11:00 AM)william escribió: [ -> ]si mietras esta en las pausas se queda el reloj parado pero es que sino ago esas pausas como tengo que hacer ? para que la luz suba poco a poco y eso que me dices de serial.printnl que lo ponga donde

Saber poner trazas a un programa es fundamental. Si sospechas de una parte que no está funcionando como debe, pon una traza que muestre que la ejecución pasa por ese lado. Si dudas de que el valor de una variable sea el correcto en determinado momento, pon una traza. Incluso si crees que algo está bien pero da problemas confirma con una traza para que muestre lo que tu esperas que debe mostrar.

Me preguntas que cómo lo tienes que hacer, pero te repito que tengo hecho un dimmer ya hecho para cuatro canales en CAO1 y otro para un solo canal en Dimmer1c. Deberías estudiarlo y tomar las ideas que te guste y dejar lo que te sobre, si es que sobra algo.

Ya sé que mi código te parece muy complicado. Si lo hiciera con menos líneas, la gente que lo usara me iría pidiendo mejoras, es decir pedirían las líneas que faltan. Para ello tendría que ir añadiendo mejoras parche a parche y finalmente todos terminarían diciendo que menuda mierda de programa porque tampoco esa es la mejor forma de desarrollar una aplicación.

Te he dado pistas de como hay que hacerlo. Te he sugerido implementar turnos de ejecución para lograr la concurrencia de ciertos procesos porque es la forma más sencilla de implementar concurrencia, pero yo la concurrencia la implemento de una forma diferente. En lugar de usar delay() uso esperas activas. Son funciones que consumen ese tiempo pero sin perderlo porque aprovechan ese tiempo para ejecutar otras cosas. La concurrencia se puede implementar de varias formas y cada una tiene sus ventajas e inconvenientes.

La clave de la ejecución por turnos es que el bucle loop() sea muy rápido y llame a otras funciones que lo primero que comprobarán es si es el momento de ejecutarse o de terminar rápido sin hacer nada, pero que en cualquier caso nunca harán delay(), nunca perderán tiempo, serán muy rápidas. loop() actuará dando oportunidades a todos los procesos y estos deciden si les toca hacer algo o no.