Go Down

Topic: control de iluminacion (Read 342 times) previous topic - next topic

Ozvaldo

Aug 10, 2018, 01:41 am Last Edit: Aug 10, 2018, 09:34 pm by surbyte
Buen dia, actualmente estoy haciendo un control de iluminacion con mi arduino UNO para el laboratorio de mi escuela, tengo el programa(ya compila y lo logro cargar en mi arduino) y un pequeño diagrama electrico, pero no hace lo que yo esperaba. Podrian por favor decirme si encuentran algun error?

Adjunto mi codigo(ahi trae la explicacion detallada del problema y modifique un poco los comentarios para que se viera bonito aqui) y mi diagrama electrico.

POR FAVOR AYUDENME, ESTOY DESESPERADO

Code: [Select]
#####################################################################
//El programa trata de esto. Hay que controlar las luces del laboratorio, alternando el encendido de cada una por dia, son siete en total mediante un boton de encendido y uno de apagado, tomando en cuenta si movimiento en el laboratorio.
//Al llegar el laboratorista un lunes con un boton de encendido en la mañana lo presiona y prende la lampara uno, si se detecta movimiento en el laboratorio se prenden las otras lamparas, sino pos no, al salir presiona un boton de apagado y se queda a oscuras.
//El martes presiona el boton de encendido y ahora prende la segunda lampara, si se detecta movimiento en el laboratorio se prenden las otras lamparas,sino pos no, al salir presiona un boton de apagado y se queda a oscuras.
//El miercoles presiona el boton de encendido y ahora prende la tercera lampara, si se detecta movimiento en el laboratorio se prenden las otras lamparas, sino pos no, al salir presiona un boton de apagado y se queda a oscuras.
//El jueves presiona el boton de encendido y ahora prende la cuarta lampara, si se detecta movimiento en el laboratorio se prenden las otras lamparas, sino pos no, al salir presiona un boton de apagado y se queda a oscuras.
//El viernes presiona el boton de encendido y ahora prende la quinta lampara, si se detecta movimiento en el laboratorio se prenden las otras lamparas, sino pos no, al salir presiona un boton de apagado y se queda a oscuras.
//y asi sucesivamente con las otras lamparas

const int on = 0; //boton de encendido
const int off = 1; //boton de apagado
const int led = 2; //led indicador
const int s1 = 3; //Sensor 1
const int s2 = 4; //Sensor 2
const int s3 = 5; //Sensor 3
const int s4 = 6; //Sensor 4
const int s5 = 7; //Sensor 5

const int l1 = 9; //lampara 1
const int l2 = 10; //lampara 2
const int l3 = 11; //lampara 3
const int l4 = 12; //lampara 4
const int l5 = 13; //lampara 5
int i = 0;

