Interrupt su Wemos D1 non funziona correttamente

Ho inserito in uno Sketch funzionante delle righe di comando per leggere il dato ricevuto da un flussimetro tipo questo:
s-l200

Basta che abilito la linea " //attachInterrupt (PIN_FLUSSO, impulso, RISING); // Interrupt pin D2" dove definisco i parametri dell'interrupt e lo installo sul Wemos, che il tutto non funziona più correttamente.
Il relè si attiva e disattiva ogni secondo.
Se poi abilito il monitor seriale vedo solo caratteri strani che scorrono velocemente.
Lo sketch è questo:

/**************** ? ***********
  Test_sensore_IR_Fluss
  1 febbraio 2022 
  
  Scheda: "LOLIN(WEMOS) D1 R2 & mini
  Porta: "/dev/cu.wchusbserial1410"
  Inserito flussometro
****************************************/  
#define PIN_LED_Verde 12      // Pin D6 (GPIO12)
#define PIN_LED_Rosso 13      // Pin D7 (GPIO13)
#define PIN_SENSORE 14        // Pin D5 (GPIO14)
#define PIN_RELE 2            // Pin D4 (GPIO2)
#define PIN_FLUSSO 4          // Pin D2 (GPIO4) 

const long T_RELE = 60000;  // tempo di attrazione in mS
unsigned long t_on;
bool gatto_prec;
int flusso;           // Acqua che scorre
volatile int count;   // Variabile di conteggio 

void setup(){
  pinMode(PIN_LED_Verde, OUTPUT);
  pinMode(PIN_LED_Rosso, OUTPUT);
  pinMode(PIN_SENSORE, INPUT);
  pinMode(PIN_RELE, OUTPUT); 
  pinMode(PIN_FLUSSO, INPUT);
  digitalWrite(PIN_RELE, LOW);
  digitalWrite(PIN_LED_Verde, HIGH);
  digitalWrite(PIN_LED_Rosso, HIGH);
  //attachInterrupt (PIN_FLUSSO, impulso, RISING);  // Interrupt pin D2
  Serial.begin(9600);
}

void Ostacolo(){
  if (digitalRead(PIN_SENSORE) == HIGH && gatto_prec == LOW)
    {
    gatto_prec = HIGH;
    t_on = millis();
    digitalWrite(PIN_RELE, HIGH);
    //Flusso();
    //digitalWrite(PIN_LED_Verde, HIGH); // acceso
    //digitalWrite(PIN_LED_Rosso, LOW);  // spento
    }
  if (gatto_prec == HIGH && millis() - t_on > T_RELE)
    {
      digitalWrite(PIN_RELE, LOW);
      //digitalWrite(PIN_LED_Verde, LOW);  // acceso
      //digitalWrite(PIN_LED_Rosso, HIGH); // spento
    }
  if(digitalRead(PIN_SENSORE) == LOW) gatto_prec = LOW;
}

void impulso(){
  count = count + 1;
} 

void Flusso(){
  count = 0;      //Resetta il conteggio
  interrupts();   //Abilita gli interrupt
  delay(1000);
  noInterrupts(); //Disabilita gli interrupt
  
  flusso = (count);
  Serial.println (flusso);
  
  if(flusso >= 100){
    digitalWrite(PIN_LED_Verde, LOW);   // acceso
    digitalWrite(PIN_LED_Rosso, HIGH);  // spento
    Serial.println("Pompa attiva");
    }
  else{
    digitalWrite(PIN_LED_Rosso, LOW);
    digitalWrite(PIN_LED_Verde, HIGH);
    Serial.println("Pompa non attiva");
    }
}

void loop(){
  Ostacolo();
}

Lello

Le funzioni associate ad interrupt su ESP8266 devono avere l'attributo IRAM_ATTR

IRAM_ATTR void impulso() {
  count = count + 1;
}

https://arduino-esp8266.readthedocs.io/en/latest/reference.html

Come ti ha iindicato correttamente cotestatnt, ogni MCU ha le sue particolarità per gli interrupts (e non solo), per cui NON devi mai assumere che quato hai potuto provare e studiare su Arduino UNO (AVR) sia valido su altre MCU ...

... fai sempre una ricerca su Google (es: esp8266 interrupt) e difatti, se l'avessi fatta, subito uno dei primi link sarebbe stato QUESTO :slight_smile:

Guglielmo

Infatti hai ragione. :+1:
Letto l'articolo che mi hai indicato e fatte le opportune modifiche adesso funziona.
Grazie anche da parte di Feriel (la mia gatta).

Lello