Comandos IF y Else

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
}

aquí

➜ "RPM" es una cadena, no es un número...

contador es probablemente el número que desea pero ojo porque se reseteó contador = 0;

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);
  }

Gracias , lo probaré

aun asi ...no me funciona ,cualquier sugerencia es bienvenida el contador funciona pero no consigo actuar la salida

¿Cambió la posición de esta línea?

¿En que pin está conectado el sensor?

Esta mal el inicio de las interrupciones

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);
  }
}

eso nunca funcionará

necesita hacer una copia de la variable en la sección crítica y usar la copia.

Basta con mover la línea al final de loop().

En el 3

que linea ?

como contador funciona ,lo que no logro es activar y desactivar una salida a partir de una consigna

solo copié lo que me ha respondido con el if en ambas versiones, adonde tengo que mover esa linea, contador = 0 ?

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
  }
}

Gracias de nuevo, al llegar a casa lo vuelvo a probar

Bueno pues esto si funciona , mil gracias ,ya que esto a mi se me hace grande , podrias aclararme 2 dudas mas .?

1 tiene un poco de retardo enmla conexion y desconexion , se piede mejorar o es cosa de la placa ?

2 acano de lee que el pin 13 es mejor no usarlo como salida fisica , cual se aconseja usar ? Y que valores debo cambiar ?

:slight_smile:

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 es el UNO, aunque voy a intentar en un Micro que es mas peqieño, a ver como va

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.