Go Down

Topic: Proyecto control de persianas automatizadas (Read 1 time) previous topic - next topic

ivitito

Sep 29, 2017, 02:32 pm Last Edit: Sep 29, 2017, 10:17 pm by surbyte
Buenas tardes,

estoy haciendo un proyecto de final de carrera de un sistema de control de persianas y luces. Me encuentro con que las persianas y las luces funcionan en algunos caso pero en otros no:


NO FUNCIONA: si el LDR NO DETECTA LUZ (LED ROJO ENCENDIDO) Y ESTAS PULSADO EL PULSADOR DE LA LUZ (pulsador amarillo), no enciende y apaga el led rojo.

en caso contrario, estando el LDR detectando LUZ(LED rojo APAGADO), puedes pulsar el pulsador y el LED se encienda y apaga.


los led amarillo y verde son motor subiendo y motor bajando respectivamente.

la Protoboard pequeña es para otra parte del proyecto y simplemente tengo en comun GND.

Estoy un poco perdido ahora mismo porque no encuentro mi error o errores, ayuda por favor.



Dejo el codigo:

Code: [Select]
//boton pulsador
const int LED = 8; //pin del LED
const int LEDsubir = 4; //pin del LED motor subiendo
const int LEDbajar = 5; //pin del LED motor bajando

const int BOTON = 7; // pin pulsador

const int FCsubir = 2; // pin FC subida
const int FCbajar = 3; // pin FC bajada

int LDRpin = A1; // pin sensor LDR

int val = 0; //val se emplea para almacenar el estado del boton
int state = 0; // 0 LED apagado, mientras que 1 encendido
int old_val = 0; // almacena el antiguo valor de val

int val_FCsub = 0; // Almacenar valor FC subir
int val_FCbaj = 0; // Almacenar valor FC bajar

//int valor = 0; //val se emplea para almacenar el estado del boton de persianas
int estadosubir = 0; // 0 Motor subir apagado, mientras que 1 encendido
int estadobajar = 0; // 0 Motor bajar apagado, mientras que 1 encendido
//int val_ant = 0; // almacena el antiguo valor del boton de las persianas

void setup() {
  pinMode(LED, OUTPUT); // establecer que el pin digital es una señal de salida
  pinMode(LEDsubir, OUTPUT); // establecer que el pin digital es una señal de salida
  pinMode(LEDbajar, OUTPUT); // establecer que el pin digital es una señal de salida

  pinMode(BOTON, INPUT); // y BOTON como señal de entrada

  pinMode(FCsubir, INPUT); // y FC subida como señal de entrada
  pinMode(FCbajar, INPUT); // y FC bajada como señal de entrada


  pinMode(LDRpin, INPUT); // LDR como entrada
  Serial.begin(9600);
}

