Dimmer con 2 canales (luz día y luz luna)

Registrado
18 Oct 2006
Mensajes
159
Ubicación
España
Provincia
Granada
Pues este es mi proyecto.
Es un arduino UNO con un reloj RTC DS1307 y un LCD Keypad shield con botones.
Lo que hace es hacer el dimeo de amanecer y el de anochecer por un canal (puesto que mi lámpara de led solo tiene un canal) y el dimmeo de luz de luna por otro canal. Pero podéis ampliar todos los canales que necesitéis, siempre que tengáis patillas PWM disponibles en vuestro arduino.

Con el LCD muestro el día, fecha y hora y puedo modificar la hora de amanecer, anochecer y la intensidad máxima con los botones. También puedo modificar la hora de encendido, apagado y la intensidad máxima de la luz de luna.

El periodo de luz lunar se repite cada 28 días. Comienza el día 21 por la noche y acaba el día 28 por la mañana. Esto lo podéis modificar cambiando el código fuente. Pero supongo que no hará falta.

Componentes necesarios:

- Arduino UNO
- Reloj RTC DS1307
- LCD Keypad Shield

Para el circuito:

- 1 Fuente de 12 Voltios
- 4 clemas de 2 conectores atornillados
- 1 Dual Mosfet ICL7667 + base de 8 patillas
- 1 Reductor de corriente LC7810, para que pasen sólo 10V. como máximo a las Meanwell.
- 1 Condensador de 10 microfaradios, para estabilizar la corriente.
- 2 resistencias de 4,7 ohmios
- 1 led (opcional, lo pongo para saber cuando estoy en un bucle de dimmeo)

Comienzo con el esquema eléctrico. He usado este de shoptronica:

[TodoMarino.com] Dimmer con 2 canales (luz día y luz luna)

La foto del circuito electrónico una vez soldado:

[TodoMarino.com] Dimmer con 2 canales (luz día y luz luna)

Las resistencias están conectadas entre las patillas PWM del arduino y la patilla correspondiente del ICL7667 para limitar la corriente del arduino.

Al keypad shield con botones le he soldado unas tiras de hembras para usar esas conexiones
[TodoMarino.com] Dimmer con 2 canales (luz día y luz luna)

También le he doblado una patilla para poder sacar la patilla 11 hacia el circuito electrónico:
[TodoMarino.com] Dimmer con 2 canales (luz día y luz luna)

[TodoMarino.com] Dimmer con 2 canales (luz día y luz luna)

Vista general de todo:

[TodoMarino.com] Dimmer con 2 canales (luz día y luz luna)

Consideraciones:

- El led que pongo en la placa es opcional. Pero si no lo ponéis se debe conectar la tierra del LCD/Arduino con la tierra del circuito electrónico. Esto es de vital importancia para que todo funcione.
- La seleccion de hora de amanecer-anochecer e intensidad máxima de luz, así como la selección de la hora de encendido-apagado e intensidad de la luz de luna se hace desde los botones del LCD (superfácil).
- Como no me he querido complicar demasiado, el dimmeo de luz de luna, tanto al encender como al apagar, usa la función delay(), así que mientras dure el dimmeo el arduino estará ocupado y no podremos cambiar nada con las teclas del LCD. Esto no pasa con el dimmeo de amanecer-anochecer ( sí ya sé... soy un poco perro por no hacer lo mismo con la luz de luna).
- Cambiar la duración de los dimmeos es muy fácil desde el código fuente: Una variable llamada "espera" para el amanecer-anochecer, y la modificación del valor de delay(valor) en los procedimientos de encendido y apagado para la luz de luna.
- No olvidéis poner el hora el DS1307. Al principio del código va comentada una parte que sirve para ponerlo en hora.
- Sólo se puede cambiar la hora, los minutos no se pueden cambiar, me parecía innecesario.
- Si se cambia la intensidad de luz día o luz luna el efecto se verá en el siguiente encendido.

