Bonjour,
J'essaie tant bien que mal de transférer les données reçues d'un capteurs de température qui est situé hors zone wifi. J'ai donc opté pour la technologie Lora entre un ESP32 équipé d'un SX1278 et d'un TTGO Lilygo lora.
Jusque-là tout fonctionne correctement. C'est à partir du moment où je tente de publier la donnée via mosquitto mqtt afin d'y avoir accès depuis home assistant. J'utilise également Mqtt explorer pour visualiser les échanges avec mosquitto. Je monitore également sur le port série les données.
Tout fonctionne correctement tant que je ne publie pas la données de température Mais a partir du moment ou je la publie après changement en string pour passer en mqtt, j'ai quelques soucis :
-
le port série affiche des valeurs incohérente du string (enfin je pense) et défiles en continue
-
les données envoyées au mqtt s'affichent bien en cohérence avec le port série mais restent incohérentes et le nombre de publication monte en flèche
-
a partir d'un certain moment, plus rien ne bouge (je pense)
J'ai l'impression donc qu'il y a au moins deux problèmes et j'ai pourtant regardé beaucoup d'exemples mais comme je ne suis pas expert, j'ai du mal a tout saisir...
Je vous joins le code que j'ai chargé dans le récepteur Lilygo en espérant que cela puisse m'aider a ce que vous trouviez mon/mes problèmes :
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <Streaming.h>
#include <Ticker.h>
#define OLED_SDA 21 // Attention: Les broches SDA et SCL de l'affichage OLED sont inversées sur le dessin de LilyGO et sur GitHub.
#define OLED_SCL 22
#define OLED_RST 12 // Note: Le TTGO Lora32 v2 n'utilise pas le signal reset, mais la librairie Adafruit_SSD1306, oui.
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
const int csPin = 18; // LoRa radio chip select-TTGO
const int resetPin = 23; // LoRa radio reset-TTGO
const int irqPin = 26; // change for your board; must be a hardware interrupt pin-TTGO
const int sckPin = 5; //-TTGO
const int misosPin = 19; //-TTGO
const int mosiPin = 27; //-TTGO
const char* ssid = "xxxxxx"; // Nom du wifi
const char* password = "xxxxxx"; // Mot de passe wifi
const char* mqtt_server = "xxx.xxx.x.xx"; // Adresse IP du brovker MQTT
const char* mqtt_username = "xxxxx"; // User MQTT
const char* mqtt_password = "xxxxxx"; // Password MQTT
const char* mqtt_topic = "ESP32/DS18B20/temp_piscine"; // Nom du topic MQTT envoyé par home assistant
char incoming ;
char msg[4];
WiFiClient espClient;
PubSubClient client(espClient);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);
void setup()
{
Serial.begin(115200);
while (!Serial);
// setup WiFi
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
//initialize OLED
Wire.begin(OLED_SDA, OLED_SCL);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false))
{ // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("LORA RECEIVER ");
display.display();
Serial.println("LoRa Receiver");
// override the default CS, reset, and IRQ pins (optional)
SPI.begin(sckPin, misosPin, mosiPin, csPin);
LoRa.setPins(csPin, resetPin, irqPin); // set CS, reset, IRQ pin
if (!LoRa.begin(433E6))
{
Serial.println("Starting LoRa failed!");
while (1);
}
}
//Fonction connexion au wifi appelé dans le setup
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
display.setCursor(0,0);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
//Fonction connexion au wifi appelé dans le setup
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
}
//Fonction connexion au serveur Mqtt dans le loop
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("ESP8266Client", mqtt_username, mqtt_password)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void loop()
{
client.loop();
// try to parse packet
int packetSize = LoRa.parsePacket();
if (packetSize)
{
// received a packet
Serial.print("Received packet ");
// read and print packet
display.clearDisplay();
display.setCursor(0,0);
while (LoRa.available())
{
incoming = ((char)LoRa.read());
//Serial.print((char) LoRa.read());
Serial.print(incoming);
display.print(incoming);
}
// print RSSI of packet
Serial.print("' with RSSI ");
Serial.println(LoRa.packetRssi());
//display.setCursor(0,0);
display.print("' with RSSI ");
display.println(LoRa.packetRssi());
display.display();
}
if (!client.connected())
{
reconnect();
}
dtostrf(incoming, 6, 2, msg);
Serial.print (msg);
client.publish(mqtt_topic,msg,false);
//client.publish(mqtt_topic,dtostrf(LoRa.packetRssi(),6,2,msg),false);
}