void setup() {
pinMode(on,INPUT);
pinMode(off,INPUT);
pinMode(led,OUTPUT);
pinMode(s1,INPUT);
pinMode(s2,INPUT);
pinMode(s3,INPUT);
pinMode(s4,INPUT);
pinMode(s5,INPUT);

pinMode(l1,OUTPUT);
pinMode(l2,OUTPUT);
pinMode(l3,OUTPUT);
pinMode(l4,OUTPUT);
pinMode(l5,OUTPUT);
Serial.begin(9600);
}
void loop()
{
 int value = i;



 if(digitalRead(on) == HIGH)
  {
    i = 0; i < 6; i++; //aqui esta el contador donde le digo que por cada que presionen el boton de encendido el contador del dia aumente en uno
   value = (i);
   Serial.println(value);
   digitalWrite(led,HIGH);//este es un led indicador
  }

  switch(value){
  
case(1): //aqui aplica la primer condicion para saber que lampara prender, en este caso es la 1
      
      digitalWrite(l1,HIGH);
      digitalRead(s3);
      digitalRead(s4);
      digitalRead(s5);//ahora lee los sensores de movimiento                
       if(s3 == HIGH || s4 == HIGH || s5 == HIGH)//si alguno de los sensores esta percibiendo las lamparas se prenden
         {
          digitalWrite(l3,HIGH);
          digitalWrite(l4,HIGH);
          digitalWrite(l5,HIGH);
         }
      digitalRead(s1);//lee los sensores de movimiento
      digitalRead(s2);
       if(s1 == HIGH || s2 == HIGH)//si alguno de los sensores esta percibiendo las lamparas se prenden
        {
         digitalWrite(l1,HIGH);
         digitalWrite(l2,HIGH);
        }


    case(2): //aqui aplica la primer condicion para saber que lampara prender, en este caso es la 1
    
      digitalWrite(l2,HIGH);
      digitalRead(s3);
      digitalRead(s4);
      digitalRead(s5);//ahora lee los sensores de movimiento                
       if(s3 == HIGH || s4 == HIGH || s5 == HIGH)//si alguno de los sensores esta percibiendo las lamparas se prenden
         {
          digitalWrite(l3,HIGH);
          digitalWrite(l4,HIGH);
          digitalWrite(l5,HIGH);
         }
      digitalRead(s1);//lee los sensores de movimiento
      digitalRead(s2);
       if(s1 == HIGH || s2 == HIGH)//si alguno de los sensores esta percibiendo las lamparas se prenden
        {
         digitalWrite(l1,HIGH);
         digitalWrite(l2,HIGH);
        }
    
     case(3): //aqui aplica la primer condicion para saber que lampara prender, en este caso es la 1
    
      digitalWrite(l3,HIGH);
      
       //el laboratorio se dividira en dos secciones para evitar encender todas las luces cuando haya movimiento, solo encendera las luces que esten en el lado donde haya movimiento
      digitalRead(s3);
      digitalRead(s4);
      digitalRead(s5);//ahora lee los sensores de movimiento            
       if(s3 == HIGH || s4 == HIGH || s5 == HIGH)//si alguno de los sensores esta percibiendo las lamparas se prenden
         {
          digitalWrite(l3,HIGH);
          digitalWrite(l4,HIGH);
          digitalWrite(l5,HIGH);
         }
        
      digitalRead(s1);//lee los sensores de movimiento
      digitalRead(s2);
       if(s1 == HIGH || s2 == HIGH)//si alguno de los sensores esta percibiendo las lamparas se prenden
        {
         digitalWrite(l1,HIGH);
         digitalWrite(l2,HIGH);
        }
    
     case(4): //aqui aplica la primer condicion para saber que lampara prender, en este caso es la 1
    
      digitalWrite(l4,HIGH);
      digitalRead(s3);
      digitalRead(s4);
      digitalRead(s5);//ahora lee los sensores de movimiento            
       if(s3 == HIGH || s4 == HIGH || s5 == HIGH)//si alguno de los sensores esta percibiendo las lamparas se prenden
         {
          digitalWrite(l3,HIGH);
          digitalWrite(l4,HIGH);
          digitalWrite(l5,HIGH);
         }
      digitalRead(s1);//lee los sensores de movimiento
      digitalRead(s2);
       if(s1 == HIGH || s2 == HIGH)//si alguno de los sensores esta percibiendo las lamparas se prenden
        {
         digitalWrite(l1,HIGH);
         digitalWrite(l2,HIGH);
        }
    
     case(5): //aqui aplica la primer condicion para saber que lampara prender, en este caso es la 1
    
      digitalWrite(l5,HIGH);
      digitalRead(s3);
      digitalRead(s4);
      digitalRead(s5);//ahora lee los sensores de movimiento            
       if(s3 == HIGH || s4 == HIGH || s5 == HIGH)//si alguno de los sensores esta percibiendo las lamparas se prenden
         {
          digitalWrite(l3,HIGH);
          digitalWrite(l4,HIGH);
          digitalWrite(l5,HIGH);
         }
      digitalRead(s1);//lee los sensores de movimiento
      digitalRead(s2);
       if(s1 == HIGH || s2 == HIGH)//si alguno de los sensores esta percibiendo las lamparas se prenden
        {
         digitalWrite(l1,HIGH);
         digitalWrite(l2,HIGH);
        }
    
  }
}





Daniel_Arg

