Hola quisiera saber si con un pulsador mientras esté pulsado un actuador lineal solo baje cierta altura (para controlar la altura use un delay de 500 por que queria que bajara aproximadamente ahi), aunque siga pulsado siga en esa altura, pero si se deje de pulsar, vuelva a su posición original.
Lo que pasa es que cuando sigue pulsado mi pulsador sigue saliendo mi actuador.
#include <Wire.h>
int Blanco1 = 8; //pulsador
int ElevadorFuera = 7; //estos son relays, este relay hace que el actuador salga
int ElevadorDentro = 4; //relay que hace que el actuador se contraiga
void setup()
{
pinMode(8, INPUT);
pinMode(ElevadorFuera, OUTPUT);
pinMode(ElevadorDentro, OUTPUT);
}
void loop()
{
int Pulsor1 = digitalRead(8);
if (Pulsor1==LOW)
{
digitalWrite(ElevadorFuera, HIGH);
digitalWrite(ElevadorDentro, LOW);
delay(500);
}
if (Pulsor1==HIGH)
{
digitalWrite(ElevadorDentro, HIGH);
digitalWrite(ElevadorFuera, LOW);
}
}
Ya que parece que empiezas te diré enfáticamente: OLVIDA DELAY()!!!!!!!!!!!
Ve a documentación y reemplaza delay con el uso de millis().
con el podras controlar lo que gustes el tiempo que gustes sin que el microcontroladores se quede de brazos cruzados porque cuando ejectuas delay() no hace nada y tu actuador baja y si lo hace mas o menos rápido no apreciarás los cambios.
Otra cosa. Pulsasdores y estados no se llevan bien porque los pulsadores rebotan, debes usar metodos que te aseguren que el estado se ha cumplido sin rebotar. Para eso hay librerias que lo hacen o puedes hacer lo propio con tu código.
Mis recomendaciones son para los pulsadores usa Bounce2.h
y ve a Documentación y lee los tutoriales (hay varios) de millis().
Como la que te sugerí si.
Si lo pones solo como lo has hecho te funcionará pero tambien verás que hace cosas raras.
Si el ambiente ademas es algo ruidoso (electricamente) será peor.
Las cosas en tu casa o laboratorio siempre funcionan bastante bien, pero luego en el lugar de trabajo o en condiciones de campo como se conoce, no ocurre lo mismo.
Hasta ahora, he encontrado con un código que encontré que quite el rebote cómo me dijiste:
#define APRETADO 0
#define SUELTO 1
#define APRETANDOLO 2
#define SOLTANDOLO 3
const int boton = 8; // Botón asignado en el pin 8.
int anterior; // guardamos el estado anterior.
int valor; // valor actual del botón.
int estado;
unsigned long temporizador;
unsigned long tiemporebote = 50;
int ElevadorFuera = 7;
int ElevadorDentro = 4;
void setup() {
Serial.begin(9600);
pinMode(boton,INPUT_PULLUP);
valor = HIGH;
anterior = HIGH;
pinMode(ElevadorFuera, OUTPUT);
pinMode(ElevadorDentro, OUTPUT);
}
void loop() {
if ( valor==digitalRead(8) ) {
temporizador = 0;
}
else
if ( temporizador == 0 ) {
temporizador = millis();
}
else
if ( millis()-temporizador > tiemporebote ) {
valor = !valor;
}
if ( anterior==LOW && valor==LOW ) estado = APRETADO;
if ( anterior==LOW && valor==HIGH ) estado = SOLTANDOLO;
if ( anterior==HIGH && valor==LOW ) estado = APRETANDOLO;
if ( anterior==HIGH && valor==HIGH ) estado = SUELTO;
switch ( estado ) {
case SUELTO:
digitalWrite(ElevadorDentro, HIGH);
digitalWrite(ElevadorFuera, LOW);
break;
case APRETANDOLO: Serial.write("Has apretado el botón"); break;
// Mandamos un mensaje. Realmente esto lo deje por formar parte del que encontre
case APRETADO: digitalWrite(12,HIGH);
digitalWrite(ElevadorFuera, HIGH);
digitalWrite(ElevadorDentro, LOW);
// Debe de salir el Actuador 700 milisegundos y quedarse aunque siga presionado
break;
case SOLTANDOLO: Serial.write("Has soltado el botón"); break; // Mandamos un mensaje.
default: break;
}
}
Ahora solo me falta agregar que solo salga el Actuador los 700 milisegundos aunque siga presionado, seguiré leyendo un tanto a ver si en un rato tengo la idea, espero que esto sea a lo que te referías.
Sip, ya lo estoy haciendo con un código que encontré antirebote y se lo comenté a Surbyte, solo me falta hacer que baje los 700 milisegundos que quiero y se quede hasta ahí, seguiré intentando, pero se me complica la función en ocasiones xd