Aide pour programmation

Bonjour tout le monde,

Je vous envoie ce message pour avoir un peu d'aide, j'ai pour projet perso de m'envoyer un SMS lorsque je dépasse un seuil de 2.5 V sur une entrée analogique. Je ne suis pas très bon en programmation, car je débute tout juste. J'ai donc regardé sur des tutos, j'ai réussi à allumer une LED lorsque le seuil et dépassé et j'ai après plusieurs essais enfin réussi à m'envoyer un SMS via un module GSM 800 L EVB acheté sur Amazon.
Il me reste plus qu'a fusionner les deux programmes, mais là, je bloque.... Je ne trouve pas de tuto exact à ma demande, j'ai donc cherché dans mes bouquins d'arduino et j'ai réussi à "fusionner" les deux programmes... Cependant, je ne suis pas sûr que cela soit juste. Pouvez-vous m'aider ? Je vous en serais reconnaissant ! Merci d'avance,
Joris



//Variable relative au capteur analogique
double seuil= 2.5;//définir les valeurs de seuil
int analogPin = 0;// définir l'entrée analogique pour le module GSM
//Variable relative aux modules GSM
#include <SoftwareSerial.h>
SoftwareSerial serialSIM800(SIM_TX,SIM_RX); // Inclure la bibliothèque SIM TX et RX
#define SIM_TX 1 // définir la SIM TX sur la broche 8 de la carte Arduino
#define SIM_RX 0 // Définir la SIM RX sur la broche 7 de la carte arduino



void setup() {
 delay(2000); //Attendre 2 secondes 
 pinMode (SIM_TX, OUTPUT); // définir le TX sur la sortie
 pinMode (SIM_RX, OUTPUT); // Définir le RX sur une sortie  
Serial.begin(9600);//initialisé le moniteur série à 9600 baud
serialSIM800.begin(9600); // Initialisation du GSM sur le moniteur série
delay(2000);// Attendre 2 secondes   
serialSIM800.write("AT+CMGF=1\r"); //activation du mode SMS
delay(2000);// Attendre deux secondes
}

void loop() {
  // put your main code here, to run repeatedly:
  //lire l'entrée analogique
  int sensorValue = analogRead(analogPin);
  // convertir la lécture analogique de 0 à 1023 pour une tension de 0V-5V:
  float voltage = sensorValue * (5.0/1023.0);

  //Réalisation d'un seuil de 2.5 V
  if (voltage > 2.5)
  {
  //Ecrire sur le moniteur la valeur que l'arduino lis
  Serial.println(sensorValue);
  Serial.println(voltage);
  Serial.println("ENVOIE DU SMS");
  //envoie du SMS
 serialSIM800.write("AT+CMGS=\"+336*******\"\r"); //envoi d'un sms au numéro inscrit
 delay(2000);// Attendre deux secondes
 serialSIM800.write("SEUIL DEPASSE"); //Contenu du SMS
 delay(2000);// Attendre deux secondes
 Serial.println("SMS envoyé !");// Ecrire sur le moniteur série que le sms est envoyé
  }
else
{
//Ecrire la valeur que l'arduino lis
  Serial.println(sensorValue);
  Serial.println(voltage);
  Serial.println("SEUIL NON DEPASSE");
}
//délais pour traitement sur le moniteur série
delay(200);
}


J’ai déplacé ce sujet dans le forum en francais. Merci de lire les règles d’usage

Ah excusez-moi je pensais être en Français

Il faut généralement envoyer au module le code 26 suivi d’un passage à la ligne ( End of Medium fin de support) après votre texte pour valider le SMS

Merci pour votre aide c'est gentil de votre part, voici la correction:



//Variable relative au capteur analogique
double seuil= 2.5;//définir les valeurs de seuil
int analogPin = 0;// définir l'entrée analogique pour le module GSM
//Variable relative aux modules GSM
#include <SoftwareSerial.h>
#define SIM_TX 1 // définir la SIM TX sur la broche 8 de la carte Arduino
#define SIM_RX 0 // Définir la SIM RX sur la broche 7 de la carte arduino
SoftwareSerial serialSIM800(SIM_TX,SIM_RX); // Inclure la bibliothèque SIM TX et RX




void setup() {
 delay(2000); //Attendre 2 secondes 
 pinMode (SIM_TX, OUTPUT); // définir le TX sur la sortie
 pinMode (SIM_RX, OUTPUT); // Définir le RX sur une sortie  
Serial.begin(9600);//initialisé le moniteur série à 9600 baud
serialSIM800.begin(9600); // Initialisation du GSM sur le moniteur série
delay(2000);// Attendre 2 secondes   
serialSIM800.write("AT+CMGF=1\r"); //activation du mode SMS
delay(2000);// Attendre deux secondes
}

