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
}
}
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.
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
He reformado tu codigo consiguiendo que funcione (de alguna manera !!).
Deberás adaptarlo y corregir a tu conveniencia.
La instrucción interrupt ponla en el setup.
En void loop() contador = 0; ,cada vez que hace loop pone a "0":
Debes tener en cuenta los rebotes de la entrada para el conteo.
Como disparas el contador ???.
Para pruebas, yo he conectado un pulsador a Pin 3 con resistencia de 260 ohms.
Un saludo!! ... ...
/*
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
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á.
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.
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].
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");
}
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
}
^
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