Persianas automáticas con arduino Solucionado

Hola, he visto post que tratan este tema pero también he visto que no reabrir post viejos...por eso este nuevo.

Bueno llevo poco tiempo con arduino,me he mudado y la casa tiene en el salon persianas mecanicas con dos botones uno para bajar y otro subir.

Ya tengo mi arduino con dos relés y un sensor de luz, estoy probando con dos leds a los relés, he conseguido que si detecta luz se encienda un led y si no se activa el otro relé y enciende el otro led.

Tengo un problema, solo quiero que se active cada rele 20 seg aprox, y se desactive por ahora solo consigo que este uno u otro se activen pero siempre uno u otro estan funcionando.

En sensor de luz lo tengo puesto que si detecta 12 o menos se active y baja la persiana.. 25 o mas sube persiana.

Como no se estaba utilizando el comando if pero parece que siempre esta en bucle, he utilizado while y mismo resultado.

Helpe me!!!

Graciasss

Si pones el código podría echarte un cable, sin el... complicado...

ya he comentado que llevo poco tiempo en arduino, el codigo lo tengo en casa pero esto es lo mas parecido que puedo poner ahora.
en el codigo tengo puesto LED subir y bajar, en el montaje tengo dos reles, como funcionan igual para ejemplo nos vale
he quitado los delay, lei que al ejecutar un delay el arduino no hace nada hasta que no termina ese delay

ahora lo que hace es que si detecta una cantidad de luz hace una cosa u otra... pero no para, entonces imaginaros el rele estaria pasando todo el rato electricidad y es como si el boton estuviera pulsado en todo momento.

quiero que cuando por ejemplo, sea de noche baje la persiana 20seg y se pare el rele, cuando se haga de dia y detecte la cantidad de luz programa suba las persianas 20 seg y se pare el rele.
¿algun comando para decirle que pare ese bucle hasta que no detecte el otro cambio de luz?

/***   Included libraries  ***/
#include <SoftwareSerial.h>
#include <BitbloqSoftwareSerial.h>


/***   Global variables and function definition  ***/
int bajar = 1;
int subir = 2;
int sensor_de_luz_0 = A0;
bqSoftwareSerial puerto_serie_0(0, 1, 9600);

/***   Setup  ***/
void setup() {
   pinMode(bajar, OUTPUT);
   pinMode(subir, OUTPUT);
   pinMode(sensor_de_luz_0, INPUT);
}

/***   Loop  ***/
void loop() {
   puerto_serie_0.println(analogRead(A0));
   delay(500);
   if (analogRead(A0) >= 25) {
       digitalWrite(bajar, HIGH);
   } else if (analogRead(A0) <= 12) {
       digitalWrite(subir, HIGH);
   }
}

no has pensado en poner unos finales de carrera al final de la persiana para que sepas en todo momento cuando llega al final y al principio? En caso contrario.... peudes hacerlo con contadores, o poniendole un tiempo de subida o de bajada a la persiana... pero sin saber del punto desde el que parte..... a mi me parece un poco arriesgado.

Piensalo. :wink:

hola, por ahora no pondre sensores pero si lo he pensado, el motor se para cuando llega arriba o abajo.
los pondre en un futuro por ejemplo para que no se baje la persiana al estar limpiando.

desde el punto mas alto a persiana bajada totalmente son 23.4seg (bueno hasta donde se para el motor)
partiendo desde arriba y bajando 20seg quedaria bien, subir tarda lo mismo 20seg.

estoy leyendo y leyendo programacion en arduino pero aun no se como hacer ciertas cosas, si detecta luz a mas de 25 suba 20seg y se pare, si detecta menos 12 baje y se pare... no se hacer eso.

yo te lo pruedo pasar sin problema, pero.... y si la persiana esta a medias.... le metes tambien 20 segundos de subida?

hola, gracias!

mi intencion es que el recorrido siempre sea solo de arriba / abajo / arriba 20seg, aparte quiero poner dos botones que pueda mover la persiana al gusto, pero esto como los sensores no lo hare ahora, primero quiero que la persiana me haga caso :smiley: y haga lo basico

ya ire investigando lo demas, asi voy aprendiendo no quiero que me hagais todo :smiley: no tiene emocion

he visto algun manual(que tengo guardado) que mueven la persiana con un mando IR, tambíen lo quiero implementar, pero solo sube o baja si mantienes pulsado el boton del mando IR, esto lo veo facil ya hecho alguna prueba, pero con el sensor de luz no se como.

Hola.
Deberás implementar una variable global en la que almacenes el estado de la persiana.
Entonces, tu condición será compuesta (lo pongo en pseudocódigo pero se entiende):

enum {INDETERMINADO,CERRADA,ABIERTA} estadoPersiana;


if (valorLuz >= 25 && estadoPersiana != CERRADA) {
    bajarpersiana();
    estadoPersiana = CERRADA;
} else if (valorLuz <12 && estadoPersiana != ABIERTA) {
    subirpersiana();
    estadoPersiana = ABIERTA;
}

hola, lo siento, por mis limitados conociemientos no se donde aplicarlo, sería en:
asi?

/***   Included libraries  ***/
#include <SoftwareSerial.h>
#include <BitbloqSoftwareSerial.h>


/***   Global variables and function definition  ***/
int bajar = 1;
int subir = 2;
int sensor_de_luz_0 = A0;
bqSoftwareSerial puerto_serie_0(0, 1, 9600);
enum {INDETERMINADO,CERRADA,ABIERTA} estadoPersiana;


