Go Down

Topic: programacion de leds horario mega-rct (Read 9972 times) previous topic - next topic

7orres

hola que tal soy nuevo en este mundo  de arduino,tengo un mega 2560 -placa de relays 8 canales y un modulo rtc(real time clock) ya todo esta instalado el reloj esta en hora actual todo trabajando correctamente.
tengo un acuario en el cual tengo 8 leds 10 watts  a 12v .
quiero encender  y apagar a cierta hora  simulando el anochecer alguien con experinceia es esto o algun link de algun tutorial ,se agradeceria mucho
http://www.tuelectronica.es/tutoriales/arduino/reloj-rtc-i2c-con-arduino.html   
son los pasos que segui para configurar la hora 
al poner los nuevos comandos se borrara la ora o tendre que poner los del reloj tambien?
puedo conectar el arduino 2560 a la fuente de poder ,tendre que poner algun fusible 500ma o no es necesario ya que tengo una fuente de pc con la que  se encuentran los leds.
gracias 


Dabauza

Hola 7orres,

La hora se establece en el RTC mediante esta linea:

RTC.adjust(DateTime(__DATE__, __TIME__));

Solo es necesario usarla una vez para configurar la hora, en la siguiente programación ya no es necesario que la incluyas ya que la hora se queda guardada y no se borrara mientras tenga alimentación o la pila este cargada.

Para controlar los LEDS yo uso un par Darlington, el TIP120 y conecto al colector los leds, la base con una resistencia en serie calculada a un pin PWM del arduino, y el colector a masa.

Tendrás que usar tantos TIP120 como grupos de leds quieras controlar, si quieres controlar luz diurna y nocturna (en un grupo cada una) te harán falta dos TIP120 con su respectiva resistencia cada uno.

Un saludo

7orres

si  ya vi algun tuto muy entendido aunque en ingles
http://www.instructables.com/id/Use-Arduino-with-TIP120-transistor-to-control-moto/?lang=es
pero por ahora eso es lo que tengo  me gustaria y seria mejor como lo planteas  solo que por mi area en las tiendas es muy caro y es necesario pedirlas enlinea ...
cual seria el codigo par aencender  relays a cierta hora ,pues aun no soy capaz de eleborar algo tan complicado y sencillo a la vez pues soy un novato que apenas y supo de este mundo arduino .gracias   :smiley-mr-green:

algun ejemplo que puedas mostrar para accionar relay a cierta hora
gracias

Nito_dj

Yo ando montando algo parecido a lo que necesitas, aqui pongo mi esquema de lo que voy a montar: http://www.todomarino.com/forum/showthread.php?119402-Pantalla-8-LED-con-Arduino
Creo que se poner en hora el reloj, mi duda viene a la hora de montar un codigo para hacer encenderse progresivamente los leds hasta un tope, mantenerlos asi y apagarlos prograsivamente a otra hora...espero alguien nos ayude

7orres

jajajaj si  lo mas complicado es la programacion para un novato :) :) :) :) :) :)

Nito_dj

Tengo algo asi que he cogido de un compañero y lo he cambiado un poco...supongo que tendra varios fallos. A ver si alguien nos ayuda...

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

Dabauza

Muy buenas,

Yo el esquema que uso para la conexión del regulador es que el adjunto aqui abajo. Yo lo gasto para un dimmer, pero en si el funcionamiento es el mismo.

Reles no te hacen falta ya que con el TIP120 ya dejas pasar (o no) la corriente entre colector-emisor dependiendo de la corriente que le metes por base. Si no le metes corriente por la base el transistor se comporta como un contacto abierto (no deja pasar la corriente) y a mas corriente de base mayor es la conducción entre colector-emisor (mas corriente deja pasar, por lo tanto mayor luz te harán los leds). A grandes rasgos esta es la explicación de funcionamiento de un transistor

Lo que yo haría seria ponerle una hora de inicio por ejemplo a las 7 a.m y cada minuto incrementaría el valor de la luminosidad en 4 puntos (hasta que llegue al máximo de 255), asi tardaria mas o menos una hora en amanecer gradualmente

Y por la noche lo mismo pero disminuyendo (de 255 a 0).

Con el código siento no poder ayudarte ahora mismo, pero yo llevo sobre un mes con el Arduino y alrededor de 15 dias en este foro y la función de programador horario aun no la he tocado así que no se como se haría, tendría que ponerme a probar.

