Limiter le nombre d' envoie de sms avec ESP32

Bonjour à tous. J’aurais besoin d’aide sur un problème que j’ai avec un projet personnel. Voici le cas : J’ai une pompe à eau sur laquelle je veux installer un dispositif qui serait contrôlé par un ESP32 en cas de fuite .Il y aurait 3 fonctions à savoir : couper le courant a la pompe avec l’aide d’un relais, émettre un signal sonore et m’envoyer un sms. Vu que je suis un débutant en programmation ,j’ai fait des recherches sur le net, je me suis acheté des livres qui traitent de la programmation pour les débutants et pris un temps fou à monter mon programme . J’ai pu enfin réussir à faire exécuter les 3 fonctions à mon esp32 mais voilà mon problème. Lors de l’envoi du sms mon signal sonore n’émet plus et je reçois plusieurs sms a répétition du fait que le code se trouve dans la loop. J’ai voulu faire une boucle mais sans résultat positif .Merci pour votre aide et votre indulgence.

include "ESP32_MailClient.h"
const char* ssid = "tichef";
const char* password = "0123456";
#define emailSenderAccount    "xxxxx@gmail.com"    
#define emailSenderPassword   "xxxxxx"
#define emailRecipient        "xxxxxxx@globetrotter.net"
#define smtpServer            "smtp.gmail.com"
#define smtpServerPort        465
#define emailSubject          "ESP32 Test"
SMTPData smtpData;
void sendCallback(SendStatus info);
 

const int SENSEUR = 26;
const byte DEL=17;
const byte PIETZO=16;
const int RELAIS=18;
      int COMPTEUR=0;


void setup(){

  {        pinMode(SENSEUR, INPUT);
           pinMode(DEL,OUTPUT);
           pinMode(PIETZO,OUTPUT);
           pinMode(RELAIS,OUTPUT);
           Serial.begin(115200);
  }          
            }



 void ENVOI_SMS(){

     
    
    
    {     Serial.println();
          Serial.print("Connecting");
          WiFi.begin(ssid, password);
          while (WiFi.status() != WL_CONNECTED) {
          Serial.print(".");
          delay(200);}
    } 
    
   
    {     Serial.println();
          Serial.println("WiFi connected.");
          Serial.println();
          Serial.println("Preparing to send email");
          Serial.println();
    }


     
    smtpData.setLogin(smtpServer, smtpServerPort, emailSenderAccount, emailSenderPassword);
    
    smtpData.setSender("ESP32"," xxxxx@gmail.com");
    smtpData.setPriority("High");
    smtpData.setSubject("Alerte detection eau");
    smtpData.setMessage("Le bateau coule on a les deux pieds dans l'eau - Envoyer avec le ESP32 ", false);
    smtpData.addRecipient("xxxxxxxxx@globetrotter.net");
    smtpData.setSendCallback(sendCallback);
    if (!MailClient.sendMail(smtpData))
    Serial.println("Error sending Email, " + MailClient.smtpErrorReason());
    smtpData.empty();

   
    
    
 }
    
void sendCallback(SendStatus msg) 
  
  
 {   Serial.println(msg.info());

  
  if (msg.success()) 
    
 {   Serial.println("----------------");  }

 

       

  }


  
   
 

void loop(){

if(digitalRead(SENSEUR) == LOW)//SI SENSEUR CAPTE L'EAU ALORS....

     



  
 {  Serial.println("Digital value : wet");
    
    digitalWrite(DEL, HIGH);
    delay(10);
    digitalWrite(DEL, LOW);
    delay(10);
    digitalWrite(PIETZO, HIGH);
    delay(100);
    digitalWrite(PIETZO, LOW);
    delay(100);
    digitalWrite(RELAIS,LOW);
    
         
 { for (COMPTEUR=0; COMPTEUR < 3 ; COMPTEUR++)
   if (COMPTEUR<3);
  ENVOI_SMS();
 }      
    
  } 
    
  
 else

   

 {Serial.println("Digital value : dry");
    delay(1000);
    
    digitalWrite(RELAIS,HIGH);}



}

ce truc là n’est pas bon

    { for (COMPTEUR = 0; COMPTEUR < 3 ; COMPTEUR++)
        if (COMPTEUR < 3); // <<<==== ATTENTION au ;
      ENVOI_SMS();
    }

(et une fois corrigé, comment COMPTEUR pourrait-il être autre chose que < 3 puisque la boucle for l’impose)

Le meilleur conseil serait sans doute que vous relisiez un tuto de C pour savoir à quoi servent les accolades et les points virgules… vous en mettez partout et au hasard on dirait…

indentez aussi le code, ça le rendra lisible… (ctrl-T ou cmd-T dans l’IDE)

Ce que vous cherchez à faire, c’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement). il faudra une transition pour faire partir le SMS lors de la détection d’humidité et ensuite un clignotement / beep et définir quelles sont les conditions de retour à l’état normal.

Bonjour. J'ai bien écouté vos conseils et j'ai refais mes devoirs, d'ou le temps réponse. Ce ne fut pas facile mais j'ai tout de meme trouvé une solution plus adaptée a la situation a savoir l'envoi d'un SMS au 10 mts.Certes je suis persuadé qu'un programmmeur chevronné aurait codé avec plus de sagacité mais ça fonctionne et c'est tout ce qui compte pour moi. Apres tout : "Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer."

Voici donc les changements apportés

void loop() {
  iValeur = digitalRead(SENSEUR);
  Serial.println(iValeur);
  delay(1000);


  switch (iValeur) {
    case 0:
      Serial.println("Le module MH-RD détecte de l'eau ");
      delay(1000);
      digitalWrite(RELAIS, LOW);
      digitalWrite(PIETZO, HIGH);
      delay(100);
      digitalWrite(PIETZO, LOW);
      delay(100);


      if ((millis() - temps) > 600000)
      { ENVOI_SMS();
        temps = millis();
      }

      break;

    case 1:

      Serial.println("tout est ok");
      delay(1000);
      digitalWrite(RELAIS, HIGH);
      digitalWrite(PIETZO, LOW);
      break;
  }
}

super !

Bonjour. J'ai oublié de vous remercier d'avoir pris le temps de me répondre et de m'avoir guidé dans mes démarches. C'est en partie grâce à ça que j'ai réussi.

Merci encore.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.