j ai une suite de code hexa.comment puis je vous l envoyer c est une ligne tres longue sur une seule ligne
il faudrait des retours chariot pour qu relle soit moins longue
Si vous copiez coller ça ira quand même
Mais en pratique ça veut dire que le code ne passe pas par
case '\n': Serial.println("<<NL>>"); break;
Et donc il se peut que le module n’envoie que des CR, ce qui mettrait la pagaille
Si c’est le cas changez la fonction lireUneLigneGSM
Pour celle ci
boolean lireUneLigneGSM()
{
static byte indiceMessage = 0;
boolean messageEnCours = true;
while (gsmSerial.available() && messageEnCours) {
int c = gsmSerial.read();
if (c != -1) {
switch (c) {
case '\r':
ligneMessageGSM[indiceMessage] = '\0'; // caractère NULL de fin pour une chaîne de caractères correcte
indiceMessage = 0; // préparez-vous pour la prochaine fois
messageEnCours = false;
break;
case '\n': // ne vous souciez pas de celui-ci
break;
default:
if (indiceMessage <= tailleMaxMessage - 1) ligneMessageGSM[indiceMessage++] = (char) c; // sinon ignorez-le..
break;
}
}
}
return !messageEnCours;
}
ca ne fonctionne plus ,j ai comme reponse 'Serial3' was not declared in this scope.c est toujours ce Serial3 qui ne fait des probleme;est elle bien declarée?
ah zut l IDE etait repassé sur une carte UNO,
maintenant sur MEGA ,le moniteur mez donne ceci
et quand vous envoyez un SMS?
pour votre question en #110 c'est juste la plateforme qui était mauvaise, Serial3 n'existe pas sur un UNO, d'où toutes les erreurs
Pour la copie d'écran (que j'ai modifiée - le mieux serait de copier coller le texte)
➜ avez vous tronqué la fin ?
la question serait de savoir si vous recevez cela
ou cela
(c'est à dire avec une ligne vide après le SMS)
à chaque SMS
en tout cas on voit bien que le module écrit un CR et un NL soit "\r\n"
à chaque fin de communication
c est ce que j ai fait ,un copier/coller sans la tronquer.
vous avez copié l'image, pas le texte
OK donc il y aurait un CR LF avant de recevoir le +CMT et la réception d'un SMS correspondrait à ce texte
Pouvez vous valider cela en effaçant le contenu du moniteur série, puis en envoyant un SMS?
oui!c est exactement ca que j ai sur le moniteur
OK.
vous pouvez poster le dernier code que vous utilisez ? (avec les balises)
const bool verifierAppelant = false; // à mettre à true si vous ne souhaitez que des commandes en provenance du numeroAutorise
const char* numeroAutorise = "+33614xxx2"; // votre numéro
// ----------------------------
// LES INTERFACES
// ----------------------------
const byte pintestcha = A0; // test telerupteur chauffage.
const byte pintestcho = A1; // test telerupteur chauffeau.
const byte relcha = 2; // relais chauffage.
const byte relcho = 3; // relais chauffeau.
const byte gsmTXpin = 14; // pin D7 vers Tx3 du SIM900
const byte gsmRXpin = 15; // pin D8 vers Rx3 du SIM900
const byte pinActivationSIM900 = 9;
// ----------------------------
// LE GSM
// ----------------------------
#define gsmSerial Serial3 // Serial3: 15 (RX) and 14 (TX croisé
const byte ctrlZ = 0x1A;
const char * ctrlZcString = "\x1A";
const char * escapecString = "\x1B";
const char * OKShortcString = "OK";
const char * OKLongcString = "OK\r\n";
char x = 0;
const uint32_t uneSeconde = 1000ul;
const byte tailleMaxMessage = 100;
char ligneMessageGSM[tailleMaxMessage + 1]; // +1 pour le '\0' à la fin de la c-string
char smsAEnvoyer[tailleMaxMessage + 1]; // +1 pour le '\0' à la fin de la c-string
const byte tailleMaxNumeroTel = 30;
char numeroAppelant[tailleMaxNumeroTel + 1];
#define gsmPrintATCommand(...) gsmSerial.print(__VA_ARGS__)
#define gsmPrintlnATCommand(...) gsmSerial.println(__VA_ARGS__)
#define gsmWriteATCommand(...) gsmSerial.write(__VA_ARGS__)
void erreurFatale(const char* erreur = nullptr)
{
Serial.print(F("Erreur. "));
if (erreur != nullptr) Serial.print(erreur);
Serial.println();
Serial.flush();
while (true) yield();
}
boolean attendreChaine(const char * marqueurDeFin, unsigned long duree, boolean bavard)
{
int taille = strlen(marqueurDeFin);
char bufferLocal[taille];
int index = 0;
boolean marqueurDeFinRecu = false;
unsigned long maintenant;
memset(bufferLocal, '\0', taille);
maintenant = millis();
while (millis() - maintenant <= duree) {
if (gsmSerial.available() > 0) {
if (index == taille) index = 0;
bufferLocal[index] = (uint8_t) gsmSerial.read();
if (bavard) Serial.print((char) bufferLocal[index]);
marqueurDeFinRecu = true;
for (int i = 0; i < taille; i++) {
if (bufferLocal[(index + 1 + i) % taille] != marqueurDeFin[i]) {
marqueurDeFinRecu = false;
break;
}
}
index++;
}
if (marqueurDeFinRecu) break;
}
return marqueurDeFinRecu;
}
boolean lireUneLigneGSM()
{
static byte indiceMessage = 0;
boolean messageEnCours = true;
while (gsmSerial.available() && messageEnCours) {
int c = gsmSerial.read();
if (c != -1) {
switch (c) {
case '\r':
ligneMessageGSM[indiceMessage] = '\0'; // caractère NULL de fin pour une chaîne de caractères correcte
indiceMessage = 0; // préparez-vous pour la prochaine fois
messageEnCours = false;
break;
case '\n': // ne vous souciez pas de celui-ci
break;
default:
if (indiceMessage <= tailleMaxMessage - 1) ligneMessageGSM[indiceMessage++] = (char) c; // sinon ignorez-le..
break;
}
}
}
return !messageEnCours;
}
boolean gsmPrintlnBloquant(const char * command, const char * marqueurDeFin, unsigned long duree, boolean bavard = true)
{
if (bavard) Serial.println(command);
gsmSerial.println(command);
return attendreChaine(marqueurDeFin, duree, bavard);
}
boolean gsmPrintBloquant(const char * command, const char * marqueurDeFin, unsigned long duree, boolean bavard = true)
{
if (bavard) Serial.print(command);
gsmSerial.print(command);
return attendreChaine(marqueurDeFin, duree, bavard);
}
boolean envoiSMS(const char * noDeTel, const char * messageAEnvoyer)
{
boolean SMSenvoye = false;
if (gsmPrintlnBloquant("AT+CSCA=\"+3369xxxxx5\"\r", OKLongcString, uneSeconde * 5)) { // numero du centre de message SMS,
gsmPrintATCommand("AT+CMGS=\"");
gsmPrintATCommand(noDeTel);
gsmPrintlnATCommand("\"");
gsmPrintlnATCommand(messageAEnvoyer);
SMSenvoye = gsmPrintlnBloquant(ctrlZcString, OKLongcString, uneSeconde * 5);
}
return SMSenvoye;
}
// ----------------
void activerChauffage() {
Serial.println(F("Demande Chauffage")); //'F' et la donnée n ira pas dans la RAM mais en memoire flash
digitalWrite(relcha, LOW); // Activez le relais chauffage.
delay(400);
digitalWrite(relcha, HIGH);
delay(20);
if (digitalRead(pintestcha) == LOW) { // lire l'état du telerupteur chauffage.
strncpy(smsAEnvoyer, "CHAUFFAGE ON", tailleMaxMessage);
} else {
strncpy(smsAEnvoyer, "CHAUFFAGE OFF", tailleMaxMessage);
}
Serial.print(F("SMS A ENVOYER : ")); Serial.println(smsAEnvoyer);
}
void activerChauffeEau() {
Serial.println(F("Demande Chauffe-eau"));
digitalWrite(relcho, LOW); // Activez le relais chauffeau.
delay(400);
digitalWrite(relcho, HIGH);
delay(20);
if (digitalRead(pintestcho) == LOW) { // lire l'état du telerupteur chauffeau
strncpy(smsAEnvoyer, "CHAUFFE-EAU ON", tailleMaxMessage);
} else {
strncpy(smsAEnvoyer, "CHAUFFE-EAU OFF", tailleMaxMessage);
}
Serial.print(F("SMS A ENVOYER : ")); Serial.println(smsAEnvoyer);
}
bool gestionMessage() {
bool commandeConnue = false;
smsAEnvoyer[0] = '\0';
if (verifierAppelant && (strcmp(numeroAppelant, numeroAutorise) != 0)) {
Serial.println(F("Appelant non autorisé. Commande ignorée"));
} else {
if (strstr(ligneMessageGSM, "chaufa") != nullptr) { // marche/arret chauffage.
commandeConnue = true;
activerChauffage();
}
else if (strstr(ligneMessageGSM, "chaufo") != nullptr) { // marche/arret chauffe-eau.
commandeConnue = true;
activerChauffeEau();
}
return commandeConnue;
}
}
// ----------------------------
// LE CODE PRINCIPAL
// ----------------------------
void setup() {
pinMode(relcha, OUTPUT); // commande chauffage.
pinMode(relcho, OUTPUT); // commande chauffeau.
digitalWrite(relcha, HIGH); // par defaut ce relais est on.
digitalWrite(relcho, HIGH); // par defaut ce relais est on.
pinMode(pintestcho, INPUT_PULLUP); // test telerupteur chauffeau.
pinMode(pintestcha, INPUT_PULLUP); // test telerupteur chauffage.
Serial.begin(9600); Serial.println();
gsmSerial.begin(9600);
// on vérifie que le GSM répond bien à un AT
if (!gsmPrintlnBloquant("AT", OKLongcString, uneSeconde * 5)) erreurFatale("Erreur GPRS Modem");
// on passe les SMS en mode texte
if (!gsmPrintlnBloquant("AT+CMGF=1", OKLongcString, uneSeconde * 5)) erreurFatale("AT+CMGF");
// on passe en mode routage des SMS vers le terminal
if (!gsmPrintlnBloquant("AT+CNMI = 1,2,0,0,0", OKLongcString, uneSeconde * 5)) erreurFatale("AT+CNMI"); // (normalement c'est 1,2,0,0,0) ??
Serial.println("Initialisation terminée. Système Prêt.");
}
void loop() {
if (lireUneLigneGSM()) {
// ********************************************
// TEST RECEPION D'UN SMS
// +CMT: "+3361xxx002","","21/12/21,17:28:41+04"<CR><LF>
// le texte du message<CR><LF>
//<CR><LF>
// ********************************************
if (!strncmp(ligneMessageGSM, "+CMT:", 5)) { //la ligne commence-t-elle par +CMT:
Serial.print(F("RECEPTION SMS = [")); Serial.print(ligneMessageGSM); Serial.println(F("]"));
const char *ptr = strchr(ligneMessageGSM + 7, '\"');
if (ptr) {
byte l = min(ptr - (ligneMessageGSM + 7), tailleMaxNumeroTel);
strncpy(numeroAppelant, ligneMessageGSM + 7, l);
numeroAppelant[l] = '\0';
} else numeroAppelant[0] = '\0';
Serial.print(F("APPELANT = [")); Serial.print(numeroAppelant); Serial.println(F("]"));
while (!lireUneLigneGSM()); // on attend le texte du SMS
bool commandeConnue = gestionMessage();
if (!commandeConnue) {
Serial.print(F("Commande Inconnue [")); Serial.print(ligneMessageGSM); Serial.println(F("]"));
}
while (!lireUneLigneGSM()); // on attend une ligne vide
// ici le Module est à nouveau dispo
if (commandeConnue) envoiSMS(numeroAppelant, smsAEnvoyer);
} else {
Serial.print(F("LIGNE IGNOREE = [")); Serial.print(ligneMessageGSM); Serial.println(F("]"));
}
}
}
essayez avec cela (il faut remettre les bons N° de tel aux bons endroits)
const bool verifierAppelant = false; // à mettre à true si vous ne souhaitez que des commandes en provenance du numeroAutorise
const char* numeroAutorise = "+33614xxx2"; // votre numéro
// ----------------------------
// LES INTERFACES
// ----------------------------
const byte pintestcha = A0; // test telerupteur chauffage.
const byte pintestcho = A1; // test telerupteur chauffeau.
const byte relcha = 2; // relais chauffage.
const byte relcho = 3; // relais chauffeau.
const byte gsmTXpin = 14; // pin D7 vers Tx3 du SIM900
const byte gsmRXpin = 15; // pin D8 vers Rx3 du SIM900
// ----------------------------
// LE GSM
// ----------------------------
#define gsmSerial Serial3 // Serial3: 15 (RX) and 14 (TX croisé
const char * ctrlZcString = "\x1A";
const char * OKLongcString = "OK\r\n";
const uint32_t uneSeconde = 1000ul;
const byte tailleMaxMessage = 100;
char ligneMessageGSM[tailleMaxMessage + 1]; // +1 pour le '\0' à la fin de la c-string
char smsAEnvoyer[tailleMaxMessage + 1]; // +1 pour le '\0' à la fin de la c-string
const byte tailleMaxNumeroTel = 30;
char numeroAppelant[tailleMaxNumeroTel + 1];
#define gsmPrintATCommand(...) gsmSerial.print(__VA_ARGS__)
#define gsmPrintlnATCommand(...) gsmSerial.println(__VA_ARGS__)
#define gsmWriteATCommand(...) gsmSerial.write(__VA_ARGS__)
void erreurFatale(const char* erreur = nullptr)
{
Serial.print(F("Erreur. "));
if (erreur != nullptr) Serial.print(erreur);
Serial.println();
Serial.flush();
while (true) yield();
}
boolean attendreChaine(const char * marqueurDeFin, unsigned long duree, boolean bavard)
{
int taille = strlen(marqueurDeFin);
char bufferLocal[taille];
int index = 0;
boolean marqueurDeFinRecu = false;
unsigned long maintenant;
memset(bufferLocal, '\0', taille);
maintenant = millis();
while (millis() - maintenant <= duree) {
if (gsmSerial.available() > 0) {
if (index == taille) index = 0;
bufferLocal[index] = (uint8_t) gsmSerial.read();
if (bavard) Serial.print((char) bufferLocal[index]);
marqueurDeFinRecu = true;
for (int i = 0; i < taille; i++) {
if (bufferLocal[(index + 1 + i) % taille] != marqueurDeFin[i]) {
marqueurDeFinRecu = false;
break;
}
}
index++;
}
if (marqueurDeFinRecu) break;
}
return marqueurDeFinRecu;
}
boolean lireUneLigneGSM() {
static byte indiceMessage = 0;
boolean messageEnCours = true;
while (gsmSerial.available() && messageEnCours) {
int c = gsmSerial.read();
if (c != -1) {
switch (c) {
case '\n':
ligneMessageGSM[indiceMessage] = '\0'; // caractère NULL de fin pour une chaîne de caractères correcte
indiceMessage = 0; // préparez-vous pour la prochaine fois
messageEnCours = false;
break;
case '\r': // ne vous souciez pas de celui-ci
break;
default:
if (indiceMessage <= tailleMaxMessage - 1) ligneMessageGSM[indiceMessage++] = (char) c; // sinon ignorez-le..
break;
}
}
}
return !messageEnCours;
}
boolean gsmPrintlnBloquant(const char * command, const char * marqueurDeFin, unsigned long duree, boolean bavard = true) {
if (bavard) Serial.println(command);
gsmSerial.println(command);
return attendreChaine(marqueurDeFin, duree, bavard);
}
boolean gsmPrintBloquant(const char * command, const char * marqueurDeFin, unsigned long duree, boolean bavard = true) {
if (bavard) Serial.print(command);
gsmSerial.print(command);
return attendreChaine(marqueurDeFin, duree, bavard);
}
boolean envoiSMS(const char * noDeTel, const char * messageAEnvoyer) {
boolean SMSenvoye = false;
if (gsmPrintlnBloquant("AT+CSCA=\"+336xxx695\"\r", OKLongcString, uneSeconde * 5)) { // numero du centre de message SMS,
gsmPrintATCommand("AT+CMGS=\"");
gsmPrintATCommand(noDeTel);
gsmPrintlnATCommand("\"");
gsmPrintlnATCommand(messageAEnvoyer);
SMSenvoye = gsmPrintlnBloquant(ctrlZcString, OKLongcString, uneSeconde * 5);
}
return SMSenvoye;
}
// ----------------
void activerChauffage() {
Serial.println(F("Demande Chauffage")); //'F' et la donnée n ira pas dans la RAM mais en memoire flash
digitalWrite(relcha, LOW); // Activez le relais chauffage.
delay(400);
digitalWrite(relcha, HIGH);
delay(20);
if (digitalRead(pintestcha) == LOW) { // lire l'état du telerupteur chauffage.
strncpy(smsAEnvoyer, "CHAUFFAGE ON", tailleMaxMessage);
} else {
strncpy(smsAEnvoyer, "CHAUFFAGE OFF", tailleMaxMessage);
}
Serial.print(F("SMS A ENVOYER : ")); Serial.println(smsAEnvoyer);
}
void activerChauffeEau() {
Serial.println(F("Demande Chauffe-eau"));
digitalWrite(relcho, LOW); // Activez le relais chauffeau.
delay(400);
digitalWrite(relcho, HIGH);
delay(20);
if (digitalRead(pintestcho) == LOW) { // lire l'état du telerupteur chauffeau
strncpy(smsAEnvoyer, "CHAUFFE-EAU ON", tailleMaxMessage);
} else {
strncpy(smsAEnvoyer, "CHAUFFE-EAU OFF", tailleMaxMessage);
}
Serial.print(F("SMS A ENVOYER : ")); Serial.println(smsAEnvoyer);
}
bool gestionMessage() {
bool commandeConnue = false;
smsAEnvoyer[0] = '\0';
if (verifierAppelant && (strcmp(numeroAppelant, numeroAutorise) != 0)) {
Serial.println(F("Appelant non autorisé. Commande ignorée"));
} else {
if (strstr(ligneMessageGSM, "chaufa") != nullptr) { // marche/arret chauffage.
commandeConnue = true;
activerChauffage();
}
else if (strstr(ligneMessageGSM, "chaufo") != nullptr) { // marche/arret chauffe-eau.
commandeConnue = true;
activerChauffeEau();
}
return commandeConnue;
}
}
// ----------------------------
// LE CODE PRINCIPAL
// ----------------------------
void setup() {
pinMode(relcha, OUTPUT); // commande chauffage.
pinMode(relcho, OUTPUT); // commande chauffeau.
digitalWrite(relcha, HIGH); // par defaut ce relais est on.
digitalWrite(relcho, HIGH); // par defaut ce relais est on.
pinMode(pintestcho, INPUT_PULLUP); // test telerupteur chauffeau.
pinMode(pintestcha, INPUT_PULLUP); // test telerupteur chauffage.
Serial.begin(9600); Serial.println();
gsmSerial.begin(9600);
// on vérifie que le GSM répond bien à un AT
if (!gsmPrintlnBloquant("AT", OKLongcString, uneSeconde * 5)) erreurFatale("Erreur GPRS Modem");
// on passe les SMS en mode texte
if (!gsmPrintlnBloquant("AT+CMGF=1", OKLongcString, uneSeconde * 5)) erreurFatale("AT+CMGF");
// on passe en mode routage des SMS vers le terminal
if (!gsmPrintlnBloquant("AT+CNMI = 1,2,0,0,0", OKLongcString, uneSeconde * 5)) erreurFatale("AT+CNMI"); // (normalement c'est 1,2,0,0,0) ??
Serial.println("Initialisation terminée. Système Prêt.");
}
void loop() {
if (lireUneLigneGSM()) {
// ********************************************
// TEST RECEPION D'UN SMS
// <CR><LF>
// +CMT: "+33614xxx2","","21/12/21,17:28:41+04"<CR><LF>
// le texte du message<CR><LF>
//
// ********************************************
if (!strncmp(ligneMessageGSM, "+CMT:", 5)) { //la ligne commence-t-elle par +CMT:
Serial.print(F("RECEPTION SMS = [")); Serial.print(ligneMessageGSM); Serial.println(F("]"));
const char *ptr = strchr(ligneMessageGSM + 7, '\"');
if (ptr) {
byte l = min(ptr - (ligneMessageGSM + 7), tailleMaxNumeroTel);
strncpy(numeroAppelant, ligneMessageGSM + 7, l);
numeroAppelant[l] = '\0';
} else numeroAppelant[0] = '\0';
Serial.print(F("APPELANT = [")); Serial.print(numeroAppelant); Serial.println(F("]"));
while (!lireUneLigneGSM()); // on attend le texte du SMS
bool commandeConnue = gestionMessage();
if (!commandeConnue) {
Serial.print(F("Commande Inconnue [")); Serial.print(ligneMessageGSM); Serial.println(F("]"));
} else envoiSMS(numeroAppelant, smsAEnvoyer);
} else {
Serial.print(F("LIGNE IGNOREE = [")); Serial.print(ligneMessageGSM); Serial.println(F("]"));
}
}
}
pas d erreur a la compilation mais toujours Erreur GPRS modem
On fait
vous ne l'aviez pas passé en 19200 bauds ?
on a aussi viré l'initialisation. Vous n'avez pas de câble pour la pin pinActivationSIM900
?
c est a n y rien comprendre! je l ai repassé a 19200 ca a marché impecable,j ai envoyé un sms assez bien ,au deuxieme sms plus rien et Erreur GPRS modem de retour
Si vous voyez cela c'est que l'arduino a planté car ce n'est fait que dans le setup()
débranchez toutes les commandes réelles allant vers les relais pour voir si ça crée un souci
voila ce que j ai constaté:je demarre tout (mega et sim900),la tout va bien,puis j envoi un sms ,je le recois bien et tout a l air bon.au deuxieme sms plus rien.alors j ai debranché la sim de son alim et je l ai redemarrée tout rentre dans l ordre pour un seul sms et ainsi de suite.on dirait que la sim ,apres la premiere commande, fait quelquechose,peut etre plantée dans une boucle??
est-ce que vous faites le test avec les relais débranchés (pour vous assurer qu'il n'y a aucune perturbation)?
l'alim de la SIM est bien capable de fournir 2A ?