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);
}
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);
}
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)
//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);
}
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 ^^'
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);
}
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....
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 ?
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);
}
}