void loop() {

  // FC
  val_FCsub = digitalRead(FCsubir); // lee el estado del FCsubir
  val_FCbaj = digitalRead(FCbajar); // lee el estado del FCbajar   

  Serial.println("FCsubir:");
  Serial.println(val_FCsub);
  Serial.println("FCbajar:");
  Serial.println(val_FCbaj);

  // BOTON LUZ
  val = digitalRead(BOTON); // lee el estado del Boton
  Serial.println("boton:");
  Serial.println(val);
  int LDRvalor = analogRead(LDRpin);   //leo el valor del LDR
  Serial.println("LDR:");
  Serial.println(LDRvalor);

  delay (1000);

  if ((val == HIGH) && (old_val == LOW)) {
    state = 1 - state;
    delay(10);
  }
  old_val = val; // valor del antiguo estado
  Serial.println("valor viejo:");
  Serial.println(old_val);
  Serial.println("Stado:");
  Serial.println(state);





  if ((state == 1) && (LDRvalor >= 80) && (val_FCbaj == 1)) { // caso 4
    digitalWrite(LED, HIGH); // enciende el LED
    digitalWrite(LEDbajar, HIGH); //Bajo la persiana
    digitalWrite(LEDsubir, LOW); //
  }
  else if ((state == 1) && (LDRvalor >= 80) && (val_FCbaj == 0)) { // caso 4 FIN
    digitalWrite(LED, HIGH); // enciende el LED
    digitalWrite(LEDbajar, LOW); //Bajo la persiana
    digitalWrite(LEDsubir, LOW); //
  }
  else if ((state == 1) && (LDRvalor < 80) && (val_FCsub == 1)) { // caso 2
    digitalWrite(LED, HIGH); // enciende el LED
    digitalWrite(LEDsubir, HIGH); //subo la persiana
    digitalWrite(LEDbajar, LOW); //
  }
  else if ((state == 1) && (LDRvalor < 80) && (val_FCsub == 0)) { // caso 2 FIN
    digitalWrite(LED, HIGH); // enciende el LED
    digitalWrite(LEDsubir, LOW); //subo la persiana
    digitalWrite(LEDbajar, LOW); //
  }
  else if ((state == 0) && (LDRvalor >= 80) && (val_FCbaj == 1)) { //caso 3
    digitalWrite(LED, HIGH); //Enciendo la luz
    digitalWrite(LEDbajar, HIGH); //Bajo la persiana
    digitalWrite(LEDsubir, LOW); //
    Serial.println("Es de noche, LUZ encendida");
  }
  else if ((state == 0) && (LDRvalor >= 80) && (val_FCbaj == 0)) { //caso 3 FIN
    digitalWrite(LED, HIGH); //Enciendo la luz
    digitalWrite(LEDbajar, LOW); //Bajo la persiana
    digitalWrite(LEDsubir, LOW); //
    Serial.println("Es de noche, LUZ encendida");
  }
  else if ((state == 0) && (LDRvalor < 80) && (val_FCsub == 1)) { // caso 1
    digitalWrite(LED, LOW);          //Apago la luz
    digitalWrite(LEDsubir, HIGH);          //Subo la persiana
    digitalWrite(LEDbajar, LOW); //
    Serial.println("Es de dia, LUZ apagada");
  }
  else if ((state == 0) && (LDRvalor < 80) && (val_FCsub == 0)) { // caso 1
    digitalWrite(LED, LOW);          //Apago la luz
    digitalWrite(LEDsubir, LOW);          //Subo la persiana
    digitalWrite(LEDbajar, HIGH); //
    Serial.println("Es de dia, LUZ apagada");
  }
}





surbyte

Puedes explicarte mejor!!

Yo no comprendo la relación entre subir/bajar y el LDR ademas de tu botón que cambia el estado.

Recuerda que nosotros no estamos ahi pero lo que mas me sorprende es que es tu tesis de modo que deberías poder explicarte con mayor claridad. Si nosotros no entendemos, espero que tu profesor si.

A ver si mejoras las comunicación.
Yo tengo tu código corregido pero haciendo lo mismo porque luego no pude entender tus objetivos.

Persianas,suben o bajan. Ok
Luz dia/noche => Luz dia ABRIR. Luz de noche BAJAR

Bien, que mas? quieres que el boton pase por encima de esta orden y suba/baje las persianas independientemente de la luz exterior?

ivitito

Tienes razon, me explique un poco mal, tenia un poco de prisa y hacer las cosas a correr no es buena idea.

Empezemos.. El proyecto se basa el domotizar las persianas y las luces.

Como veis en las imagenes, tengo un led rojo, eso representa la luz de una habitacion por ejemplo, al lado se ve un pulsador amarillo, ese interruptor controla la luz, un uno se enciende un 0 se apaga.

Despues tambien veis otros dos leds, representan el motor de la persiana, el amarillo es motor subiendo y el verde motor bajando.

Mi idea es, si el LDR detecta que no hay luz fuera, entonces bajará las persianas y encenderá la luz(caso es de noche). Si si que hay luz, hara lo contrario, subir las persianas y apagar la luz (ya que seria de dia). Quiero tambien, que ante la pulsacion del pulsador amarillo, la luz se encienda y se apague. Independientemente de las condiciones, ya que si estas enfermo y es de noche, igual quieres dormir y la luz estaria encendida.

Hasta este punto, EL FALLO es que si es de noche (LDR por encima del umbral) la persiana se baja y se enciende la luz, lo que pasa, es que no hace caso al pulsador, NO PUEDO ENCENDER NI APAGAR LA LUZ MANUALEMENTE, sin embargo en caso contrario, (de dia con LDR sin deteccion de luz) si que tengo el control manual funcionando correctamente.


