problème envoie d'un char

Bonjour, dans un programme, j'utilise une sous-fonction qui doit envoyer une chaîne de caractères variable selon la valeur de l'entier que je met dans l'appel de la fonction.
Je n'arrive pas à le faire fonctionner, j'ai essayé plusieurs méthodes mais aucune ne fonctionne.

Voici le void setup() :

void setup() 
{
  Serial.begin(9600);
  Serial.print("Code initiale : ");
  Serial.println(code);//1234
    
  // connection state
  boolean notConnected = true;
  
  // Start GSM connection
  while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Module GSM non connecte");
      delay(1000);
    }
  }
  Serial.print("Temps d'initialisation : ");
  Serial.print((millis()/1000));
  Serial.println(" secondes.");
  void envoie_sms(1);
  //delay(1000); je ne sais pas si la tempo est nécessaire.
  Serial.println("GSM pret, en attente de message...");
  
}

1ere méthode : une sous-fonction pour chaque valeur : marche si j'écris une seule sous-fonction, à partir de deux, plante.

void envoie_smsA=1()
{
  char remoteNumber[20]= "06XXXXXXXX";  
  char txtMsg[120]="A=1";
  Serial.print("Message      ");
  Serial.print(txtMsg);
  Serial.print("   envoye au ");
  Serial.print(remoteNumber);

  sms.beginSMS(remoteNumber);
  sms.print(txtMsg);
  sms.endSMS(); 
  Serial.print("     Envoye!\n");  
}

2eme méthode : avec des if pour tester l'entier, le programme fonctionne mais il n'envoie pas txtMsg par message. Pourtant quand j'affiche txtMsg en Serial.print, j'ai le bon message.

 void envoie_sms(int A)
{
 char txtMsg[120];
  if(A==1)
  char txtMsg[]="A = 1";
  if(A==2)
  char txtMsg[]="A = 2";

  char remoteNumber[20]= "06XXXXXXXX";  
  Serial.print("Message      ");
  Serial.print(txtMsg);
  Serial.print("   envoye au ");
  Serial.print(remoteNumber);

  sms.beginSMS(remoteNumber);
  sms.print(txtMsg);
  sms.endSMS(); 
  Serial.print("     Envoye!\n"); 
}

3ème méthode : comme la 2 mais avec des switch case = même problème.

Pour la 1ere méthode avec plusieurs sous-fontion ou la 2eme et 3 eme, sur mon téléphone, je reçois des caractères spéciaux.
Sur le moniteur série, il s'affiche en boucle :

Code initiale : 1234
Code initiale : 1234
Code initiale : 1234
Code initiale : 1234
...

Quelqu'un a une solution pour justement réussir à choisir le message que l'on envoie par SMS en fonction d'un paramètre ?

Cordialement.
Merci.

Salut,

Déjà pas bon ça dans ton setup(): void envoie_sms(1);

Tu voulais faire quoi ?

1ere méthode : une sous-fonction pour chaque valeur : marche si j'écris une seule sous-fonction, à partir de deux, plante.

Quel code plante ?

Dans le setup, le module GSM s'initialise et je voulais envoyer un SMS pour dire qu'il était prêt à fonctionner. Parce que si je la met au début du loop, il sera envoyer à chaque boucle ? Ou alors si je fais comme ça c'est mieux ?

int P=0;

void setup()