Está en fase de prueba. Lleva 26 días andando bien. Cualquier "bug" que detectéis me lo decís e intentaré resolverlo rápidamente.

El código:

PHP:
/* Codigo para crear un dimming de amanecer-anochecer y para dimming de encendido-apagado de luz de luna
usando el integrado ICL7667

Por Jose Manuel Mas (trosdejos)

Tambien he añadido un led para saber cuando se esta encendiendo-apagando tanto la luz dia com la luz de luna. Esta parte también es prescindible.
*/
/*

Versión 2.1
Mejoras respecto a la version 2.0:
- Al cambiar la intensidad máxima se ve de forma inmediata, sin tener que esperar al siguiente amanecer/luz de luna
- Puedo encender y apagar manualmente y al instante.

*/
/* //Esta parte comentada es para poner en hora el reloj cuando se cambie la pila o por si pierde la hora. El reloj guarda la hora que obtiene del PC desde el que se ejecute el programa

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
void setup () {
  Serial.begin(9600); // Establece la velocidad de datos del puerto serie
Wire.begin(); // Inicia el puerto I2C
RTC.begin(); // Inicia la comunicación con el RTC
RTC.adjust(DateTime(__DATE__, __TIME__)); // Establece la fecha y hora
}
void loop () {
  DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
  
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
delay(1000); // La información se actualiza cada 1 seg.
}*/


#include <Wire.h>   // Incluye la librería Wire
#include "RTClib.h" // Incluye la librería RTClib
#include <LiquidCrystal.h>

#define LUZ 3   // Pin para encender las tiras de leds
#define LUNA 11  // Este es el pin para Enceder-Apagar la luz de luna
#define LED 16 // Es el pin A2 conectado a un led que se enciende mientras dure el amanecer-anochecer y luz de luna encendido-apagado
#define tierra 17 // El pin 17 es el Analogico A3 que conecto a tierra para tener otra toma de tierra y conetarla al circuito electrónico
                       
     // Atencion: Si al ICL 7667 le metemos por PWM un analogWrite(pinPWM, 0) saldra toda la potencia. Si metemos un 255 apagara la salida.                   

int minutoanterior=0, minuto=0; // Borrar cuando se borre la impresion de fecha y hora en Loop()

LiquidCrystal lcd(8, 12, 9, 4, 5, 6, 7);

// Lista de variables para el LCD
const float divisor=0.39;  // divisor para operar el porcentaje de la intensidad
const int numeroDeMenus=3;
const int numeroMaximoDeSubmenus=5;
int hora_amanecer=10, hora_anochecer=21, intensidad_max_dia=128, luz_luna_ON=20, luz_luna_OFF=9, intensidad_max_luna=128; // para la intensidad el valor minimo es 255 (apagado) y el maxino es 0 (100%)

char tituloMenu[numeroDeMenus][16] = {
  "Elige opcion:",
  "1  Luz de dia ",
  "2  Luz de luna"};
  
byte numeroDeSubmenus[numeroDeMenus] = {1,5,5};

char tituloSubmenu[numeroDeMenus][numeroMaximoDeSubmenus][16] = 
{
  "","","","","",
  "Set Amanecer","Set Anochecer","Intensidad Max","Encender Dia","Apagar Dia",
  "Set LuzLuna ON","Set LuzLuna OFF","Intensidad Max","Encender Luna","Apagar Luna",
  };

int adc_key_val[5] ={
  50, 200, 400, 600, 800 };
int NUM_KEYS = 5;
int adc_key_in;   
int key=-1;    // 0= boton derecha;  1= boton arriba;  2=boton abajo;  3=boton izquierda  4=boton select
int oldkey=-1;
boolean luzEncendida=true;
boolean cursorActivo=false;
unsigned long time;
int x=0;
int y=0;
// Fin Lista de variables para LCD

boolean encendido = false;  // Variable para saber si la pantalla LED esta encendida
boolean encendidoluna = false; // Variable para saber si la luz de luna esta encendida