if (valorLuz >= 25 && estadoPersiana != CERRADA) {
   bajarpersiana();
   estadoPersiana = CERRADA;
} else if (valorLuz <12 && estadoPersiana != ABIERTA) {
   subirpersiana();
   estadoPersiana = ABIERTA;
}

/***   Setup  ***/
void setup() {
   pinMode(bajar, OUTPUT);
   pinMode(subir, OUTPUT);
   pinMode(sensor_de_luz_0, INPUT);
}

/***   Loop  ***/
void loop() {
   puerto_serie_0.println(analogRead(A0));
   delay(500);
   if (analogRead(A0) >= 25 && persiana != ABIERTA) {digitalWrite(subir, HIGH); estadoPersiana=ABIERTA;

   } else if (analogRead(A0) <= 12 && persiana != CERRADA) {digitalWrite(subir, HIGH); estadoPersiana= CERRADA;
       
   }
}

¿como hago que cada estado dure solo 20seg ?

gracias!

hola,

antes no podía probar en el curro ya en casa he probado el codigo en el arduino
ahora tengo el led de bajar encendido y el de subir apagado, da lo mismo lo que reciba por el sensor de luz que no hace nada

***   Included libraries  ***/
#include <SoftwareSerial.h>
#include <BitbloqSoftwareSerial.h>


/***   Global variables and function definition  ***/
int bajarpersiana = 4;
int subirpersiana = 5;
int sensor_de_luz_0 = A0;
bqSoftwareSerial puerto_serie_0(0, 1, 9600);
float valorLuz = analogRead(A0);


enum {INDETERMINADO,CERRADA,ABIERTA}estadoPersiana;
void bajarpersiana1() {
    digitalWrite(bajarpersiana, HIGH);
}
void subirpersiana2() {
    digitalWrite(subirpersiana, HIGH);
}
void setup() {
    pinMode(bajarpersiana, OUTPUT);
    pinMode(subirpersiana, OUTPUT);
    pinMode(sensor_de_luz_0, INPUT);
}

/***   Loop  ***/
void loop() {
    puerto_serie_0.println(analogRead(A0));
    delay(500);
    if (valorLuz <=12 && estadoPersiana != CERRADA) {    
      bajarpersiana1();
      estadoPersiana = CERRADA;
    } else if (valorLuz >= 20 && estadoPersiana != ABIERTA) {    
     subirpersiana2();
     estadoPersiana = ABIERTA;
}
}

Pues una opción rápida podría ser esta modificación:

void bajarpersiana1() {
    digitalWrite(bajarpersiana, HIGH);
    delay(20000);
    digitalWrite(bajarpersiana, LOW);
}
void subirpersiana2() {
    digitalWrite(subirpersiana, HIGH);
    delay(20000);
    digitalWrite(subirpersiana, LOW);
}

Pd: el icono para englobar el código es el de la izquierda (</>)

ok gracias! pruebo y os cuento

Gracias!

hola, nada por ejemplo detecta mas luz se activa el rele de subir esos 20seg se apaga y otra vez se enciende

tapo el sensor se para el rele de subir , el rele de bajar no hace nada

Pon el código completo, porque creo que debería funcionar.

esto es lo que tengo:

***   Included libraries  ***/
#include <SoftwareSerial.h>
#include <BitbloqSoftwareSerial.h>


/***   Global variables and function definition  ***/
int bajarpersiana = 4;
int subirpersiana = 5;
int sensor_de_luz_0 = A0;
bqSoftwareSerial puerto_serie_0(0, 1, 9600);
float valorLuz = analogRead(A0);


enum {INDETERMINADO,CERRADA,ABIERTA}estadoPersiana;

void bajarpersiana1() {
    digitalWrite(bajarpersiana, HIGH);
    delay(20000);
    digitalWrite(bajarpersiana, LOW);
}
void subirpersiana2() {
    digitalWrite(subirpersiana, HIGH);
    delay(20000);
    digitalWrite(subirpersiana, LOW);
}

void setup() {
    pinMode(bajarpersiana, OUTPUT);
    pinMode(subirpersiana, OUTPUT);
    pinMode(sensor_de_luz_0, INPUT);
}

/***   Loop  ***/
void loop() {
    puerto_serie_0.println(analogRead(A0));
    delay(500);
    if (valorLuz <=12 && estadoPersiana != CERRADA) {    
      bajarpersiana1();
      estadoPersiana = CERRADA;
    } else if (valorLuz >= 20 && estadoPersiana != ABIERTA) {    
     subirpersiana2();
     estadoPersiana = ABIERTA;
}
}

En principio creo que no estás leyendo la luz para gestionar las persianas. Prueba a poner en el loop:

void loop() {
    valorLuz=analogRead(sensor_de_luz_0);
    puerto_serie_0.println(valorLuz);
    delay(500);
    if (valorLuz <=12 && estadoPersiana != CERRADA) {   
      bajarpersiana1();
      estadoPersiana = CERRADA;
    } else if (valorLuz >= 20 && estadoPersiana != ABIERTA) {   
     subirpersiana2();
     estadoPersiana = ABIERTA;
   }
}

SIIII era eso, MUCHAS GRACIAS!

Ya he metido alguna cosilla mas como por ejemplo sube o baja también cuando utilizo el mando IR

ya os ire avanzando como va el proyecto

aparte de la persiana, cuando se haga de noche quiero que una lampara se encienda..pero esta ya es facil

persianas automáticas arduino Solucionado

GRACIAS!

funcionando! :grin:

Arduino persiana automática con sensor de luz

Arduino persiana ir