void loop()
{
        if(P==0){module prêt(); P=1;}
{
}

Ensuite, j'ai remarqué que lorsque que je mettais une sous-fonction par exemple module prêt() et que je l'appelais dans le setup
je recevais bien le message correcte et le programme fonctionnait correctement.

Quand j'ai essayé de faire une sous-fonction pour chaque type de message, le moniteur série affiche en boucle
Code initiale : 1234
Code initiale : 1234
J'en déduis qu'il reste au tout début de la boucle setup et je ne comprends pas pourquoi.

Nachroum:
Quand j'ai essayé de faire une sous-fonction pour chaque type de message, le moniteur série affiche en boucle
Code initiale : 1234
Code initiale : 1234
J'en déduis qu'il reste au tout début de la boucle setup et je ne comprends pas pourquoi.

Personnellement, j'en déduit que le processeur doit faire un reset. La raison du reset restant à déterminer:

  • alimentation trop faible. L'activation du GSM fait chuter l'alimentation, le processeur reboot, et ainsi de suite
  • problème de mémoire. Tu n'es pas très économe dans l'utilisation de la mémoire quand je vois ça
char remoteNumber[20]= "06XXXXXXXX";  
  char txtMsg[120]="A=1";

20 octets de réservés pour en stocker 10 et 120 pour en stocker 3. Tu fais habituellement du développement sur PC?
Pour peu que la librairie GSM soit gourmande en mémoire, tu risques de bouffer la pile et de faire planter ton programme.

Pour la 1ere méthode avec plusieurs sous-fontion ou la 2eme et 3 eme, sur mon téléphone, je reçois des caractères spéciaux.

Les caractères spéciaux à la place des chaînes attendues est souvent signe d'un problème dans la gestion de la mémoire ou d'une mauvaise manipulaton de pointeurs

  • alimentation trop faible. L'activation du GSM fait chuter l'alimentation, le processeur reboot, et ainsi de suite

Pour le moment la carte et le module GSM sont alimentés par le câble USB. J'ai a ma disposition un chargeur qui délivre 9V DC et 800mA. Cela serait-il mieux ? Peut-on combiner les deux en même temps ?

  • problème de mémoire. Tu n'es pas très économe dans l'utilisation de la mémoire quand je vois ça

Oui, jusqu'à maintenant, j'étais toujours sur PC, mais ma chaine de caracteres varie de 12 à 105 caractères selon le message envoyé. Je peux sinon écrire cela :

char txtMsg[]="A=1" ? Il déterminera lui même la place nécessaire et optimisera ?

Mais quand je compile, je suis à environ 17 000 octets (d'un max de 32 256 octets) donc je comprends pas le problème de mémoire.

Et pour les caractères spéciaux, je reçois quasiment toujours @@@@, après je n'utilise pas les pointeurs, je devrais ?

Nachroum:

  • alimentation trop faible. L'activation du GSM fait chuter l'alimentation, le processeur reboot, et ainsi de suite

Pour le moment la carte et le module GSM sont alimentés par le câble USB. J'ai a ma disposition un chargeur qui délivre 9V DC et 800mA. Cela serait-il mieux ? Peut-on combiner les deux en même temps ?

Il faudrait surtout que tu saches combien consomme ton équipement.

Nachroum:

  • problème de mémoire. Tu n'es pas très économe dans l'utilisation de la mémoire quand je vois ça

Oui, jusqu'à maintenant, j'étais toujours sur PC, mais ma chaine de caracteres varie de 12 à 105 caractères selon le message envoyé. Je peux sinon écrire cela :
char txtMsg[]="A=1" ? Il déterminera lui même la place nécessaire et optimisera ?

Cette écriture est valable pour des chaînes de taille constante. Si la taille change, il faut prévoir un buffer de taille suffisante à l'origine. Mais comme l'ATMega a peu de mémoire il faut être radin (dans ce cas c'est une qualité).

Nachroum:
Mais quand je compile, je suis à environ 17 000 octets (d'un max de 32 256 octets) donc je comprends pas le problème de mémoire.

Je parle de mémoire RAM (celle où on stocke les variables) pas de la flash programme.

Nachroum:
Et pour les caractères spéciaux, je reçois quasiment toujours @@@@, après je n'utilise pas les pointeurs, je devrais ?

Tu n'es pas obligé d'utiliser les pointeurs. Ma remarque était plus un constat. lorsqu'on imprime (ou reçoit) des caractères inattendus c'est souvent le fait d'un problème de mauvaise gestion mémoire ou d'une erreur de manipulation de pointeur. Ce peut être aussi le fait d'une chaîne trop longue placée dans une variable mal dimensionnée.

combien consomme ton équipement

Comment puis-je le savoir ?

Mais je ne comprends pas pourquoi ce serait un problème d'alimentation. J'ai déjà réussi à envoyer un message.
Quand je fais ça :

void envoie_sms(int A)
{
  char txtMsg[20];
  if(A==1)
  char txtMsg[]="la valeur égale 1.";
  if(A==2)
{
  char txtMsg[]="la valeur égale 2.";
   Serial.print(txtMsg);
}
  if(A==3)
  char txtMsg[]="la valeur égale 3.";

  char remoteNumber[20]= "06XXXXXXXX";  
  Serial.print("Message      ");
  Serial.print(txtMsg);
  Serial.print("   envoye au ");
  Serial.print(remoteNumber);

  sms.beginSMS(remoteNumber);
  sms.print(txtMsg);
  sms.endSMS(); 
  Serial.print("     Envoye!\n");  
}

Le programme fonction, il ne reste pas sur le setup. Mais il n'envoie pas le message correspondant. C'est la que ça coince.
Pourtant, j'ai vérifié en mettant un Serial.print dans le if(A==2) il m'affiche bien la valeur égale 2. à l'écran mais je ne reçois pas ça par message.

Quelqu'un a une idée ?

Nachroum:

combien consomme ton équipement

Comment puis-je le savoir ?

T'achete un multimètre et tu mesure le courant consommé par chaque module.

T'achete un multimètre et tu mesure le courant consommé par chaque module.

Oui je m'en doute mais ou prendre la mesure sachant que je suis en liaison USB, il faut que je coupe le câble ?

Nachroum:

T'achete un multimètre et tu mesure le courant consommé par chaque module.

Oui je m'en doute mais ou prendre la mesure sachant que je suis en liaison USB, il faut que je coupe le câble ?

Il n'y a hélas pas trop d'autre solution pour faire une mesure à l'ampèremètre.

Maintenant, si la documentation de ton shield GSM est suffisament complète peut être as-tu une information sur sa consommation. Ce qui te donnerait un ordre de grandeur de la consommation de l'ensemble sachant qu'une carte arduino consomme dans les 20mA environ (si ses sorties ne sont pas connectées à des LEDs ou équivalents).

En veille, le shield GSM ne doit pas avoir une consommation très élevée. Le problème c'est en émission il peut y avoir des appels de courants importants.
Par exemple la doc du shield GSM arduino donne comme caractéristiques d'alimentation:

Power requirements
It is recommended that the board be powered with an external power supply that can provide between 700mA and 1000mA. Powering an Arduino and the GSM shield from a USB connection is not recommended, as USB cannot provide the required current for when the modem is in heavy use.
The modem can pull up to 2A of current at peak usage, which can occur during data transmission. This current is provided through the large orange capacitor on the board's surface.

Cela donne une bonne idée du problème que tu pourrais avoir. Il semblerait que sur ce shield, il y ait une capacité tampon pour absorber les pics de cosommation. Ce qui n'est peut être pas le cas sur tout les shield du commerce.

Merci beaucoup :slight_smile:

Je vais essayé de chercher un charger, je peux l'alimenter sur la broche à côté du port USB avec un chargeur DC ?

La tension max est 5V ou je peux les dépasser ?

Il faut que j'en trouve un capable de délivrer minimum 1A.

Encore merci.

J'ai un shield officiel donc les données doivent correspondre à mon cas, ce qui explique sans doute le problème de message envoyés.

Je viens de tester avec n chargeur 9V 800mA cela fait pareil, je reçois toujours des @@)@... à la place des vrais messages.