Alarme avec pad numérique et capteur ultrason et shield Ethernet

Bonjour, bonsoir j'aimerai configurer une alarme activable à l'aide d'un mot de passe sur un pad numérique. Le but est que quand le capteur ultrason calcule une distance inférieure à 15 cm, une led rouge s'allume et un email est envoyé à l'utilisateur. Pour l'instant, le pad active bel et bien le capteur ultrason, mais ce-dernier capte toujours une distance de 0 cm, en ce qui concerne le Shield Ethernet, il envoie bien un email.
Cependant, j'ai retesté en enlevant le code du Shield Ethernet, et là le capteur ultrason se remet à fonctionner correctement.
Voici mon code ci-dessous (je suis débutant, soyez indulgents :slight_smile: ) !
Merci de votre attention et pour les futurs réponses !

#include <Ethernet.h>

#include <SPI.h>


#define ALARM 15 // A partir de  15 cm et moins, l'alarme se déclenchera

#include <Keypad.h>  // On insère la bibliothèque utilisée.

String  code=""; // Chaque nombre tapé sera compris la dedans et constituera notre code.
 String motdepasse="123"; // Le mot de passe nécessaire pour activer la bonne LED.
const byte ROWS = 4; //Nous indiquons que le keypad a 4 lignes
const byte COLS = 3; // Nous indiquons que le keypad a 4 colonnes
const int led_verte = 12; // Commande optionnel, la bibliothèque le fait d'office.
const int led_rouge = 13;
const int trig = 10;
const int echo = 11;
long lecture;
long cm;
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 }; 
char server[] = "smtp.orange.fr";
EthernetClient client;

char hexaKeys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
 // On insère tous les chiffres et symboles disponible sur le pavé numérique.
};
byte rowPins[ROWS] = {5, 4, 3, 2};   
byte colPins[COLS] = {8, 7, 6};  
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 
// Création du pad numérique en tant que clavier.

void setup(){
 
  pinMode(led_verte, OUTPUT); // On déclare la led verte comme un sortie
 
  Serial.begin(9600); // Nécessaire pour communiquer avec le "moniteur série"
  pinMode(trig, OUTPUT); // "Trig" est en sortie pour envoyer le signal au capteur
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT); // "echo" correspond au retour du capteur
  pinMode(led_rouge, OUTPUT);
  pinMode(4,OUTPUT);
  digitalWrite(4,HIGH);
  Ethernet.begin(mac);
  delay(2000);
  
}
  