Ahora he intalado un pulsador verde con conexion igual que el amarillo, para controlar las persianas. Pero no se muy bien como programarlo para que tenga prioridad sobre el LDR.

muchas gracias.

ivitito

He seguido mejorando el proyecto ya que encontré un error que lo hacía poco eficiente que era en él caso que fuera de noche, La Luz se encendería aunque no estuvieras en casa. He introducido un detector de presencia. Caso 3.

Sigo con el problema de que no doy puesto prioritario el interruptor, que siempre que pulse el interruptor haga caso y encienda y apague La Luz detecte lo que detecte el sensor.

Alguien puede ayudarme? Muchas gracias.

rodripelto

Hola,

En primer lugar, state una vez que se a puesto a 1 nunca vuelve a 0.

Segundo, tiene 8 if para controlar las persiana, yo creo que necesitas solo 2.

Si es de día y la persiana esta bajada entonces la subo y apago la luz, en el resto de los casos de día no hago nada.

Segundo if independiente del primero, si es de noche y la persiana esta subida entonces bajo la persiana y enciendo la luz, en el resto de los cason de noche no hago nada.

Para la luz, otro if, si hay pulsación cambi el estado de la luz, como mucho añadiria que si es de día ignore la pulsación.

Hemos pasado de 8 IF a 3.

Tercero, todas las variables int que tienes el cual su estado es 0 ó 1 estan pidiendo a gritos que sean variables bool
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

ivitito

#5
Oct 09, 2017, 07:02 pm Last Edit: Oct 20, 2017, 05:23 pm by ivitito
te comento lo que hace:

He dejado cuatro casos, porque cuando pulso el final de carrera de subir quiero que se apague el LED que representa motorsubiendo (al llegar al tope los dos motores(leds) quedarian apagados esperando cambio).

Tengo el mismo problema con el boton, cuando pulso el pulsador amarillo de encender y apagar la luz, cuando el LDR no detecta luz, me lo enciende y apaga bien, pero cuando si detecta luz, no me funciona el pulsador.

¿cual es el error?

muchas gracias por la respuesta anterior, y por lo de los bool, no me habia dado cuenta.

rodripelto

Yo intentaria lo siguiente
Code: [Select]

if (val == HIGH ){
state= !state;
delay(10);
}

Y
Code: [Select]

digitalWrite(LED, state);

Sin el if
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

ivitito

Vale, hice lo que me has dicho, pero ahora el problema que tengo es que detecte lo que detecte el LDR, me deja encender y apagar la luz con el pulsador, pero si es de noche (LDR>=200) no me enciende el LED como yo quiero que haga. Te dejo el codigo a ver si ves tu el error, ya que yo veo que ese If (CASO 4) se cumplen las condiciones y no hace el Digitalwrite (LED, High).

Mi idea es que en ese caso, este como este el LED, lo enciendo, si esta encendido lo deje como tal, y si esta apagado lo encienda, ya que es de noche por tanto luz encendida.

Code: [Select]

//boton pulsador
const int LED =8; //pin del LED
const int LEDsubir =4; //pin del LED motor subiendo
const int LEDbajar =5; //pin del LED motor bajando

const int BOTON = 7; // pin pulsador

const int FCsubir = 2; // pin FC subida
const int FCbajar = 3; // pin FC bajada

int LDRpin= A1; // pin sensor LDR

bool val = 0; //val se emplea para almacenar el estado del boton
bool state = false; // 0 LED apagado, mientras que 1 encendido
//bool old_val = 0; // almacena el antiguo valor de val

bool val_FCsub = false; // Almacenar valor FC subir
bool val_FCbaj = false; // Almacenar valor FC bajar


void setup(){
 pinMode(LED,OUTPUT); // establecer que el pin digital es una señal de salida
 pinMode(LEDsubir,OUTPUT); // establecer que el pin digital es una señal de salida
 pinMode(LEDbajar,OUTPUT); // establecer que el pin digital es una señal de salida
 
 pinMode(BOTON,INPUT); // y BOTON como señal de entrada
 
 pinMode(FCsubir,INPUT); // y FC subida como señal de entrada
 pinMode(FCbajar,INPUT); // y FC bajada como señal de entrada

 
 pinMode(LDRpin, INPUT); // LDR como entrada
    Serial.begin(9600);
}

