Programa una serie de 8 LED

  • Iniciador del tema Iniciador del tema nito_dj
  • Fecha de inicio Fecha de inicio
Registrado
28 Sep 2008
Mensajes
2.256
Ubicación
España
Provincia
Rivas Vaciamadrid (Madrid)
Buenas a todos,
Estoy montando una pqueña pantalla que consta de 8 LED de 700ma en una sola serie y mi intención era hacer una programacion sencilla con Arduino para amanecer y anochecer. Para ello he adquirido:
- Arduino Mega
- Reloj DS1307
- Tip 141
- Resistencioa de 2,2
- Fuente para los LED de 24V
- Fuente para arduino de 9V

El esquema que voy a montar es este:

[TodoMarino.com] Programa una serie de 8 LED

Hasta aqui, todo claro, el problema viene con la programación. No tengo casi ni idea de programar, si entiendo algo y cosas sencillas pero no se muy bien como declarar ciertas cosas.
Encontré un post de Medina donde hacía algo parecido a lo que yo quiero y he copiado un trocito de codigo y lo he modificado para ver si me sirve, pero aun no puedo probarlo ya que no me ha llegado el arduino. Lo pongo aqui por si alguno de vosotros mil veces más entendido que yo me echa una mano que seguro que hay mil cosas mal.

PHP:
#include <OneWire.h>  
#include <Wire.h>   
#include "RTClib.h" // Incluye la librería RTClib  
RTC_DS1307 RTC; // Crea el objeto RTC  



void setup() 
pinMode(9, OUTPUT); // LED//ajudicamos esa salida a la serie (tip 141) 

void loop()  
{ 

Pot(minute, hour);// declaramos fase,tiempos , hora y minutos para la fase 

void Pot(int minutos, int horas) { 
///////////tiempos de progamacion////////// 
int PotLED; 
int InicioAmanecerLED=720; //12:00 
int FinAmanecerLED=780; //13:00 // 
int InicioAnochecerLED=1320; //22:00// 
int FinAnochecerLED=1380; //23:00// 
int MaxLED=125; //Maximo que vamos a encender los LED sobre 255 
int PorcentLED; 
int PasoLEDAM=MaxLED/(FinAmanecerLED-InicioAmanecerLED); 
int PasoLEDPM=MaxLED/(FinAnochecerLED-InicioAnochecerLED); 
int Tiempo;  
Tiempo=horas*60+minutos; 
if (Tiempo < 60) 
{ 
Tiempo=Tiempo+1440; 
} 
// Tiempo=Tiempo-60; //Horario de Invierno  

//Noche 
if (Tiempo < InicioAmanecerLED )  
{ 
PotLED=0; 
} 

//Amanecer 
if (Tiempo >= InicioAmanecerAzul && Tiempo <= FinAmanecerAzul)  
{ 
PotLED=(Tiempo-InicioAmanecerLED)*PasoLEDAM; 
} 

//Dia 
if ((Tiempo > FinAmanecerLED) && (Tiempo < InicioAnochecerLED))  
{ 
PotLED=MaxLED; 
} 

//Anochecer 
if (Tiempo >= InicioAnochecerLED && Tiempo <= FinAnochecerLED) 
{ 
PotLED=(FinAnochecerLED-Tiempo)*PasoLEDPM; 
} 


  

//Control 
if(PotLED <0)  
{ 
PotLED=0; 
} 
if(PotLED >MaxLED)  
{ 
PotLED=MaxLED; 
analogWrite(9, PotLED); 
} 

delay(1000); 
}  - See more at: https://todomarino.com/comunidad/showthread.php?119402-Pantalla-8-LED-con-Arduino/page4#sthash.gGgpVW53.dpuf

Se que antes de esto debo poner en hora el reloj, pero eso lo haré siguiendo este manual que creo es bastante sencillo:

Saludos y mil gracias de antemano
 
Creo que había cosas mal en el codigo (pese a no poder probarlo aun) asique me lo he revisado y he cambiado cosas.
Entre ellas, he puesto una manera sencilla de grabar la hora en el reloj, de forma manual y que solo debe hacerse la primera vez, una vez hecho creo ya debería estar en hora y borrar esa parte de código para futuras ocasiones.
He añadido una función para que automáticamente se cambie la hora cuando llegue el momento del cambio de horariuo de verano y horario de invierno.
Aqui dejo mi código por si alguien me echa una mano con el:

PHP:
#include <OneWire.h> 
#include <Wire.h>  
#include "RTClib.h" // Incluye la librería RTClib 
RTC_DS1307 RTC; // Crea el objeto RTC 
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
boolean HoraRetrasa;

void setup()
{
Serial.begin(9600);
Wire.begin();
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
pinMode(9, OUTPUT); // ajudicamos esa salida a la serie (tip 141)
  /* Solo queremos poner en hora el reloj una vez y luego quitar la llamada de setDateDs1307. Activar esta parte y luego quitarla */
/*  
  second = 00; 
  minute = 50; 
  hour = 17; 
  dayOfWeek = 5; 
  dayOfMonth = 28; 
  month = 3; 
  year = 14; 
  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);  
*/
}

void loop() 
{
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); //Obtenemos la hora
Pot(minute, hour); // declaramos fase,tiempos , hora y minutos para la fase
if (minute != minutoMemory) //Si es un nuevo minuto comprobamos cambio de hora
{
ActualizaMinuto();
}
Luces(minute, hour);
}


void ActualizaMinuto() //Cambiar hora verano-invierno
{
    //Adelanta la hora a partir del dia 25 de Marzo, busca el primer domingo
    //y cuando se han las 2 de la noche adelanta el reloj una hora
    if (month==3)
    {
       if (dayOfMonth >= 26)
       {
         if (dayOfWeek = 7)      
         {
           if (hour==2)
           {
              hour = 3;
              setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
           }
         }
         
       }
    }
    //Retrasa la hora a partir del dia 25 de Octubre, busca el primer domingo
    //y cuando se han las 2 de la noche retrasa el reloj una hora
    if (month==10)
    {
       if (dayOfMonth >= 26)
       {
         if (dayOfWeek = 7)      
         {
           if ((hour==2)&&(HoraRetrasa==false))
           {
              hour = 1;
              HoraRetrasa=true;
              setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
           }
         }
         
       }
    }
    if (hour==3)
{
HoraRetrasa=false;
}
minutoMemory=minute;

}



void Luces(int minutos, int horas)
{
///////////tiempos de progamacion//////////
int PotLED;
int InicioAmanecerLED=720; //12:00
int FinAmanecerLED=780; //13:00 //
int InicioAnochecerLED=1320; //22:00//
int FinAnochecerLED=1380; //23:00//
int MaxLED=125; //Maximo que vamos a encender los LED sobre 255
int Tiempo; 
Tiempo=horas*60+minutos;
if (Tiempo < 60)
{
Tiempo=Tiempo+1440;
}
// Tiempo=Tiempo-60; //Horario de Invierno 

//Noche
if (Tiempo < InicioAmanecerLED ) 
{
PotLED=0;
}

//Amanecer
if (Tiempo >= InicioAmanecerLED && Tiempo <= FinAmanecerLED) 
{
PotLED=map(Tiempo,InicioAmanecerLED,FinAmanecerLED,0,MaxLED);
}

//Dia
if ((Tiempo > FinAmanecerLED) && (Tiempo < InicioAnochecerLED)) 
{
PotLED=MaxLED;
}

//Anochecer
if (Tiempo >= InicioAnochecerLED && Tiempo <= FinAnochecerLED)
{
PotLED=map(Tiempo,InicioAnochecerLed,FinAnochecerLED,MaxLED,0);
}
//Control
if(PotLED <0) 
{
PotLED=0;
}
if(PotLED >MaxLED) 
{
PotLED=MaxLED;
}
analogWrite(9, PotLED);

delay(1000);
}
 
Revisa si lo que compraste es igual a lo de Medina, sino es igual tienes que cambiar algunas cosas del codigo
en caso de que no usen la misma libreria, pero ya que te llegue pruebas.
 
Esto es lo que tengo ahora mismo, aun sin poder probarlo y compilar (espero me llegue esta semana la placa arduino)

PHP:
#include <OneWire.h>  
#include <Wire.h>   
#include "RTClib.h" // Incluye la librería RTClib  
#define DS1307_I2C_ADDRESS 0x68 
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
boolean HoraRetrasa; 

void setup() 
{ 
Serial.begin(9600); 
Wire.begin(); 
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;  
pinMode(9, OUTPUT); // ajudicamos esa salida a la serie (tip 141) 
  /* Solo queremos poner en hora el reloj una vez y luego quitar la llamada de setDateDs1307. Activar esta parte y luego quitarla */ 
/*   
  second = 00;  
  minute = 50;  
  hour = 17;  
  dayOfWeek = 5;  
  dayOfMonth = 28;  
  month = 3;  
  year = 14;  
  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);   
*/ 
} 

