Probleme de reception de SMS. SIM 900

Bonjour,

j'ai fabriqué une alarme a base d'un arduino mega et d'un module SIM900 pour une maison de vacances qui fonctionne parfaitement depuis plusieurs mois.

Elle prévient en cas d'alarme et il est possible de l’interroger par SMS afin de voir son statut ( si elle est en service ou pas ou connaitre les défauts), elle répond sous forme d'un SMS après quelques secondes.

J'en ai refait une avec le même code et le même matériel, sauf que j'ai remarqué un petit "défaut" que je n'arrive pas a cerner :

  • il arrive régulièrement que lorsque je fais une demande de statut, je n'obtienne pas de réponse de l’Arduino (pourtant le module GSM clignote une fois après l'envoie depuis mon portable). Si je ne fais rien, je finirai par avoir une réponse aléatoirement après plusieurs dizaines de minutes voire quelques heures.

J'ai remarqué que lorsque j'avais cette situation ( être en attente d'une réponse ), si j'envoie un SMS depuis l'arduino (un déclenchement d'alarme par exemple) et bien je recevais une réponse comme si le fais d'envoyer un SMS debloqué le problème.

J'utilise la librairie GSM.h, donc finalement c'est comme si la condition

if (sms.available())

ne voyait pas le SMS recu en attente...

quelqu'un a une idée d’où peut venir mon problème ? ou d'une méthode pour m'orienter vers la solution ?

car honnêtement je sèche depuis un moment !

Salut Hache76,

Si j'ai bien compris tu a refait a l'identique ton premier système qui lui fonctionne parfaitement bien ?!

Dans ton second système est ce le même opérateur mobile "carte sim" est ce au même lieu ? "force du signal "

a+

Oui c'est ça, même système même opérateur et force du signal supérieur à 50%.

En postant ma question je me suis dis que j'allais vérifier tout bêtement le remplacement du fil TX entre le module SIM et l'arduino... je vais faire ca ce matin car finalement la communication entre le module SIM900 et l'arduino est problématique mais pas le contraire.... j'y crois pas trop mais bon....

J'ai toujours mon problème de réception de SMS malgré les changements de câbles...

La seule chose que j'ai réussi a remarquer en restant devant le module SIM900 est que :

Lorsque que j’envoie un SMS, la LED "statut" clignote et l'arduino rentre directement dans ma fonction de réception de SMS puis m'envoie une réponse.

Et des fois fois après envoie d'un SMS la LED "statut" ne clignote pas et donc l'arduino ne voit rien, comme si le problème venait du module SIM900...

Existe il une possibilité que mon module SIM900 passe en veille tout seul ? et qu'il en sorte tout seul de temps en temps ce qu'il expliquerai pourquoi des fois je reçoive mes messages avec deux heures de retard ?

Je viens d'y repasser l’après midi complète sans sucés, je suis certain que le problème est tout bête...

J'ai vu que certains modules ont une broche DTR qui permet la mise en veille si elle est mise a 1 et que le module se réveille ensuite de temps en temps, ce qui pourrait correspondre a mon problème.Pourtant sur mon module SIM900A V3.9.2 je n'ai pas de pin DTR ( seulement RST et RESTART )

Personne ne peut m'aider avec la borne DTR ? Faut il la relier physiquement a la masse ou peut on le configurer dans le soft du module ?

Bon étant un peu seul sur le problème, j'ai démonté mon alarme et monté le SIM900 sur un UNO avec un sketch pour envoyer des commandes AT depuis le terminal de l'IDE.

Le sketch a un " auto baud " et j'ai remarqué que des fois le SIM900 repondait avec differentes valeurs de baudrate ( 115 200 et 4800 ). Avec ces baud rate il repond "bien" aux commandes AT mais avec des caracteres un peu speciaux autour.

J'ai donc fixé la vitesse de communcation avec " AT+IPR = 57600 ". Avec ce baud rate, je n'ai plus aucun probleme de caracteres speciaux dans les reponses aux commandes AT. J'ai verifier que le mode veille n'etant pas en cause puisque la reponse a " AT+CSCLK? " est 0.

Je pense avoir un peu avancé mais plus rien ne fonctionne maintenant. Mon alarme utilise la librairie GSM.h et je ne trouve pas d'info sur le baudrate qu'elle utilise.... (j'y ai passé quelques heures)

Quelqu'un a cette information ou sait comment modifier le baudrate de la librairie GSM.h car j'ai parcouru tout les fichiers de la librairie mais je n'ai trouvé !

Personnellement j'utilise un module sim 808 avec la librairie de dfrobot ( qui pour moi est bien meilleure que la librairie d'arduino).