void loop(){
   byte inChar;
  char customKey = customKeypad.getKey();
  if (customKey){
    
    
    
     if(customKey=='#'){
   Serial.print("Le code saisi est:");
 Serial.println(code); ; 
    }
    else if (customKey=='*'){
     
      if (code == motdepasse){
      Serial.println("Alarme activee");
      digitalWrite(12,HIGH);
        digitalWrite(13,LOW);
    delay(5000);
digitalWrite(12,LOW);
    
      
        
        
  do {
  digitalWrite(trig, HIGH);
  delay (0.01);
  digitalWrite(trig, LOW);
  lecture = pulseIn(echo, HIGH); // Mesure le temps que la pin echo est à l'état HAUT
  cm = lecture / 58; // Calcul de la distance : distance = (durée de l’impulsion (en µs) / 58
  Serial.print("Distance en cm : ");
  Serial.println(cm);
  
    
  
  } while (cm  >= ALARM); 
        
        if (cm <= ALARM);
        {
          digitalWrite(led_rouge, HIGH);
          delay (5000);
          digitalWrite(led_rouge, LOW);
          if(sendEmail()) Serial.println(F("Email envoyé"));
          else Serial.println(F("echec de l'envoie"));
        } 
    

  
     
 delay(1000);
   
  
   
        
        }else{
      Serial.println("Mauvais code");
      digitalWrite(13,HIGH);
        delay (5000);
        digitalWrite(13,LOW);
   }
    code="";}
     else{
    code=code+customKey; //Le code devra contenir en plus des chiffres une de ses lettres
  }
  }
  }
  byte sendEmail()
    {
      byte thisByte = 0;
      byte respCode;
     
      if(client.connect(server,25)) {
        Serial.println(F("connecté"));
      } else {
        Serial.println(F("connection echouee"));
        return 0;
      }
     
      if(!eRcv()) return 0;
      Serial.println(F("Sending helo"));
     
    // Renseignez votre ip publique
      client.println(F("helo ................."));
     
      if(!eRcv()) return 0;
      Serial.println(F("Sending From"));
     
    // Renseignez l'adresse email expéditrice
      client.println(F("MAIL From: <...................>"));
     
      if(!eRcv()) return 0;
     
    // Renseignez l'adresse email receveur
      Serial.println(F("Sending To"));
      client.println(F("RCPT To: <................>"));
     
      if(!eRcv()) return 0;
     
      Serial.println(F("Sending DATA"));
      client.println(F("DATA"));
     
      if(!eRcv()) return 0;
     
      Serial.println(F("Mail envoyé avec succes !"));
     
    // Renseignez l'adresse email receveur
      client.println(F("To:  <...................>")); 
     
    // Mettez l'adresse e-mail expéditrice
      client.println(F("From:  <.................>"));
     
      client.println(F("Subject: Intrusion !\r\n"));
     
      client.println(F("Presence dectectee !  millis= "));
      client.println(millis());
     
      client.println(F("."));
     
      if(!eRcv()) return 0;
     
      Serial.println(F("Sending QUIT"));
      client.println(F("QUIT"));
     
      if(!eRcv()) return 0;
     
      client.stop();
     
      Serial.println(F("disconnected"));
     
      return 1;
    }
     
    byte eRcv()
    {
      byte respCode;
      byte thisByte;
      int loopCount = 0;
     
      while(!client.available()) {
        delay(1);
        loopCount++;
     
        // Si rien reçu pendant 10 secondes, l'envoie d'email est coupé
        if(loopCount > 10000) {
          client.stop();
          Serial.println(F("\r\nTimeout"));
          return 0;
        }
      }
     
      respCode = client.peek();
     
      while(client.available())
      {  
        thisByte = client.read();    
        Serial.write(thisByte);
      }
     
      if(respCode >= '4')
      {
        efail();
        return 0;  
      }
     
      return 1;
    }
     
     
    void efail()
    {
      byte thisByte = 0;
      int loopCount = 0;
     
      client.println(F("QUIT"));
     
      while(!client.available()) {
        delay(1);
        loopCount++;
     
        //  Si rien reçu pendant 10 secondes, l'envoie d'email est coupé
        if(loopCount > 10000) {
          client.stop();
          Serial.println(F("\r\nTimeout"));
          return;
        }
      }
     
      while(client.available())
      {  
        thisByte = client.read();    
        Serial.write(thisByte);
      }
     
      client.stop();
     
      Serial.println(F("Déconnecté"));
      
    }
    

Qu'est-ce que ça fait à ton avis ?

Je te conseille d'indenter ton code en tapant CTRL T dans l'IDE, tu verras mieux l'organisation des blocs. Il sera plus facilement lisible.

Bonsoir, merci de votre réponse comme le stipule: https://www.gotronic.fr/pj2-guide-us-hc-sr04-compatible-arduino-2309.pdf il est nécessaire d'envoyé un signal de 10 µS sur la broche Trigger, il est vrai que j'aurai pu l'écrire sous cette forme delayMicroseconds (10);

