Envoi message esp32 et sim900

Bonjour à tous,

Voilà, j'ai un Esp32 et une sim900.

Cet esp32 récupère en wifi les données d'un autre esp32 avec la librairie esp now.

Je voudrais envoyer un SMS de toute mes données mais là je ne reçois seulement "Ruche n"

J'ai trouvé ce code sur le net que j'ai essayé de faire à ma sauce mais je bloque, je pense ce n'est pas grand chose car je reçois un message mais bon...
Merci d'avance

#include <esp_now.h>
#include <WiFi.h>

// Définir la structure des données.
typedef struct struct_message {
  int a;
  float b;
  float c;
  float d;
  float e;
} struct_message;

// Créez un struct_message appelé "Ruche".
struct_message Ruche;

// Fonction de rappel.
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len)
{
  // Obtenir des données entrantes.
  memcpy(&Ruche, incomingData, sizeof(Ruche));

  // Imprimer sur le moniteur Série.
  Serial.print("Ruche n°: ");
  Serial.println(Ruche.a);
  Serial.print("Température INT: ");
  Serial.print(Ruche.b);
  Serial.println("°C");

  Serial.print("Température EXT: ");
  Serial.print(Ruche.c);
  Serial.println("°C");

  Serial.print("Humidité EXT: ");
  Serial.print(Ruche.d);
  Serial.println("%");

  Serial.print("Poids: ");
  Serial.print(Ruche.e);
  Serial.println("Kg");
  Serial.println("");
  Serial.println("");
}

void setup() {

Serial.begin(115200);//Initialisation liaison Moniteur série

  // Mettre l'ESP32 en mode WIFI temporaire.
  WiFi.mode(WIFI_STA);

  // Initialiser ESP-NOW.
  if (esp_now_init() != 0) {
    Serial.println("Erreur d'initialisation...");
    return;
  }

  // Fonction de rappel d'enregistrement.
esp_now_register_recv_cb(OnDataRecv);

Serial2.begin(115200);//Initialisation module SIM900
  delay(10000);//Temps de connexion du SIM900 au réseau téléphonique - Ajuster si besoin
  Serial2.println("AT");
  delay(1000);
  updateSerial();
Serial2.println("AT+CMGF=1\r"); //Activation mode Texte
  delay(1000);
  updateSerial();
Serial2.println("AT+CMGS=\"+33xxxxxxxxx\""); //Numéro du destinataire
  delay(1000);
  updateSerial();
  Serial2.print("Faire-part de naissance des modules ESP32 et SIM900"); //Message à envoyer
  delay(1000);
  Serial2.write((char)26); //Envoi du message
  delay(1000);
}
void loop() {


Serial2.println("AT+CMGF=1\r"); //Activation mode Texte
  delay(1000);
  updateSerial();
Serial2.println("AT+CMGS=\"+33xxxxxxxxxx\""); //Numéro du destinataire
  delay(1000);
  updateSerial();
  // Message à envoyer.
  Serial2.print("Ruche n°: ");
  Serial2.println(Ruche.a);
  Serial2.print("Température INT: ");
  Serial2.print(Ruche.b);
  Serial2.println("°C");

  Serial2.print("Température EXT: ");
  Serial2.print(Ruche.c);
  Serial2.println("°C");

  Serial2.print("Humidité EXT: ");
  Serial2.print(Ruche.d);
  Serial2.println("%");

  Serial2.print("Poids: ");
  Serial2.print(Ruche.e);
  Serial2.println("Kg");
  Serial2.println("");
  Serial2.println("");
  delay(1000);
  Serial2.write((char)26); //Envoi du message
  delay(1000);
}

void updateSerial()
{

  delay(500);
  while (Serial.available())
  {
    Serial2.write(Serial.read());
  }
  while (Serial2.available())
  {
    Serial.write(Serial2.read());
  }
}


Essayez d'abord sans le SIM900. Vérifiez si vous pouvez transférer avec succès des messages entre deux ESP32 à l'aide du protocole ESP-NOW.

Qu'est-ce qui s'affiche dans la console Arduino ?

Bonjour,
Les données se transmettent sur l'esp32.

J'ai toutes les données transmises, le numéro de ruche, température etc...

Dans le SMS, tu as "Ruche n°: " ou "Ruche n" ?

Ruche n

