Control de luces segun tiempo y cantidad de luz en el ambiente

Hola

Soy nuevo en esto de Arduino, y mi duda es la siguiente. Tengo que hacer un sistema que encienda y apague las luces según el horario. El horario de encendido y apagado tiene que ser configurable, y , si hay poca luz en el ambiente se debera encender,sin importar que todavia no sea hora de encender las luces; esto controlado por un LDR . Y bueno, la verdad es que no se por donde empezar, llevo algunos dias conociendo las funciones, pero todavia no logro un avance importante. Tengo un Arduino uno, un Tiny RTC, y el modulo de relé, la parte del sensor de luz va con un LDR. Desde ya muchas gracias!

Usa TimeAlarm para controlar los tiempos. Es una librería que resuelve el problema de los horarios. Usa Time asociado con un RTC como el DS3231 para tener seguimiento de la hora con precisión. LDR no mucho que decir a una entrada del ADC del arduino.

El ejemplo de TImeAlarm sirve para entender como usarlo. Configurarlo ya requiere un menú y un LCD posiblemente, asi que si no tienes pines considera uno del tipo I2C. Ya verás.

Muchas gracias!! Respecto de como configurarlo, me olvide de decir que tengo el Ethernet Shield, eso como podria hacerlo? Gracias!!

Olvida el LCD y el menú y pasas a una página web con opciones. Hay alguien que esta queriendo hacer algo parecido para un sistema de riego y pretende lo mismo que tu. Porque no lo buscas. Esta en este mismo subforo. Hay sugerencias de donde leer tutoriales de como armar la página web usando Ajax u otras alternativas.

Muchisimas gracias, la verdad que no tenia ni idea por donde empezar y ahora lo veo un poco mas claro. Gracias !!!

Te recomiendo que definas etapas a cumplir y vas compartiendo y sumando al debate las mismas. Como si fuera un play de trabajo. Asi el lector del hilo entiendo por donde vas y se va uniendo al mismo de manera ordenada.

Bien, antes que nada perdon por no responder, no estuve disponible este tiempo, las etapas a cumplir serian mas o menos:

*Lograr que funcione la parte de el encendido y apagado con el tiempo. *Lograr que se pueda configurar la hora de encendido y apagado. *Hacer la pagina web para controlarlo.

Estuve intentando hacer algunas cosas, pero aun no logro mucho, no entiendo la parte de la libreria de alarmas, no encuentro ningun tutorial de como funciona. Ni que hablar de la parte de la pagina web. La parte del sensor de luz, mas o menos sera con un divisor resistivo entre el LDR y un potenciometro para configurar la sensibilidad. Cuando tenga oportunidad de hacer un avance en el codigo, lo pondre.

Este es tu tutorial.
Example Program
You can open this example from File > Examples > TimeAlarms > TimeAlarmExample.

