[Projet] Requête SMS Arduino + Shield GPRS pour boîtier connecté

Bonjour,

Nous sommes un groupe de trois étudiants en terminale STI2D et nous recherchons de l’aide pour notre projet de fin d’année en SIN (Système d’Information Numérique) afin de créer des requêtes par SMS pour consulter les stock d’œufs ou la température depuis le téléphone, par exemple.

Présentation du projet

Notre projet est un prototype de stockage d’œufs intelligent permettant aux utilisateurs de consulter en temps réel le nombre d’œufs disponibles dans le réfrigérateur via un Arduino envoyant un SMS à un téléphone mobile.

Ce dispositif permet également de contrôler la température actuelle à l’intérieur du réfrigérateur et il sera possible de stocker la date de péremption.

Ce dispositif est équipé d’un shield GPRS/GSM, d’un capteur de température, mais également d’un écran LCD plus son clavier numérique qui permet de rentrer les dates de péremption.

Voici notre code pour le moment qui permet de communiquer entre le téléphone mobile et le shield GRPS sans les requêtes dont nous avons besoin

#include "SIM900.h"
#include <SoftwareSerial.h>
//#include "inetGSM.h"
//#include "sms.h"
//#include "call.h"

//To change pins for Software Serial, use the two lines in GSM.cpp.

//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.

//Simple sketch to communicate with SIM900 through AT commands.

//InetGSM inet;
//CallGSM call;
//SMSGSM sms;

int numdata;
char inSerial[40];
int i=0;


void setup()
{
     //Serial connection.
     Serial.begin(9600);
     Serial.println("GSM Shield testing.");
     //Start configuration of shield with baudrate.
     //For http uses is raccomanded to use 4800 or slower.
     if (gsm.begin(9600))
          Serial.println("\nstatus=READY");
     else Serial.println("\nstatus=IDLE");
};

void loop()
{
     //Read for new byte on serial hardware,
     //and write them on NewSoftSerial.
     serialhwread();
     //Read for new byte on NewSoftSerial.
     serialswread();
};

void serialhwread()
{
     i=0;
     if (Serial.available() > 0) {
          while (Serial.available() > 0) {
               inSerial[i]=(Serial.read());
               delay(10);
               i++;
          }

          inSerial[i]='\0';
          if(!strcmp(inSerial,"/END")) {
               Serial.println("_");
               inSerial[0]=0x1a;
               inSerial[1]='\0';
               gsm.SimpleWriteln(inSerial);
          }
          //Send a saved AT command using serial port.
          if(!strcmp(inSerial,"TEST")) {
               Serial.println("SIGNAL QUALITY");
               gsm.SimpleWriteln("AT+CSQ");
          }
           if(!strcmp(inSerial,"SMS")) {
            gsm.SimpleWriteln("AT+CMGF=1");
          gsm.SimpleWriteln("AT+CMGS=\"+336XXXXXXX\"");
          gsm.SimpleWriteln("test");
          } else {
               Serial.println(inSerial);
               gsm.SimpleWriteln(inSerial);
          }
          inSerial[0]='\0';
     }
}

void serialswread()
{
     gsm.SimpleRead();
}

Exigences

  • Pouvoir consulter le stock d’œufs par sms.
  • Pouvoir par sms surveiller la température du réfrigérateur.
  • Le nombre d’œufs à être stockés doit être conséquent (6 ou +).
  • Pouvoir rentrer les dates de péremption à travers un clavier.
  • Les dates de péremption doivent-être indépendantes par œuf.
  • La commande sms par l’utilisateur doit-être simple.

Matériel disponible

  • Capteur de température
  • Carte SIM
  • Accumulateur Nimh – 1,2 Vcc
  • Filaments 3D 1,75 MM
  • LCD 4*20 l2C
  • Interrupteurs fin de course
  • Arduino
  • Shield GRPS + antenne
  • Clavier matriciel
  • Téléphone mobile + forfait à 2€ free ou 20€ sfr

Cordialement, en l’attente d’une réponse de votre part :slight_smile:

Mettez votre code de côté pour le moment et faites un petit programme juste pour apprendre jouer avec les SMS.

Vous comptez mettre l'Arduino et son Shield dans le réfrigérateur?

Bonjour,

Nous aimerions ne pas mettre le code de côté mais plutôt se concentrer dessus et le travailler pour aboutir au projet final.