void loop() {

  // FC
val_FCsub= digitalRead(FCsubir); // lee el estado del FCsubir
val_FCbaj= digitalRead(FCbajar); // lee el estado del FCbajar   

Serial.println("FCsubir:");
Serial.println(val_FCsub);
Serial.println("FCbajar:");
Serial.println(val_FCbaj);
 
  // BOTON LUZ
val= digitalRead(BOTON); // lee el estado del Boton
Serial.println("boton:");
Serial.println(val);

//LDR
int LDRvalor = analogRead(LDRpin);   //leo el valor del LDR
Serial.println("LDR:");
Serial.println(LDRvalor);

delay (1000);

if (val == HIGH) {
state= !state;
delay(10);
}
Serial.println("Stado:");
Serial.println(state);


delay(1000);


if ((LDRvalor>= 200)&&(val_FCbaj==true)){ // caso 4
 digitalWrite(LED, HIGH); // enciende el LED
  bajarpersiana();
}
else if ((LDRvalor>= 200)&&(val_FCbaj==false)){ // caso 4 FIN
 digitalWrite(LED, HIGH); // enciende el LED
 digitalWrite(LEDbajar, LOW); //Bajo la persiana
 digitalWrite(LEDsubir, LOW); //
}
else if ((LDRvalor < 200)&&(val_FCsub==true)){ // caso 2
 digitalWrite(LED, LOW); // apaga el LED
 subirpersiana();
}
else if ((LDRvalor<200)&&(val_FCsub==false)){ // caso 2 FIN
 digitalWrite(LED, LOW); // apaga el LED
 digitalWrite(LEDsubir, LOW); //subo la persiana
 digitalWrite(LEDbajar, LOW); //
}

digitalWrite(LED, state);

}





void subirpersiana () {
 digitalWrite(LEDsubir, HIGH); //subo la persiana
 digitalWrite(LEDbajar, LOW); //
}

void bajarpersiana () {
 digitalWrite(LEDbajar, HIGH); //Bajo la persiana
 digitalWrite(LEDsubir, LOW); //
}




muchas gracias por las respuestas.

rodripelto

Te propongo este otro cambio, a ver si así si.
Code: [Select]

void loop() {

  // FC
val_FCsub= digitalRead(FCsubir); // lee el estado del FCsubir
val_FCbaj= digitalRead(FCbajar); // lee el estado del FCbajar   

Serial.println("FCsubir:");
Serial.println(val_FCsub);
Serial.println("FCbajar:");
Serial.println(val_FCbaj);
 
  // BOTON LUZ
val= digitalRead(BOTON); // lee el estado del Boton
Serial.println("boton:");
Serial.println(val);

//LDR
int LDRvalor = analogRead(LDRpin);   //leo el valor del LDR
Serial.println("LDR:");
Serial.println(LDRvalor);

delay (1000);

if (val == HIGH) {
state= !state;
delay(10);
}
Serial.println("Stado:");
Serial.println(state);


delay(1000);


if ((LDRvalor>= 200)&&(val_FCbaj==true)){ // caso 4
 //digitalWrite(LED, HIGH); // enciende el LED
state=true;
  bajarpersiana();
}
else if ((LDRvalor>= 200)&&(val_FCbaj==false)){ // caso 4 FIN
 //digitalWrite(LED, HIGH); // enciende el LED
state=true;
 digitalWrite(LEDbajar, LOW); //Bajo la persiana
 digitalWrite(LEDsubir, LOW); //
}
else if ((LDRvalor < 200)&&(val_FCsub==true)){ // caso 2
 //digitalWrite(LED, LOW); // apaga el LED
state=false;
 subirpersiana();
}
else if ((LDRvalor<200)&&(val_FCsub==false)){ // caso 2 FIN
 //digitalWrite(LED, LOW); // apaga el LED
state=false;
 digitalWrite(LEDsubir, LOW); //subo la persiana
 digitalWrite(LEDbajar, LOW); //
}

digitalWrite(LED, state);

}


así solo actuamos sobre el led en la útima linea y siempre tenemos controlada la variable state.
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

ivitito