int intensidad_parcial_dia=255, intensidad_parcial_luna=255;  // valor para subir/bajar la intensidad de forma progresiva

long espera = 30000;           // Intervalo de espera para el ir subiendo-bajando la intensidad (milisegundos)
long previousMillis = 0;       // valor que almacena tiempo
unsigned long currentMillis;   // Guardo el tiempo actual para ir comparando con previousMillis
RTC_DS1307 RTC; // Crea el objeto RTC
DateTime now; // Creo la variable global now para guardar la hora del objeto RTC


const char *nombreDia[7] = {
  "L", "M", "X", "J", "V", "S",
  "D"
};
void setup()
{
  Serial.begin(9600);
  pinMode(LUZ, OUTPUT);
  pinMode(LUNA, OUTPUT);
  pinMode(tierra, OUTPUT);
  digitalWrite(tierra, LOW);  // Conecto este pin a Tierra
 // pinMode(INTERRUPTOR, INPUT);
  pinMode(LED, OUTPUT);
  Serial.println("empiezo el programa");
  analogWrite(LUZ, 255); // me aseguro de que PWM es 255 (leds apagados)
  analogWrite(LUNA, 255); // me aseguro de que PWM es 255 (leds apagados)
  Wire.begin(); // Establece la velocidad de datos del bus I2C
  RTC.begin(); // Establece la velocidad de datos del RTC
  
  lcd.clear(); 
  lcd.begin(16, 2);
  lcd.setCursor(0,0); 
  lcd.print("Muevase con las ");
  lcd.setCursor(0,1); 
  lcd.print("teclas direccion");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0,0); 
  lcd.print("Menu principal");
  lcd.setCursor(0,1); 
  lcd.print(tituloMenu[x]);
  time = millis();
}

void amanecer()
{ 
   currentMillis = millis();
   if(currentMillis - previousMillis > espera)
    {
       previousMillis = currentMillis;  // guardo el último valor de para volver a esperar el tempo de la variable "espera"
       if (intensidad_parcial_dia >= intensidad_max_dia)
       {
          digitalWrite(LED, HIGH); // Enciendo el led para saber que estoy en un bucle de encendido 
          analogWrite(LUZ, intensidad_parcial_dia);   //Como mucho subo la intensidad hasta 125 (50%), aqui regulo la intensidad maxima
           intensidad_parcial_dia -=5;

       }                          
    } 
  if (intensidad_parcial_dia < intensidad_max_dia)
  {
    digitalWrite(LED, LOW); // Apago el led cuando finaliza el bucle de encedido 
    encendido=true;  //Pongo el valor a 1 para no volver a ejecutar esta funcion 
  }
}

void anochecer()
{
    currentMillis = millis();
    if(currentMillis - previousMillis > espera)
    {
       previousMillis = currentMillis;  // guardo el último valor de para volver a esperar el tempo de la variable "espera"
       if (intensidad_parcial_dia <= 255)
       {
          digitalWrite(LED, HIGH); // Enciendo el led para saber que estoy en un bucle de encendido 
          analogWrite(LUZ, intensidad_parcial_dia);   //Poco a poco voy quitando intensidad
          intensidad_parcial_dia +=5;
       }                          
    } 
  if (intensidad_parcial_dia > 255)
  {
    digitalWrite(LED, LOW); // Apago el led cuando finaliza el bucle de apagado 
    encendido=false;  //Pongo el valor a 0 para no volver a ejecutar esta funcion 
  }
}
 
void encenderluzdeluna()
{
  if (encendidoluna == false)
  {
    digitalWrite(LED, HIGH); // Enciendo el led para saber que estoy en un bucle de encendido
    for(intensidad_parcial_luna ; intensidad_parcial_luna >= intensidad_max_luna; intensidad_parcial_luna -=5) {    //aqui regulo la intensidad maxima que es el valor intensidad_max_luna
      analogWrite(LUNA, intensidad_parcial_luna);
      delay(15000); //cada 15 segundos aumenta el valor en +5.   
                    // aqui uso el delay() porque es poco tiempo el que se lleva este bucle para su ejecucion 
    }  
    digitalWrite(LED, LOW); // Apago el led al finalizar el bucle de encendido    
    encendidoluna=true;
  }  
} 