#1
Aug 10, 2018, 12:28 pm Last Edit: Aug 10, 2018, 12:33 pm by Daniel_Arg
Hola.

Si el profesor te lo ha planteado rotar la luz que siempre se enciende fija, creo que se equivoca.

Toda sala o laboratorio tiene un puerta de entrada y por lógica, esta al alcance de la mano la llave que encienden alguna o todas las luces del laboratorio.

Si son 5 artefactos y tienen 5 sensores, pues que todos trabajen para lo cual fueron diseñados. Apenas entrar al laboratorio se debería encender la primera luminaria.

Si quieren usar una llave de encendido como en este caso, debe ser la primera luminaria y entonces solo se necesitan 4 sensores para el resto de las lámparas.

Las luminarias que están conectadas a la red eléctrica deben ser accionadas mediante relay y estos son directamente disparados por el módulo sensor que tiene ajuste de sensibilidad y tiempo de retención, con lo cual es una imbecilidad usar un arduino.


Me he fijado en tus post y llevas meses preguntando por este tema. No se a cuanto estamos para que este foro sea "El rincón del vago"  pero bueno, aquí tienes tu código.


Si usar arduino, debes setear el sensor en un tiempo corto y arduino será quien demore en apagar las luminarias con la variable intervalo, que por defecto es 30000 = 30 segundos.


Los pines para los relay son {8, 9, 10, 11, 12}.
Para probar el código en tu protoboard las entradas {3, 4, 5, 6, 7} están con INPUT_PULLUP y debes ponerlas a mas para ver encender los relay pero los sensores si no me equivoco dan un estado alto al activar, por lo cual deberás quitar el PULLUP  y dejar solo INPUT, pero tendrás que poner entre los pines y masa una resistencia de 4K7 o un valor parecido para que no se disparen por ruidos.

Las líneas las dejo comentadas.

Lo hice con botón pulsador que al accionar pone a masa la para analógica 0 de arduino.

Con un pulsación o Click la primera luz enciende y al censar se encienden el resto. Si la variable estado esta activada con otro Click se apagan todas las luces.

Como es una estupidez usar arduino para esto había que agregarle una función mas.
Supongamos que para un evento especial  con el director van al laboratorio y quieren que las luces queden todas encendidas anulando los sensores de movimiento, bastará con hacer DobleClick en el botón.


Code: [Select]

#include "OneButton.h"
OneButton button(A0, true);  // puldador a masa.

unsigned long previousMillis[5];
const byte relay[5] = {8, 9, 10, 11, 12};
const byte sensor[5] = {3, 4, 5, 6, 7};
bool state = 0;
bool todas = 0;
int rotacion = 0;
unsigned long currentMillis;
long intervalo = 30000;   // Tiempo que demora en apagar.

void setup() {
    button.attachClick(Click);
    button.attachDoubleClick(Doubleclick);
    for(int i=0;i<5;i++) {
      pinMode(sensor[i],INPUT_PULLUP);  // cambiar a solo INPUT para instalar sendor
      pinMode(relay[i],OUTPUT);
      digitalWrite(relay[i],HIGH);
    }
}

void loop() {
  button.tick();
  currentMillis = millis();
  previousMillis[rotacion] = currentMillis;

  while(todas) {
    button.tick();
    for (byte a = 0; a < 5; a++){
      digitalWrite(relay[a],LOW);
    }
  }

  if (state) {
    for (byte i = 0; i < 5; i++) {
    if (digitalRead(sensor[i]) == LOW) {  // Cambiar LOW a HIGH para leer los sensores
      Serial.println(previousMillis[i]);
      previousMillis[i] = currentMillis ;
      }
    }

    for (byte a = 0; a < 5; a++){
    if ( millis() - previousMillis[a] < intervalo) {
     digitalWrite(relay[a],LOW);
     }
     else {
      digitalWrite(relay[a],HIGH);
     }
    }
   }
  
   if (!state) {
     for (byte a = 0; a < 5; a++){
     digitalWrite(relay[a],HIGH);
     previousMillis[a] = 0;
    }
   }

 }

 void Click() {
  if (todas) {
    todas = !todas;
    state = !state;
  }
  state = !state;

  if (state) {
    rotacion++;
    if (rotacion > 4) rotacion = 0;
  }
}