Un saludo

7orres

si eso ya tengo en mente solo q el programa es lo mas dificel sin una idea  pero gracia  y esperemos q nos ayuden con ese  codigo q tiene varios errores XD

Nito_dj

Seguro que tendra errores porque aun no tengo el arduino para compilarlo y comprobar el codigo...

7orres

si esperoemos que alguien pueda hecharnos una mano

gusanoloko

Hola yo lo utilizo con la libreria rtc asi
Code: [Select]
   if ((now.dayOfWeek()==4) and (now.hour()==9) and (now.minute()==43) and (now.second()==30)){  //condicion riego del jardin
            digitalWrite (riego1, HIGH);                                                              //enciende electrovalvula
            stateriego=true;
            delay (10000);                                                                            //tiempo 10 sg
            digitalWrite (riego1, LOW);                                                               //corta electrovalvula
            stateriego=false; 
          }

7orres

encontre esto en un post en ingles de aqui mismo pero me da errores  supuestamente quien pregunto se le soluciono el problema pero a mi no espero alguien entienda esto :smiley-red:

#include <Wire.h>
#include "RTClib.h"
#include <Time.h>
#include <TimeAlarms.h>

int pir = 12;
//Arduino nano PWM outputs
const int led1 = 3;
const int led2 = 5;
const int led3 = 6;
const int led4 = 9;

int led1val = 10;
int led2val = 5;
int led3val = 2;
int led4val = 255;

RTC_DS1307 RTC;

void setup()
{
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(pir, INPUT);
  Serial.begin(57600);
  Wire.begin();
  RTC.begin();

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    //RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  DateTime now = RTC.now();
  setTime(hour(), minute(), second(), day(), month(), year());
  setTime(now.hour(),now.minute(),now.second(),now.day(),now.month(),now.year());

  // Alarmid (Hour, Minute, Second)
  Alarm.alarmRepeat(16,45,0, Alarm1);  //
  Alarm.alarmRepeat(16,46,0, Alarm2);  //
  Alarm.alarmRepeat(16,47,0, Alarm3); //
  Alarm.alarmRepeat(16,48,0, Alarm4);  //
  Alarm.alarmRepeat(16,49,0, Alarm5);  //
  Alarm.alarmRepeat(16,50,0, Alarm6);  //
  //  Alarm.alarmRepeat(0,0,0, Alarm7);  //
  //  Alarm.alarmRepeat(0,0,0, Alarm8);  //
  //  Alarm.alarmRepeat(0,0,0, Alarm9);  //
  //  Alarm.alarmRepeat(0,0,0, Alarm10);  //

}

void  loop(){
   DateTime now = RTC.now();
  setTime(now.hour(),now.minute(),now.second(),now.day(),now.month(),now.year()); // set time & date
  Alarm.delay(1000); //clock display delay

  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();

  motion();
}

void motion(){
  if (digitalRead(pir) == HIGH)
  {
    analogWrite(led1, led1val);
    analogWrite(led2, led2val);
    analogWrite(led3, led3val);
    analogWrite(led4, led4val);
delay(1000);
Serial.println("PIR");

  Serial.print("LED1");
  Serial.print('~');
  Serial.println(led1val);
 
  Serial.print("LED2");
  Serial.print('~');
  Serial.println(led2val);
 
  Serial.print("LED3");
  Serial.print('~');
  Serial.println(led3val);
 
  Serial.print("LED4");
  Serial.print('~');
  Serial.println(led4val);
  }
  else {
    analogWrite(led1, 0);
    analogWrite(led2, 0);
    analogWrite(led3, 0);
    analogWrite(led4, 0);
  }
}
// Alarm Functions
void Alarm1(){
  led1val = 150;
  led2val = 0;
  led3val = 0;
  led4val = 0;
}

void Alarm2(){
  led1val = 0;
  led2val = 100;
  led3val = 0; 
  led4val = 0;

}
void Alarm3(){
  led1val = 0;
  led2val = 0;
  led3val = 255; 
  led4val = 0;
}

void Alarm4(){
  led1val = 33;
  led2val = 0;
  led3val = 33; 
  led4val = 11;
}

