// MODBUS protocol https://www.productinfo.schneider-electric.com/masterpactntnwcompactnsmodbuscommguide/masterpact-nt_nw_compact-ns-modbus-comm-guide/EN/BM_VEGA_MasterPact_IEC_2c93c0c3_T001013498.xml/$/TPC_Master_NS_MasterSlaveProtocol_2c93c0c3_T001013508 // ModbusMaster by Doc Walker in library #include // Include ModbusMaster library for Modbus RTU // RS485 control pins (STM32 example) #define RS485_DE_PIN PB5 // DE (Driver Enable) pin #define RS485_RE_PIN PA15 // RE (Receiver Enable) pin // Create an instance of ModbusMaster for the master node ModbusMaster node; // Enable RS485 transceiver to send data (DE, RE pins) void preTransmission() { digitalWrite(RS485_DE_PIN, HIGH); // Enable transmit digitalWrite(RS485_RE_PIN, HIGH); // Disable receive } // Enable RS485 transceiver to receive data void postTransmission() { digitalWrite(RS485_DE_PIN, LOW); // Disable transmit digitalWrite(RS485_RE_PIN, LOW); // Enable receive } void setup() { // Initialize Serial2 for RS485 communication Serial2.begin(9600); // Set DE and RE pins as output pinMode(RS485_DE_PIN, OUTPUT); pinMode(RS485_RE_PIN, OUTPUT); postTransmission(); // Set to receive mode by default // Initialize Modbus communication with the slave node node.begin(1, Serial2); // Set slave ID to 1, use Serial2 for communication // Assign the preTransmission and postTransmission callbacks node.preTransmission(preTransmission); node.postTransmission(postTransmission); // Start Serial for debugging Serial.begin(9600); Serial.println("Modbus Master: Requesting Temperature from Slave"); } void loop() { uint8_t result; uint16_t temperature; // Request holding register 0 from the slave node (where the temperature is stored) result = node.readHoldingRegisters(0, 1); // Read 1 register starting from address 0 // Check if the Modbus request was successful if (result == node.ku8MBSuccess) { // Read the temperature value from the response temperature = node.getResponseBuffer(0); // Get the value from the first register (index 0) // Convert the value back to a floating-point temperature (assuming it's scaled by 100) float temperatureC = temperature / 100.0; // Print the temperature to the Serial Monitor Serial.print("Temperature from slave: "); Serial.print(temperatureC); Serial.println(" °C"); } else { // Print error message if the Modbus request failed Serial.println("Failed to read from slave"); } // Delay before next Modbus request delay(2000); // Poll the slave every 2 seconds }