Configurar interrupciones en ESP8266

Configuración de interrupciones ESP8266 en Arduino IDE

La función attachInterrupt tiene 3 argumentos:

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)

digitalPinToInterrupt(pin): Esta es una función que toma el pin GPIO de la placa ESP8266 como un parámetro dentro de ella. El pin denota el GPIO asociado con el pin que provocará que ocurra una interrupción. Por ejemplo, si configura GPIO2 como un pin de interrupción, la función se especificará como digitalPinToInterrupt(2). Puede usar cualquiera de los pines de interrupción ESP8266 que se muestran en el diagrama anterior, como un parámetro dentro de esta función.

ISR: este es el segundo argumento utilizado para configurar una interrupción. Es un tipo especial de función conocida como Rutina de Servicio de Interrupción que no toma parámetros y tampoco devuelve nada. Cada vez que ocurra la interrupción, se llamará a esta función.

mode: Esto denota la acción de activación para que ocurra la interrupción. Los cuatro parámetros siguientes se utilizan para especificar el modo:

LOW (BAJO) Esto se usa para activar la interrupción cuando el pin está en un estado bajo.

CHANGE (CAMBIO): Esto se usa para disparar la interrupción cuando el pin cambia su estado (HIGH-LOW o LOW-HIGH)

RISING: Esto se usa para activar la interrupción cuando el pin pasa de BAJO a ALTO.+

const int led_pin = LED_BUILTIN;
const int sensor_pin = D1;

unsigned long current_time = millis();
unsigned long last_trigger = 0;
//boolean timer_on = false;

volatile long cuentaVuelta;

ICACHE_RAM_ATTR void movement_detection() {
  //Serial.println("Motion was detected");
  cuentaVuelta++;
  last_trigger = millis();
}

void setup() {

  Serial.begin(115200);

  pinMode(sensor_pin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(sensor_pin), movement_detection, RISING);
  pinMode(led_pin, OUTPUT);
  digitalWrite(led_pin, LOW);
}

long cuentaVueltaAnterior;

void loop() {
  static unsigned long lastTimer;
  if (millis() > lastTimer + 1000) { //Timer por 1 segundo
    
    lastTimer = millis();

    if (cuentaVuelta != cuentaVueltaAnterior) {
      Serial.print("Tacómetro: ");
      Serial.print(cuentaVuelta);
      Serial.println("por segundo");
      cuentaVuelta = 0;
    }
    else {
      Serial.println("No se han detectado vueltas");
    }
  }
}

Otros Proyectos realizados en España:

2 Respuestas
  1. Eduard

    Gracias por explicar tan bien y todo en un tutorial, ha sido realmente de mucha ayuda. Quisiera saber si se usan los mismos métodos para esp32.

Dejar comentario

HUE CAT

PROGRAMACIÓN Y DISEÑO

GDPR