Un mystère pour moi

Bonjour

J'ai écrit ce sketch qui me permet de surveiller à distance la t° interne d'un chalet sur mon gsm

Particularités :

  • la transmission de la mesure se fait uniquement par envoi de la lettre "V" et une seule mesure me parvient
  • Le réseau étant instable, je souhaite être informé de chaque rebootage de mon système

Tout fonctionne parfaitement mais :
Si je conditionne la mesure à la lettre "V" tout va bien, je ne reçois qu'une seule mesure
Mais si je la remplace par d'autres lettres, les envois sont lancés sans demandes et ne s'arrêtent plus

Pourquoi?

 #include <SoftwareSerial.h>
#include <DHT.h>
#define brocheDeBranchementDHT 4  // pine de mesre DHT22
#define typeDeDHT DHT22           // type de DHT utilisé 

// Instanciation de la librairie DHT
DHT dht(brocheDeBranchementDHT, typeDeDHT);


char inchar;  // variable du caractere reçu
int N=0;

SoftwareSerial mySerial(2, 3);  // 2=TX 3=RX

void setup() {
  mySerial.begin(9600);  // vitesse SIM900
  Serial.begin(9600);    // vitesse moniteur
  delay(100);

  // Initialisation du DHT22;
  dht.begin();

  N=N+1;
                   
}
void loop() {

//envoi vers gsm de la signalisation du reboot du systeme
if (N==1)
 {
mySerial.println("AT+CMGF=1");                   //Sets the GSM Module in Text Mode
delay(1000);                                     // Delay of 1 second
 mySerial.println("AT+CMGS=\"+xxxxxxxx\"\r");  // Replace x with mobile number
 delay(1000);
 mySerial.println("REBOOT Chalet");  // The SMS text you want to send
 delay(100);
 mySerial.println((char)26);  // ASCII code of CTRL+Z for saying the end of sms to  the module
                               //                delay(5000);
 }     
 N=0;
  if (mySerial.available() > 0) {

    inchar = mySerial.read();
    Serial.println(inchar);
    delay(20);
    if (inchar == 'V') {
      delay(10);

      // Lecture des données
      float tauxHumidite = dht.readHumidity();             // Lecture du taux d'humidité (en %)
      float temperatureEnCelsius = dht.readTemperature();  // Lecture de la température, exprimée en degrés Celsius

      // Vérification si données bien reçues
      if (isnan(tauxHumidite) || isnan(temperatureEnCelsius)) {
        Serial.println("Aucune valeur retournée par le DHT22. Est-il bien branché ?");
        delay(2000);
        return;  // Si aucune valeur n'a été reçue par l'Arduino, on attend 2 secondes, puis on redémarre la fonction loop()
      }

      // Affichage des valeurs dans moniteur
      Serial.print("Humidité = ");
      Serial.print(tauxHumidite);
      Serial.println(" %");
      Serial.println();

      // envoi des valeurs vers GSM
     mySerial.println("AT+CMGF=1");                   //Sets the GSM Module in Text Mode
      delay(1000);                                     // Delay of 1 second
     mySerial.println("AT+CMGS=\"+xxxxxx\"\r");  // Replace x with mobile number
      delay(1000);
      mySerial.print("Temperature = ");
      mySerial.print(temperatureEnCelsius);
      mySerial.print(" *c");  // The SMS text you want to send
      mySerial.println();
      mySerial.print("Humidite        = ");
      mySerial.print(tauxHumidite);
      mySerial.print(" %");  // The SMS text you want to send
      delay(100);
      mySerial.println((char)26);  // ASCII code of CTRL+Z for saying the end of sms to  the module
      mySerial.println();
      // Temporisation de 2 secondes (pour rappel : il ne faut pas essayer de faire plus d'1 lecture toutes les 2 secondes, avec le DHT22, selon le fabricant)
      delay(2000);
    }
  }
}

votre code fait cela:

si votre arduino reboote, N est remis à 0 puis incrémenté à 1 dans le setup et donc dans la loop le test N == 1 sera toujours vrai

autant mettre l'envoi du SMS dans le setup directement et vous passer de N

#include <SoftwareSerial.h>
#include <DHT.h>
#define brocheDeBranchementDHT 4  // pine de mesre DHT22
#define typeDeDHT DHT22           // type de DHT utilisé 

// Instanciation de la librairie DHT
DHT dht(brocheDeBranchementDHT, typeDeDHT);
SoftwareSerial mySerial(2, 3);  // 2=TX 3=RX