void loop()  
{ 
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); //Obtenemos la hora 
Pot(minute, hour); // declaramos fase,tiempos , hora y minutos para la fase 

if (minute != minutoMemory) //Si es un nuevo minuto comprobamos cambio de hora 
     { 
    ActualizaMinuto(); 
     } 
Luces(minute, hour); 
} 


void ActualizaMinuto() //Cambiar hora verano-invierno 
{ 
    //Adelanta la hora a partir del dia 25 de Marzo, busca el primer domingo 
    //y cuando se han las 2 de la noche adelanta el reloj una hora 
    if (month==3) 
    { 
       if (dayOfMonth >= 26) 
       { 
         if (dayOfWeek = 7)       
         { 
           if (hour==2) 
           { 
              hour = 3; 
              setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
           } 
         } 
          
       } 
    } 
    //Retrasa la hora a partir del dia 25 de Octubre, busca el primer domingo 
    //y cuando se han las 2 de la noche retrasa el reloj una hora 
    if (month==10) 
    { 
       if (dayOfMonth >= 26) 
       { 
         if (dayOfWeek = 7)       
         { 
           if ((hour==2)&&(HoraRetrasa==false)) 
           { 
              hour = 1; 
              HoraRetrasa=true; 
              setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
           } 
         } 
          
       } 
    } 
    if (hour==3) 
    { 
      HoraRetrasa=false; 
    } 
   minutoMemory=minute; 

} 



void Luces(int minutos, int horas) 
{ 
 ///////////tiempos de progamacion////////// 
 int PotLED; 
 int InicioAmanecerLED=720; //12:00 
 int FinAmanecerLED=780; //13:00 // 
 int InicioAnochecerLED=1320; //22:00// 
 int FinAnochecerLED=1380; //23:00// 
 int MaxLED=125; //Maximo que vamos a encender los LED sobre 255 
 int Tiempo;  
 Tiempo=horas*60+minutos; 

 if (Tiempo < 60) 
  { 
   Tiempo=Tiempo+1440; 
  } 

 //Noche 
 if (Tiempo < InicioAmanecerLED )  
  { 
   PotLED=0; 
  } 

 //Amanecer 
 if (Tiempo >= InicioAmanecerLED && Tiempo <= FinAmanecerLED)  
  { 
   PotLED=map(Tiempo,InicioAmanecerLED,FinAmanecerLED,0,MaxLED); 
  } 

 //Dia 
 if ((Tiempo > FinAmanecerLED) && (Tiempo < InicioAnochecerLED))  
  { 
   PotLED=MaxLED; 
  } 

 //Anochecer 
 if (Tiempo >= InicioAnochecerLED && Tiempo <= FinAnochecerLED) 
  { 
   PotLED=map(Tiempo,InicioAnochecerLed,FinAnochecerLED,MaxLED,0); 
  } 
 //Control 
 if(PotLED < 0)  
  { 
   PotLED=0; 
  } 

 if(PotLED >MaxLED)  
  { 
   PotLED=MaxLED; 
  } 
 analogWrite(9, PotLED); 

 delay(1000); 
} 

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.send(0); 
 Wire.send(decToBcd(second)); // 0 a bit 7 inicia el reloj 
 Wire.send(decToBcd(minute)); 
 Wire.send(decToBcd(hour));  
 Wire.send(decToBcd(dayOfWeek)); 
 Wire.send(decToBcd(dayOfMonth)); 
 Wire.send(decToBcd(month)); 
 Wire.send(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.send(0); 
 Wire.endTransmission(); 
 Wire.requestFrom(DS1307_I2C_ADDRESS, 7); 
 // Alguno de estos necesitan enmascarar porque ciertos bits son bits de control  
 *second = bcdToDec(Wire.receive() & 0x7f); 
 *minute = bcdToDec(Wire.receive()); 
 *hour = bcdToDec(Wire.receive() & 0x3f);  
 *dayOfWeek = bcdToDec(Wire.receive()); 
 *dayOfMonth = bcdToDec(Wire.receive()); 
 *month = bcdToDec(Wire.receive()); 
 *year = bcdToDec(Wire.receive()); 
}
 
