Bonjour,
j'ai deux fonctions GSM qui fonctionnent individuellement.
Par contre contre, quand j'essaye de les mettre à deux dans la loop, ça ne fonctionne pas. Pourriez-vous me donner des pistes svp. J'ai essayéde plusieurs façons mais rien à faire, ça ne marche pas...
#include <SoftwareSerial.h>
SoftwareSerial Sim(7, 8);
// variables
char bufRecSim[100]; // buffer de réception
int cptRecSim; // compteur
char bufIndexSMS[10]; // pour memorisation index du message
int cptIndex;
char bufIndex[10]; // pour l'index en chaine de caracteres brut
char *ptrIndex; // pointeur tempraire pour traitement de l'index
char cmdSim[30]; // pour les commandes à destination du Sim900
int litSMS = 0; // drapeau pour signaler que la prochaine ligne est le contenu du SMS
bool recommence = true; // pour la boucle de lecture des données venant du SIM
char c; // pour traiter un caractère
String msg;
int val_signal;
int led_rouge = 2;
int led_orange = 3;
int led_verte = 4;
void setup()
{
Sim.begin(9600); // the GPRS baud rate
Serial.begin(9600); // le PC pour verification
pinMode(led_rouge, OUTPUT);
pinMode(led_orange, OUTPUT);
pinMode(led_verte, OUTPUT);
digitalWrite(led_rouge, LOW);
digitalWrite(led_orange, LOW);
digitalWrite(led_verte, LOW);
}
void loop() {
reception_message();
mesure_qualite_signal();
}
void reception_message() {
if (Sim.available()) {
while (Sim.available()) {
// utilisation de peek pour rechercher le caractère NL et CR
c = Sim.peek();
switch (c) {
case '\x0a':
case '\x0d':
Sim.read();
if (cptRecSim > 0) {
bufRecSim[cptRecSim++] = '\x0a';
bufRecSim[cptRecSim++] = '\0';
cptRecSim = 64;
}
break;
default:
bufRecSim[cptRecSim++] = Sim.read();
break;
}
if (cptRecSim == 64) break;
}
}
// si cptReception = 64, la ligne est entière
if (cptRecSim == 64) {
if (litSMS) {
// c'est ici que l'on passe au traitement du contenu du SMS
// dans mon cas, je l'affiche...
Serial.print(bufRecSim);
// on repasse le drapeau à 0 pour l'attente d'un nouveau SMS
litSMS = 0;
}
// on peut comparer le début de ligne
if (strstr(bufRecSim, "+CMGR:")) {
litSMS = 1;
}
// On attend un +CMTI:
if (strstr(bufRecSim, "+CMTI:")) {
// Un nouveau message est arrivé, il faut récupérer l'index du message
// Le formt est "+CMTI: "SM",<index>"
ptrIndex = strchr(bufRecSim, ',');
// L'index se trouve juste après le caractère ',' donc du pointeur ptr + 1
ptrIndex++;
sprintf(bufIndex, "%s", ptrIndex);
cptIndex = 0;
// il faut enlever les caracteres parasites comme \x0a
while (1) {
if ((bufIndex[cptIndex] < '\x30') || (bufIndex[cptIndex] > '\x39')) {
bufIndex[cptIndex] = '\0';
// on sort du while
break;
}
cptIndex++;
}
sprintf(cmdSim, "AT+CMGR=%s\r", bufIndex);
Sim.write(cmdSim);
}
// la ligne a ete traite, cptRecSim900 repasse à 0
cptRecSim = 0;
}
}
void mesure_qualite_signal() {
msg = "";
Sim.println("AT+CSQ"); //indique la qualit? du signal, de 0 ? 31 (31 ?tant la meilleure qualit?)
delay(200);
while (Sim.available()) {
msg += String(char(Sim.read()));
}
val_signal = msg.substring(15, 17).toInt();
digitalWrite(led_rouge, LOW);
digitalWrite(led_orange, LOW);
digitalWrite(led_verte, LOW);
if (val_signal < 10) {
digitalWrite(led_rouge, HIGH);
}
if ((val_signal >= 10) && (val_signal < 13)) {
digitalWrite(led_orange, HIGH);
}
if (val_signal >= 13) {
digitalWrite(led_verte, HIGH);
}
Serial.print("Qualite signal: "), Serial.print(val_signal), Serial.println(" / 31");
}