il me semble , en parcourant les docs techniques de mon module, qu'il y a une fonction de mise en veille automatique avec reveille par reception serial sois par dtr. le problème du mode réveil automatique c'est qu'il ne prend pas en compte tous les caractères, il faut lui envoyer un caractère (peut-importe lequel) pour le sortir de veille et envoyer ta commande un peu après (quelques ms plus tard) sinon il reçois pas tous les caractères .

après une autre piste est l’auto-baud comme tu l'as évoqué plus tot, le module se base sur le message "AT" pour determiner le debit. debit que tu as du renseigner au debut de ton programme quand tu as déclaré le serial attribué au module GSM.
il se peut qu'en fixant le débit par la commande AT définie, tu puisse résoudre ton problème.
ou alors c'est ta sortie de veille qui pose problème, comme il ne reçois pas le mot "AT" complètement, il se trompe de baud-rate , d'ou tes caractères inconnus en reception

effectivement je partais sur une mise en veille automatique du module GSM mais visiblement ce n'est pas ca puisqu'il repond 0 à la commande AT+CSCLK? ==> donc aucune mise en veille

maintenant je m'oriente vers un mauvais baudrate de la librairie GSM.h car quand je fixe le baudrate du module 57600 baud, le dialogue en commande AT est parfait mais plus moyen de m'y connecter avec GSM.h. et lorsque je remet le module avec un baudrate en auto la connexion se fait mais j'ai mes soucis de stabilité...
Le probleme etant que je n'arrive pas a modifié le baudrate de la librairie GSM.h

PS : je viens de chercher la librairie dont tu me parles ( celle de DFROBOT ) car j'ai aussi un module SIM800L mais je ne trouve pas depuis l'IDE dans la recherche de libraire ( la seule que je trouve est Blynk mais elle n'est pas de DFROBOT)

laisse tomber la recherche depuis l'IDE, va la chercher directement sur github ça sera beaucoup plus simple: GitHub - DFRobot/DFRobot_SIM808: SIM808

par contre il va falloir réécrire ton programme, les fonctions sont pas du tout les memes ...

robotdelta:
par contre il va falloir réécrire ton programme, les fonctions sont pas du tout les memes ...

Vu le nombre de dizaine d'heures que j'ai perdues a essayer de résoudre le problème, je ne suis plus à ça prêt !

Maintenant si je le fais je veux etre sur que ca fonctionne et que je puisse le refaire ( pour un autre projet ). A ce propos la librairie dont tu parles n'est valable que pour les SIM808 ? car celle que j'ai en plus est une SIM800L...

non elle est valable pour tout modules utilisant les commandes de simcom, toutes les commandes liées au sim808 (GPS) mais fonctionne avec le sim800L et meme le sim900 .

moi-meme j'utilise sur un projet cette librairie avec une puce sim800L et ça n'a brulé qu'une fois ...
j’arrête de plaisanter, cette librairie fonctionne très avec mon sim800L et cela a résolu pas mal de mes problèmes, de plus la libraire est bien faite et dispose d'un "timeout" pour eviter de rester coincer dans ses propres fonctions (contrairement a la libraire arduino que j'avais utiliser sur leurs shield a l'epoque :puce quectelM10)

robotdelta:
moi-meme j'utilise sur un projet cette librairie avec une puce sim800L et ça n'a brulé qu'une fois ...

:o

Ok, merci des conseils je vais m'y pencher alors !

robotdelta:
non elle est valable pour tout modules utilisant les commandes de simcom, toutes les commandes liées au sim808 (GPS) mais fonctionne avec le sim800L et meme le sim900 .

moi-meme j'utilise sur un projet cette librairie avec une puce sim800L et ça n'a brulé qu'une fois ...
j’arrête de plaisanter, cette librairie fonctionne très avec mon sim800L et cela a résolu pas mal de mes problèmes, de plus la libraire est bien faite et dispose d'un "timeout" pour eviter de rester coincer dans ses propres fonctions (contrairement a la libraire arduino que j'avais utiliser sur leurs shield a l'epoque :puce quectelM10)

Eh bien voila, j'ai refais tout mon programme avec la librairie SIM808_master, j'en ai profiter pour améliorer pas mal de bricoles mais j'ai toujours le même problème... tout fonctionne a merveille pendant plusieurs heure et d'un coup d'un seul, le module GSM ne recoit plus les SMS ( sauf s'il en envoie un, ce qui debloquera les SMS non recu ).

