una misma fotocelula controlando dos momentos

Hola! estoy empezando con arduino y quiero correr un programa utilizando un sensor de luz con un relay para prender una luz durante X horas pero dependiendo de la salida del sol y la puesta del sol

Esto sería:
sale el sol (empieza el programa)
se oculta el sol (prende relay)
Cuenta X horas (apaga el relay)

He intentado con if y whiles anidados pero me estoy entreverando bastante.

Capaz que no es posible y tengo que usar 2 sensores?

gracias!

Buenas acozme,

Si el programa (o sea la energia que le llega al arduino) comienza con la salida del sol y luego el arduino debe continuar funcionando durante X horas durante la noche, practicamente lo tienes funcionando casi 24 hs y si fuese asi (24hs andando) con solo una LDR (y el rele, claro) puedes hacer lo que necesitas.

Hay muchos videos sobre el uso de una LDR y para el conteo lee sobre la funcion Millis().

Saludos.

Hola hypernovat!

El funcionamiento de la LDR, rele y la función millis lo tengo claro, el tema es que me estoy entreverando con los if para poder usar la misma LDR para 2 instancias del programa

  • iniciar programa (cuando sale el sol)
  • activar el rele (cuando se oculta)

Las dos funciones las tengo andando por separado :grinning:

Energía al Arduino le va a llegar siempre

Saludos!

Asi que no tienes problemas con millis() y tienes problemas con las condiciones, cosa rara la que dices.
Porque no publicas lo que has hecho hasta ahora y nos explicas que hace bien y qué mal, y desde ahi partimos.

Supongo que tienes a la LDR formando parte de un divisor de tension que esta conectado a una entrada analogica del arduino.
Supongo tambien que has hecho las pruebas de valores que arrojan con luz y obscuridad, valores que son los que debes poner en las condiciones de los IF.
Igual me confunde cuando dices "iniciar programa cuando sale el sol", se supone que el programa ya esta trabajando en el void loop chequendo continuamente los valores que le da el divisor de tension.
Como dice surbyte, deberias colocar el programa, porque es un proyecto sencillo y es una lastima que te traves en los IF.

Al final me salió pero usé delay, tengo que ver si el sensor me demora algo en medir para sumarle el tiempo

Detecta la salida del sol, detecta el ocaso y prende el relay y a los 20 segundos desde la salida apaga

(tengo que prender el arduino de noche)

int ldrPin = 7;
int ledPin= 12;
int val = 0;
int salioelsol = 0;
int seocultoelsol = 0;
int segundos = 0;
int segundostotal = 20;

void setup() {
  pinMode(ldrPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}
 
void loop() {
  int val = digitalRead(ldrPin);
  delay(1000);
  segundos = segundos + 1;  
  Serial.print(segundos);
  Serial.println(val);
  
  if((val == LOW) && (salioelsol == 0)){
       salioelsol = 1; 
       segundos = 0;
         }
  if ((val == HIGH) && (salioelsol == 1)){
    seocultoelsol = 1;
    digitalWrite(ledPin, HIGH);
      if (segundos >= segundostotal){
                 digitalWrite(ledPin, LOW);
                 salioelsol = 0;
                 seocultoelsol = 0;
                 segundos = 0;
    }
       
  }
  }

Tengo que emprolijar el código, pero hace lo que necesitaba

Te modifique el codigo colocandole millis (a ver si te sirve).
¿el led simula al rele?, ¿conectastes la LDR en un pin digital, sera por eso que dices que tienes que echar a andar el arduino de noche?

int ldrPin = 7;
int ledPin= 12;
int val = 0;
int salioelsol = 0;
int seocultoelsol = 0;
//int segundos = 0;
//int segundostotal = 20;
unsigned long segundos = millis();
unsigned long segundostotal = 20;

void setup() {
  pinMode(ldrPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}
 
void loop() {
  int val = digitalRead(ldrPin);
//  delay(1000);
//  segundos = segundos + 1; 
  Serial.print("seg ");
  Serial.print((millis()-segundos)/1000);
  Serial.print("  val ");
  Serial.println(val);
  
 
  if((val == LOW) && (salioelsol == 0)){
       salioelsol = 1;
       segundos = 0;
         }
  if ((val == HIGH) && (salioelsol == 1)){
    seocultoelsol = 1;
     digitalWrite(ledPin, HIGH);
      if ((millis()-segundos)/1000 >= segundostotal){
                 digitalWrite(ledPin, LOW);
                 salioelsol = 0;
                 seocultoelsol = 0;
                 //segundos = 0;
                 segundos = millis();
    }
       
  }
  }

Bien! voy a probarlo así a ver que tal. gracias!