Wemos D1 + SIM800L

Bonjour à tous,

j’ai branché un module SIM800L sur une carte Wemos D1 mini.
Tout fonctionne correctement mis à part les messages que je reçois.

Parfois, je me retrouve avec des caractères incompréhensibles ou les lettres changées…
J’ai mis des “delay” dans mes commandes AT croyant les passer trop vite mais rien n’y fait. Ma séquence d’envoi de SMS est plus longue mais j’ai tjs des caractères incorrectes.

Aves vous une idée?

void a() //Sonnette
{
sim800l.println("AT+CMGF=1");
 delay(1000);
 sim800l.println("AT+CSMP=17,167,0,240");
 delay(1000);
 sim800l.println("AT+CMGS=\"XXXXXXXXXX\"");
 delay(1000);
 sim800l.println("Une personne vient de sonner a la maison");
 delay(1000);
 sim800l.println("Vas ouvrir s'il te plait. Merci!");
 delay(1000);
 sim800l.write(26); // Caractère de fin 26 <Ctrl-Z>
 delay(1000);
 sim800l.println("");
}

comment avez vous défini sim800l ? postez tout le code, pas des morceaux... cf Snippets R Us!

comment alimentez vous le module ?

Merci J-L-M pour cette réponse.
Voici mon code complet:

// Connect VCC to +5V
// Connect GND to Ground
// Connect RXD (data into SIM800L) to Digital 1
// Connect TXD (data out from SIM800L) to Digital 2
#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>

const char* ssid     = "Liveboxxxxxxxx";
const char* password = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";

int relais = 2; //Branchement du relais sur D5

SoftwareSerial sim800l(D1, D2); // RX, TX
WiFiServer server(80);

void setup() {
 Serial.begin(9600);
 pinMode(LED_BUILTIN, OUTPUT);    //Defini la led interne
 digitalWrite(LED_BUILTIN, HIGH); //Eteint la led interne au demarrage
 pinMode(relais, OUTPUT);         //Definit la broche relais en sortie
 digitalWrite(relais, HIGH);      //Eteint le relais au demarrage
 delay(100);
 Serial.print("Connexion a ");
 Serial.println(ssid);
 WiFi.begin(ssid, password);
 IPAddress ip(192,168,1,170);   
 IPAddress gateway(192,168,1,1);   
 IPAddress subnet(255,255,255,0);   
 WiFi.config(ip, gateway, subnet);
 // connection  en cours ...
 while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
 Serial.println("");
 Serial.print("WiFi connecte"); // Wifi connecte
 server.begin();                // Démmarrage du serveur.
 Serial.println("Le serveur demarre...");
 Serial.print("Utiliser cette adresse URL pour la connexion: ");
 Serial.print("http://");
 Serial.print(WiFi.localIP());
 Serial.println("/");
 sim800l.begin(9600);
 sim800l.println("AT");
 delay(1000);
 sim800l.println("AT+CMGF=1");
 delay(1000);
 sim800l.println("AT+CSMP=17,167,0,240");
 delay(1000);
 sim800l.println("AT+CMGS=\"xxxxxxxxxxxxx\"");
 delay(1000);
 sim800l.println("Demarrage du module GSM");
 delay(500);
 sim800l.print("WiFi connecte a: "); // Wifi connecte
 delay(500);
 sim800l.println(ssid);
 delay(500);
 sim800l.println("Utiliser cette adresse URL pour la connexion: ");
 delay(500);
 sim800l.print("http://");
 delay(500);
 sim800l.print(WiFi.localIP());
 delay(500);
 sim800l.println("/");
 delay(500);
 sim800l.write(26); // Caractère de fin 26 <Ctrl-Z> ou 
 delay(500);
 sim800l.println("");
}

void loop(){


 WiFiClient client;

  
  // Vérification si le client est connecter.
  client = server.available();
  if (!client)
  {
    return;
  }
 
  // Attendre si le client envoie des données ...
  Serial.println("Nouveau client");
  while(!client.available()){
    delay(1);
  }
 
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();

//#########################################################################################
//            Sonette
//#########################################################################################

  int value = LOW;
  if (request.indexOf("/LED=ON") != -1)  {
    a();
    digitalWrite(LED_BUILTIN, LOW); //Allume la led interne
    digitalWrite(relais, LOW);      //Allume le relais
    value = HIGH;
    delay (60000);
    digitalWrite(LED_BUILTIN, HIGH); //Eteint la led interne
    digitalWrite(relais, HIGH);      //Eteint le relais
    value = LOW;
    
  }
  if (request.indexOf("/LED=OFF") != -1)  {
    digitalWrite(LED_BUILTIN, HIGH);
    value = LOW;
  }
//#########################################################################################
//            Sonette
//#########################################################################################

//#########################################################################################
//            BOITE AUX LETTRES
//#########################################################################################

  if (request.indexOf("/BAL=ON") != -1)  {
    b();
    digitalWrite(LED_BUILTIN, LOW); //Allume la led interne
    digitalWrite(relais, LOW);      //Allume le relais
    value = HIGH;
    delay (10000);
    digitalWrite(LED_BUILTIN, HIGH); //Eteint la led interne
    digitalWrite(relais, HIGH);      //Eteint le relais
    value = LOW;
    
  }
  if (request.indexOf("/BAL=OFF") != -1)  {
    digitalWrite(LED_BUILTIN, HIGH);
    value = LOW;
  }
  
  if (request.indexOf("/a") != -1)  {
    a();
  }
  if (request.indexOf("/b") != -1)  {
    b();
  }
  if (request.indexOf("/c") != -1)  {
    c();
  }
  if (request.indexOf("/d") != -1)  {
    d();
  }
//#########################################################################################
//            BOITE AUX LETTRES
//########################################################################################
  
  // Réponse
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); 
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
 
  client.print(" ok");  
  client.println("</html>");
 
  delay(1);
  Serial.println("Client deconnecte");
  Serial.println("");
  
 if (sim800l.available())
 Serial.write(sim800l.read());

 if (Serial.available())
 sim800l.write(Serial.read());
}

void a() //Sonnette
{
sim800l.println("AT+CMGF=1");
 delay(1000);
 sim800l.println("AT+CSMP=17,167,0,240");
 delay(1000);
 sim800l.println("AT+CMGS=\"xxxxxxxxxxxxx\"");
 delay(1000);
 sim800l.println("Une personne vient de sonner a la maison");
 delay(1000);
 sim800l.println("Vas ouvrir s'il te plait. Merci!");
 delay(1000);
 sim800l.write(26); // Caractère de fin 26 <Ctrl-Z>
 delay(1000);
 sim800l.println("");
}

void b() //BaL
{
sim800l.println("AT+CMGF=1");
 delay(1000);
 sim800l.println("AT+CSMP=17,167,0,240");
 delay(1000);
 sim800l.println("AT+CMGS=\"xxxxxxxxxxxxx\"");
 delay(1000);
 sim800l.println("Bonjour,");
 delay(1000);
 sim800l.println("Du courier vient d'etre depose dans la boite aux lettres.");
 delay(1000);
 sim800l.println("");
 delay(1000);
 sim800l.println("Merci d'aller voir, meme si il pleut!!");
 delay(1000);
 sim800l.write(26); // Caractère de fin 26 <Ctrl-Z>
 delay(1000);
 sim800l.println("");
}

void c()
{
sim800l.println("AT+CMGF=1");
 delay(1000);
 sim800l.println("AT+CSMP=17,167,0,240");
 delay(1000);
 sim800l.println("AT+CMGS=\"xxxxxxxxxxxxx\"");
 delay(1000);
 sim800l.println("Void C bordel");
 delay(1000);
 sim800l.write(26); // Caractère de fin 26 <Ctrl-Z>
 delay(1000);
 sim800l.println("");
}

void d()
{
sim800l.println("AT+CMGF=1");
 delay(1000);
 sim800l.println("AT+CSMP=17,167,0,240");
 delay(1000);
 sim800l.println("AT+CMGS=\"xxxxxxxxxxxxx\"");
 delay(1000);
 sim800l.println("ok pour le D");
 delay(1000);
 sim800l.write(26); // Caractère de fin 26 <Ctrl-Z>
 delay(1000);
 sim800l.println("");
}

Le module est alimenté par une pile 18650 ou par un module abaisseur de tension DC - DC qui passe de 12V 5A à 4,2V (je ne sais pas si je peux poster un lien eBay)

Merci

il y a de fortes chances que la couche SoftwareSerial sur votre Wemos ne tienne pas la route et que vous aillez trop de conflit sur la gestion des interruptions

essayez en connectant le module SIM800 sur le vrai port série (et bien sûr en virant les print sur la console) pour voir si ça fonctionne mieux

Bonjour

Y a t-il , içi, une motivation particulière pour prendre 240 et non zéro comme 4 ème paramètre de la commande AT+CSMP (SMS de classe 0, ='messages flash') ?

Comment sont reçus des messages SMS 'normaux' ?

Autre hypothèse : il n'y aurait pas un composant I2C relié, reste d'une manip antérieure ?

