Hola ,soy nuevo en esto y tengo una duda a ver si alguien me puede ayudar.
Tengo este cuenterrevoluciones y quiero activar una salida a partir de X revoluciones y desactivarla por debajo de este valor ,pero no lo consigo.
Alguien me puede decir que hago mal ? Gracias.
#include <FreqCount.h>
// Contador de RPM by: http://elprofegarcia.com
// Conexion de la entrada de la interrupcion 0 por el PIN 2
// Configurar el monitor serial a 57600 Baudios para visualizar los RPM
// Tienda para comprar Materiales http://dinastiatecnologica.com
volatile int contador = 0; // Variable entera que se almacena en la RAM del Micro
int ledPin = 13; // LED que se encuentra en el pin 13
void setup() {
Serial.begin(57600);
attachInterrupt(1,interrupcion0,RISING); // Interrupcion 0 (pin3)
pinMode(ledPin, OUTPUT); // El p1n 13 será una salida digital
} // LOW, CHANGE, RISING, FALLING
void loop() {
delay(999); // retardo de casi 1 segundo
Serial.print(contador*1); // Como son dos interrupciones por vuelta (contador * (60/2))
Serial.println(" RPM"); // El numero 2 depende del numero aspas de la helise del motor en prueba
contador = 0;
// Sentencia if con Arduino
if (" RPM" > 15) {
// Encender LED
digitalWrite (ledPin, HIGH);
}if (" RPM" < 15) {
// Apagar LED
digitalWrite (ledPin, LOW);
}
}
void interrupcion0() // Funcion que se ejecuta durante cada interrupion
{
contador++; // Se incrementa en uno el contador
}
Complementando la buena lectura de @J-M-L
Reemplaza "RPM" por contador
if (contador > 15) {
// Encender LED
digitalWrite (ledPin, HIGH);
}if (contador < 15) {
// Apagar LED
digitalWrite (ledPin, LOW);
}
Tambien era mas fácil si incluyes el igual
if (contador > 15) {
// Encender LED
digitalWrite (ledPin, HIGH);
} else { // esta incluye el igual para <=
// Apagar LED
digitalWrite (ledPin, LOW);
}
void loop() {
detachInterrupt(1);
delay(999); // retardo de casi 1 segundo
Serial.print(contador*1); // Como son dos interrupciones por vuelta (contador * (60/2))
Serial.println(" RPM"); // El numero 2 depende del numero aspas de la helise del motor en prueba
contador = 0;
attachInterrupt(1, interrupcion0, RISING); // Interrupcion 0 (pin3)
// Sentencia if con Arduino
if (contador > 15) {
// Encender LED
digitalWrite (ledPin, HIGH);
}if (contador < 15) {
// Apagar LED
digitalWrite (ledPin, LOW);
}
}
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);
attachInterrupt(digitalPinToInterrupt(isrPin), interrupcion1, RISING); // Interrupcion 1 (pin3), LOW, CHANGE, RISING, FALLING
pinMode(ledPin, OUTPUT); // El p1n 13 será una salida digital
}
void loop() {
delay(1000); // retardo de casi 1 segundo
// -------- sección crítica --------
detachInterrupt(digitalPinToInterrupt(isrPin));
unsigned long contadorCopia = contador;
contador = 0;
attachInterrupt(digitalPinToInterrupt(isrPin), interrupcion1, RISING);
// ----------------------------------
Serial.print(contadorCopia); Serial.println(" RPM");
if (contadorCopia > 15) {
digitalWrite (ledPin, HIGH); // Encender LED
} else {
digitalWrite (ledPin, LOW); // Apagar LED
}
}
podría deberse a que bootloader está esperando un poco antes de comenzar a codificar para ver si se acerca una carga. Puede leer sobre la instalación de código sin bootloader (ICSP, Upload Using Programmer)
¿Con un Arduino UNO?
El pin 13 tiene un LED adjunto en la placa, por lo que esto modifica un poco su comportamiento. Puede usar cualquier otro pin además de 0 y 1 (Serial).
Si funcionar funciona, pero no me siento cómodo con esa estructura de attach y detach, ya que de esa forma medimos las interrupciones que se producen durante 1 segundo mas las que se podrían dar durante la ejecución del código y lo que tarda en reinicializar el loop.
En un código tan corto como este no creo que tenga importancia, pero para ser estrictos yo lo plantearía de la siguiente forma:
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 / 2 * 60;
Serial.print(contador); Serial.println(" RPM");
if (contador > 15) {
digitalWrite (ledPin, HIGH); // Encender LED
} else {
digitalWrite (ledPin, LOW); // Apagar LED
}
}
Que además calcula las RPM, ( / 2 * 60), que se os había olvidado.