void apagarluzdeluna()
{
  if (encendidoluna == true)
  {
    digitalWrite(LED, HIGH); // Enciendo el led para saber que estoy en un bucle de apagado
     for(intensidad_parcial_luna ; intensidad_parcial_luna <=255 ; intensidad_parcial_luna +=5) {  
      analogWrite(LUNA, intensidad_parcial_luna);
      delay(15000); //cada 15 segundos aumenta el valor en +5.  
                    // aqui uso el delay() porque es poco tiempo el que se lleva este bucle para su ejecucion
    }
    digitalWrite(LED, LOW); // Apago el led
    encendidoluna=false;  
  }  
} 
   
void luzdedia()
{
     if (encendido==false && (now.hour()==hora_amanecer)) // Enciende 
   {                                 
      amanecer();
   }
   
   if (encendido==true && (now.hour()>=hora_anochecer)) // Se comienza el apagado
   {
      anochecer();  
   }
 
}

void luzdeluna()
{
      switch (now.day()) {
	    case 21: 
                if (now.hour()==luz_luna_ON && encendidoluna==false) {
	           encenderluzdeluna();      // Activamos la luz de luna
                }
                break;
	    case 22 ... 26: 
                 if ((now.hour()<luz_luna_OFF || now.hour()>=luz_luna_ON) && encendidoluna==false){
	            encenderluzdeluna();
                }
                 if (now.hour()==luz_luna_OFF && encendidoluna==true) {
	           apagarluzdeluna();    
                }
	      break;
	    case 27:
                 if (now.hour()<luz_luna_OFF && encendidoluna==false){
	            encenderluzdeluna();
                 }
                 if (now.hour()==luz_luna_OFF && encendidoluna==true) {
	           apagarluzdeluna();      
                }
	      break;  
    }
}

void actualiza_lcd()
{
    // Si han pasado mas de 15 segundos apagamos la luz y volvemos al menu inicial donde mostraremos Fecha y hora
  if (millis()-time > 15000) {
    pinMode(10, OUTPUT);
    digitalWrite(10, LOW);
    luzEncendida=false;
    lcd.clear();
    x=0;
    y=0;
    lcd.setCursor(0,0);  // Escribo Fecha y hora en la primera linea
    lcd.print(nombreDia[now.dayOfWeek()-1]);
    lcd.print(" ");
    escribe_cero(now.day());
    lcd.print(now.day());
    lcd.print("/");
    escribe_cero(now.month());
    lcd.print(now.month());
    lcd.print("/");
    lcd.print(now.year()-2000);  //Solo imprimo los dos ultimos digitos del año
    lcd.print(" ");
    escribe_cero(now.hour());
    lcd.print(now.hour());
    lcd.print(":");
    escribe_cero(now.minute());
    lcd.print(now.minute());  
    lcd.setCursor(0,1);   // Escribo en la segunda fila
    lcd.print(tituloMenu[x]);
  }
  // Si han pasado mas de 10 segundos apagamos la luz
  if (millis()-time > 10000) {
    pinMode(10, OUTPUT);
    digitalWrite(10, LOW);
    luzEncendida=false;
  }
  // Si han pasado mas de 5 segundos apagamos el cursor
  if (millis()-time > 5000) {
    lcd.noBlink();
    cursorActivo=false;
  } 
  leerTecla();
}

