Envoyer un message shield GSM + Capteur de courant

Salut, je suis bloqué depuis quelques jours avec mon shield GSM
Le but du shield est que lorsque j’envoie un message avec mon smartphone, le shield GSM me renvoit un message avec les données des capteurs qui sont reliés avec la carte Arduino
J’ai pris les programmes d’exemple fournis avec l’Arduino (SendSMS & ReceiveSMS) et j’ai essayé de les modifié afin de mettre une condition pour que quand le shield reçois un message, il renvoies les données

J’ai réussi à envoyer les données d’un potentiomètre mais j’ai besoin d’allumer le moniteur afin qu’il envoie un mesage

// Include the GSM library
#include <GSM.h>

#define PINNUMBER ""

// initialize the library instance
GSM gsmAccess;
GSM_SMS sms;

void setup()
{
  // initialize serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  Serial.println("SMS Messages Sender");

  // connection state
  boolean notConnected = true;

  // Start GSM shield
  // If your SIM has PIN, pass it as a parameter of begin() in quotes
  while (notConnected)
  {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("GSM initialized");
}

void loop()
{
  int sensorValue = analogRead(A0);

  // send the message
  sms.beginSMS("0647549629");
  sms.print(sensorValue);
  sms.endSMS();
  Serial.println("\nCOMPLETE!\n");
}

/*
  Read input serial
 */
int readSerial(char result[])
{
  int i = 0;
  while (1)
  {
    while (Serial.available() > 0)
    {
      char inChar = Serial.read();
      if (inChar == '\n')
      {
        result[i] = '\0';
        Serial.flush();
        return 0;
      }
      if (inChar != '\r')
      {
        result[i] = inChar;
        i++;
      }
    }
  }
}

Puis j’ai essayé de mettre des conditions pour que quand la carte SIM sur le shield reçois un message, si le message est un nombre >50 il écrit quelque chose sur le moniteur série et si il est inférieur à 40 il écrit autre chose mais ça ne fonctionne pas

#include <GSM.h>

// PIN Number for the SIM
#define PINNUMBER ""

// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;

// Array to hold the number a SMS is retreived from
char senderNumber[20];

void setup()
{
  // initialize serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  Serial.println("SMS Messages Receiver");

  // connection state
  boolean notConnected = true;

  // Start GSM connection
  while (notConnected)
  {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("GSM initialized");
  Serial.println("Waiting for messages");
}

void loop()
{
  char c;

  // If there are any SMSs available()
  if (sms.available())
  {
   while (c = sms.read())
    if (c> 50)
    {
      Serial.println("Sms 111");
      }
      else if (c<40)
      {
        Serial.println("Sms 222");
        }
        
      
 
    // An example of message disposal
    // Any messages starting with # should be discarded
    if (sms.peek() == '#')
    {
      Serial.println("Discarded SMS");
      sms.flush();
    }

    // Read message bytes and print them
    while (c = sms.read())
      Serial.print(c);

    Serial.println("\nEND OF MESSAGE");

    // Delete message from modem memory
    sms.flush();
    Serial.println("MESSAGE DELETED");
  }

  delay(1000);

}

Voilà, je suis un peu bloqué et j’aimerais un peu d’aide, une piste si quelqu’un voudrait bien m’aider
Merci d’avance

Attention, je ne sais pas ce que vaut le SMS que tu envoies vers ton shield mais ta variable c est un char, elle ne contient donc qu'un seul caractère.

Et c > 50, ça veut dire si c contient un caractère dont la valeur dans la table ASCII est supérieure à 50.

D'accord, donc il faut que je fasse des c avec que 1 chiffre
Sinon pour le moniteur je viens de modifier quelques trucs et ça à l'air de marcher, malgré un léger décalage

Eukwa:
D'accord, donc il faut que je fasse des c avec que 1 chiffre

Pas forcement, il faut surtout que tu comprennes la différence entre un nombre (int, float, long, ...), un caractère (char) et une chaine de caractères (char ou String). Et aussi la façon dont ces différents types de variables sont stockés.

Bonjour, j’ai fait des recherches et j’ai fait ceci à l’aide des modèles

#include <GSM.h>

// PIN Number for the SIM
#define PINNUMBER ""

// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;

void setup()
{
  // initialize serial communications and wait for port to open:
  Serial.begin(9600);

  Serial.println("SMS Messages Receiver");

  // connection state
  boolean notConnected = true;

  // Start GSM connection
  while (notConnected)
  {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("GSM initialized");
  Serial.println("Waiting for messages");
}

void loop()
{
   char c;
   int sensorValue = analogRead(A0);
 
  
  // If there are any SMSs available()
  if (sms.available())
  {
    Serial.println("message recu");
    if(sms.peek() =='1')
    {
      Serial.println("Lire valeur capteurs");
      sms.beginSMS("numéro");
      sms.print(sensorValue);
      sms.endSMS();
      
      }
     else if(sms.peek() =='2')
      {
        Serial.println("Couper l'eau");
        }

      while (c = sms.read()) 
          Serial.print(c);

    Serial.println("\nEND OF MESSAGE");
    sms.flush();
Serial.println("Message supprime");
  }
  delay(1000);
 
}

Donc en gros, quand j’envoie un sms commençant par 1, l’Arduino lit la valeur du potentiomètre l’envoie par sms au numéro que j’ai mis, et quand le message commence par 2, il écrit juste couper l’eau sur le moniteur
Le problème et que lorsque j’envoie le message commençant par 1, il lit et envoie bien la valeur du potentiomètre par sms mais ça s’arrête là, normalement il devrait écrire le message reçu sur le moniteur et le supprimer, mais ça ne fait plus rien
Auriez vous une aide svp ?

A mon avis, sms.beginSMS("numéro") réinitialise le contenu de ton objet sms. Donc comme la lecture s'effectue après la réinitialisation, il n'y a plus rien à lire.

Bah j'avais essayé ce week-end sans envoyer la donnée du potentiomètre car il était en cours et que chez moi j'ai accès qu'à la carte Arduino et au shield, et avec juste

  if(sms.peek() =='1')
    {
      Serial.println("Capteurs");
      }
     else if(sms.peek() =='2')
      {
        Serial.println("Eau");
        }

En gros j'avais pas mis l'envoi du potentiomètre, ça devait juste afficher sur le moniteur lire les capteurs et couper l'eau, et ça fonctionnait
Je suis un peu perdu, peut-être que le if n'accepte que une fonction

Justement, c'est l'envoi de la valeur lue qui réinitialise l'objet sms donc si ça fonctionnait avant que tu ne mettes l'envoi c'est que c'est bien la commande sms.beginSMS() qui provoque (et c'est logique) la perte du message reçu.

Pour solutionner le problème, tu peux récupérer l'intégralité du SMS puis l'analyser et faire tes actions conditionnelles ensuite.

Après pleins d’essais en modifiant un peu de tout pour tester, j’ai enfin réussi

#include <GSM.h>

// PIN Number for the SIM
#define PINNUMBER ""

// initialize the library instances
GSM gsmAccess;
GSM_SMS sms;

void setup()
{
  // initialize serial communications and wait for port to open:
  Serial.begin(9600);

  Serial.println("SMS Messages Receiver");

  // connection state
  boolean notConnected = true;

  // Start GSM connection
  while (notConnected)
  {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("GSM initialized");
  Serial.println("Waiting for messages");
}

void loop()
{
   char c;
   int sensorValue = analogRead(A0);
 truc:
  sms.flush();
  // If there are any SMSs available()
  
  if (sms.available())
  {
    Serial.print("message recu");
    if(sms.peek() =='1')
    {
      Serial.print("\nLire valeur capteurs");
      sms.beginSMS("0647549629");
      sms.print(sensorValue);
      sms.endSMS();
        Serial.print("\nEND OF MESSAGE");
    sms.flush();
Serial.println("\nMessage supprime");
goto truc;

      }
     else 
      {
        Serial.print("\nCouper l'eau");
          Serial.print("\nEND OF MESSAGE");
    sms.flush();
Serial.println("\nMessage supprime");
goto truc;

        }

  }
  delay(1000);
 
}
  1. Le goto c'est a proscrire

  2. Tu as réussi quoi ? Si je comprends bien ton programme, tu n'affiches plus le SMS reçu...

L'affichage du sms sur le moniteur c'était juste pour voir si ça fonctionne, et à la fin je n'aurai pas besoin du moniteur
Et ce que je voulais faire fonction, c'est à dire qu'en j'envoie un message commençant par 1, l'Arduino me renvoi par sms les valeurs du capteur (actuellement le potentiomètre), et quand j'envoie un autre message, il affiche pour le moment Couper l'eau sur le moniteur mais là je suis en train de chercher comment piloter un relai avec le shield
Sinon pourquoi le goto est à proscrire ?

Sinon maintenant que j 'ai réussi avec le potentiomètre, je dois le faire avec le vrai capteur, qui est http://www.gotronic.fr/art-capteur-de-courant-5a-mr361-20839.htm

J'ai fait le montage, fait un analogRead et pourtant j'ai toujours 1023 d'afficher sur le moniteur
Sur le site ils disent : Capteur de courant basé sur un ACS714 permettant de mesurer un courant de -5A à +5A. Une sortie analogique est proportionnelle au courant mesuré (2,5 V pour 0 A).
J'ai testé avec mon alim pouvant délivrer 0.1 - 0.5 & 2.5A et ça ne change rien, 1023 est tout le temps affiché
Quelqu'un saurait comment ça se fait ?

Salut Eukwa,

As-tu code pin sur ta carte SIM ?

De mon coté je n'arrive ni a envoyer ni à recevoir un sms.