La fonction qui affiche ces textes est appelée en cas de réception d'un message. Il est possible que ça ne fonctionne que pour des fonctions simples et rapides d'exécution. Mais la tienne est assez longue car elle contient plusieurs appels de serial.print.
Tu devrais la modifier pour qu'elle mette seulement un flag booléen à true. Dans la loop, tu testes si ce booléen est à true : si oui, tu fais toutes les commandes qui sont actuellement dans la fonction et tu repasses le booléen à false

Il faut bien sûr le déclarer en variable globale et l'initialiser à false.

Ok je te remercie, je débute dans la programmation et la tu me perds un peu :thinking:

Avant le setup, tu définis un booléen
bool messagerecu = false;
Dans la fonction, tu enlèves tout (mais tu gardes les lignes de côté, elles seront remises dans la loop) et tu mets seulement
messagerecu = true;

Ensuite dans la loop, tu ajoutes un bloc :

if (messagerecu) {
// Copier ici les lignes enlevées de la fonction
messagerecu = false;
}

A tester...

Non j'ai testé et ça ne fonctionne pas😔 toujours, je reçois "Ruche n"
Voici le code


#include <esp_now.h>
#include <WiFi.h>

// Définir la structure des données.
typedef struct struct_message {
  int a;
  float b;
  float c;
  float d;
  float e;
} struct_message;

bool messagerecu = false;

// Créez un struct_message appelé "Ruche".
struct_message Ruche;

// Fonction de rappel.
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len)
{
  // Obtenir des données entrantes.
  memcpy(&Ruche, incomingData, sizeof(Ruche));

  // Imprimer sur le moniteur Série.
  Serial.print("Ruche n°: ");
  Serial.println(Ruche.a);
  Serial.print("Température INT: ");
  Serial.print(Ruche.b);
  Serial.println("°C");

  Serial.print("Température EXT: ");
  Serial.print(Ruche.c);
  Serial.println("°C");

  Serial.print("Humidité EXT: ");
  Serial.print(Ruche.d);
  Serial.println("%");

  Serial.print("Poids: ");
  Serial.print(Ruche.e);
  Serial.println("Kg");
  Serial.println("");
  Serial.println("");

  bool messagerecu = false;
}

void setup() {

Serial.begin(115200);//Initialisation liaison Moniteur série

  // Mettre l'ESP32 en mode WIFI temporaire.
  WiFi.mode(WIFI_STA);

  // Initialiser ESP-NOW.
  if (esp_now_init() != 0) {
    Serial.println("Erreur d'initialisation...");
    return;
  }

  // Fonction de rappel d'enregistrement.
esp_now_register_recv_cb(OnDataRecv);

Serial2.begin(115200);//Initialisation module SIM900
  delay(20000);//Temps de connexion du SIM900 au réseau téléphonique - Ajuster si besoin
  Serial2.println("AT");
  delay(1000);
  updateSerial();
Serial2.println("AT+CMGF=1\r"); //Activation mode Texte
  delay(1000);
  updateSerial();
Serial2.println("AT+CMGS=\"+33xxxxxxxxxx\""); //Numéro du destinataire
  delay(1000);
  updateSerial();
  messagerecu = true;
}
void loop() {
if (messagerecu){
  // Message à envoyer.
  Serial2.print("Ruche n°: ");
  Serial2.println(Ruche.a);
  Serial2.print("Température INT: ");
  Serial2.print(Ruche.b);
  Serial2.println("°C");

  Serial2.print("Température EXT: ");
  Serial2.print(Ruche.c);
  Serial2.println("°C");

  Serial2.print("Humidité EXT: ");
  Serial2.print(Ruche.d);
  Serial2.println("%");

  Serial2.print("Poids: ");
  Serial2.print(Ruche.e);
  Serial2.println("Kg");
  Serial2.println("");
  Serial2.println("");
  delay(1000);
  Serial2.write((char)26); //Envoi du message
  delay(1000);
  messagerecu = false;
}
  }

void updateSerial()
{

  delay(500);
  while (Serial.available())
  {
    Serial2.write(Serial.read());
  }
  while (Serial2.available())
  {
    Serial.write(Serial2.read());
  }
}

Ce n'est pas ce que je proposais, voici une autre version :

#include <esp_now.h>
#include <WiFi.h>

// Définir la structure des données.
typedef struct struct_message {
  int a;
  float b;
  float c;
  float d;
  float e;
} struct_message;

bool messagerecu = false;

// Créez un struct_message appelé "Ruche".
struct_message Ruche;

// Fonction de rappel.
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len)
{
  bool messagerecu = false;
  // Obtenir des données entrantes.
  memcpy(&Ruche, incomingData, sizeof(Ruche));
}

