/*Projet: Alarme avec un SIM800 ou un SIM900
* Auteur: Christian Joseph
* Description: Ce Programme permet d’envoyer un SMS à un destinataire en cas d’activation d’un capteur
* Ex: PIR sensor, Water Sensor, photorésistance,etc…
* Le système s’active et se désactive par SMS
* Date: 08 Juillet 2021
* Website: https://atelierdelarobotique.fr
*/
char incoming_char;
String msgrecu= "";
String numero = "";
String bienvenue = "Bonjour, envoyez Activation pour mettre en route ou Stop pour mettre en pause";
String alerte = "Alerte, erreur sur la machine";
String alerteStop = "systeme mis en pause";
String activer = "systeme mis en route";
int a = 0;
int t = 0;
int r = 1;
// Broche de notre capteur de mouvement
int sensorPin = 2;
void setup()
{
pinMode(sensorPin, INPUT);
Serial.begin(9600);
// Liaison SIM900 sur le tx2 et rx2 de la carte Arduino Mega
Serial2.begin(9600);
// Envoi du message de Bienvenue du système
message(bienvenue);
delay(2000);
}
void loop()
{
actif: delay(10);
// Activation du mode reception de sms
configuration();
// Boucle infinie d’attente d’activation: le système attent de recevoir un sms avec le mot « Activation »
//(Respecter les majuscules et minuscules et pas d’espace derrière)
while(1)
{
// Attente du SMS avec le mot Activation pour autoriser le système à detecter des mouvements
activation();
//la variable r = 1 si le SMS d’activation est valide
if( r == 1)
{
//Activation de l’autorisation d’interrution lorsque la broche de détecteur (sensorPin) passe à l’état HAUT
// les autres états possibles sont LOW (broche à l’état BAS), CHANGE(sur un changement d’état)
//RISING (état BAS vers état HAUT), FALLING(état HAUT vers état BAS)
// Choisissez l’état désiré en fonction de votre capteur
// Ici on choisi HAUT pour notre capteur de présence, mais on aurait pu choisir BAS
//pour un capteur de lumière pour indiquer que le capteur est exposé à la lumière.
//Envoi du SMS de confirmation de mise en route du système
message(activer);
attachInterrupt(digitalPinToInterrupt(sensorPin), etat, HIGH);
goto process;
}
}
process: // Dans cette boucle, on attend: 1)soit le SMS « Stop » pour désactiver le système. Imaginez vous oubliez vos clés de voiture dans la pièce
// et que vous ayez besoin d’y retourner. Dans ce cas vous envoyez « Stop » pour désactiver le système.
//2) soit notre détecteur se déclenche et le système envoi un message d’alerte. Là aussi il faut envoyer « Stop » pour tout désactiver.
configuration();
//On réinitialise les variable numero et msgrecu
msgrecu= "";
numero = "";
// Ceci est la désactivation si je veux entrer dans la pièce lorsque j’ai oublié mes clés par exemple.
desactivation1();
// Dans ce cas la variable r = 2
if(r==2)
{
// on arrête toute interruption, sinon le sous-programme d’interruption s’executera sans fin
detachInterrupt(digitalPinToInterrupt(sensorPin));
// on envoi le SMS indiquant que le système est mis en Pause
message(alerteStop);
//on efface tous les SMS reçus
configuration();
//on retourne au debut du programme en attente du mot « Activation » pour relancer le système
goto actif;
}
//la variable r = 3 en cas de détection d’un mouvement (ou de présence de lumière pour un capteur photosensible)
// Tant que r = 3 et SMS « Stop » non reçu, alors le SMS d’alerte est envoyé à l’utilisateur toutes les minutes environs
while(r == 3)
{
// Envoi du SMS d’alerte
message(alerte);
//delay(2000);
while (Serial2.available() >0 )
{
Serial.print(Serial2.read());
}
configuration();
// Attente du sms permettant la désactivation avec le mot « Stop »
//(Respecter les majuscules et minuscules et pas d’espace derrière).
desactivation();
}
message(alerteStop); //Envoi du SMS de mise en pause du système. Le système est désactivé.
while (Serial2.available() >0 )
{
Serial.print(Serial2.read());
}
delay(2000);
// retour vers l’attente d’activation du système
goto actif;
}
// Sous-Programme d’interruption en cas de détection
void etat()
{
// Broche du capteur à l’état HAUT – Mouvement détecté
if(digitalRead(sensorPin) == HIGH)
{
Serial.println("Mouvement detecte");
r = 3;
// Fin d’autorisation d’interruption
detachInterrupt(digitalPinToInterrupt(sensorPin));
Serial.println("fin interruption");
}
}
//Envoi du message à l’utilisateur
void message(String a)
{
Serial2.println("AT");
delay(500);
updateSerial();
//Activation mode Texte
Serial2.print("AT+CMGF=1\r");
delay(500);
updateSerial();
//Numéro du destinataire
Serial2.println("AT+CMGS=\"+33644757223\"");
delay(500);
updateSerial();
//Message à envoyer
Serial2.print(a);
delay(500);
//Envoi du message
Serial2.write((char)26);
delay(1000);
// On vide le Buffer de l’Arduino
while (Serial2.available() > 0 )
{
Serial.print(Serial2.read());
}
delay(1000);
}
void updateSerial()
{
delay(500);
while (Serial.available())
{
Serial2.write(Serial.read());
}
while(Serial2.available())
{
Serial.write(Serial2.read());
}
}
// Desactivation de l’alarme sans détection de mouvement
void desactivation1()
{
//on fait une boucle infini
while(1)
{
reception2:
//Si le capteur se déclenche, r est mis à 3 dans le sous programme d’interruption
if (r == 3)
{
// on sort de la boucle infinie et du sous-programme desactivation1
goto sortie2;
}
if(Serial2.available() > 0)
{
incoming_char=Serial2.read();
if (a > 9 && a < 21)
{
// récupération du numéro de l’emetteur du SMS
numero += incoming_char; //on récupère le numéro caractère par caractère et on le stocke dans la variable numero
Serial.println(numero);
}
else if (a > 49 && a < 54)
{
// récupération du message de l’emetteur du SMS
msgrecu += incoming_char;
//on récupère le message caractère par caractère et on le stocke dans la variable msgrecu
Serial.println(msgrecu);
}
//Fin de reception et d’exploration du SMS (le sms entier fait 54 caractères)
if (a >= 54)
{
goto compare2;
}
a++;
}
}
compare2:
//Test si bon numéro entrant et bon message
//autrement n’importe qui pourrait désactiver le système
if(numero == "33644757223" && msgrecu == "Stop")
{
Serial.println("Systeme inactif,reussi merci");
numero = ""; //On réinitialise les variable numero et msgrecu
msgrecu = "";
a = 0;
r = 2;
t = 0;
incoming_char = 0;
configuration();
delay(2000);
goto sortie2;
}
else
{
// Serial.println(« mauvais numéro ou mauvaise commande »);
numero = "";//On réinitialise les variable numero et msgrecu
msgrecu = "";
a = 0;
t = 0;
r = 1;
incoming_char = 0;
configuration();
goto reception2;
}
sortie2: delay(10);
}
void desactivation()
{// Desactivation de l’alarme en cas de détection de mouvement
while(t < 400)
{ //On fait une boucle qui dure en réalité entre 40s et 1 minute, pour attendre le mot « Stop », sinon on ressort
reception2:
//Attente du mot « Stop » par le bon numéro de téléphone
if(Serial2.available() > 0)
{
incoming_char=Serial2.read();
// récupération du numéro de l’emetteur du SMS
if (a > 9 && a < 21)
{
//on récupère le numéro caractère par caractère et on le stocke dans la variable numero
numero += incoming_char;
Serial.println(numero);
}
// récupération du message de l’emetteur du SMS
else if (a > 49 && a < 54)
{
//on récupère le message caractère par caractère et on le stocke dans la variable msgrecu
msgrecu += incoming_char;
Serial.println(msgrecu);
}
a++;
if (a >= 54)
{ //Fin de reception et d’exploration du SMS (le sms entier fait 54 caractères)
goto compare2;
}
}
delay(100);
t++;
}
compare2:
if(numero == "33644757223" && msgrecu == "Stop")
{ //Test si bon numéro entrant et bon message
//autrement n’importe qui pourrait désactiver le système
Serial.println("Systeme inactif,reussi merci");
numero = ""; //On réinitialise les variable numero et msgrecu
msgrecu = "";
a = 0;
r = 0;
t = 0;
incoming_char = 0;
configuration();
delay(2000);
}
else
{
Serial.println("mauvais numéro ou mauvaise commande");
numero = ""; //On réinitialise les variable numero et msgrecu
msgrecu = "";
a = 0;
t = 0;
incoming_char = 0;
configuration();
}
}
void activation()
{ // Activation de l’alarme
while(1)
{
reception:
if(Serial2.available() > 0)
{
incoming_char=Serial2.read();
if (a > 9 && a < 21)
{ // récupération du numéro de l’emetteur du SMS
numero += incoming_char; //on récupère le numéro caractère par caractère et on le stocke dans la variable numero
Serial.println(numero);
}
else if (a > 49 && a < 60)
{ // récupération du message de l’emetteur du SMS
msgrecu += incoming_char; //on récupère le message caractère par caractère et on le stocke dans la variable msgrecu
Serial.println(msgrecu);
}
a++;
if (a >= 60)
{ //Fin de reception et d’exploration du SMS(le sms entier fait 60 caractères)
goto compare;
}
}
}
compare:
//Test si bon numéro entrant et bon message
if(numero == "33644757223" && msgrecu == "Activation")
{
//autrement n’importe qui pourrait activer le système
Serial.println("Systeme actif,reussi merci");
numero = ""; //On réinitialise les variable numero et msgrecu
msgrecu = "";
a = 0;
r = 1;
incoming_char = 0;
//Efface le SMS reçu
configuration();
goto sortie;
}
else
{
Serial.println("Mauvais numéro ou mauvaise commande");
//On réinitialise les variable numero et msgrecu
numero = "";
msgrecu = "";
a = 0;
//Efface le SMS reçu
configuration();
goto reception;
}
sortie: delay(10);
}
// Activation mode reception de sms
void configuration()
{
Serial2.println("AT");
updateSerial();
// Mode Texte
Serial2.println("AT+CMGF=1");
updateSerial();
// Efface tous les SMS en mémoire
Serial2.println("AT+CMGD=1,4");
updateSerial();
// Activation de notification textos entrants
Serial2.println("AT+CNMI=1,2,0,0,0");
updateSerial();
delay(1000);
while (Serial2.available() >0 )
{
Serial.print(Serial2.read());
}
}