void loop() {
  // put your main code here, to run repeatedly:
  //lire l'entrée analogique
  int sensorValue = analogRead(analogPin);
  // convertir la lécture analogique de 0 à 1023 pour une tension de 0V-5V:
  float voltage = sensorValue * (5.0/1023.0);

  //Réalisation d'un seuil de 2.5 V
  if (voltage > 2.5)
  {
  //Ecrire sur le moniteur la valeur que l'arduino lis
  Serial.println(sensorValue);
  Serial.println(voltage);
  Serial.println("ENVOIE DU SMS");
  //envoie du SMS
 serialSIM800.write("AT+CMGS=\"+336*******\"\r"); //envoi d'un sms au numéro inscrit
 delay(2000);// Attendre deux secondes
 serialSIM800.write("SEUIL DEPASSE"); //Contenu du SMS
 delay(2000);// Attendre deux secondes
 serialSIM800.write((char)26); //Permet d'indiquer que le message est finit
 delay(2000);// Attendre deux secondes
 Serial.println("SMS envoyé !");// Ecrire sur le moniteur série que le sms est envoyé
     
  }
else
{
//Ecrire la valeur que l'arduino lis
  Serial.println(sensorValue);
  Serial.println(voltage);
  Serial.println("SEUIL NON DEPASSE");
}
//délais pour traitement sur le moniteur série
delay(200);
}


Et ça fonctionne ? (Il n’y a pas le passage à la ligne après le 26 mais ça dépend des modules)

Ça va faire "mitraillette" quand ça va marcher…

Qu'entendez vous par mitraillette ? Vous me conseillez de le mettre hors du loop ?

je veux dire qu'à chaque tour de loop() si la tension est > 2.5 alors vous balancez le SMS. il y a quelques délais mais en gros toutes les 4/5 secondes vous allez balancer le SMS si la condition est réalisée.

peut-être que l''envoyer qu'une seule fois et attendre le retour en fonctionnement nominal serait suffisant ?

Ah je comprend !
C'est tout à fait ce que je cherche à faire... comment puis-je faire cela ?
Imaginons je met un délais de une heure vous pensez que cela fera l'affaire ?

il suffit de faire passer une variable booléenne smsDejaEmis initialisée à FAUX (false) à VRAI (true) par exemple une fois le SMS envoyé
Vous la remettez à FAUX quand la tension est revenue normale par exemple (dans le else de votre test)

Merci de l'aide ! Quelque chose dans ce style ?



//Variable relative au capteur analogique
double seuil= 2.5;//définir les valeurs de seuil
int analogPin = 0;// définir l'entrée analogique pour le module GSM
//Variable relative aux modules GSM
#include <SoftwareSerial.h>
#define SIM_TX 1 // définir la SIM TX sur la broche 8 de la carte Arduino
#define SIM_RX 0 // Définir la SIM RX sur la broche 7 de la carte arduino
SoftwareSerial serialSIM800(SIM_TX,SIM_RX); // Inclure la bibliothèque SIM TX et RX
boolean smsDejaEmis = true;



void setup() {
 delay(2000); //Attendre 2 secondes 
 pinMode (SIM_TX, OUTPUT); // définir le TX sur la sortie
 pinMode (SIM_RX, OUTPUT); // Définir le RX sur une sortie  
Serial.begin(9600);//initialisé le moniteur série à 9600 baud
serialSIM800.begin(9600); // Initialisation du GSM sur le moniteur série
delay(2000);// Attendre 2 secondes   
serialSIM800.write("AT+CMGF=1\r"); //activation du mode SMS
delay(2000);// Attendre deux secondes

}

void loop() {
  // put your main code here, to run repeatedly:
  //lire l'entrée analogique
  int sensorValue = analogRead(analogPin);
  // convertir la lécture analogique de 0 à 1023 pour une tension de 0V-5V:
  float voltage = sensorValue * (5.0/1023.0);

  //Réalisation d'un seuil de 2.5 V
  if (voltage > 2.5)
  {
  smsDejaEmis = smsDejaEmis;
  //Ecrire sur le moniteur la valeur que l'arduino lis
  Serial.println(sensorValue);
  Serial.println(voltage);
  Serial.println("ENVOIE DU SMS");
  //envoie du SMS
 serialSIM800.write("AT+CMGS=\"+336*******\"\r"); //envoi d'un sms au numéro inscrit
 delay(2000);// Attendre deux secondes
 serialSIM800.write("SEUIL DEPASSE"); //Contenu du SMS
 delay(2000);// Attendre deux secondes
 serialSIM800.write((char)26); //Permet d'indiquer que le message est finit
 delay(2000);// Attendre deux secondes
 Serial.println("SMS envoyé !");// Ecrire sur le moniteur série que le sms est envoyé
     
  }
else
{
//Ecrire la valeur que l'arduino lis
  Serial.println(sensorValue);
  Serial.println(voltage);
  Serial.println("SEUIL NON DEPASSE");
smsDejaEmis = !smsDejaEmis;
}
//délais pour traitement sur le moniteur série
delay(200);
}