D'un point de vu strictement rationnel, pour avoir le même problème avec deux modules GSM de technologie différentes et deux librairies différentes c'est que je passé a coté d'un problème de hard...

et bien a ce stade seul un schema électrique et ton code permettront de voir ce qui cloche, si tu veux je pourrai essayer d'y jeter un coup d’œil voir si je trouve quelque chose. Dans ce cas poste le sur le forum ou envoie le moi en piece jointe si tu souhaite que j'y regarde.

j'ai travaillé pendant longtemps sur mon projet et avec cette puce du coup donc peut-être que je pourrai trouver ce qui cloche
le seul conseil que je peux te donner c'est de vérifier tes boucles voir si tu tu reste pas bloqué dans l'une d'elles (c’était la cause d'un bug qui m'avait fait ragé pendant plusieurs jours , un for a suffit pour résoudre le problème)

Mon projet étant une alarme, le code est trop grand pour etre mit complet ici. Mais la partie qui nous intéresse est celle là :

if((millis()-Depart)>=MonDelai){     // rentre dans la boucle lorsque le delai est epuisé

//verification de la presence d'un message dans le buffer
//sim808.listen();
if(sim808.readable())
{
  
messageIndex = sim808.isSMSunread();
  if (messageIndex > 0)
  Reception_message();// Fonction qui traite le message recu.
  if (messageIndex == -1)
  sim808.sendSMS(Admin,"Erreur GSM");
  
//sim808_clean_buffer(gprsBuffer,32);
//sim808_flush_serial();

}// Fin du IF de la presence d'octet sur la liaison serie.
Depart=millis();  // nouvel enregistrement du point de départ
}

Ce code fonctionne bien pendant des heures et régulièrement il "ne voit pas" les messages recus. ( sauf si évidement les messages ne sont pas reçus... ).
Pour qu'il traite ces messages "non vus" il faut :

  • Ne rien faire et attendre un delai variant de plusieurs dizaines de minutes à 2 ou 3 heures.
  • envoyer un SMS avec le module SIM
  • Faire un Reset ou arret redemerrage du module

Concernant le Cablage du SIM800L:

  • VCC et GND alimenté par un régulateur de tension ( reglé a 4 Volt ) de 3 Amperes avec une masse commune a l'arduino
  • TX raccordé à la pin 10 de l'arduino
    -RX raccordé à la pin 11 de l'arduino
  • RST raccordé au 3.3 V
  • DTR a la masse

Merci a ceux qui se penchent sur mon problème, et si vous avez besoin de plus d'informations pour votre diagnostic n’hésitez pas !

J'ai regardé ton code, je te conseille de passer par une autre fonction que sim808 readable()
La fonction sim808 isunread() suffit amplement
Une autre piste serait de déclencher ta gestion des SMS directement par la fonction sim808 isunread()

Une piste qui me semble problématique c'est l'absence de délai entre sim808. Listen et le reste, il y a des chances pour que ton serial soit pas initialisé et provoque une mauvaise lecture /émission des premiers caractères, à creuser.

Pour la partie hardware il me semble que ça devrait aller, si tu as accès à la broche Ring tu peux l'utiliser pour trigger une interruption, elle passe à 1 un bref instant à la réception d'un sms et des appels

Si j'ai le temps je te mettrai un extrait de mon code pour te donner des pistes

robotdelta:
La fonction sim808 isunread() suffit amplement
Une autre piste serait de déclencher ta gestion des SMS directement par la fonction sim808 isunread()

oui j'avais fait ca y a quelques jours, j'avais mis directement messageIndex = sim808.isSMSunread();

Mais le problème était le même, d'autant plus que la fonction isSMSunread est très longue a exécuter donc pendant que l'arduino est dans cette fonction il ne surveille pas mes capteurs d'alarme.

Je vais tenter un delay après sim808.listen();

Merci de tes conseils :slight_smile:

longue tu dis? combien de temps environ?
si je dis pas de bêtises la fonction est équipé d'un timeout de 5 secondes durant lesquels il fait juste une emission de caractères et une lecture de la réponse, pour moi cela ne prends que quelques dizaines de millisecondes.

je me pencherais plus sur une mauvaise emission des caractères d'ou le temps de réponse si long

de plus je te conseil de piloter la broche DTR par un transistor, cela te permettra de réveiller le GSM un peu avant de pouvoir recevoir et communiquer (environ une 100aine de milliseconde si ma mémoire est bonne) et cela te permettrait d’avoir une conso réduite.

la fonction ne dure pas 5 secondes mais ca ralentit mon alarme d'environ 1 seconde maximum.