void setup() {

Serial.begin(115200);//Initialisation liaison Moniteur série

  // Mettre l'ESP32 en mode WIFI temporaire.
  WiFi.mode(WIFI_STA);

  // Initialiser ESP-NOW.
  if (esp_now_init() != 0) {
    Serial.println("Erreur d'initialisation...");
    return;
  }

  // Fonction de rappel d'enregistrement.
esp_now_register_recv_cb(OnDataRecv);

Serial2.begin(115200);//Initialisation module SIM900
  delay(20000);//Temps de connexion du SIM900 au réseau téléphonique - Ajuster si besoin
  Serial2.println("AT");
  delay(1000);
  updateSerial();
Serial2.println("AT+CMGF=1\r"); //Activation mode Texte
  delay(1000);
  updateSerial();
Serial2.println("AT+CMGS=\"+33617819501\""); //Numéro du destinataire
  delay(1000);
  updateSerial();
  messagerecu = true;
}
void loop() {
  // Message à envoyer.
  Serial2.print("Ruche n°: ");
  Serial2.println(Ruche.a);
  Serial2.print("Température INT: ");
  Serial2.print(Ruche.b);
  Serial2.println("°C");

  Serial2.print("Température EXT: ");
  Serial2.print(Ruche.c);
  Serial2.println("°C");

  Serial2.print("Humidité EXT: ");
  Serial2.print(Ruche.d);
  Serial2.println("%");

  Serial2.print("Poids: ");
  Serial2.print(Ruche.e);
  Serial2.println("Kg");
  Serial2.println("");
  Serial2.println("");
  delay(1000);
  Serial2.write((char)26); //Envoi du message
  delay(1000);

  if (messagerecu) {
  // Imprimer sur le moniteur Série.
  Serial.print("Ruche n°: ");
  Serial.println(Ruche.a);
  Serial.print("Température INT: ");
  Serial.print(Ruche.b);
  Serial.println("°C");

  Serial.print("Température EXT: ");
  Serial.print(Ruche.c);
  Serial.println("°C");

  Serial.print("Humidité EXT: ");
  Serial.print(Ruche.d);
  Serial.println("%");

  Serial.print("Poids: ");
  Serial.print(Ruche.e);
  Serial.println("Kg");
  Serial.println("");
  Serial.println("");

  messagerecu = false;
  }
}

void updateSerial()
{
  delay(500);
  while (Serial.available())
  {
    Serial2.write(Serial.read());
  }
  while (Serial2.available())
  {
    Serial.write(Serial2.read());
  }
}

Tu as essayé sans le caractère ° ?

1 Like

Merci, c'était bien ça, un caractère spécial, ça bloque le reste de l'envoi!
Merci

Je voudrais rajouter une ligne, et faire une différence de poids par rapport à la dernière prise de données.
Soit en positive soit en négative.
Par exemple

  • 2,3Kg ou -1,5kg

Est ce possible ?

Désolé je n'ai pas compris ta problématique ?

Il te faut un capteur pour peser la ruche. Cette problématique a été abordée de nombreuses fois sur le forum, en utilisant le moteur de recherche tu trouveras pas mal de discussions sur le sujet.

Lorsque je reçois le message j'ai la lecture de données à l'instant T.
J'aimerais rajouter une ligne, lors du prochain message, j'ai la lecture du poids, et dessous (ajout de cette fameuse ligne) indiquant si le poids a augmenté ou diminué de tant de kg, "+2,3kg" ou"-1,5kg"
Est ce possible ?

Merci

Oui, c'est toi qui écrit le message avec tes Serial.print.
Il ne me semble pas que tu passe en sommeil profond ?
Donc je ne comprends ce qui t'emepeche d'écrire la différence de poid avec la précédente mesure que tu avais sauvegardé dans un variable?

Mon projet je vais le mettre en sommeil profond, il faudra que je regarde même comment on fait...
Mon relevé s'enregistre ? Je peux le récupérer pour faire la différence ?

J'ai peut être loupé une information, tu as décris ton projet dans ce post ?
tu compte te reveiller tout les combiens de temps (24h) ?

En gros lorsque tu passes en sommeil profond, tu ne peux pas garder la valeur de tes variables.
Il faut donc sauvegarder cette valeur dans une mémoire persistante, mais celle-ci on une durée de vie limite en nombre d'écriture.

Il s'enregistre ou ?