void escribe_cero(int num) // funcion para poner un cero delante de la hora minuto si es menor de 10
{
  if (num<10) lcd.print("0");
}
void leerTecla()
{ 
    delay(50);  // Espera para evitar los rebotes de las pulsaciones
    adc_key_in = analogRead(0);    // Leemos el valor de la pulsacion
    key = get_key(adc_key_in);    // Obtenemos el boton pulsado
    if (key != oldkey)    
    {
      time = millis();  
      if (!luzEncendida) {  // Al pulsar cualquier tecla encendemos la pantalla
        pinMode(10, INPUT);
        luzEncendida=true;
      } 
      else {  // si la pantalla esta encendida seguimos funcionando normalmente
        oldkey = key;
        if (key >=0){  // Si se ha pulsado cualquier tecla
          lcd.blink();  // Mostramos el cursor parpadeando
          cursorActivo=true;
        }
        if (key == 0){  // Se ha pulsado la tecla derecha
          x++;
          if (x>numeroDeMenus-1) x=numeroDeMenus-1;
          y=0;
        }
        if (key == 1) {  // Se ha pulsado la tecla arriba
           y--;
          if (y < 0) y=0;
        }
        if (key == 2) {  // Se ha pulsado la tecla abajo
          y++;
         if (y > numeroDeSubmenus[x]-1) y=numeroDeSubmenus[x]-1;
       
        }
        if (key == 3) {  // Se ha pulsado la tecla izquierda
          x--;
          if (x<0) x=0;
          y=0;
        }
        lcd.clear();
        lcd.setCursor(0,0); 
        lcd.print(tituloMenu[x]);
        lcd.setCursor(0,1); 
        lcd.print(tituloSubmenu[x][y]);
       
        if (key == 4){  // Se ha pulsado la tecla de seleccion
               
                modificar_valores(x,y); 
        }
      }
    } 
  
}

// Convertimos el valor leido en analogico en un numero de boton pulsado
int get_key(unsigned int input)
{
  int k;

  for (k = 0; k < NUM_KEYS; k++)
  {
    if (input < adc_key_val[k])
    {
      return k;
    }
  }

  if (k >= NUM_KEYS)k = -1;  // Error en la lectura
  return k;
}

void modificar_valores(int menu, int submenu)
{  
  switch (menu)
   {
     case 0: break; // en este punto no hay opciones
     case 1:   // menu de Luz dia
     {
         switch (submenu)
         {
           case 0:   // Cambiar hora de amanecer
           {
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print("Hora Amanecer:");
             lcd.setCursor(4,1);
             imprime_hora(hora_amanecer);
             hora_amanecer=set_valor(hora_amanecer);
           }
           break;
           case 1:   // Cambiar hora de anochecer
           {
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print("Hora Anochecer:");
             lcd.setCursor(4,1);
             imprime_hora(hora_anochecer);
             hora_anochecer=set_valor(hora_anochecer);

           }
           break;
           case 2:   // Cambiar intensidad
           {
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print("Intensidad:");
             lcd.setCursor(4,1);
             imprime_intensidad(intensidad_max_dia);
             intensidad_max_dia=set_valor(intensidad_max_dia);
             if (encendido == true) 
               {
                 analogWrite(LUZ, intensidad_max_dia);   //Ponemos la nueva intensidad en la salida PWM 
                 intensidad_parcial_dia=intensidad_max_dia;
               }
           }
           break;
           case 3:   // Encender luces
           {
            // intensidad_parcial_dia=255;   // para forzar encendido aunque ya esté encendido descomnetar estas dos líneas
            // encendido = false;
             while (encendido==false)
             {
                amanecer();
             }
           }
           break;
           case 4:   // Apagar luces
           {
              while (encendido==true)
              {
                anochecer();
              }
           }
           break;

         }  // fin switch submenu
     }
     break;
     case 2:   // menu de luz de luna
     {
               switch (submenu)
         {
           case 0:   // Cambiar hora de amanecer
           {
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print("Salida luna:");
             lcd.setCursor(4,1);
             imprime_hora(luz_luna_ON);
             luz_luna_ON=set_valor(luz_luna_ON);
           }
           break;
           case 1:   // Cambiar hora de anochecer
           {
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print("Apagado Luna:");
             lcd.setCursor(4,1);
             imprime_hora(luz_luna_OFF);
             luz_luna_OFF=set_valor(luz_luna_OFF); 
           }
           break;
           case 2:   // Cambiar intensidad
           {
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print("Intensidad Luna:");
             lcd.setCursor(4,1);
             imprime_intensidad(intensidad_max_luna);
             intensidad_max_luna=set_valor(intensidad_max_luna);
             if (encendidoluna == true) 
               {
                 analogWrite(LUNA, intensidad_max_luna);   //Ponemos la nueva intensidad en la salida PWM 
                 intensidad_parcial_luna=intensidad_max_luna;
               }
           }
           break;
           case 3:   // Encender luna
           {
            encenderluzdeluna();
           }
           break;
           case 4:   // Apagar luces
           {
            apagarluzdeluna();
           }
           break;

         }  // fin switch submenu

     }
     break;

  }  // fin switch menu
}