void Alarm5(){
  led1val = 0;
  led2val = 200;
  led3val = 0; 
  led4val = 0;
}
void Alarm6(){
  led1val = 100;
  led2val = 0;
  led3val = 0;
  led4val = 30; 
}

Nito_dj

Echa un vistazo al ultimo codigo que he puesto en este foro: http://www.todomarino.com/forum/showthread.php?119402-Pantalla-8-LED-con-Arduino
Lo he modificado un poco y según me han dicho tiene mejor pinta pero aun no he podido probarlo

7orres

POR AHORA ENCONtre esto no se usa el rtc  por el momento ,se tiene que tener una fuente de poder confiable sin interrupciones que al reiniciar se reinicia el conteo ,

// This is an arduino clock that runs lights.
unsigned long start = 0;
unsigned long current = 0;
// The values that are displayed on the display/ computer. They are the times of day. You don;t need a display.
int displaysecond;
int displayminute;
int displayhour;
//Lighting stuff; setting pinouts and initializing variables. Pinouts must be PWM pins.
const int bluepin = 3;
int bluedim;
const int whitepin = 5;
int whitedim;
int bluemax;
int whitemax;

void setup()
{
  current = millis();
  Serial.begin (9600);
  pinMode (bluepin, OUTPUT);
  pinMode (whitepin, OUTPUT);
  displaysecond = 0;
  // Times that are displayed on startup. Change this to change the starting time.
  displayminute = 30;
  displayhour = 6;
  // Lighting stuff
  bluedim = 0;
  whitedim = 0;
  // Max dimming out of 255 of the channels of blues and whites.
  //Ex: 255 is 100%, 128 is ~50%, etc. Integers only. Bluemax is blues, whitemax is whites.
  bluemax = 100;
  whitemax = 255;
}
//This is the clock
void loop()
{
  current = millis();
  // If the clock is running fast, increase the "+1000". If it's slow, decrease it.
  //This runs fast 30sec a day at 1000, but slow 30s a day at 999. No decimals.
  if (current >= start + 1000) {
  displaysecond = displaysecond + 1;
  start = current;
  Serial.print("Second = ");
  Serial.println(displaysecond);
  Serial.print("Minute = ");
  Serial.println(displayminute);
  Serial.print("Hour = ");
  Serial.println(displayhour);
  Serial.print("blue dimming = ");
  Serial.println(bluedim);
  Serial.print("white dimming = ");
  Serial.println(whitedim);
}
  if (displaysecond >= 60) {
  displaysecond = displaysecond - 60;
  displayminute = displayminute + 1;
}
  if (displayminute >= 60) {
  displayminute = displayminute - 60;
  displayhour = displayhour + 1;
}
  if (displayhour >= 24) {
  displayhour = displayhour - 24;
}
//Blues lights
analogWrite (bluepin, bluedim);
if (displayhour == 6){
  // The "displayminute" being < 40 means the dawn cycle will take place between 6:00 and 6:40. I'm changing these to variables.
  if (displayminute < 40){
//
    bluedim = displayminute * bluemax / 40 + displaysecond * bluemax / 2400;
}
  else {bluedim = bluemax;}
}
if (displayhour == 13){
  if (displayminute >= 20){
    bluedim = bluemax - ((displayminute - 20) * bluemax / 40 + displaysecond * bluemax / 2400);
  }
  else {
    bluedim = bluemax;
  }
}
if (displayhour > 6){
  if (displayhour < 13){
      bluedim = bluemax;
    }
}
// Sets the max dimming. Change the variables bluemax and whitemax to change the maximum. See the "void setup"
// earlier in the code.
if (bluedim > bluemax) {
  bluedim = bluemax;
}
//Whites
analogWrite (whitepin, whitedim);
if (displayhour == 6) {
  if (displayminute < 40){
    if (displayminute >= 10) {
    whitedim = (displayminute - 10) * whitemax / 30 + displaysecond * whitemax / 1800;
    }
  }
  else {whitedim = whitemax;}
}
if (displayhour == 13) {
  if (displayminute >= 20){
    whitedim = 254 - ((displayminute - 30) * 255 / 40 + displaysecond * 255 / 2400);
  }
  else {
    whitedim = whitemax;
  }
}
if (displayhour > 6){
  if (displayhour < 13){
    whitedim = whitemax;
  }
}
if (whitedim > whitemax) {
  whitedim = whitemax;
}
}

Go Up