Obtener posicion cortina roller.

Hola, estoy manejando una cortina roller con motor tubular de 220 mediante arduino con 2 reles, 1 para subir y otro para bajar.

Funciona todo barbaro, pero quiero pedirles si tienen alguna idea como puedo leer la posicion de la cortina, se me ocurrio hacerlo por software que cada vez que un rele se activa contar las vueltas. Pero nose si funcionara. Que me dicen?

Si claro, funcionará salvo cuando se corte la energía?
Podrias simplemente mover el motor hasta una posición extrema y entonces contar las vueltas y luego regresarlo a donde estaba. Si eso te satisface entonces adelante.

Bien, entonces me ayudarias con el codigo? Estoy usando Debounce para los rebotes asi que voy a usar un pin de entrada con debounce que me dara alto cada vez que accione subir y otro pin de entrada me dara alto cuando acciono bajar.

Subir y bajar es lo mismo para que dos pines? Pensé que usarías algo optico o un efecto hall.

Y ademas es un contador, usas debounce, si hay cambio incrementas. siempre que subas, si bajas decrementas.

Mucho no hay para ayudar.

Entonces seria algo asi…???

#include <Bounce2.h>
Bounce debouncer = Bounce();
Bounce debouncer2 = Bounce();
int estado_cortina = 0;

void setup() { 
  
  debouncer.attach(22);
  debouncer.interval(100); // interval in ms
  debouncer2.attach(23);
  debouncer2.interval(100); // interval in ms
  pinMode(22, INPUT_PULLUP); //LEO ESTADO SUBIR.
  pinMode(23, INPUT_PULLUP); //LEO ESTADO BAJAR.
  pinMode(3, OUTPUT); //SUBO CORTINA
  pinMode(4, OUTPUT); //BAJO CORTINA
  
}

void loop() {   
  
debouncer.update();
debouncer2.update();
int value_subir = debouncer.read();
int value_bajar = debouncer2.read();

  if (value_subir == HIGH) { estado_cortina++; }
  if (value_bajar == HIGH) { estado_cortina--; }
  
}

Me gustaría personalmente que fuera un flanco y no un value_subir == HIGH porque si el loop pasa dos veces por ahi cuenta dos veces.

No entendi lo del flanco... Otra consulta ahi cuando subo o bajo me hace el conteo muy rapido, es decir que me manda millones de paquetes por tcp por cada unidad que subo o bajo el int estado_cortina , por ejemplo casi de 0 a 15000 tengo que contar para el recorrido de la cortina, como puedo hacer esto un poco mas lento?

Daviten que te dije en el post #5?
Cada vez que el loop vea la condicion que tu consultas cuenta y eso esta mal.

Lo del flanco lo he repito infinidad de veces asi que por favor tomate el trabajo de leer hilos (hacia abajo) y verás a que me refiero.
Disculpa, pero encuentro ultimamente mucha comodidad de parte de todo el mundo y he decidido que la gente se esmere un poco leyendo y buscando la información, cosa que no hacen.

No es contra ti personalmente pero si es contra toda la comodidad que veo en el foro.

Que es un flanco? Un cambio de un valor a otro. Del valor anterior al actual.
Bueno ahi esta.

No solo cuenta cuando el motor esta en marcha cuando el motor recibe corriente para subir o bajar este me active un rele 220vac, y manda la señal a la entrada digital input_pull_up. El codigo esta funcionando bien, pero me falta hacer el incremento y decremento con un poco mas de delay quiero decir que me tarde de contar de 0 a 100 el tiempo que tarda en abrir la cortina, unos aproximadamente 2 min.

Exactamente tarda 23 Segundos en abrir.

Tengo un problemita, mientras se acciona un rele para subir o bajar la cortina mientras este este el motor en marcha los reles 220vac se me accionan los 2 juntos, y cuando el motor se para y deja de girar funciona bien... Cual es el problema? las conexiones estan bien. Cualquier cosa paso esquema.

ESQUEMA DE CONEXION.

Necesito saber porque se me activan los 2 reles 220vac cuando subo o bajo, si los 2 estan conectados a neutro y la fase de cada rele la toma de los cables de la cortina una fase para subir y otra para bajar... hara alguna descarga cuando el motor esta en marcha?

Solucionado.

Con el rele vac220, hice el circuito que cuando un rele activa me corta el neutro del otro rele y viceversa para que de esta manera no se enciendan los 2.

Perdona que no respondí mas. Estoy con un trabajo que me consume todo el dia.

En el setup tienes esto

  pinMode(3, OUTPUT); //SUBO CORTINA
  pinMode(4, OUTPUT); //BAJO CORTINA

y cuando haces esto lo que le dices a los reles es que estan en LOW y justamente LOW hace que se accionen. Asi que una manera simple seria poner

digitalWrite(3, HIGH);
digitalWrite(4, HIGH);

Consejo, no uses 3 y 4 para trabajar con tus códigos, define etiquetas que te ayuden a entender que estas haciendo como

#define SUBIR_PIN 3
#define BAJAR_PIN 4

  pinMode(SUBIR_PIN , OUTPUT); //SUBO CORTINA
  pinMode(BAJAR_PIN , OUTPUT); //BAJO CORTINA
  digitalWrite(SUBIR_PIN , HIGH);
  digitalWrite(BAJAR_PIN , HIGH);

Entonces ahi tienes mas claro todo.

No se si esto resolvería tus problemas.

Otra cosa porque veo que no indicaste si entendiste lo del flanco y como veo que no lo posteaste te lo indico pero perdona mi frustración ya que veo que por mas que lo digo la gente sigue sin buscar las cosas que estan en el foro.

#include <Bounce2.h>

#define SUBIR_PIN 3
#define BAJAR_PIN 4

Bounce debouncer = Bounce();
Bounce debouncer2 = Bounce();
int estado_cortina = 0;
bool value_subir, value_subir_Ant = false;
int value_bajar, value_bajar_Ant = false;

void setup() { 
  
  debouncer.attach(22);
  debouncer.interval(100); // interval in ms
  debouncer2.attach(23);
  debouncer2.interval(100); // interval in ms
  pinMode(22, INPUT_PULLUP); //LEO ESTADO SUBIR.
  pinMode(23, INPUT_PULLUP); //LEO ESTADO BAJAR.

  pinMode(SUBIR_PIN , OUTPUT); //SUBO CORTINA
  pinMode(BAJAR_PIN , OUTPUT); //BAJO CORTINA
  digitalWrite(SUBIR_PIN , HIGH);
  digitalWrite(BAJAR_PIN , HIGH); 
}

void loop() {   
  
debouncer.update();
debouncer2.update();
value_subir = debouncer.read();
value_bajar = debouncer2.read();

  if (value_subir && !value_subir_Ant) { // flanco de subida 0 a 1
      estado_cortina++; 
  }
  if (value_bajar && !value_bajar_Ant) { // flanco de subida 0 a 1
      estado_cortina--; 
  }
  value_subir_Ant = value_subir;
  value_bajar_Ant = value_bajar;
}

Lo hice pero al estar la cortina subiendo o bajando y estar prendiendo y apagando luces tengo como trabas en los tiempos...

ASi mando cuando alguna luz cambia de estado...

if(estadopin3 != value || estadopin4 != value4 || estadopin5 != value2 || estadopin7 != value7 || estadopin6 != value3 || alarma2 != alarma ||estadopin8 != value6 || estadopin9 != value8 || pin6auto != auto6 || pin5auto != auto5 || cortiauto != autocorti || estadopin10 != value9 || p1 != value11 || p2 != value10)
    {
      sprintf(buffer,"pin%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i   ",value,value4,value2,value7,value3,alarma,value6,value8,auto6,auto5,aviso,autocorti,value9,value11,value10);     
      server.print(buffer);
      estadopin3 = value;
      estadopin4 = value4;
      estadopin5 = value2;
      estadopin6 = value3;
	    alarma2 = alarma;
      estadopin7 = value7;
      estadopin8 = value6;
      estadopin9 = value8;
      pin6auto = auto6;
      pin5auto = auto5;
      cortiauto = autocorti;
      estadopin10 = value9;
      p1 = value11;
      p2 = value10;
    }

Asi mando cuando la cortina cambia de posicion...

if(estado_cortina != estado_cortina_a)
    {
      sprintf(buffer,"cor%i   ",estado_cortina / 100);
      server.print(buffer);
      estado_cortina_a = estado_cortina;
    }

Con millis() logre mejor no mandar tantos valores por tcp, pero el tema es que si estoy bajando y suelto antes de que millis cuente, me va bajando la cortina pero no me suma valor…

if (value13 == LOW && value12 == HIGH && estado_cortina > 0) 
{ 
  if (millis_before + 1000 < millis()) //loop for waiting 5 seconds between messages
  {
    estado_cortina--;
    millis_before = millis(); //reset timer
  } 
}
if (value12 == LOW && value13 == HIGH && estado_cortina < 24) 
{ 
  if (millis_before + 1000 < millis()) //loop for waiting 5 seconds between messages
  {
    estado_cortina++;
    millis_before = millis(); //reset timer
  } 
}

Tienes muchos topicos abiertos sobre el mismo tema.
O los junto a todos o ve cerrando porque estas preguntado por lo mismo en varios sitios y esos es un doble posteo y por lo tanto una falta a las normas.

Bueno finalmente hice lo del flanco como me dijiste... me quedo asi...

bool value_bajar_Ant, value_subir_Ant = false;
int value_bajar, value_subir = 0;
int estado_cortina;
int value_bajar = debouncer12.read();
int value_subir = debouncer13.read();

  if (value_subir && !value_subir_Ant) { // flanco de subida 0 a 1
      estado_cortina++; 
  }
  if (value_bajar && !value_bajar_Ant) { // flanco de subida 0 a 1
      estado_cortina--; 
  }
  value_subir_Ant = value_subir;
  value_bajar_Ant = value_bajar;

y para pasar el valor de la cortina a la red lo hago asi...

if(estado_cortina != estado_cortina_a)
    {
      sprintf(buffer,"cor%i   ",estado_cortina);
      server.print(buffer);
      estado_cortina_a = estado_cortina;
    }

Estaria bien?

Si, solo haría un pequeño cambio para mejor la visualización

sprintf(buffer,"cor%i   ",estado_cortina);

lo cambiaría por

sprintf(buffer,"cor %s   ",estado_cortina?"SUBE":"BAJA");

Modifica si 1 no corresponde a SUBE, es decir, invierte las etiquetas.