int set_valor(int valor)   // funcion para sumar/restar unidades a las horas y a la intensidad
{
  boolean enMenu = true;
  do
    {
       delay(50);  // Espera para evitar los rebotes de las pulsaciones
       adc_key_in = analogRead(0);    // Leemos el valor de la pulsacion
       key = get_key(adc_key_in);    // Obtenemos el boton pulsado       
       if (key != oldkey)    
        {
          time = millis();  
          if (!luzEncendida) {  // Al pulsar cualquier tecla encendemos la pantalla
          pinMode(10, INPUT);
          luzEncendida=true;
          } 
          else {  // si la pantalla esta encendida seguimos funcionando normalmente
             oldkey = key;
             if (key >=0){  // Si se ha pulsado cualquier tecla
             lcd.blink();  // Mostramos el cursor parpadeando
             cursorActivo=true;
                }           
              if (key == 0){
                 
                 lcd.setCursor(4,1);
                 if (y != 2)   // si estamos cambiando una hora  
                   {
                     valor++;
                     imprime_hora(valor);
                   }
                     else
                     {
                       valor--;
                       imprime_intensidad(valor);  // si estamos imprimiendo una intensidad
                     }
                 
                 }
              if (key == 3){
                  
                  lcd.setCursor(4,1);
                  if (y != 2)   // si estamos cambiando una hora 
                   {
                     valor--; 
                     imprime_hora(valor);
                   }
                     else
                      {
                        valor++;
                        imprime_intensidad(valor);  // si estamos imprimiendo una intensidad
                      }
                  
                 }
              if (key == 4){
                 enMenu = false; 
                 }
              } // fin else
           }//fin if
   } while (enMenu); // fin do while
   
   return valor;
}

void imprime_hora(int hora)  //solo imprime las horas, ni minutos ni segundos, para ajusta hora de encendido y apagado
{                            // los minutos no me interesa ajustarlos
   if (hora<10){
      lcd.print("0");
      lcd.print(hora);
      lcd.print(":00");
   }
   else {
     lcd.print(hora);
     lcd.print(":00");
   }
}

void imprime_intensidad(int i)  //Imprime la intensidad de 0-100%
{
   float resultado;
   resultado=100-(i*divisor);
   lcd.print(resultado);
   lcd.print("%");   
}


void loop()
{
  actualiza_lcd(); 
  
  now = RTC.now(); // Obtiene la fecha y hora del RTC

  luzdedia();  
  luzdeluna();
}

Espero vuestras sugerencias/dudas.
Saludos
 
Última edición:
Jó que gozada de proyecto! Que modelo de Keypad shield tienes? La mayoria de los que he visto tienen 7 patillas en la parte superior y ni siquiera vienen los pines puestos. :yb639[1]:
 
Éste:

(link roto eliminado)

y este reloj:

(link roto eliminado)
 
He añadido al código un par de opciones de menú nuevas:

- Al cambiar la intensidad máxima, tanto de luz día como de luz de luna, se ve de forma inmediata, sin tener que esperar al siguiente amanecer/luz de luna
- Puedo encender y apagar manualmente.

