Go Down

Topic: DigitalRead pin inestable (Read 128 times) previous topic - next topic

Rogarza

Mar 11, 2019, 03:51 am Last Edit: Mar 11, 2019, 11:37 am by Rogarza
Buenas, a ver si me podéis echar una manita con esto... que he empezado hace muy poquito con Arduino y estoy un poquito verde...

Tengo una placa arduino UNO, con un interruptor y un relé, algo sencillo (en principio).
Lo que debería de hacer el circuito es, al pulsar el botón, cambiar el relé, el problema es que sin pulsar el botón el relé se cambia solo...
Añado el código que estoy usando, según la información que me devuelve el serial cambia el estado del pin por si solo... (de HIGH/LOW de manera aleatoria y viceversa) desconozco si debo poner algún tipo de resistencia entre interruptor y pin (he probado varias cositas, entre ellas una resistencia en pull down y nada), si debo colocar otro elemento o si mi código es erróneo.

Gracias de antebrazo.


Code: [Select]
#define DEBUG // Modo debug

const int inPin = 7;    // Botón conectado al pin digital 7
const byte lockPin = A0; // Relé conectado al pin analógico 0
int val = 0;      // Variable almacén de valor leído

void setup() {
 
  #ifdef DEBUG
  // Iniciar puerto serie
  Serial.begin(9600);
  Serial.println(F("Inicia comunicacion serial"));
  #endif

  // Activa el pin de relé
  pinMode(lockPin, OUTPUT);
  digitalWrite(lockPin, HIGH);

  // Pin entrada digital apagado
  pinMode(inPin, INPUT);
  digitalWrite(inPin, LOW);
 
  #ifdef DEBUG
  // Muestra valor almacenado
  Serial.print("VAL: ");
  Serial.println(val);
 
  Serial.println(F("--- FIN SETUP ---"));
  #endif
}

void loop() {
 
  delay(1000);
  // Asigna valor de lectura del pin inPin
  val = digitalRead(inPin);
  #ifdef DEBUG
  //Muestra valor almacenado
  Serial.println(val);
  #endif
 
  // Manda mensaje a puerto serie en función del valor leido
  if (val == HIGH) {
      Serial.println("Encendido");
      abrirRele();
  }
  else {
      Serial.println("Apagado");
  }
}

void abrirRele(){

  #ifdef DEBUG
  // Imprime información abierto
  Serial.println(F("Abierto"));
  #endif

  // Apaga pin del relé
  digitalWrite(lockPin, LOW);

  while(true) {
    delay(1000);
  }

}


Un saludo!

surbyte

#1
Mar 11, 2019, 01:33 pm Last Edit: Mar 11, 2019, 01:34 pm by surbyte
Nada cambia solo, lo único que justifica que algo cambie es un MAL CODIGO, TU CODIGO.

Esto es un ejemplo de mal código

Code: [Select]
 while(true) {
    delay(1000);
  }


cuando tu programa entre en la rutina abrirRele() no sale jamas!!


MODERADOR:
Tu hilo apareció en Proyectos. Esa sección es para trabajos de largo aliento no para consultas.
Cuesta poco, leer las normas del foro al que ingresas, tenlo presente y por favor no dejes de hacerlo.

Rogarza

#2
Mar 11, 2019, 06:52 pm Last Edit: Mar 11, 2019, 06:54 pm by Rogarza
No está mal, al no salir nunca de esa rutina ¡HACE JUSTO LO QUE ESTABA BUSCANDO! No debe desbloquear dicho relé una vez detectada corriente en el pin. Por lo que no es un error de código, me alegra que mi código haga justo lo que le he dicho que tiene que hacer.

Mi pregunta iba más por el tema de la sensibilidad de los pines, que siempre reciben ruido de manera "aleatoria" y me gustaría saber si hay algún modo de arreglarlo, ya sea añadiendo algún componente (he probado resistencias pull down y nada) o añadiendo algo de código para hacer que el pin reaccione solo al recibir una corriente concreta.

Gracias.

surbyte

Tienes un rele conoectado a A0, ese no es un pin habilitual pero claro que puede usarse.
No hay razón por la cual recibas ruido como tu dices.
Y hay maneras que el programa siga funcionando sin ponerlo como has hecho
Simplemente cuando se de una acción lo colocas en el estado que gustes y no lo cambias.

Porque no haces un simple enclavamiento usando un contacto auxiliar del RELE. Es lo que usan los electricistas. Usar un arduino para que al recibir un pulso el arduino no tenga mas actividad que sostener el estado luce como algo pobre, pero claro es tu decisión.

Y aclaro que el serial no hace nada con tu pin.
Tu miras el pin 7 y el pin 7 no se como esta conectado, si solo lo tienes esperando una señal digital sin R pull-up o down pues ahi esta tu problema.

Revisa en Google: Arduino pull-up pull-down

Kike_GL

Tengo una placa arduino UNO, con un interruptor y un relé, algo sencillo (en principio).
Si solo tienes eso y no estas usando:
Code: [Select]

pinMode(inPin, INPUT_PULLUP);


Lo que te falta es una resistencia de 10K entre el pin y GND (PullDown) para que la entrada no flote sola.
Saludos, Kike_GL

Go Up