J-M-L:
essayez en connectant le module SIM800 sur le vrai port série (et bien sûr en virant les print sur la console) pour voir si ça fonctionne mieux

Que veux tu dire par là?
Si je comprend bien il faut que j'utilise la broche 1 et 3 pour le serial, qu'il faudra que je débranche pour flasher avec l'usb et débrancher l'usb pour alimenter mon module via le pin 5V? c'est bien ça?

Si j'ai bien compris, je ne vois pas comment écrire le code :roll_eyes:

al1fch:
Y a t-il , içi, une motivation particulière pour prendre 240 et non zéro comme 4 ème paramètre de la commande AT+CSMP (SMS de classe 0, ='messages flash') ?

Aucune motivation particulière. Disons que j'ai essayé une fois et ça ne fonctionne pas (les sms flash) mais j'ai jamais pensé a remettre ce paramètre 'normal'
Je reçois tous les sms normalement.
Il n'y a aucun autre composant de relié a la Wemos D1 mini sauf le SIM800L

Il y’a un port série standard sur votre wemos, les broches Tx et Rx. Utilisez celles ci pour tester (et oui ça veut dire débrancher pendant l’upload et pas de traces en Serial.print puisque Serial sera connecté au SIM800L (en gros virez tout ce qui a trait à Serial et l’import et déclaration de SoftwareSerial, puis remplacez partout où vous voyez la variable sim800l utilisée par Serial)

Merci J-M-L, je pense avoir résolu mon problème grâce a toi! Apparemment il n'y a plus de caractères bizarres.

C'est vraiment top! Pour la programmation c'est super chiant mais ça fonctionne. :wink:

Donc sans doute l’émulation série qui ne suivait pas et perdait des interruptions pendant la partie wifi

Si vous prenez un autre type de carte vous pourrez avoir plusieurs ports série matériel - par exemple avec un esp32 comme le HUZZAH32 vous aurez le wifi et 2 ports séries, un pour upload et debug et un pour votre module GPRS sur TX/RX

J’ai pas regardé en détail mais peut être que le nouveau MKR WIFI 1010 a aussi cette possibilité

on aurait pu espérer que la librairie SofwareSerial adaptée à l'ESP8266 (et fournie avec l'ensemble d'outils) se comporte mieux !
(Il serait peut être bon de vérifier que c'est bien cette version qui est utilisée dans le cas présent et non la librairie SoftwareSerial courante)

al1fch:
on aurait pu espérer que la librairie SofwareSerial adaptée à l'ESP8266 (et fournie avec l'ensemble d'outils) se comporte mieux !
(Il serait peut être bon de vérifier que c'est bien cette version qui est utilisée dans le cas présent et non la librairie SoftwareSerial courante)

Pas de magie, la génération de page web et gestion du wifi doit venir mettre à plat l’écoute et la simulation du port série... perso j’ai quasiment laissé tomber le Software Serial, les cartes récentes avec SERCOM permettent bcp de flexibilité

(La librairie de base ne compilerait pas sur esp, donc c’est sans doute la dédiée)

je suis du même avis et délaisse autant que faire se peut l'une ou l'autre des ces émulations
+Il existe aussi la possibilité sur ESP8266 de permutation des TX pour la sortie debug

içi un pb constaté spécifiquement à 9600 bauds pour la librairie ESP8266 dont nous parlons
peut être corrigé sur une version récente si je comprend bien

Salut a tous,

Déterrage de topic!
Le Weemos D1 mini fini par planter au bout de quelques jours. Peut-être un manque de mémoire ou je ne sais pas trop.

Suivant les conseils de J-M-L j'ai acheté un HUZZAH! 32
J'ai mis a jour mon IDE Arduino pour avoir la carte.

Question: est ce que je peux uploader directement le meme sketch que pour le Weemos?
Ou sont les deux ports serial?

@J-M-L: Je cherche un peu partout sur le web mais pas trop d'exemples de programmation pour cette carte...

Vous pouvez accéder Serial1 sur ces 2 pins (3.3V)

cf la doc Adafruit par exemple

si je connecte le module sim 800 L sur le Tx et Rx je pourrais toujours me servie de l’usb sans débrancher?

iNouNours:
si je connecte le module sim 800 L sur le Tx et Rx je pourrais toujours me servie de l'usb sans débrancher?

oui c'est Serial1, ces 2 pins ne sont pas connectées sur l'USB. ATTENTION ELLES SONT EN 3.3V

Bon, je n’y arrive pas…
Aucune communication entre le HUZZAH! et le SIM800L a priori

mon code:

// Connect VCC SIM800L to 4.2V 2A
// Connect all GND together
// Connect RXD SIM800L to Tx
// Connect TXD SIM800L to Rx
// Connect Relay commande to D5

#include <WiFi.h>

const char* ssid     = "LiveboxXXX";
const char* password = "XXXXXXXXXXXXXXXXXXXXXX";

#define PROPRIO1 "XXX"
#define PROPRIO2 "XXX"
#define PROPRIO3 "XXX"

String SMS;

int relais = 2; //Branchement du relais sur D5

WiFiServer server(80);

void setup() {
 pinMode(relais, OUTPUT);         //Definit la broche relais en sortie
 digitalWrite(relais, HIGH);      //Eteint le relais au demarrage
 delay(100);
 WiFi.begin(ssid, password);
 IPAddress ip(192,168,1,180);   
 IPAddress gateway(192,168,1,1);   
 IPAddress subnet(255,255,255,0);   
 WiFi.config(ip, gateway, subnet);
 while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
 server.begin();                // Démmarrage du serveur.
 Serial.begin(115200);
 Serial1.begin(9600);
 Serial.println("Demarrage du module GSM");
 delay(500);
 Serial1.println("AT");
 delay(500);
 Serial1.println("AT+CMGF=1");
 delay(500);
 Serial1.println("AT+CSMP=17,167,0,0");
 delay(500);
 Serial1.println("AT+CMGS=\"xxxxxxxxxx\"");
 delay(500);
 Serial1.write(26); // Caractère de fin 26 <Ctrl-Z> ou 
 delay(500);
 Serial1.print("WiFi connecte a: "); // Wifi connecte
 delay(500);
 Serial1.println(ssid);
 delay(500);
 Serial1.println("Utiliser cette adresse URL pour la connexion: ");
 delay(500);
 Serial1.print("http://");
 delay(500);
 Serial1.print(WiFi.localIP());
 delay(500);
 Serial1.println("/");
 delay(500);
 Serial1.println("");
}

void loop(){


 WiFiClient client;

  
  // Vérification si le client est connecter.
  client = server.available();
  if (!client)
  {
    return;
  }
 
  while(!client.available()){
    delay(1);
  }
 
  String request = client.readStringUntil('\r');
  client.flush();

  int value = LOW;
  if (request.indexOf("/a") != -1)  {
    SMS = "Une personne vient de sonner a la maison.\nVas ouvrir s'il te plait. Merci.";
    EnvoiSMS();
    digitalWrite(relais, LOW);      //Allume le relais
    value = HIGH;
    delay (60000);
    digitalWrite(relais, HIGH);      //Eteint le relais
    value = LOW;
  }
  if (request.indexOf("/b") != -1)  {
    SMS = "Du courier vient d'etre depose dans la boite aux lettres.\n\nMerci d'aller voir, meme si il pleut!!";
    EnvoiSMS();
    digitalWrite(relais, LOW);      //Allume le relais
    value = HIGH;
    delay (10000);
    digitalWrite(relais, HIGH);      //Eteint le relais
    value = LOW;
  }
  if (request.indexOf("/c") != -1)  {
    SMS = "!!ATTENTION FEU!!\nLe detecteur de fumee au dessus de l'imprimante vient de se declencher!";
    EnvoiSMS();
  }
  if (request.indexOf("/d") != -1)  {
    SMS = "!!ATTENTION FEU!!\nLe detecteur de fumee des chambres vient de se declencher!";
    EnvoiSMS();
  }
  
  // Réponse du navigateur
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); 
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.print("Commande ok");  
  client.println("</html>");
  delay(1);

}

void EnvoiSMS()
{
Serial1.println("AT+CMGF=1");
 delay(500);
 Serial1.println("AT+CSMP=17,167,0,0");
 delay(500);
 Serial1.print("AT+CMGS=\""); Serial1.print(PROPRIO1); Serial1.println("\"");
 delay(500);
 Serial1.println(SMS);
 delay(500);
 Serial1.write(26); // Caractère de fin 26 <Ctrl-Z>
 delay(500);
 Serial1.println("");
}

On est bien d’accord que Serial est pour le port USB et faire du débug par exemple et que Serial1 est pour les ports Tx et Rx?

Essaye cette instruction sim800l. Write ("AT") apres sim800l.begin(9600)

je n'ai pas de

sim800l.begin(9600)

Lisez ce qu’il revient sur Serial1 et imprimez le sur Serial pour voir si votre module vous répond ‘vous avez un print potentiel d’ailleurs sur Serial avant son begin)

Lisez mon tuto sur l’ESP01 et piquez le code là bas pour voir comment envoyer des codes et tester le retour et essayez ça