Non :slight_smile:

pourquoi initialiser à vrai ?

boolean smsDejaEmis = true;

que pensez vous de l'affectation faite ici:

  if (voltage > 2.5)
  {
  smsDejaEmis = smsDejaEmis; // ?????????

Une fois corrigé, faudrait peut-être tester la valeur avant d'émettre non ? :slight_smile:

Je vois ce que vous voulez dire, mais qu'entendez vous par tester ? Et en effet, la logique est plutôt négative dans ce cas si le smsemis est a false alors on envoie, c'est l'idée ? Désolé, je ne suis vraiment pas très doué, je fais de mon mieux ^^'

tester, ça veut dire :

Si le sms n'a pas déjà été émis alors l'envoyer et noter qu'on l'a émis

Ahh je vois merci je vais chercher je reviens vers vous si jamais !

Et comme ceci ? J'ai pris du temps car j'ai regardé deux trois tutos j'espère que c'est mieux ^^'



//Variable relative au capteur analogique
double seuil= 2.5;//définir les valeurs de seuil
int analogPin = 0;// définir l'entrée analogique pour le module GSM
//Variable relative aux modules GSM
#include <SoftwareSerial.h>
#define SIM_TX 1 // définir la SIM TX sur la broche 8 de la carte Arduino
#define SIM_RX 0 // Définir la SIM RX sur la broche 7 de la carte arduino
SoftwareSerial serialSIM800(SIM_TX,SIM_RX); // Inclure la bibliothèque SIM TX et RX
boolean smsDejaEmis = false;



void setup() {
 delay(2000); //Attendre 2 secondes 
 pinMode (SIM_TX, OUTPUT); // définir le TX sur la sortie
 pinMode (SIM_RX, OUTPUT); // Définir le RX sur une sortie  
Serial.begin(9600);//initialisé le moniteur série à 9600 baud
serialSIM800.begin(9600); // Initialisation du GSM sur le moniteur série
delay(2000);// Attendre 2 secondes   
serialSIM800.write("AT+CMGF=1\r"); //activation du mode SMS
delay(2000);// Attendre deux secondes

}

void loop() {
  // put your main code here, to run repeatedly:
  //lire l'entrée analogique
  int sensorValue = analogRead(analogPin);
  // convertir la lécture analogique de 0 à 1023 pour une tension de 0V-5V:
  float voltage = sensorValue * (5.0/1023.0);

  //Réalisation d'un seuil de 2.5 V
if(voltage > 2.5 && smsDejaEmis);
  {
  //Ecrire sur le moniteur la valeur que l'arduino lis
  Serial.println(sensorValue);
  Serial.println(voltage);
  Serial.println("ENVOIE DU SMS");
  //envoie du SMS
 serialSIM800.write("AT+CMGS=\"+336*******\"\r"); //envoi d'un sms au numéro inscrit
 delay(2000);// Attendre deux secondes
 serialSIM800.write("SEUIL DEPASSE"); //Contenu du SMS
 delay(2000);// Attendre deux secondes
 serialSIM800.write((char)26); //Permet d'indiquer que le message est finit
 delay(2000);// Attendre deux secondes
 Serial.println("SMS envoyé !");// Ecrire sur le moniteur série que le sms est envoyé
  }
else
{
//Ecrire la valeur que l'arduino lis
  Serial.println(sensorValue);
  Serial.println(voltage);
  Serial.println("SEUIL NON DEPASSE");

}
//délais pour traitement sur le moniteur série
delay(200);
}


il y a encore pas mal de bugs...

un ; termine un statement en C ou C++ donc quand vous écrivez

  if (voltage > 2.5 && smsDejaEmis);

le if se termine au ; et ce qui suit n'est pas dans le if... sans doute pas ce que vous voulez.... :slight_smile:

ensuite, la logique n'est pas bonne.

il faut bien commencer avec

boolean smsDejaEmis = false;

et le test doit être

if (voltage > 2.5) { 
  // si on est au dessus du seuil
  if (! smsDejaEmis) { // si le SMS n'a pas été encore envoyé
    ... // envoi du SMS
    smsDejaEmis = true; // on mémorise l'envoi
  }
} else { 
  // on est en dessous du seuil
  ... // du code
  smsDejaEmis = false; // on mémorise que le seuil n'était plus atteint
}

ensuite pouvez vous expliquer ce que vous faites ici?

#include <SoftwareSerial.h>
#define SIM_TX 1 // définir la SIM TX sur la broche 8 de la carte Arduino
#define SIM_RX 0 // Définir la SIM RX sur la broche 7 de la carte arduino
SoftwareSerial serialSIM800(SIM_TX,SIM_RX); // Inclure la bibliothèque SIM TX et RX

(le commentaire ne correspond pas et les pins 0 et 1 sont le port série standard, pas besoin de Software Serial, mais dans ce cas vous ne pouvez pas utiliser le moniteur série pour l'affichage)

ça aussi c'est louche, pourquoi le faites vous ?

 pinMode (SIM_TX, OUTPUT); // définir le TX sur la sortie
 pinMode (SIM_RX, OUTPUT); // Définir le RX sur une sortie  

Ah ok, je vois pour le point virgule, c'est une erreur d'inattention ! Merci, pour l'aide, je n'aurais pas réussi sans vous, mais j'ai compris la logique !
C'est juste que sur le programme d'envoi de SMS, ils utilisent ces bibliothèques et la communication entre la carte Arduino et le GSM800L ce fait par les broches RX et TX de ma carte soit le 8 et le 7 c'est encore une erreur d'étourderie..... Pour la sortie, c'est parce que ces broches sont en sortie nan ?

vous dites

Arduino et le GSM800L ce fait par les broches RX et TX de ma carte soit le 8 et le 7

mais le code dit

#define SIM_TX 1 // définir la SIM TX sur la broche 8 de la carte Arduino
#define SIM_RX 0 // Définir la SIM RX sur la broche 7 de la carte arduino

donc 0 et 1... qui sont les Rx et Tx matériels. Le code utilise justement les broches 7 et 8 pour laisser ce port matériel libre pour la connexion USB et l'affichage sur le moniteur série.

Pour la sortie, c'est parce que ces broches sont en sortie nan ?

si Rx veut dire "Réception" ce serait plutôt une entrée non ? (mais SoftwareSerial s'occupera de faire cela pour vous)

Oui oui tout a fait j'ai pris les broches 7 et 8 pour avoir accès au moniteur série comme indiqué dans le tuto sur internet ^^



//Variable relative au capteur analogique
double seuil= 2.5;//définir les valeurs de seuil
int analogPin = 0;// définir l'entrée analogique pour le module GSM
//Variable relative aux modules GSM
#include <SoftwareSerial.h>
#define SIM_TX 8 // définir la SIM TX sur la broche 8 de la carte Arduino
#define SIM_RX 7 // Définir la SIM RX sur la broche 7 de la carte arduino
SoftwareSerial serialSIM800(SIM_TX,SIM_RX); // Inclure la bibliothèque SIM TX et RX
boolean smsDejaEmis = false;



void setup() {
 delay(2000); //Attendre 2 secondes 
 pinMode (SIM_TX, OUTPUT); // définir le TX sur la sortie
 pinMode (SIM_RX, OUTPUT); // Définir le RX sur une sortie  
Serial.begin(9600);//initialisé le moniteur série à 9600 baud
serialSIM800.begin(9600); // Initialisation du GSM sur le moniteur série
delay(2000);// Attendre 2 secondes   
serialSIM800.write("AT+CMGF=1\r"); //activation du mode SMS
delay(2000);// Attendre deux secondes

}

void loop() {
  // put your main code here, to run repeatedly:
  //lire l'entrée analogique
  int sensorValue = analogRead(analogPin);
  // convertir la lécture analogique de 0 à 1023 pour une tension de 0V-5V:
  float voltage = sensorValue * (5.0/1023.0);

  //Réalisation d'un seuil de 2.5 V
if(voltage > 2.5)
{
if (! smsDejaEmis)//si le SMS n'a pas été encore envoyé
{ 
 //Ecrire sur le moniteur la valeur que l'arduino lis
  Serial.println(sensorValue);
  Serial.println(voltage);
  Serial.println("ENVOIE DU SMS");
  //envoie du SMS
 serialSIM800.write("AT+CMGS=\"+336*******\"\r"); //envoi d'un sms au numéro inscrit
 delay(2000);// Attendre deux secondes
 serialSIM800.write("SEUIL DEPASSE"); //Contenu du SMS
 delay(2000);// Attendre deux secondes
 serialSIM800.write((char)26); //Permet d'indiquer que le message est finit
 delay(2000);// Attendre deux secondes
 Serial.println("SMS envoyé !");// Ecrire sur le moniteur série que le sms est envoyé
 smsDejaEmis = true; 
   }
 else
 {
//Ecrire la valeur que l'arduino lis
  Serial.println(sensorValue);
  Serial.println(voltage);
  Serial.println("SEUIL NON DEPASSE");
  smsDejaEmis = false;
 }

//délais pour traitement sur le moniteur série
delay(200);
}
}