Voici le code indenter : `

#include <Ethernet.h>

#include <SPI.h>


#define ALARM 15 // A partir de  15 cm et moins, l'alarme se déclenchera

#include <Keypad.h>  // On insère la bibliothèque utilisée.

String  code = ""; // Chaque nombre tapé sera compris la dedans et constituera notre code.
String motdepasse = "123"; // Le mot de passe nécessaire pour activer l'alarme.
const byte ROWS = 4; //Nous indiquons que le keypad a 4 lignes
const byte COLS = 3; // Nous indiquons que le keypad a 4 colonnes
const int led_verte = 12; 
const int led_rouge = 13;
const int trig = 10;
const int echo = 11;
long lecture;
long cm;
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 };
char server[] = "smtp.orange.fr";
EthernetClient client;

char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'#', '0', '*'}
  // On insère tous les chiffres et symboles disponible sur le pavé numérique.
};
byte rowPins[ROWS] = {5, 4, 3, 2};
byte colPins[COLS] = {8, 7, 6};
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
// Création du pad numérique en tant que clavier.

void setup() {

  pinMode(led_verte, OUTPUT); // On déclare la led verte comme un sortie

  Serial.begin(9600); // Nécessaire pour communiquer avec le "moniteur série"
  pinMode(trig, OUTPUT); // "Trig" est en sortie pour envoyer le signal au capteur
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT); // "echo" correspond au retour du capteur
  pinMode(led_rouge, OUTPUT);
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  Ethernet.begin(mac);
  delay(2000);

}

void loop() {
  byte inChar;
  char customKey = customKeypad.getKey();
  if (customKey) {



    if (customKey == '#') {
      Serial.print("Le code saisi est:");
      Serial.println(code); ;
    }
    else if (customKey == '*') {

      if (code == motdepasse) {
        Serial.println("Alarme activee");
        digitalWrite(12, HIGH);
        digitalWrite(13, LOW);
        delay(5000);
        digitalWrite(12, LOW);




        do {

          digitalWrite(trig, HIGH);
          delayMicroseconds (10);
          digitalWrite(trig, LOW);
          lecture = pulseIn(echo, HIGH); // Mesure le temps que la pin echo est à l'état HAUT
          cm = lecture / 58; // Calcul de la distance : distance = (durée de l’impulsion (en µs) / 58
          Serial.print("Distance en cm : ");
          Serial.println(cm);



        } while (cm  >= ALARM);

        if (cm <= ALARM);
        {
          digitalWrite(led_rouge, HIGH);
          delay (5000);
          digitalWrite(led_rouge, LOW);
          if (sendEmail()) Serial.println(F("Email envoyé"));
          else Serial.println(F("echec de l'envoie"));
        }




        delay(1000);




      } else {
        Serial.println("Mauvais code");
        digitalWrite(13, HIGH);
        delay (5000);
        digitalWrite(13, LOW);
      }
      code = "";
    }
    else {
      code = code + customKey; //Le code devra contenir en plus des chiffres une de ses lettres
    }
  }
}
byte sendEmail()
{
  byte thisByte = 0;
  byte respCode;

  if (client.connect(server, 25)) {
    Serial.println(F("connecté"));
  } else {
    Serial.println(F("connection echouee"));
    return 0;
  }

  if (!eRcv()) return 0;
  Serial.println(F("Sending helo"));

  // Renseignez votre ip publique
  client.println(F("helo......"));

  if (!eRcv()) return 0;
  Serial.println(F("Sending From"));

  // Renseignez l'adresse email expéditrice
  client.println(F("MAIL From: <..........>"));

  if (!eRcv()) return 0;

  // Renseignez l'adresse email receveur
  Serial.println(F("Sending To"));
  client.println(F("RCPT To: <.........>"));

  if (!eRcv()) return 0;

  Serial.println(F("Sending DATA"));
  client.println(F("DATA"));

  if (!eRcv()) return 0;

  Serial.println(F("Mail envoyé avec succes !"));

  // Renseignez l'adresse email receveur
  client.println(F("To:  <........>"));

  // Mettez l'adresse e-mail expéditrice
  client.println(F("From:  <.........>"));

  client.println(F("Subject: Intrusion !\r\n"));

  client.println(F("Presence dectectee !  millis= "));
  client.println(millis());

  client.println(F("."));

  if (!eRcv()) return 0;

  Serial.println(F("Sending QUIT"));
  client.println(F("QUIT"));

  if (!eRcv()) return 0;

  client.stop();

  Serial.println(F("disconnected"));

  return 1;
}

byte eRcv()
{
  byte respCode;
  byte thisByte;
  int loopCount = 0;

  while (!client.available()) {
    delay(1);
    loopCount++;

    // Si rien reçu pendant 10 secondes, l'envoie d'email est coupé
    if (loopCount > 10000) {
      client.stop();
      Serial.println(F("\r\nTimeout"));
      return 0;
    }
  }

  respCode = client.peek();

  while (client.available())
  {
    thisByte = client.read();
    Serial.write(thisByte);
  }

  if (respCode >= '4')
  {
    efail();
    return 0;
  }

  return 1;
}


void efail()
{
  byte thisByte = 0;
  int loopCount = 0;

  client.println(F("QUIT"));

  while (!client.available()) {
    delay(1);
    loopCount++;

    //  Si rien reçu pendant 10 secondes, l'envoie d'email est coupé
    if (loopCount > 10000) {
      client.stop();
      Serial.println(F("\r\nTimeout"));
      return;
    }
  }

  while (client.available())
  {
    thisByte = client.read();
    Serial.write(thisByte);
  }

  client.stop();

  Serial.println(F("Déconnecté"));

}

C'est pas que tu aurais pu, c'est que tu aurais ... :wink:

D'accord merci, je l'ai modifié mais lorsque je test avec uniquement le pad et le capteur ça fonctionne parfaitement même avec delay (0.01); :sweat_smile: