Insertar digitalread

Hola ,quería mejorar este sketch añadiendo la funcion digitalread para poder ver en pantalla el estado del pin LED ,pero por mas que lo intento ,no lo consigo ,tampoco se si es posible al estar leyendo ya las RPM, podeis ayudarme ? Gracias.

volatile unsigned long contador = 0; // Variable entera que se almacena en la RAM del Micro
const byte ledPin = 13; // LED que se encuentra en el pin 13
const byte isrPin = 3; // INPUT

void interrupcion1() { // Funcion que se ejecuta durante cada interrupion
contador++; // Se incrementa en uno el contador
}

void setup() {
Serial.begin(57600);
pinMode(ledPin, OUTPUT); // El p1n 13 será una salida digital
}

void loop() {
contador = 0;
// -------- sección crítica --------
attachInterrupt(digitalPinToInterrupt(isrPin), interrupcion1, RISING);
delay(1000);
detachInterrupt(digitalPinToInterrupt(isrPin));
// ----------------------------------
contador = contador / 1 * 1;
Serial.print(contador); Serial.println(" RPM");

if (contador > 15) {
digitalWrite (ledPin, HIGH); // Encender LED
} else {
digitalWrite (ledPin, LOW); // Apagar LED
}
}

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

No es una solución, pero ¿qué esperas de este cálculo?

lo que puse funciona ,eso es para multiplicar o dividir los impulsos de entrada según el tipo de captador , lo que no se es como agregar la función de leer la salida digital en impresión de salida , similar ala de entrada RPM.
También os digo que estoy muy verde en el tema ,(esto lo conseguí anteriormente con ayuda de miembros del foro) ,pero quería añadir esa función y ya supera mis básicos conocimientos.

Por favor edita tu post y adjunta el código de acuerdo a las Normas del Foro en Español, punto 7.

Si lo que querés es que te muestre el estado del LED solo agrega

Serial.println("LED encendido"); // o apagado

debajo de cada sentencia digitalWrite().

Leer el estado del pin para saber su estado es complicar la cosa y es redundante porque, en este caso, el estado es conocido.

De todos modos, para que experimentes, podrías hacer algo asi

if (digitalRead(ledPin) == HIGH) {
  Serial.println("LED encendido"); 
} else {
  Serial.println("LED apagado");
}
1 Like

lo probaré ,he intentado editar el poste pero no consigo ponerlo en el formato adecuado.
respectto a lo de la modificacion y a se que es liar la cosa ,pero lo necesiro de forma temporal para ver el estado de la salida cuando no tengo delante el arduino.
Gracias mil

en que linea o apartado lo pongo ?

ya lo he probado y funciona ,solo indica cuando led apagado pero ya me vale .Gracias de nuevo !!

Debería mostrar también cuando está en encendido.
Mirá

1 Like

Pues no lo muestra ,lo miraré hasta donde sepa ver ,aunque asi ya me vale .Gracias !!

Hola @mancamba

He reformado tu codigo consiguiendo que funcione (de alguna manera !!).
Deberás adaptarlo y corregir a tu conveniencia.

  1. La instrucción interrupt ponla en el setup.

  2. En void loop() contador = 0; ,cada vez que hace loop pone a "0":

  3. Debes tener en cuenta los rebotes de la entrada para el conteo.

  4. Como disparas el contador ???.
    Para pruebas, yo he conectado un pulsador a Pin 3 con resistencia de 260 ohms.

Un saludo!! ... :cocktail:... :cocktail:

/*

   A_REVOLUCIONES

   https://forum.arduino.cc/t/insertar-digitalread/1324669
*/
volatile unsigned long contador = 0; // Variable entera que se almacena en la RAM del Micro
const byte ledPin = 13; // LED que se encuentra en el pin 13
const byte isrPin = 3; // INPUT

void interrupcion1()  // Funcion que se ejecuta durante cada interrupion
{
  contador++; // Se incrementa en uno el contador
}

void setup()
{
  Serial.begin(57600);
  Serial.println(" A_REVOLUCIONES_MS   \n");
  pinMode(ledPin, OUTPUT); // El p1n 13 será salida digital
  // -------- sección crítica --------
  attachInterrupt(digitalPinToInterrupt(isrPin), interrupcion1, RISING);
  // delay(1000);
  // detachInterrupt(digitalPinToInterrupt(isrPin));
  // ----------------------------------
}

void loop()
{
  Serial.print(contador);
  Serial.println(" RPM");

  if (contador > 15)// Enciende LED a mas de 15
  {
    digitalWrite (ledPin, HIGH); // Encender LED
  } else {
    digitalWrite (ledPin, LOW); // Apagar LED
  }

  if (digitalRead(ledPin) == HIGH)
  {
    Serial.println("LED encendido");
  } else
  {
    Serial.println("LED apagado");
  }
    delay(1000);
}
//***************  FIN  ***********************

Le tengo puesto a la entrada un generador de pulsos de onda cuadrada , que es similar a los pulsos que da el capatador de velocidad.
Lo probaré cuando tenga un ratito.
Gracias

Tu modificación no funciona como se esperaría.
Primero veamos el loop() en el código de @mancamba en #1.
Pone el contador en 0, engancha la interrupción, hace un delay de 1 segundo para contar los pulsos, desengancha la interrupción (para que no cuente más pulsos) y enciende el LED que corresponda según el valor del contador

Tu código al mover el enganche a setup() ya no desengancha la interrupción por lo que cuenta constantemente.
Además al no resetear el contador la cuenta solo se incrementa indefinidamente.
Ergo, no funciona como requiere @mancamba

Hola @MaximoEsfuerzo

Supongo, que es a mi, una parte de tu respuesta.
Es verdad lo que me comentas, lo único que pretendía con mi reforma de código, era dar una versión para @mancamba que si funcionara, pero advirtiendole que:

Gracias por tu aportación, seguro que a @mancamba , le servirá.

Un saludo crack !!!.. :cocktail:... :cocktail:

Bueno , aunque los términos técnicos a mí se hacen grandes , solo os puedo decir que asi funciona perfectamente, y no es un error que cuente constantemente , así es como lo necesito porque es una especie de vigilancia que active una salida cuando supera un preset y lo desactive cuando esté por debajo, y tiene que ser repetitivo pero no acumulativo.
Gracias ambos , si se puede grabaré un vídeo para explicarme mejor.

Hola @mancamba

Seria bueno, si funciona correctamente, que volvieras a postear el tu código definitivo.
Sera de utilidad para los que lo lean mas tarde.
También edita tu título y añade :[SOLUCIONADO].

Un saludo !!!!... :cocktail:... :cocktail:

..

Ahora veo por qué siempre envía el mismo mensaje.
Insertaste incorrectamente el código que te sugerí, mira

if (contador > 8) { //setpoint del contador
  digitalWrite (ledPin, LOW); // Apagar LED
} else {
  digitalWrite (ledPin, HIGH); // Encender LED
  if (digitalRead(ledPin) == HIGH) {
    Serial.println("LED encendido");
  } else {
    Serial.println("LED apagado");
  }
}

Solo envía el texto cuando enciendes el LED, pones el pin en HIGH.
Al estar el condicional dentro del bloque else siempre se cumple que el pin es HIGH entonces siempre envía el mismo mensaje.

Hay dos formas de solucionarlo, te las sugerí antes.
Una, es tan simple como mover una llave

if (contador > 8) { //setpoint del contador
  digitalWrite (ledPin, LOW); // Apagar LED
} else {
  digitalWrite (ledPin, HIGH); // Encender LED
}
if (digitalRead(ledPin) == HIGH) {
  Serial.println("LED encendido");
} else {
  Serial.println("LED apagado");
}

La otra

if (contador > 8) { //setpoint del contador
  digitalWrite (ledPin, LOW); // Apagar LED
  Serial.println("LED apagado");
} else {
  digitalWrite (ledPin, HIGH); // Encender LED
  Serial.println("LED encendido");
}
1 Like

C:\Users\dmrga\Documents\Arduino\cont_rpm__profegarcia_led_setpoint_2_con_indic_led_apagado\cont_rpm__profegarcia_led_setpoint_2_con_indic_led_apagado.ino: In function 'void loop()':
C:\Users\dmrga\Documents\Arduino\cont_rpm__profegarcia_led_setpoint_2_con_indic_led_apagado\cont_rpm__profegarcia_led_setpoint_2_con_indic_led_apagado.ino:34:1: error: expected '}' at end of input
}
^

exit status 1

Compilation error: expected '}' at end of input

C:\Users\dmrga\Documents\Arduino\cont_rpm__profegarcia_led_setpoint_2_con_indic_led_apagado\cont_rpm__profegarcia_led_setpoint_2_con_indic_led_apagado.ino: In function 'void loop()':
C:\Users\dmrga\Documents\Arduino\cont_rpm__profegarcia_led_setpoint_2_con_indic_led_apagado\cont_rpm__profegarcia_led_setpoint_2_con_indic_led_apagado.ino:31:1: error: expected '}' at end of input
} else {
^

exit status 1

Compilation error: expected '}' at end of input

la verdad ,no se si lo hago bien pero asi me da error