Notre demande est à propos des requêtes, les SMS émissions/réceptions sont déjà opérationnels

L'arduino, le shield ainsi que tout le système se trouvera dans le réfrigérateur dans un boitier imprimé en 3D

Cordialement, en l'attente d'une réponse.

vous avez vérifié que les SMS passent dans le réfrigérateur ? Quid des conditions de T° - avez vous vérifié que tous vos composants se comporteront bien à 5°C? Est-ce qu'un point chaud (l'Arduino qui fonctionne en permanence enfermé dans une boîte?) dans un réfrigérateur est un problème?

Pour apprendre à analyser une entrée série, vous pouvez lire cela:Serial Input Basics

J-M-L les SMS passent dans le réfrigérateur mais là n'est pas le problème, ceci n'est qu'un projet qui seras présenté à l'éxtérieur d'un réfrigérateur et juste pour un BAC technologique, pas pour une entreprise de plusieurs milliards de chiffre d'affaire

Ceci n'est pas la question, loin de là, nous demandons de l'aide pour des requêtes SMS incluses dans le programme et non une question de faisabilitée du projet ou bien apprendre à "jouer" avec les SMS

Cordialement, en l'attente d'une réponse à notre question

Bon donc vous vous fichez de l'environnement et du contexte du projet, si j'étais à votre soutenance, c'est le genre de question que je poserai pour voir si vous avez réfléchi au problème dans son ensemble parce que les profs savent très bien qu'il y a du code qui traine sur internet pour faire tout le reste...

Notre demande est à propos des requêtes, les SMS émissions/réceptions sont déjà opérationnels

nous demandons de l'aide pour des requêtes SMS incluses dans le programme

précisez votre question alors... parce que vous dites être capable d'envoyer et de recevoir des SMS. si votre soucis c'est d'analyser un message reçu, je vous ai donné un lien en #3 qui permet de comprendre comment gérer de l'information reçue de manière asynchrone et ensuite de l'analyser. avez vous jeté un oeil?

pouvez vous décrire le langage de commande ou exactement ce que vous voulez faire?

Bonsoir,

J-M-L: Bon donc vous vous fichez de l'environnement et du contexte du projet

je ne pense pas qu'il se fiche de l'environnement et du contexte du projet puisque il a du ou doit être fait pour les revu de projet En revanche la n'est pas leur problème.

d'Après ce qu'il nous dit Il souhaiterais par exemple envoyer depuis un mobile "température" au GPRS pour recevoir ensuite un message du GPRS vers le mobile indiquant la température et idem avec les œuf

Pour cela il faudra du coté GPRS faire en boucle un check des sms reçu toute les X seconde, stocker les sms Lu par le Serial dans un char ou un string comparer le tout et envoyer un SMS spécifique selon le message reçu

Je pense que leur soucis vient du fait de stocker les donnée Serial dans un char ou un string puisque le code actuelle permet seulement d'afficher les caractères l'un après l'autre dans le moniteur donc inutilisable pour des conditions.

Cordialement

Pour cela il faudra du coté GPRS faire en boucle un check des sms reçu toute les X seconde, stocker les sms Lu par le Serial dans un char ou un string comparer le tout et envoyer un SMS spécifique selon le message reçu

Non pas la peine de boucle toutes les x secondes, une commande AT et le module déverse les SMS quand ils arrive t, il suffit d'écouter le port série et bâtir la commande, puis l'analyser. c'est exactement la manip et ce qui est expliqué dans le lien que je leur ai donné

Bonjour, nous avons suivie vos conseil à propos du Serial et avons correctement réussis à stocker les donner dans un char Mais nous somme actuellement bloqué sur comment réaliser une comparaison entre le char reçu du GPRS et notre commande Exemple

Nous souhaitons envoyer un "bonjour" l'lorsque nous recevons "esms" mais nous n'y parvenons pas nous avons tenter de faire cette comparaison avec la fonction strcmp(inSerial,"esms") dans une conditions if mais cela ne fonctionne pas

En attente de vos réponses Cordialement.

bonjour, il serait bon de faire comme l'a indiqué J-M-L jouer avec les sms et comprendre comment ca fonctionne.

le plus simple étant de lire la position du sms, lui associer le texte recu comparer ce texte avec la comparaison

Postez votre code sinon on ne sait pas ce que vous faites

Bonjour, voici notre code:

