Alarme capteur pir+sim800l +arduino

Bonjour,

Les fonctions delay() ne sont pas pris en compte dans l’exécution du programme. Le but est d’appeler sue deux numéros différents.

#include <SoftwareSerial.h>


#define IR_output 2


SoftwareSerial sim800l(10, 11);    // RX,TX for Arduino and for the module it's TXD RXD, they should be inverted




void setup() {

  pinMode(IR_output, INPUT);          //Define pinModes
  attachInterrupt(digitalPinToInterrupt(IR_output),detection_IR,CHANGE); //détecte un changement d'état
 
  Serial.begin(9600);           //Start the Serial communication with the PC and SIM800L

  sim800l.begin(9600);
  delay(5000);

}

void loop() {
  }
  
void detection_IR(){
  if(digitalRead(IR_output)==HIGH){  //si le signal est à l'état haut
   Serial.println("mouvement detecte");
    sim800l.println("ATD+xxxxxxxxxx;");  //The number to call don't forget to add the country code
    Serial.println("Appelle du Numéro xxxxxxxxxx");
    Serial.println("Racrocche automatique dans 20s");
    delay(20000);
    sim800l.print("ATH");

  }

delay (20000);
 
  if(digitalRead(IR_output)==HIGH){  //si le signal est à l'état haut
   Serial.println("mouvement detecte");
    sim800l.println("ATD+xxxxxxxxxx;");  //The number to call don't forget to add the country code
    Serial.println("Appelle du Numéro xxxxxxxxxx");
    Serial.println("Racrocche automatique dans 30s");
    delay(30000);

    sim800l.print("ATH");

    }  

if(digitalRead(IR_output)==LOW){ //si le signal est à l'état bas
   Serial.println("pas de mouvement detecte");    
  }
}

ne faites pas tout le boulot dans une interruption. Une interruption se doit d'être hyper courte (millis est désactivé dans une interruption donc delay() ne marche pas et Software Serial ne va pas marcher non plus car dépendant des interruptions aussi)

=> Votre interruption ne devrait que lever un drapeau (variable déclarée volatile) disant "ALERTE !" et vous traitez cela dans la loop puis remettez le drapeau à faux.

volatile bool alerte = false;
void detection_IR() {alerte = true;}

void setup() {....}

void loop() {
  if (alerte) {
    // le PIR a détecté quelque chose
    ....
    // on note que l'on a fini de traiter cette alerte
    alerte = false;
  }
}

Vous avez bien noté qu'en mettant l'interruption sur CHANGE vous aurez à la fois le front montant et le front descendant de votre PIR (ie ça va lancer l'alarme quand le mouvement n'est plus détecté). Vous pourriez déclencher que sur front montant.