void setup() {
  mySerial.begin(9600);  // vitesse SIM900
  Serial.begin(9600);    // vitesse moniteur
  delay(100);

  // Initialisation du DHT22;
  dht.begin();

  //envoi vers gsm de la signalisation du reboot du systeme
  mySerial.println("AT+CMGF=1");                   //Sets the GSM Module in Text Mode
  delay(1000);                                     // Delay of 1 second
  mySerial.println("AT+CMGS=\"+32123456789\"\r");  // Replace x with mobile number
  delay(1000);
  mySerial.println("REBOOT Chalet");  // The SMS text you want to send
  delay(100);
  mySerial.println((char)26);  // ASCII code of CTRL+Z for saying the end of sms to  the module

}
void loop() {
  if (mySerial.available() > 0) {
    char inchar = mySerial.read();
    Serial.println(inchar);

    if (inchar == 'V') {
      delay(10);

      // Lecture des données
      float tauxHumidite = dht.readHumidity();             // Lecture du taux d'humidité (en %)
      float temperatureEnCelsius = dht.readTemperature();  // Lecture de la température, exprimée en degrés Celsius

      // Vérification si données bien reçues
      if (isnan(tauxHumidite) || isnan(temperatureEnCelsius)) {
        Serial.println("Aucune valeur retournée par le DHT22. Est-il bien branché ?");
        delay(2000);
        return;  // Si aucune valeur n'a été reçue par l'Arduino, on attend 2 secondes, puis on redémarre la fonction loop()
      }

      // Affichage des valeurs dans moniteur
      Serial.print("Humidité = ");
      Serial.print(tauxHumidite);
      Serial.println(" %");
      Serial.println();

      // envoi des valeurs vers GSM
      mySerial.println("AT+CMGF=1");                   //Sets the GSM Module in Text Mode
      delay(1000);                                     // Delay of 1 second
      mySerial.println("AT+CMGS=\"+32123456789\"\r");  // Replace x with mobile number
      delay(1000);
      mySerial.print("Temperature = ");
      mySerial.print(temperatureEnCelsius);
      mySerial.print(" *c");  // The SMS text you want to send
      mySerial.println();
      mySerial.print("Humidite        = ");
      mySerial.print(tauxHumidite);
      mySerial.print(" %");  // The SMS text you want to send
      mySerial.println((char)26);  // ASCII code of CTRL+Z for saying the end of sms to  the module
      mySerial.println();
      mySerial.flush();
      // Temporisation de 2 secondes (pour rappel : il ne faut pas essayer de faire plus d'1 lecture toutes les 2 secondes, avec le DHT22, selon le fabricant)
      delay(2000);
    }
  }
}

quel code utilisez vous qui ne fonctionne pas ?

De quel code parlez-vous?

quel code utilisez vous quand ça ne marche pas ?

