// To include the SimpleModbusSlave.h download ZIP https://github.com/jecrespo/simple-modbus/tree/master and extract it. Search for folder Simple Modbus. Then, create a ZIP file from the Simple Modbus folder and install it. #include #include #include #define ONE_WIRE_BUS PA15 // DS18B20 One-Wire pin OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); // RS485 control pins #define RS485_DE_PIN PB5 // DE (Driver Enable) pin #define RS485_RE_PIN PA15 // RE (Receiver Enable) pin // Define Modbus parameters #define SLAVE_ID 1 #define HOLDING_REGS_SIZE 2 // Modbus holding registers unsigned int holdingRegs[HOLDING_REGS_SIZE]; void setup() { afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY); // Initialize Serial2 for RS485 communication. Serial2.begin(9600); // Configure Modbus with correct parameters modbus_configure(9600, SLAVE_ID, RS485_DE_PIN, HOLDING_REGS_SIZE, 0); // 0 for low latency // Debug output Serial.begin(9600); Serial.println("Modbus Slave Setup Complete"); } void loop() { // Initialize OneWire for DS18B20 temperature sensor. Initialized inside the loop () due to the pins conflict of R485, sensor board. sensors.begin(); // Update Modbus register values modbus_update(holdingRegs); // Pass holding registers // Read temperature from DS18B20 sensor sensors.requestTemperatures(); float temperatureC = sensors.getTempCByIndex(0); // Get temperature in Celsius // Store the temperature in Modbus holding register (scaled by 100) holdingRegs[0] = (unsigned int)(temperatureC * 100); // Set RS485 DE/RE control pins as output pinMode(RS485_DE_PIN, OUTPUT); pinMode(RS485_RE_PIN, OUTPUT); digitalWrite(RS485_DE_PIN, LOW); // Set DE to LOW (receive mode) digitalWrite(RS485_RE_PIN, LOW); // Set RE to LOW (receive mode) // Print temperature to Serial for debugging Serial.print("Temperature: "); Serial.print(temperatureC); Serial.println(" °C"); delay(1000); // Delay between temperature reads }