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());
}
}
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.
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;
}
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
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 ?
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.