Commit ddf0d38c7dfc6ffcb0b1e27217c6d38496a3ca44

Authored by dling
0 parents

Il s'agit du code pour écrire sur plusieurs registres modbus lors de la réceptio…

…n d'un message par MQTT.
Showing 1 changed file with 172 additions and 0 deletions   Show diff stats
MQTT_modbus_write_multiple_coils 0 → 100644
  1 +++ a/MQTT_modbus_write_multiple_coils
... ... @@ -0,0 +1,172 @@
  1 +#include <WiFi.h>
  2 +#include <PubSubClient.h>
  3 +#include <WiFiClientSecure.h>
  4 +#include "identifiants.h"
  5 +#include "ModbusMaster.h"
  6 +ModbusMaster node;
  7 +
  8 +//identifiants
  9 +const char* ssid = MY_SSID;
  10 +const char* password = MY_PASS;
  11 +
  12 +
  13 +//adresse du broker MQTT cloud et son port (8883 car protocole SSL)
  14 +const char* mqttServer = "f63f940361134f62957ef137f9d2e29f.s1.eu.hivemq.cloud";
  15 +const int mqttPort = 8883;
  16 +
  17 +//identifiants du broker MQTT cloud pour s'authentifier
  18 +const char* mqttUser = MQTT_USER;
  19 +const char* mqttPassword = MQTT_PASSWORD;
  20 +
  21 +unsigned long previousMillis = 0;
  22 +const long interval = 5000;
  23 +uint8_t result;
  24 +int messageMQTT;
  25 +
  26 +uint8_t coil_value;
  27 +
  28 +WiFiClientSecure wifiClient;
  29 +PubSubClient mqttClient(wifiClient);
  30 +String messageToPublish;
  31 +
  32 +// Certificat CA du serveur MQTT obligatoire pour authentifier l'appareil qui se connecte
  33 +const char* caCert = \
  34 +"-----BEGIN CERTIFICATE-----\n" \
  35 +"MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n" \
  36 +"TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n" \
  37 +"cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n" \
  38 +"WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n" \
  39 +"ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n" \
  40 +"MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n" \
  41 +"h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n" \
  42 +"0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n" \
  43 +"A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n" \
  44 +"T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n" \
  45 +"B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n" \
  46 +"B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n" \
  47 +"KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n" \
  48 +"OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n" \
  49 +"jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n" \
  50 +"qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n" \
  51 +"rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n" \
  52 +"HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n" \
  53 +"hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n" \
  54 +"ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n" \
  55 +"3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n" \
  56 +"NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n" \
  57 +"ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n" \
  58 +"TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n" \
  59 +"jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n" \
  60 +"oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n" \
  61 +"4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n" \
  62 +"mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n" \
  63 +"emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\n" \
  64 +"-----END CERTIFICATE-----\n";
  65 +
  66 +void setup() {
  67 + Serial.begin(115200); //port série activé
  68 +
  69 + WiFi.begin(ssid, password); //connexion au WiFi
  70 + while (WiFi.status() != WL_CONNECTED) {
  71 + delay(1000);
  72 + Serial.println("Connecting to WiFi...");
  73 + }
  74 + Serial.println("Connected to WiFi");
  75 + //connexion au broker MQTT
  76 + mqttClient.setServer(mqttServer, mqttPort);
  77 + mqttClient.setCallback(callback);
  78 +
  79 + // Chargement du certificat CA du serveur MQTT
  80 + wifiClient.setCACert(caCert);
  81 +
  82 + while (!mqttClient.connected()) {
  83 + Serial.println("Connecting to MQTT server...");
  84 + if (mqttClient.connect("ESP32Client", mqttUser, mqttPassword)) {
  85 + Serial.println("Connected to MQTT server");
  86 + mqttClient.subscribe("topic/hello");
  87 + } else {
  88 + Serial.print("Failed to connect to MQTT server, rc=");
  89 + Serial.print(mqttClient.state());
  90 + Serial.println(" Retrying in 5 seconds...");
  91 + delay(5000);
  92 + }
  93 + }
  94 +
  95 + Serial.print("\r\n*****************PRET!*******************");
  96 + Serial2.begin(9600, SERIAL_8N1); //communication modbus à 9600 bauds
  97 + node.begin(1, Serial2); //ID node 1
  98 +}
  99 +
  100 +void loop() {
  101 + mqttClient.loop();
  102 +
  103 + if (!mqttClient.connected()) {
  104 + reconnect();
  105 + }
  106 +
  107 + //Le port série permet de publier des messages sur le topic "topic/hello"
  108 + if (Serial.available()){
  109 + Serial.println();
  110 + messageToPublish = Serial.readString();
  111 + mqttClient.publish("topic/hello",messageToPublish.c_str());
  112 + }
  113 +}
  114 +
  115 +// Fonction pour se reconnecter au serveur MQTT en cas de problème
  116 +void reconnect() {
  117 + while (!mqttClient.connected()) {
  118 + Serial.println("Connecting to MQTT server...");
  119 + if (mqttClient.connect("ESP32Client", mqttUser, mqttPassword)) {
  120 + Serial.println("Connected to MQTT server");
  121 + } else {
  122 + Serial.print("Failed to connect to MQTT server, rc=");
  123 + Serial.print(mqttClient.state());
  124 + Serial.println(" Retrying in 5 seconds...");
  125 + delay(5000);
  126 + }
  127 + }
  128 +}
  129 +
  130 +void callback(char* topic, byte* payload, unsigned int length) {
  131 + // Fonction de rappel pour la réception des messages MQTT
  132 + Serial.print("Message arrived on topic: ");
  133 + Serial.print(topic);
  134 + Serial.print(". Message: ");
  135 + for (int i = 0; i < length; i++) {
  136 + Serial.print((char)payload[i]);
  137 + }
  138 +
  139 + char messageBuffer[length + 1];
  140 + memcpy(messageBuffer, payload, length);
  141 + messageBuffer[length] = '\0'; // Ajouter le caractère de fin de chaîne
  142 + //messageMQTT = 0; //Clear messsage
  143 + messageMQTT = atoi((char*)messageBuffer); //convertir le
  144 +
  145 + Serial.print("message MQTT:");
  146 + Serial.println(messageMQTT);
  147 +
  148 + if(messageMQTT < 32767){
  149 +
  150 + static uint16_t coil_values[10] = {0b0000000100100011, 0b0001001010000011, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,0x0001,0x0001};
  151 +
  152 + for (int i = 0; i < 10; i++) {
  153 + node.setTransmitBuffer(i, coil_values[i]);
  154 + }
  155 + //for(int j = 0; j < 20; j++){
  156 + result = node.writeMultipleCoils(0,40); // write coil registers to true
  157 +
  158 + if (result == node.ku8MBSuccess)
  159 + {
  160 + Serial.printf("\r\nSucces");
  161 + }
  162 + else
  163 + {
  164 + Serial.printf("\r\nFail");
  165 + }
  166 +
  167 + //}
  168 + }
  169 + else
  170 + Serial.println("number is too big");
  171 + //Serial.println();
  172 +}
0 173 \ No newline at end of file
... ...