[color=#7e7e7e]/*[/color]
[color=#7e7e7e] * TimeAlarmExample.pde[/color]
[color=#7e7e7e] *[/color]
[color=#7e7e7e] * This example calls alarm functions at 8:30 am and at 5:45 pm (17:45)[/color]
[color=#7e7e7e] * and simulates turning lights on at night and off in the morning[/color]
[color=#7e7e7e] * A weekly timer is set for Saturdays at 8:30:30[/color]
[color=#7e7e7e] *[/color]
[color=#7e7e7e] * A timer is called every 15 seconds[/color]
[color=#7e7e7e] * Another timer is called once only after 10 seconds[/color]
[color=#7e7e7e] *[/color]
[color=#7e7e7e] * At startup the time is set to Jan 1 2011  8:29 am[/color]
[color=#7e7e7e] */[/color]
 
#include <Time.h>
#include <TimeAlarms.h>

[color=#cc6600]void[/color] [color=#cc6600][b]setup[/b][/color]()
{
  [color=#cc6600][b]Serial[/b][/color].[color=#cc6600]begin[/color](9600);
  [color=#cc6600]setTime[/color](8,29,0,1,1,11); [color=#7e7e7e]// set time to Saturday 8:29:00am Jan 1 2011[/color]
  [color=#7e7e7e]// create the alarms [/color]
  [color=#cc6600]Alarm[/color].[color=#cc6600]alarmRepeat[/color](8,30,0, MorningAlarm); [color=#7e7e7e]// 8:30am every day[/color]
  [color=#cc6600]Alarm[/color].[color=#cc6600]alarmRepeat[/color](17,45,0,EveningAlarm); [color=#7e7e7e]// 5:45pm every day [/color]
  [color=#cc6600]Alarm[/color].[color=#cc6600]alarmRepeat[/color](dowSaturday,8,30,30,WeeklyAlarm); [color=#7e7e7e]// 8:30:30 every Saturday [/color]

 
  [color=#cc6600]Alarm[/color].[color=#cc6600]timerRepeat[/color](15, Repeats); [color=#7e7e7e]// timer for every 15 seconds [/color]
  [color=#cc6600]Alarm[/color].[color=#cc6600]timerOnce[/color](10, OnceOnly); [color=#7e7e7e]// called once after 10 seconds [/color]
}

[color=#cc6600]void[/color] [color=#cc6600][b]loop[/b][/color](){ 
  digitalClockDisplay();
  [color=#cc6600]Alarm[/color].[color=#cc6600]delay[/color](1000); [color=#7e7e7e]// wait one second between clock display[/color]
}

[color=#7e7e7e]// functions to be called when an alarm triggers:[/color]
[color=#cc6600]void[/color] MorningAlarm(){
  [color=#cc6600][b]Serial[/b][/color].[color=#cc6600]println[/color]([color=#006699]"Alarm: - turn lights off"[/color]); 
}

[color=#cc6600]void[/color] EveningAlarm(){
  [color=#cc6600][b]Serial[/b][/color].[color=#cc6600]println[/color]([color=#006699]"Alarm: - turn lights on"[/color]); 
}

[color=#cc6600]void[/color] WeeklyAlarm(){
  [color=#cc6600][b]Serial[/b][/color].[color=#cc6600]println[/color]([color=#006699]"Alarm: - its Monday Morning"[/color]); 
}

[color=#cc6600]void[/color] ExplicitAlarm(){
  [color=#cc6600][b]Serial[/b][/color].[color=#cc6600]println[/color]([color=#006699]"Alarm: - this triggers only at the given date and time"[/color]); 
}

[color=#cc6600]void[/color] Repeats(){
  [color=#cc6600][b]Serial[/b][/color].[color=#cc6600]println[/color]([color=#006699]"15 second timer"[/color]); 
}

[color=#cc6600]void[/color] OnceOnly(){
  [color=#cc6600][b]Serial[/b][/color].[color=#cc6600]println[/color]([color=#006699]"This timer only triggers once"[/color]); 
}

[color=#cc6600]void[/color] digitalClockDisplay()
{
  [color=#7e7e7e]// digital clock display of the time[/color]
  [color=#cc6600][b]Serial[/b][/color].[color=#cc6600]print[/color]([color=#cc6600]hour[/color]());
  printDigits([color=#cc6600]minute[/color]());
  printDigits([color=#cc6600]second[/color]());
  [color=#cc6600][b]Serial[/b][/color].[color=#cc6600]println[/color](); 
}

[color=#cc6600]void[/color] printDigits([color=#cc6600]int[/color] digits)
{
  [color=#cc6600][b]Serial[/b][/color].[color=#cc6600]print[/color]([color=#006699]":"[/color]);
  [color=#cc6600]if[/color](digits < 10)
    [color=#cc6600][b]Serial[/b][/color].[color=#cc6600]print[/color]([color=#006699]'0'[/color]);
  [color=#cc6600][b]Serial[/b][/color].[color=#cc6600]print[/color](digits);
}

Lo estuve viendo y entiendo como funciona, pero el problema es que no puedo hacer que lea la hora del RTC.

pregunto: si solo se trata de encender una luz que siempre dependa de la luz ambiente, ¿porqué con arduino?
es quizas una tarea escolar?
con un comparador y 4 resistencias+ldr ya lo tienes, ya que el horario no sirve de nada si la cantidad de luz es la que manda.
ahora bien, si es un proyecto para aprender, entonces es distinto.

Este es parte de un código que uso con un cliente

#include <Time.h>
#include <TimeAlarms.h>
#include <Wire.h>
#include <DS1307RTC.h>
// he quitado las definiciones porque no vienen al caso

void setup(){

  Serial.begin(57600);
  Serial.println("Inicializando...");
  
  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  setSyncInterval(600);       // sincronizo cada 10 min 600 segundos
  if (timeStatus() != timeSet) 
      Serial.println("No pude sincronizarme con el RTC");
   else
      Serial.println("RTC ha fijado el tiempo del sistema"); 
  RTC.read(tm);                     //No it didn't, set the clock from this code
  
  saturdayAlarmID1 = Alarm.alarmRepeat(dowSaturday,  9, 15,  0,  onAlarm);
  saturdayAlarmID2 = Alarm.alarmRepeat(dowSaturday,  9, 25,  0, offAlarm);
  saturdayAlarmID3 = Alarm.alarmRepeat(dowSaturday, 12,  0,  0,  onAlarm);
  saturdayAlarmID4 = Alarm.alarmRepeat(dowSaturday, 12, 10, 0, offAlarm);
  
  pinMode(13, OUTPUT); 
  pinMode(buzzer, OUTPUT);     
  // attachInterrupt(digitalPinToInterrupt(2), telefono, RISING);
  Serial.println("Control de horarios IVECO.");
}

Exelente, ya lo he entendido. Hice una pequeña modificacion para probarlo con un led y asi quedo

#include <Time.h>
#include <TimeAlarms.h>
#include <Wire.h>
#include <DS1307RTC.h>
// he quitado las definiciones porque no vienen al caso

int led = 13;

void setup(){

  Serial.begin(57600);
  Serial.println("Inicializando...");
  
  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  setSyncInterval(600);       // sincronizo cada 10 min 600 segundos
  if (timeStatus() != timeSet) 
      {
        Serial.println("No pude sincronizarme con el RTC");
      }
   else
      {
        Serial.println("RTC ha fijado el tiempo del sistema"); 
      }                    
  Alarm.alarmRepeat(13,33,00,Encendido);
  Alarm.alarmRepeat(13,43,00,Apagado);
  pinMode(led, OUTPUT);   
}
void loop() 
{
  digitalClockDisplay();
  Alarm.delay(1000); // wait one second between clock display
}
void digitalClockDisplay() 
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println();
}
void printDigits(int digits) 
{
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}
void Encendido ()
{
  digitalWrite (led,HIGH);
  Serial.println ("LED ENCENDIDO");
}
void Apagado ()
{
  digitalWrite (led,LOW);
  Serial.println ("LED APAGADO");
}

Ahora, como hago para que pueda ingresar desde teclado o desde la pagina en su defecto, el horario de encendido o de apagado.

Ahora, como hago para que pueda ingresar desde teclado o desde la pagina en su defecto, el horario de encendido o de apagado.

Amigo.. intenta poner algo de tu esfuerzo!! Si a cada paso te lo tenemos que resolver.. entonces te pasamos un presupuesto. Y no digas que soy suceptible. Cada consulta es un pedido, no una duda. Lee las normas del foro, por favor!! Hay que trabajar, estudiar, aprender equivocarse y consultar. Pero no pedir que te hagan todo. Ve a documentación y lee los primeros post con cursos en Youtube.

Como usar un teclado esta ampliamente respondido en este foro. Ve a Search y busca keyboard o en google : Arduino keyboard y tendrás tu respuesta. No copies y pegues y vuelve a preguntar.. intenta adaptarlo y no es escusa que seas nuevo. Ponte a estudiar que hay tutoriales por todos lados.

Tienes razon, he abusado de tu ayuda, lo siento. Buscare mas informacion y estudiare, apenas tenga avances lo subire aqui. Gracias por tu ayuda!!

Tienes el ejemplo que te he pasado de TimeAlarm Library.
Prueba con el, elimina o cambia lo que te haga falta.

#include <Time.h>
#include <TimeAlarms.h>

void setup()
{
  Serial.begin(9600);
  setTime(8,29,0,1,1,11); // set time to Saturday 8:29:00am Jan 1 2011
  // create the alarms 
  Alarm.alarmRepeat(8,30,0, MorningAlarm); // 8:30am every day
  Alarm.alarmRepeat(17,45,0,EveningAlarm); // 5:45pm every day 
  Alarm.alarmRepeat(dowSaturday,8,30,30,WeeklyAlarm); // 8:30:30 every Saturday 

 
  Alarm.timerRepeat(15, Repeats); // timer for every 15 seconds 
  Alarm.timerOnce(10, OnceOnly); // called once after 10 seconds 
}

Todo eso es básico

Alarm.alarmRepeat(8,30,0, MorningAlarm); // 8:30am every day

es una alarma que se repite todos los dias a las 8:30:00
luego hay una alarma

Alarm.alarmRepeat(17,45,0,EveningAlarm); // 5:45pm every day

que se repite pero a las 17:45:00
cada una llama a una rutina, la primera a MorningAlarm y la segunda a EveningAlarm

// functions to be called when an alarm triggers:
void MorningAlarm(){
  Serial.println("Alarm: - turn lights off"); 
}

void EveningAlarm(){
  Serial.println("Alarm: - turn lights on"); 
}

Estas dos rutinas no hacen nada, solo muestran un cartel y si fueran por ejemplo acciones sobre un pin podrias encender luces con un

digitalWrite(pin, HIGH);

en MorningAlarm
y otra que apague con

digitalWrite(pin, LOW);

como ves es muy fácil.
luego hay otra que tiene un comando extra que le dice que día se activa la alarma

Alarm.alarmRepeat(dowSaturday,8,30,30,WeeklyAlarm); // 8:30:30 every Saturday

y finalmente estas dos

Alarm.timerRepeat(15, Repeats); // timer for every 15 seconds 
  Alarm.timerOnce(10, OnceOnly); // called once after 10 seconds

Son alarmas que se repiten pero ahora en intervalos cortos, segundos.
la que indica timerRepeat es la que repite… imagina que es interesante usarla para por ejemplo generar una sirena cada 10 segundos entonces usas Alarm.timerRepeat(10, Repeats)
y la segunda timerOnce solo se ejecuta una vez a los 10 segundos de ser llamada.
Con estas herramientas tienes todo lo que necesites.

La parte de la libreria de alarmas la he entendido, el problema lo tengo porque quiero que el horario de encendido y apagado puedan ser controlados por medio de la pagina, y hasta ahora solo consigo dejarlo en un solo horario, pero fuera de eso he entendido como funciona la libreria.

Sin nada de tu parte que muestre el avance, no hay nada en lo que podamos ayudar. Si vienes a pedir ayuda, es bueno que vayas aportando lo realizado, para que la comunidad vea y aporte. Yo no domino el tema html pero muchos otros que suelen no responder si. Asi que presenta lo realizado y explica donde esta tu problema y verás como irás avanzando.