No, con ese codigo funciona, lo de si esta detecta luz  funcionan las persianas y led apagado, y si no detecta luz, si se enciende el LED y funcionan las persianas. Ahora lo que no va, es el pulsador, detecta la pulsacion pero no se enciende y apaga.

rodripelto

Vale, vamos a ver si con esto otro.
Code: [Select]

void loop() {

  // FC
val_FCsub= digitalRead(FCsubir); // lee el estado del FCsubir
val_FCbaj= digitalRead(FCbajar); // lee el estado del FCbajar   

Serial.println("FCsubir:");
Serial.println(val_FCsub);
Serial.println("FCbajar:");
Serial.println(val_FCbaj);
 
  // BOTON LUZ
val= digitalRead(BOTON); // lee el estado del Boton
Serial.println("boton:");
Serial.println(val);

//LDR
int LDRvalor = analogRead(LDRpin);   //leo el valor del LDR
Serial.println("LDR:");
Serial.println(LDRvalor);

delay (1000);

if (val == HIGH) {
state= !state;
delay(10);
}
Serial.println("Stado:");
Serial.println(state);


delay(1000);


if ((LDRvalor>= 200)&&(val_FCbaj==true)){ // caso 4 es de noche baja la persiana y enciende la luz
 //digitalWrite(LED, HIGH); // enciende el LED
state=true;
  bajarpersiana();
}
else if ((LDRvalor>= 200)&&(val_FCbaj==false)){ // caso 4 FIN Solo quiero que para la persiana no que controle las luces
 //digitalWrite(LED, HIGH); // enciende el LED
//state=true;
 digitalWrite(LEDbajar, LOW); //Bajo la persiana
 digitalWrite(LEDsubir, LOW); //
}
else if ((LDRvalor < 200)&&(val_FCsub==true)){ // caso 2 Es de dia sube la persiana y apaga la luz
 //digitalWrite(LED, LOW); // apaga el LED
state=false;
 subirpersiana();
}
else if ((LDRvalor<200)&&(val_FCsub==false)){ // caso 2 FIN Solo quiero que para la persiana no que controle las luces
 //digitalWrite(LED, LOW); // apaga el LED
//state=false;
 digitalWrite(LEDsubir, LOW); //subo la persiana
 digitalWrite(LEDbajar, LOW); //
}

digitalWrite(LED, state);

}
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

ivitito

Sigue haciendo lo mismo que antes, funciona segun el LDR pero detecta la pulsación y cambia la variable state pero no cambia el estado del LED.

rodripelto

Pue la verdad no lo se, ¿Has puesto el código tal cual te lo he pasado? pon un serial.print antes de digitalWrite(LED, state); para ver en que estado llega state.
¿ cuando sube la persina apaga la luz y cuando baja la persiana encinde la luz?. Puede que este equivocado pero creo que false es equivalente a LOW y a 0.
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

ivitito

Correcto, he puesto exactamente el mismo codigo que tu. El seguimiento del sensor lo hace ok. Enciende el LED si es de noche y lo apaga si es de dia, modificando bien el State justo antes del DigitalWrite.

Uso del pulsador: Cuando pulso detecta Boton y lo pone a 0 y a 1, y cambia estado a 1 pero segun sueltas se pone a cero sin otra pulsacion, se resetea solo. Y no cambia el Led ni de dia ni de noche.

Cambiando en tu codigo por doble igual:
Code: [Select]

if ((LDRvalor>= 200)&&(val_FCbaj==true)){ // caso 4 es de noche baja la persiana y enciende la luz
 //digitalWrite(LED, HIGH); // enciende el LED
state==true;
  bajarpersiana();


el boton funciona bien sea de dia y de noche, pero el Sensor no funciona bien, es de noche y no enciende la luz, si queda encendida de dia y apagas la luz, se mantiene encendida porque no cambia en funcion del sensor.

rodripelto

Tiene que ser 1 igual 2 iguales es para comparación.
Creo que entra en un if que no debe.
Cuentame el funcionamiento de los finales de carrera. ¿ cuando no están pulsados que tensión le llega al PIN arduino? ¿ cuando la persiana esta subida el fina de carrera subida esta pulsado? ¿ los estas pulsando manualmente?.
Una forma de depurar es usar serial.print pon uno dentro de cada if con mensajes distintos para ir viendo por donde pasa.

Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

Go Up