Saludos
 
Muy interesante; intentaré, con mi corta experiencia, adaptarlo a lo que busco (haciendo pocos cambios). Gracias por compartirlo.
 
Aquí estamos para echarnos una mano en lo que sea necesario.
 
Interesante quizá me anime. Felicidades

Enviado desde mi Phoenix rock X1 mediante Tapatalk
 
Me alegro de verte por aquí Camarón_37. Para lo quieras ya sabes donde estoy.

Saludos
 
Alguna parte tengo todavía un Arduino UNO quizá me animé y lo monte para el acuario pequeño el acuario grande va funcionando con uno desde hace más de un año

Enviado desde mi Phoenix rock X1 mediante Tapatalk
 
amigo donde puedo conseguir las librerías ya que la del reloj no la consigo por ningún lado muchas gracias de antemano muy interesante el dispositivo
 
Las saqué de Internet. Si no las encuentras te las puedo pasar en un email. Me das tu email y te las paso.
¿Cuáles te interesan?
 
Yo usé la de jeelabs para el reloj DS1307, si tu reloj usa el chip DS1302 creo que deberás usar otra. No estoy seguro de esto último pero me suena que era así.
 
Mírate el código que h epuesto en el primer post. Allçi puedes aprender el funcionamiento de los menús-submenús. No es demasiado complejo.... ¡¡¡lo he aprendido hasta yo!!!!:yb667[1]:
 
hola amigo tengo unos power drivers que carecen de dimmeo independiente por lo cual se tiene que montar un mosfer irl520 como lo puedo adaptar a tu sketch podrias auxiliarme xfavor?
 

Archivos adjuntos

  • [TodoMarino.com] Dimmer con 2 canales (luz día y luz luna)
    Drivers_zps99c9bb0b.webp
    46,6 KB · Visitas: 1.574
El dimeo no lo hace el driver sino el arduino junto con los mosfet. Puedes montar el dimeo sin que el driver sea dimmeable. Es lo mismo que tengo puesto en el esquema. Mi drver era dimeable pero, repito, el dimeo no lo hacía el driver sino el arduino (con las salidas PWM) y los mosfet.

Saludos
 
El dimeo no lo hace el driver sino el arduino junto con los mosfet. Puedes montar el dimeo sin que el driver sea dimmeable. Es lo mismo que tengo puesto en el esquema. Mi drver era dimeable pero, repito, el dimeo no lo hacía el driver sino el arduino (con las salidas PWM) y los mosfet.

Saludos

lo que no comprendo es porque el valor de pwm cuando esta en 255 esta a pagado y no encendido ?
 
lo que no comprendo es porque el valor de pwm cuando esta en 255 esta a pagado y no encendido ?
saludos lo que yo quisiera hacer es lo siguiente con el menu:

pantalla prncipal:
_________________________
|25/02/2015 18:25:30 | // Fecha hora
|C1__%C2__%C3__%C4__% | //POTENCIA CANALES DE LEDS
----------------------
//AL PULSAR ABAJO ACCEDER A MENU:

*DIMMER DE LEDS:
•C1__%C2__%C3__%C4__% // AL POSARSE SOBRE CADA CANAL PODER MODIFICARLO
*PROGRAMAR EFECTOS:
•MANECER•ANOCHECER•TORMENTA•NUBES // PROGRAMAR LOS EFECTOS
*EFECTOS:
•AMANECER •ANOCHECER •TORMENTA •NUBES // MENU EFECTOS SIN PROGRAMAR
*CONF. HORA:
•CONFIGURAR HORA // CONFIGURAR FECHA Y HORA
 
lo que no comprendo es porque el valor de pwm cuando esta en 255 esta a pagado y no encendido ?

No hace falta entenderlo, sabiendo que es así lo tienes en cuenta y ya está.

Lo que quieres hacer con os canales es complejo para mí. No puedo ayudarte más en ese tema. Lo lamento.
Saludos
 
Atrás
Arriba