SIM900 - Commande AT pour vérifier la bonne connexion au réseau

Bonsoir à tous,
je viens vers vous pour un petit soucis dans un projet.
J'utilise une SIM900, avec la bibliothèque softwareserial et des commandes AT, et j'aimerai avoir l'information si le shield en question est bien connecté au réseau (il n'est pas visible car dans un boitier, je ne peux donc pas voir directement l'état de la led correspondante).
Dans mon programme, et comme dans l'exemple trouver sur le net, j'utilise la fonction SIM900.available() comme condition pour lire les SMS reçu par le shield. Je pensais pouvoir utiliser cette notion de "available", comme indication si la carte est connectée ou non. Malheureusement, en utilisant la fonction ainsi (exemple sans les fonctions utiles à mon projet) :

if(SIM900.available()>0) 
{
 lcd.setCursor(0,1);
 lcd.print("Réseau OK");
}
else
{
  lcd.setCursor(0,1);
 lcd.print("Pas de réseau");
}

les deux messages alternent sans arrêt.
J'ai cherché d'autres commandes pouvant me renvoyer une information caractéristique de la présence ou non du réseau (niveau du signal : CSQ, ou autre CREG) mais la valeur renvoyé ne change pas que la carte soit activée ou non.
Avez vous une idée ? j'utilise mal toutes ces fonctions qui devraient pouvoir m'aider ?
Je précise que je suis débutant, c'est mon premier projet.
L'envoi et la récéption de SMS marche sans soucis.

Merci d'avance

Bonne soirée à tous

Tu devrais essayer ceci. Crée une variable booléenne (appelons la 'flag') que tu mets à true lorsque le 'available' est positif et qui restera à true pendant une certaine durée, disons une minute. Ensuite tu la remets à false.

Et tu fais le test à la fois sur le available et sur cette variable, avant d'afficher ton message.

if(SIM900.available()>0){
 lcd.setCursor(0,1);
 lcd.print("Réseau OK");
 flag = true;
 chrono = millis() ;
}
else if (flag != true) 
{
 lcd.setCursor(0,1);
 lcd.print("Pas de réseau");
}
} 
if (millis() - chrono > 60000) {
 flag = false;
 chrono = millis() ;
}

Et chrono doit être définie en variable globale de toute unsigned long

À tester...

Bonsoir

tester AT+COPS? et sa réponse selon que le téléphone est connecté ou pas a un réseau cellulaire

AT+COPS=? renvoie la liste des opérateurs disponibles
AT+COPS? le nom de l'opérateur connecté

AT+CREG? le second chiffre devrait te dire si tu est ou pas sur un réseau et même indiquer (chiffre 5) si tu es en roaming

Voilà avec et sans carte sim Free Mobile(Roaming -> Orange)

[tt]Avec carte FreeMobile/ Roaming Orange
AT+CREG?
+CREG: 0,[b]5[/b]
OK
AT+COPS?
+COPS: 0,0,[b]"Orange F"[/b]
OK

Sans carte SIM
AT+CREG?
+CREG: 0,[b]0[/b]
OK
AT+COPS?
+COPS: 0
OK

[/tt]

Merci pour votre aide à tous les deux !

Je crois que je maîtrise surtout mal les commandes AT comme je le sentais.
Je vais approfondir avec CREG !

tu peux juste m'indiquer la ligne de code qui corresponds stp ?

car je me mélange entre AT+CREG=? AT+CREG? ... ou plus simple, connais-tu un tuto pour que je trouve enfin des exemples pour code arduino et que je comprenne la syntaxe. Je trouve bcp d'exemple à partir d'un logiciel (AT Commander tester) que je n'ai pas du tout approché. A tord peut être ?

J'oubliais, quelle variable utilises tu pour extraire ces infos ?

Merci encore !

Les lignes reproduites ci-dessus n'ont pas été obtenues avec un code Arduino mais en envoyant directement les commandes AT sur un module SIM800 'à la main' avec un terminal
C'était juste pour montrer l'existence de ces commandes et leur réponses.
Pour tester les commandes découvertes en parcourant la doc des modules SIM, le plus rapide consiste à les envoyer 'à la main' !!

La liste des commande pour SIM900 est içi , COPS est page 66, CREG page 75

Sous Arduino j'utilise plutôt des librairies , comme GSMSim qui possède d'ailleurs des commandes telles que :

gsm.isRegistered() , qui utilise AT+CREG?

gsm.operatorName(), qui utilise AT+COPS?

On les voit à l'oeuvre dans l'exemple GSMSim_Module_Info
Une bonne librairie de commandes AT analyse les réponses , dont les 'OK' , elle ne se contente pas de balancer des commandes AT en espérant que ça marche à tout les coups !
Si on veut se passer de librairie on peut toujours étudier le code des fonctions intéressantes et s'en inspirer

Je pensais pouvoir me passer de librairie car elle ne m'était pas utile pour les fonctions de bases que j'utilise (envoi et réception de SMS). Et comme tu l'as dis, j'ai tenter de reprendre ces fonctions en ajoutant les commandes AT trouver dans le document que tu mentionne (la fonction CPAS aussi). Mais je n'avais pas de résultat probant (sans doute par manque de maitrise de la syntaxe).

Je vais me concentrer sur la libraire GSMsim que je ne connaissais pas (la libraire "GSM" plus classique n'ayant pas fonctionné).

Merci pour tes conseils.

Bonne journée !