void Doubleclick() {
todas = !todas;
}



No olvides instalar la librería OneButton.



ArduMyth

#2
Aug 10, 2018, 06:55 pm Last Edit: Aug 10, 2018, 07:17 pm by ArduMyth
Me he fijado en tus post y llevas meses preguntando por este tema. No se a cuanto estamos para que este foro sea "El rincón del vago"  pero bueno, aquí tienes tu código.
@Daniel_Arg El código está muy bien porque puede servir para terceros, pero ningún favor les haces a quienes entran en el foro buscando que les hagan sus tareas o ejercicios de clase. Sólo estás incrementando su mal hábito y lo que es peor, su tiempo antes de "estallarse" contra la realidad. Quien copia y pega no aprende. Yo no ví a nadie que copiase ejercicios de programación graduarse nunca.

Quienes tienen esta actitud de desesperación y búsqueda constante de los ejercicios en internet porque no consiguen hacerlo por sí mismos deben darse cuenta que se han metido en algo que no son capaces de realizar porque no les gusta, al que le gusta programar se busca la vida y aprende no lo solicita hecho una y otra vez. Es cómo darle unas gotas de agua a alguien en un desierto que se niega a moverse del sitio, lo salvas un día a sabiendas que igual se va a morir porque no quiere moverse.

Mi opinión es que contribuyamos a hacer del foro de Arduino lo mismo que los otros foros programación, un lugar de dudas y soluciones, un lugar de formación, no un lugar de Control+C y Control+V para quien no quiere ni aprender.

Fíjate que lleva tres post y sigue saltándose las normas del foro y deja el código sin poner los tags. Vamos que va a lo suyo, a mendigar código y le da igual todo lo demás.

Saludos

Daniel_Arg

@Daniel_Arg Fíjate que lleva tres post y sigue saltándose las normas del foro y deja el código sin poner los tags. Vamos que va a lo suyo, a mendigar código y le da igual todo lo demás.

Saludos
Yo también fui joven!!!!   Que esta vez al menos ha intentado hacerlo a pesar que ha escrito 20 veces digitalRead y digitalWrite.  Yo creo que a pesar que yo le haga el trabajo igual va a a prender, porque quedará sorprendido porque con tan pocas líneas de código hago mucho mas que con el suyo, y lo va a conseguir.

Se lo ganó  por obstinado, por valiente y no renunciar en el primer intento.

Ozvaldo

@Daniel_arg muchas gracias por tu ayuda enserio solo una pregunta, que modelo de arduino utilizaste? Y como comentario final, si se me paso mencionar que las luces si seran controladas por relays asi como tu me comentabas solo que aqui pues como simulacion utlizo leds para cada una de las posibles salidas


@ArduMyth yo no entre aqui pidiendo que me hicieran mi tarea sino que me corrigieran o dieran algun consejo con respecto a mi proyecto, si lo acepto la verdad la programacion no se me da pero enserio que me e esforzado por tratar de entenderle
Y si no sigo las normas de este foro es porque soy nuevo en esto, esta no es la primera ves que me lo dicen, estoy en otros foros y cada uno tiene sus normas distintas

Daniel_Arg

@Daniel_arg muchas gracias por tu ayuda enserio solo una pregunta, que modelo de arduino utilizaste? Y como comentario final, si se me paso mencionar que las luces si seran controladas por relays asi como tu me comentabas solo que aqui pues como simulacion utlizo leds para cada una de las posibles salidas

Uso arduino uno pero puede ser un nano también. Así como te dejé el código, las salidas están el alto y bajan para disparar los relay.  Si pones led's estarán brillando cuando cuando los relay están apagados y viceversa.

Para probar las entradas solo ponle pulsadores a masa. En cambio, como yo no tengo sensores y estos disparan un nivel alto cuando detectan moviendo tendrás que sacar el PULLUP en el setup y poner una resistencia de 1k a 4k7  al instalar los infrarrojos.

Saludos

Go Up