Tengo un problema con la boya para controlar el nivel de agua del acuario, en principio lo he configurado para que cuando baje el nivel, suene una señal sonora cada 30 segundos (en horario de 12:00 a 22:00 para no molestar por la noche en horas de sueño) y el problema que tengo es que no recoge correctamente cuando el nivel esta bajo o correcto, sino que oscila entre uno y otro y no se donde puede estar el fallo.
La boya la conecto al arduino mega un cable al pin 3,3V o 5V (lo he probado en los dos) y el otro al pin digital PWM 4.

El codigo completo es este:

PHP:
#include <Wire.h>   // Incluye la librería Wire
#include "RTClib.h" // Incluye la librería RTClib
#include <OneWire.h> 
#include <pitches.h> //Libreria para buzzer
RTC_DS1307 RTC; // Crea el objeto RTC

int boya=4; //Conectamos la boya al digital 4
int buz=7; //Conectamos el buzzer al digital 7
int valor=0;

void setup () {
Serial.begin(9600); // Establece la velocidad de datos del puerto serie
Wire.begin(); // Establece la velocidad de datos del bus I2C
RTC.begin();// Establece la velocidad de datos del RTC
//RTC.adjust(DateTime(__DATE__, __TIME__)); 

pinMode(buz, OUTPUT); 
pinMode (boya, INPUT); 

}
void loop () {
  int minute;
  int hour;
  int tiempo;
  int segundo;
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();
Serial.print("Dia de la semana: ");
Serial.println(now.dayOfWeek(), DEC);
tiempo=(now.hour()*60)+now.minute();
 if (tiempo < 60) 
  { 
   tiempo=tiempo+1440; 
  } 
 if (digitalRead(boya) == LOW)
  {
   Serial.print("Nivel de agua Bajo");
   if(tiempo >= 720 && tiempo <= 1320)//Avisa de 12 a 22
   {
     if(now.second()==0 || now.second()==30)//Avisa cada 30 segundos
     {
      Serial.print ("  ***RELLENAR AGUA***");
      tone(buz,200000,200);
      noTone(buz);
     }
   }     
  }
  
 if (digitalRead(boya)==HIGH)
 {
   Serial.print("Nivel de agua correcto");
 }
Serial.println();
Serial.print("Tiempo: ");
Serial.println(tiempo);
delay(1000); // La información se actualiza cada 1 seg.
Luces (tiempo);

}


void Luces(int tiempo) 
{ 
 ///////////tiempos de progamacion////////// 
 int PotLED; 
 int InicioAmanecerLED=720; //12:00 
 int FinAmanecerLED=780; //13:00 // 
 int InicioAnochecerLED=1320; //22:00// 
 int FinAnochecerLED=1380; //23:00// 
 int MaxLED=125; //Maximo que vamos a encender los LED sobre 255 
    

 //Noche 
 if (tiempo >FinAnochecerLED || tiempo < InicioAmanecerLED )  
  { 
   PotLED=0; 
   Serial.println();
   Serial.print("NOCHE: ");
   Serial.println(PotLED);
   Serial.println(); 
  
  } 

 //Amanecer 
 if (tiempo >= InicioAmanecerLED && tiempo <= FinAmanecerLED)  
  { 
   PotLED=map(tiempo,InicioAmanecerLED,FinAmanecerLED,0,MaxLED); 
   Serial.println();
   Serial.print("AMANECIENDO: ");
   Serial.println(PotLED); 
   Serial.println();
  } 

 //Dia 
 if (tiempo > FinAmanecerLED && tiempo < InicioAnochecerLED)  
  { 
   PotLED=MaxLED; 
   Serial.println();
   Serial.print("DIA: ");
   Serial.println(PotLED); 
   Serial.println();
  } 

 //Anochecer 
 if (tiempo >= InicioAnochecerLED && tiempo <= FinAnochecerLED) 
  { 
   PotLED=map(tiempo,InicioAnochecerLED,FinAnochecerLED,MaxLED,0); 
   Serial.println();
   Serial.print("ANOCHECIENDO: ");
   Serial.println(PotLED); 
   Serial.println();
  } 
 //Control 
 if(PotLED < 0)  
  { 
   PotLED=0; 
  } 

 if(PotLED >MaxLED)  
  { 
   PotLED=MaxLED; 
  } 
 analogWrite(9, PotLED); 

 //delay(1000); 
}

Espero me echeis una mano

Saludos
 
Atrás
Arriba