From ddf0d38c7dfc6ffcb0b1e27217c6d38496a3ca44 Mon Sep 17 00:00:00 2001 From: dling Date: Mon, 19 Jun 2023 04:35:31 +0200 Subject: [PATCH] Il s'agit du code pour écrire sur plusieurs registres modbus lors de la réception d'un message par MQTT. --- MQTT_modbus_write_multiple_coils | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+), 0 deletions(-) create mode 100644 MQTT_modbus_write_multiple_coils diff --git a/MQTT_modbus_write_multiple_coils b/MQTT_modbus_write_multiple_coils new file mode 100644 index 0000000..454ab07 --- /dev/null +++ b/MQTT_modbus_write_multiple_coils @@ -0,0 +1,172 @@ +#include +#include +#include +#include "identifiants.h" +#include "ModbusMaster.h" +ModbusMaster node; + +//identifiants +const char* ssid = MY_SSID; +const char* password = MY_PASS; + + +//adresse du broker MQTT cloud et son port (8883 car protocole SSL) +const char* mqttServer = "f63f940361134f62957ef137f9d2e29f.s1.eu.hivemq.cloud"; +const int mqttPort = 8883; + +//identifiants du broker MQTT cloud pour s'authentifier +const char* mqttUser = MQTT_USER; +const char* mqttPassword = MQTT_PASSWORD; + +unsigned long previousMillis = 0; +const long interval = 5000; +uint8_t result; +int messageMQTT; + +uint8_t coil_value; + +WiFiClientSecure wifiClient; +PubSubClient mqttClient(wifiClient); +String messageToPublish; + +// Certificat CA du serveur MQTT obligatoire pour authentifier l'appareil qui se connecte +const char* caCert = \ +"-----BEGIN CERTIFICATE-----\n" \ +"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\n" \ +"-----END CERTIFICATE-----\n"; + +void setup() { + Serial.begin(115200); //port série activé + + WiFi.begin(ssid, password); //connexion au WiFi + while (WiFi.status() != WL_CONNECTED) { + delay(1000); + Serial.println("Connecting to WiFi..."); + } + Serial.println("Connected to WiFi"); + //connexion au broker MQTT + mqttClient.setServer(mqttServer, mqttPort); + mqttClient.setCallback(callback); + + // Chargement du certificat CA du serveur MQTT + wifiClient.setCACert(caCert); + + while (!mqttClient.connected()) { + Serial.println("Connecting to MQTT server..."); + if (mqttClient.connect("ESP32Client", mqttUser, mqttPassword)) { + Serial.println("Connected to MQTT server"); + mqttClient.subscribe("topic/hello"); + } else { + Serial.print("Failed to connect to MQTT server, rc="); + Serial.print(mqttClient.state()); + Serial.println(" Retrying in 5 seconds..."); + delay(5000); + } + } + + Serial.print("\r\n*****************PRET!*******************"); + Serial2.begin(9600, SERIAL_8N1); //communication modbus à 9600 bauds + node.begin(1, Serial2); //ID node 1 +} + +void loop() { + mqttClient.loop(); + + if (!mqttClient.connected()) { + reconnect(); + } + + //Le port série permet de publier des messages sur le topic "topic/hello" + if (Serial.available()){ + Serial.println(); + messageToPublish = Serial.readString(); + mqttClient.publish("topic/hello",messageToPublish.c_str()); + } +} + +// Fonction pour se reconnecter au serveur MQTT en cas de problème +void reconnect() { + while (!mqttClient.connected()) { + Serial.println("Connecting to MQTT server..."); + if (mqttClient.connect("ESP32Client", mqttUser, mqttPassword)) { + Serial.println("Connected to MQTT server"); + } else { + Serial.print("Failed to connect to MQTT server, rc="); + Serial.print(mqttClient.state()); + Serial.println(" Retrying in 5 seconds..."); + delay(5000); + } + } +} + +void callback(char* topic, byte* payload, unsigned int length) { + // Fonction de rappel pour la réception des messages MQTT + Serial.print("Message arrived on topic: "); + Serial.print(topic); + Serial.print(". Message: "); + for (int i = 0; i < length; i++) { + Serial.print((char)payload[i]); + } + + char messageBuffer[length + 1]; + memcpy(messageBuffer, payload, length); + messageBuffer[length] = '\0'; // Ajouter le caractère de fin de chaîne + //messageMQTT = 0; //Clear messsage + messageMQTT = atoi((char*)messageBuffer); //convertir le + + Serial.print("message MQTT:"); + Serial.println(messageMQTT); + + if(messageMQTT < 32767){ + + static uint16_t coil_values[10] = {0b0000000100100011, 0b0001001010000011, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,0x0001,0x0001}; + + for (int i = 0; i < 10; i++) { + node.setTransmitBuffer(i, coil_values[i]); + } + //for(int j = 0; j < 20; j++){ + result = node.writeMultipleCoils(0,40); // write coil registers to true + + if (result == node.ku8MBSuccess) + { + Serial.printf("\r\nSucces"); + } + else + { + Serial.printf("\r\nFail"); + } + + //} + } + else + Serial.println("number is too big"); + //Serial.println(); +} \ No newline at end of file -- libgit2 0.21.2