toughc5_rs485_modbus_master.ino

M5Stack ToughC5 Weatherproof IoT Dev Kit (ESP32-C5) · File : toughc5_rs485_modbus_master.ino · Language : C++ (Arduino) · Use case : Communiquer avec un périphérique industriel via le port RS485 intégré.

Modbus RTU master example on the RS485 bus for industrial communication.

The ToughC5 has an RS485 transceiver. This code uses UART2. Ensure you check the exact GPIO pins for TX/RX/DE in the official ToughC5 schematic, as they may vary by revision. RS485 mode often requires precise direction timing (DE/RE) handling.

toughc5_rs485_modbus_master.ino

#include <M5ToughC5.h>
#include <RS485.h>

// Le ToughC5 a un transceiver RS485 intégré.
// La broche de contrôle de direction (DE/RE) est souvent gérée automatiquement 
// ou doit être mappée selon le schéma spécifique (vérifier GPIO pour DE).
// Ici, nous utilisons l'interface série UART2 mappée sur les broches RS485.

HardwareSerial RS485Serial(2); // UART2 pour RS485

void setup() {
    M5.begin();
    Serial.begin(115200);
    
    // Initialiser RS485 à 9600 bauds (standard Modbus RTU)
    // Note: Vérifier les broches TX/RX spécifiques du connecteur HY2.0 RS485
    // Sur ToughC5, RS485 est souvent sur UART2 avec gestion auto-direction si câblé correctement
    RS485Serial.begin(9600, SERIAL_8N1, 16, 17); // Ajuster les broches TX/RX selon le schéma officiel
    
    Serial.println("RS485 Master Ready");
}

void loop() {
    // Envoyer une commande Modbus RTU simple (ex: lire registre 0)
    // Adresse 1, Fonction 3 (Read Holding Registers), Start 0, Qty 1, CRC
    uint8_t modbusCmd[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};
    
    // Mettre en mode transmission (si gestion manuelle du DE est nécessaire)
    // digitalWrite(DE_PIN, HIGH); 
    
    RS485Serial.write(modbusCmd, sizeof(modbusCmd));
    RS485Serial.flush(); // Attendre que le buffer soit vide
    
    // Attendre la réponse (timeout simple)
    delay(100);
    
    if (RS485Serial.available()) {
        Serial.print("Received: ");
        while (RS485Serial.available()) {
            Serial.print(RS485Serial.read(), HEX);
            Serial.print(" ");
        }
        Serial.println();
    } else {
        Serial.println("No response from RS485 slave");
    }
    
    delay(2000);
}

← Back to the board