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);
}
}
}
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);
}
}
}
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
#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...
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);
}
}
}
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…