#include "SIM900.h"
#include <SoftwareSerial.h>

const byte numChars = 32;
char receivedChars[numChars];   //array pour réception des données du GPRS
boolean newData = false;


int numdata;
char inSerial[40];   //array pour envoi des données au GPRS
int i = 0;

void setup()
{
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  if (gsm.begin(9600)) { // Initialisation du GPRS et configuration
    Serial.println("\nstatus=READY");
    delay(2000);
    gsm.SimpleWriteln("AT+CPIN=1203");
    delay(2000);
    gsm.SimpleWriteln("AT+CNMI=1,2,0,0,0"); //Envoi les sms dirrectement dans le Serial
    delay(2000);
  } else {
    Serial.println("\nstatus=NOTREADY");
  }


}

void loop()

{
  serialhwread(); //Lecture du Serial pour envoi de donnée vers le GPRS
  serialswread(); //Lecture des données du GPRs pour les stocker
}


void WriteSMS() { //Fonction pour envoi de SMS

  gsm.SimpleWriteln("AT+CMGF=1");
  delay(1000);
  gsm.SimpleWriteln("AT+CMGS=\"+33XXXXXXXX\"");
  delay(1000); gsm.SimpleWriteln("hello");
  delay(1000);
  gsm.SimpleWriteln("");
  delay(1000);
  Serial.println("_");
  inSerial[0] = 0x1a;
  inSerial[1] = '\0';
  gsm.SimpleWriteln(inSerial);
  delay(1000);
}



void serialhwread()
{
  i = 0;
  if (Serial.available() > 0) {
    while (Serial.available() > 0) {
      inSerial[i] = (Serial.read());
      delay(10);
      i++;
    }
    inSerial[i] = '\0';
    
    if (!strcmp(inSerial, "/END")) { //Commande pour terminer une requette AT manuellement
      Serial.println("_");
      inSerial[0] = 0x1a;
      inSerial[1] = '\0';
      gsm.SimpleWriteln(inSerial);
    }
   
    if (!strcmp(inSerial, "SMS")) {
      Serial.prinln("Message envoyer");
      WriteSMS(); //Commande pour envoyer un SMS depuis le Serial
      
    } else {
      Serial.println(inSerial);
      gsm.SimpleWriteln(inSerial);
    }
    inSerial[0] = '\0';
  }
  if (newData == true) { // Partie Requette SMS

    String reception = String(receivedChars);
    
    if (!strcmp(reception, "esms")) {     //ERREUR ICI pb de convertion char,string ....
      WriteSMS();
    }
    Serial.println(receivedChars);
    newData = false;
  }
}



void serialswread()
{
  static byte ndx = 0;
  char endMarker = '\n';
  char rc;

  while (gsm.available() > 0 && newData == false) {
    rc = gsm.read();

    if (rc != endMarker) {
      receivedChars[ndx] = rc;
      ndx++;
      if (ndx >= numChars) {
        ndx = numChars - 1;
      }
    }
    else {
      receivedChars[ndx] = '\0'; // terminate the string
      ndx = 0;
      newData = true;
    }
  }
}

Nous savons envoyer/réceptionner les sms depuis le Serial le problème est de faire une conditions en fonction du message reçu pour r’envoyer le sms correspondant à la demande.
Un autre soucis que nous avons remarquer est que l’or de la réception d’un SMS une première ligne nous donne toute les info (num, nom du contacte …) est la deuxième nous donne le message Comme sur ce screen:

En attente de vos réponses Cordialement.

Bonjour,

Nous sommes toujours dans l’attente d’une réponse pour notre projet.

Cordialement.

UP

je vous suggère de relire et bien comprendre le tuto Serial Input Basics qui explique comment recevoir correctement des données sur le port série et analyser ces données reçues (vous aurez besoin de comprendre les fonctions C standards stdlib.h et string.h)

Il me semble que vous avez utilisé cette approche dans l'analyse des commandes manuelles tapée sur Serial- si j'en crois votre code:

if (!strcmp(inSerial, "SMS")) {
      Serial.prinln("Message envoyer");
      WriteSMS(); //Commande pour envoyer un SMS depuis le Serial
      ...

--> il vous faut faire quelque chose similaire dans l'autre fonction:

  • réception d'une ligne de texte en provenance de l'autre port Série
  • extraction de la commande avec les fonction de traitement des chaines de caractères
  • exécution de la commande reconnue