juste (disons pour tester avec W)

    if (inchar == 'W') {
...

ou vous essayez de mettre plusieurs lettres

    if (inchar == 'VWXYZ') {
...

Une seule lettre (inchar == 'W") au lieu de (inchar == 'V')

vous mettez "W" avec des guillemets ou 'W' avec des apostrophes ?

(pour une seule lettre il faut des apostrophes — les guillemets c'est pour les chaînes de caractères)

Je l'avais fait et exactement comme vous mais pas d'affichage de "reboot chalet" sur mon gsm

vous mettez "W" avec des guillemets ou 'W' avec des apostrophes ?

(pour une seule lettre il faut des apostrophes — les guillemets c'est pour les chaînes de caractères)

oupsss erreur de frappe ici mais pas dans mon sketch

hum... il n'y a aucune raison que

if (inchar == 'V') {

et que

if (inchar == 'W') {

ne fonctionne pas...

il doit y avoir autre chose...

quand vous envoyez un SMS que lisez vous sur le port série ? il y a du bla-bla en plus du contenu du SMS normalement

le moniteur série placé directement après l'arrivée du caractère indique parfaitement la lettre émise

mais voyez vous autre chose (lié aux commandes AT)

pouvez vous postez le code qui ne fonctionne pas et une copie d'écran de ce que l'on voie dans la console lors de la réception de cette lettre

Lorsque je n'envoie absolument rien, voici ce que je reçois : la décomposition de commandes AT qui sont celles qui ont été envoyées lors du rebootage
Pourquoi me reviennent-elles sans demande?

On comprend donc que la lettre V fonctionne mais pas les lettres C,T etc

moniteur série :

mon sketch :

#include <SoftwareSerial.h>
#include <DHT.h>
#define brocheDeBranchementDHT 4  // pine de mesre DHT22
#define typeDeDHT DHT22           // type de DHT utilisé 

// Instanciation de la librairie DHT
DHT dht(brocheDeBranchementDHT, typeDeDHT);


char inchar;  // variable du caractere reçu
int N=0;

SoftwareSerial mySerial(2, 3);  // 2=TX 3=RX

void setup() {
  mySerial.begin(9600);  // vitesse SIM900
  Serial.begin(9600);    // vitesse moniteur
  delay(100);

  // Initialisation du DHT22;
  dht.begin();

  N=N+1;
                   
}
void loop() {

//envoi vers gsm de la signalisation du reboot du systeme
if (N==1)
{
mySerial.println("AT+CMGF=1");                   //Sets the GSM Module in Text Mode
delay(1000);                                     // Delay of 1 second
 mySerial.println("AT+CMGS=\"+xxxx\"\r");  // Replace x with mobile number
 delay(1000);
 mySerial.println("REBOOT Chalet");  // The SMS text you want to send
 delay(100);
 mySerial.println((char)26);  // ASCII code of CTRL+Z for saying the end of sms to  the module
Serial.print("REBOOT Chalet");
Serial.println();
 }     

 N=0;

  if (mySerial.available() > 0) {

    inchar = mySerial.read();
    Serial.print("lettre envoyée = ");
    Serial.println(inchar);
    delay(20);
    if (inchar == 'V') {
      delay(10);

      // Lecture des données
      float tauxHumidite = dht.readHumidity();             // Lecture du taux d'humidité (en %)
      float temperatureEnCelsius = dht.readTemperature();  // Lecture de la température, exprimée en degrés Celsius

      // Vérification si données bien reçues
      if (isnan(tauxHumidite) || isnan(temperatureEnCelsius)) {
        Serial.println("Aucune valeur retournée par le DHT22. Est-il bien branché ?");
        delay(2000);
        return;  // Si aucune valeur n'a été reçue par l'Arduino, on attend 2 secondes, puis on redémarre la fonction loop()
      }

      // Affichage des valeurs dans moniteur
      Serial.print("Temperature = ");
      Serial.print(temperatureEnCelsius);
      Serial.println(" *C");
      Serial.print("Humidite = ");
      Serial.print(tauxHumidite);
      Serial.println(" %");
      Serial.println();

      // envoi des valeurs vers GSM
     mySerial.println("AT+CMGF=1");                   //Sets the GSM Module in Text Mode
      delay(1000);                                     // Delay of 1 second
     mySerial.println("AT+CMGS=\"+xxxx\"\r");  // Replace x with mobile number
      delay(1000);
      mySerial.print("Temperature = ");
      mySerial.print(temperatureEnCelsius);
      mySerial.print(" *c");  // The SMS text you want to send
      mySerial.println();
      mySerial.print("Humidite        = ");
      mySerial.print(tauxHumidite);
      mySerial.print(" %");  // The SMS text you want to send
      delay(100);
      mySerial.println((char)26);  // ASCII code of CTRL+Z for saying the end of sms to  the module
      mySerial.println();
      // Temporisation de 2 secondes (pour rappel : il ne faut pas essayer de faire plus d'1 lecture toutes les 2 secondes, avec le DHT22, selon le fabricant)
      delay(2000);
    }
  }
}

Je pense que votre module est en mode ECHO donc il répète la commande et affiche la réponse.

si vous envoyez un SMS est-ce que ça affiche quelque chose ?
➜ copiez et collez le texte du moniteur série, ce sera plus utile qu'une image partielle...

  1. Mon module est un SIM900 ... un mode Echo??

  2. Si j'envoie l'sms "bonjour" je recois "bonjour" voici le rendu dans le monitor

lettre envoyée = ,

lettre envoyée = 2

lettre envoyée = 0

lettre envoyée = :

lettre envoyée = 0

lettre envoyée = 8

lettre envoyée = :

lettre envoyée = 1

lettre envoyée = 7

lettre envoyée = +

lettre envoyée = 0

lettre envoyée = 4

lettre envoyée = "

lettre envoyée =

lettre envoyée =

lettre envoyée = B

lettre envoyée = o

lettre envoyée = n

lettre envoyée = j

lettre envoyée = o

lettre envoyée = u

lettre envoyée = r

lettre envoyée =

lettre envoyée =

J'ai trouvé une solution ... j'envoie de mon gsm la commande "TEMP" au lieu d'une seule lettre ... de cette façon la simple lettre,même tapée erronémment, ne causera plus de soucis

Tout fonctionne correctement maintenant

Le sketch modifié :

#include <SoftwareSerial.h>
#include <DHT.h>
#define brocheDeBranchementDHT 4  // pine de mesre DHT22
#define typeDeDHT DHT22           // type de DHT utilisé 

// Instanciation de la librairie DHT
DHT dht(brocheDeBranchementDHT, typeDeDHT);


char inchar;  // variable du caractere reçu
int N=0;

SoftwareSerial mySerial(2, 3);  // 2=TX 3=RX

void setup() {
  mySerial.begin(9600);  // vitesse SIM900
  Serial.begin(9600);    // vitesse moniteur
  delay(100);

  // Initialisation du DHT22;
  dht.begin();

  N=N+1;
                   
}
void loop() {

//envoi vers gsm de la signalisation du reboot du systeme
if (N==1)
{
mySerial.println("AT+CMGF=1");                   //Sets the GSM Module in Text Mode
delay(1000);                                     // Delay of 1 second
 mySerial.println("AT+CMGS=\"+xxxxxxx\"\r");  // Replace x with mobile number
 delay(1000);
 mySerial.println("REBOOT Chalet");  // The SMS text you want to send
 delay(100);
 mySerial.println((char)26);  // ASCII code of CTRL+Z for saying the end of sms to  the module
Serial.print("REBOOT Chalet");
Serial.println();
 }     

 N=0;

  if (mySerial.available() > 0) {

    inchar = mySerial.read();
    Serial.print("lettre envoyée = ");
    Serial.println(inchar);
    delay(20);
    if (inchar == 'T') {
      delay(10);
    }
      if (inchar == 'E') {
        delay(10);
      }
      if (inchar == 'M') {
        delay(10);
      }
      if (inchar == 'P') {
        
      // Lecture des données
      float tauxHumidite = dht.readHumidity();             // Lecture du taux d'humidité (en %)
      float temperatureEnCelsius = dht.readTemperature();  // Lecture de la température, exprimée en degrés Celsius

      // Vérification si données bien reçues
      if (isnan(tauxHumidite) || isnan(temperatureEnCelsius)) {
        Serial.println("Aucune valeur retournée par le DHT22. Est-il bien branché ?");
        delay(2000);
        return;  // Si aucune valeur n'a été reçue par l'Arduino, on attend 2 secondes, puis on redémarre la fonction loop()
      }

      // Affichage des valeurs dans moniteur
      Serial.print("Temperature = ");
      Serial.print(temperatureEnCelsius);
      Serial.println(" *C");
      Serial.print("Humidite = ");
      Serial.print(tauxHumidite);
      Serial.println(" %");
      Serial.println();

      // envoi des valeurs vers GSM
     mySerial.println("AT+CMGF=1");                   //Sets the GSM Module in Text Mode
      delay(1000);                                     // Delay of 1 second
     mySerial.println("AT+CMGS=\"+xxxxxxx\"\r");  // Replace x with mobile number
      delay(1000);
      mySerial.print("Temperature = ");
      mySerial.print(temperatureEnCelsius);
      mySerial.print(" *c");  // The SMS text you want to send
      mySerial.println();
      mySerial.print("Humidite        = ");
      mySerial.print(tauxHumidite);
      mySerial.print(" %");  // The SMS text you want to send
      delay(100);
      mySerial.println((char)26);  // ASCII code of CTRL+Z for saying the end of sms to  the module
      mySerial.println();
      // Temporisation de 2 secondes (pour rappel : il ne faut pas essayer de faire plus d'1 lecture toutes les 2 secondes, avec le DHT22, selon le fabricant)
      delay(2000);
    }
  }
  }


Non…seul le P déclenche le traitement….les autres tests avant ne servent à rien

je pense que ma solution est plus universelle et ne dépend pas du tout du contenu des commandes AT envoyées

Si je peux me permettre, vous vous racontez une histoire… vous recevez un octet et le comparez à différentes choses… il ne va être égal qu’à un seul caractère s’il y a un match… tous ces delay ne servent à rien, tant que vous ne trouvez pas dans le flux la seule lettre qui déclenche la mesure et l’envoi de la réponse

Pour que votre code soit réellement fonctionnel, il vous faudrait

  • arrêter d’utiliser delay() dans l’espoir que vous attendiez assez longtemps pour que la commande soit traitée
  • Écouter la réponse pour voir si la commande a été correctement exécutée
  • Ne pas tenir compte du langage de commande de la réponse lors d’une réception de SMS pour pouvoir extraire réellement uniquement le message envoyé
  • Comparer ce message reçu avec les commandes possibles pour effectuer l’opération attendue.

Il existe des bibliothèques pour gérer cela, vous devriez explorer cette piste.

Ce n’est que mon avis, si vous pensez avoir la solution universelle et que ça vous convient, c’est votre projet…

Merci pour m'avoir fait constater une faiblesse dans la chaine des IF

Vous avez raison, en ne gardant que le dernier IF sur "P" on arrive au même résultat

Peut-être q'une concaténation des lettres reçues suivie d'une comparaison à "TEMP" résoudrait le problème?

Je te remercie de prendre du temps pour moi

Tu ne devrais pas mettre un numéro de téléphone en clair sur le forum (juste un conseil).