Buenos días a todos, necesito urgentemente que me echeis una mano.
Tengo una electroválvula controlada por un relé con arduino que se activa al dar un impulso (6v.) y se desactiva con otro impulso (conectada a otra entrada). El problema es que los cables que dan los impulsos tienen un voltaje residual continuo (por llamarle de alguna manera) de unos 0.02 voltios, sufiente para activar el relé involuntariamente. Mi pregunta es si hay alguna manera de programar el arduino que hasta que supere, por ejemplo, 2 voltios no active el relé.
Muchas gracias de antemano.
int valvula = 10; // señal a relé
int inputPin1 = 8; // impulso de paro
int inputPin2 = 9; // impulso de inicio
Comienza explicando que entrega esa tensión de 6 volts a la que haces referencia y como esta cableada tu entrada.
6V no pueden ingresar a una entrada digital. Que los resista no significa que este bien.
Basta con poner una resistencia y un zener de 5.1 para proteger la entrada y restringirla a 5V.
Ahora bien, tus 0.02 volts no disparan involuntariamente la entrada, lo que lo hace es el loop de tierra que seguramente tienes.
Eso ocurre porque no se conectan debidamente las entradas
Un método que funciona y soluciona los dos problemas en uno es usar una entrada optoacoplada.
Un optoacoplador es un diodo emisor de luz que va conectado a esos 6V. Cuando estan presentes hacen circular la I necesaria para que encienda el diodo del opto. Luego en la salida un fototransistor con emisor a tierra del arduino y colector a una R generalmente 10k a +5V del arduino
Del colector conectas a la entrada anterior la misma que tenias puesta la entra, la que dispara.
Haces lo mismo con la que detiene.
entonces te quedan dos circuitos aislados, el que dispara y detiene y el arduino. Sin masas en común,
Olvida que la iamgen dice linea de salida y de entrada
Si tomas el de la izq (el de la derecha es igual)
Veras que tu entrada con los 6V iran entre D0 y GND y tu salida será Vout con +5 y GND del Arduino. Tu Vout va a la entrada de disparo
Y repitas para la de STOP o DETENCION.
agregale un retardo para confirmar que realmente se produjo el cambio y se mantiene durante unos 50mseg al menos.
algo asi, este es general aplicalo a tu caso
byte buttonPin = 7;
boolean currentState = LOW; // almacena el estado de la entrada actual
boolean lastState = LOW; // almacena el ultimo estado de la entrada
boolean debouncedState = LOW; // estado del rebote
int debounceInterval =50; // espera 50 ms para el establecimiento del boton
unsigned long timeOfLastButtonEvent = 0;//almacena lo milis del cambio de estado del boton
void setup(){
pinMode(buttonPin, INPUT); // boton como entrada
Serial.begin(9600); //
}
void loop(){
currentState = digitalRead(buttonPin);
unsigned long currentTime = millis();
if (currentState != lastState) {
timeOfLastButtonEvent = currentTime;
}
if (currentTime - timeOfLastButtonEvent > debounceInterval) { // si suficiente tiempo ha pasado
if (currentState != debouncedState){ // si el estado actual es aun diferente del ultimo rebote almacenado
debouncedState = currentState; // actualizo el esado del rebote
// disparo el evento
if (debouncedState == HIGH){
Serial.println("Presionado");
} else {
Serial.println("Liberado");
}
}
}