Go Down

Topic: Proyecto control de persianas automatizadas (Read 460 times) previous topic - next topic

ivitito

Vale pues con un igual la situación es que hace caso al sensor pero que no funciona el pulsador.
Te pego todo el codigo de nuevo que tengo ahora mismo.

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 es de noche baja la persiana y enciende la luz
 //digitalWrite(LED, HIGH); // enciende el LED
state=1;
  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); //
}

Serial.println("Stado final LED:");
Serial.println(state);
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); //
}


Al Pulsar el pulsador, detecta un 1 en el BOTON, cambia el estado a 1, pero el estado al que llamo estado final de led se mantiene a 0.
Cuando hace el cambio automatico con el LDR, si es de noche enciende el LED y el estado final de led se pone a 1. Si es de dia el estado final de Led se pone a 0 y se apaga.

te cuento los finales de carrera los tengo normalmente abierto, entonces estan siempre a 1. Cuando enciende el led de motorsubiendo por ejemplo, y llega al final de subida pulsaria el FC y lo pone a cero, por tanto apaga el led de subida y se quedan los dos apagados. Eso lo hace bien.

No encuentro el fallo por mucho que lo miro. Cuando pulsas el pulsador no cambia el state del DigitalWrite pero si el state de justo despues de state=!state


rodripelto

Pues yo tampoco, por favor pon los serial.print dentro de los if para seguir el flujo del programa.
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

ivitito

que pongo dentro de cada if en el Print? state?

rodripelto

Mensajes diferentes, por ejemplo subiendo persiana, bajando persiana, desconectando subida, desconectando bajada o simplemente 1 2 3 4. Lo que quieras es para saber en que parte del programa esta.
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

ivitito

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=1;
  bajarpersiana();
  Serial.println("If de bajada/Persianas ON");
}

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); //
 Serial.println("If de bajada/Persianas OFF");
}
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();
 Serial.println("If de subida/Persianas ON");
}
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); //
 Serial.println("If de subida/Persianas OFF");
}

Serial.println("Stado final LED:");
Serial.println(state);
digitalWrite(LED, state);

}



Lo he puesto asi, y si apago la luz entra en el IF de bajada , si la enciendo entro en el If de subida. Se enciende el LED con luz apagada de noche.

El problema esta en el boton, es raro que el state del print de state=!state , si que cambia al pulsar, pero no cambia el print de stado final LED.

Si pulsas el pulsador, boton=1 y state= 1, el boton cambia a 0 al soltar y si vuelves a pulsar el boton state=0 y al soltar boton=0

 pero el state final del LED es siempre 1 si esta de noche y no cambia y es siempre 0 si esta de dia y no cambia.


rodripelto

 :smiley-confuse:  Pues la verdad no lo veo. Tendré que simularlo pero no se cuando voy a poder.
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

ivitito

muchisimas gracias, a ver si asi ves el fallo cuando puedas, yo seguire intentando a ver si con prueba y error, ya te digo lo raro es lo del boton, que el digitalWrite(LED, state) si es con el boton, no cambia al pulsarlo.

A ver sino, si alguien mas sabe y ayuda.

muchas gracias de nuevo.

rodripelto

Hola,

He simulado el circuito con TinkerCad y funciona bien, el tema es que tienes una condición no deseada, cuando sube la persiana se apaga la luz, si mientras se da esta situacción si enciendes la luz sevuelve  a apagar y en la bajada pasa el caso contrario. Resumiendo mientras que estan los led de subida o bajada encendidos no se puede manipular la luz. Yo ya te he dado el problema ahora es cosa tuya solucionarlo, no es dificil.
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

ivitito

Me podrias decir cuales son las opciones de solucion? Yo diria que la mas optima seria que estuviera como estuviera la persiana, se pudiera controlar las luces, osea que este o no encendido el led porque el motor aun no haya acabado de subir o bajar de todo, pudiera controlar las luces en todo momento. No tengo muy clara la solucion tampoco.

rodripelto

Hola,
La solución para tú código es usar un flag para saber si la persiana esta en movimiento, con este flag haremos que solo pase una vez por los if de que ponen en marcha la persiana y enciende la luz, además he añadido una condición mas al if de detener la persiana, ya que tal como lo tenias en una situación real se pararía inmediatamente al empezar a moverse la persiana, por el simple motivo de que en cuanto la persiana empezara a moverse dejaría de estar pisado el correspondiente final de carrera.
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= A0; // 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
bool moviendo=false;

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)&&(moviendo==false)){ // caso 4 es de noche baja la persiana y enciende la luz
 //digitalWrite(LED, HIGH); // enciende el LED
state=1;
  bajarpersiana();
  Serial.println("If de bajada/Persianas ON");
}

else if ((LDRvalor>= 200)&&(val_FCbaj==false)&&(val_FCsub==true)){ // caso 4 FIN Solo quiero que para la persiana no que controle las luces
 pararpersiana();
 Serial.println("If de bajada/Persianas OFF");
}
else if ((LDRvalor < 200)&&(val_FCsub==true)&&(moviendo==false)){ // caso 2 Es de dia sube la persiana y apaga la luz
 //digitalWrite(LED, LOW); // apaga el LED
state=false;
 subirpersiana();
 Serial.println("If de subida/Persianas ON");
}
else if ((LDRvalor<200)&&(val_FCsub==false)&&(val_FCbaj==true)){ // caso 2 FIN Solo quiero que para la persiana no que controle las luces
 pararpersiana();
 Serial.println("If de subida/Persianas OFF");
}

Serial.println("Stado final LED:");
Serial.println(state);
digitalWrite(LED, state);

}

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

void bajarpersiana () {
 moviendo=true;
 digitalWrite(LEDbajar, HIGH); //Bajo la persiana
 digitalWrite(LEDsubir, LOW); //
}
void pararpersiana()
{
 moviendo=false;
 digitalWrite(LEDsubir, LOW);
 digitalWrite(LEDbajar, LOW);
}
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

Go Up