Hi I want to try mimicking rs485 communication with arduino. We want to test before purchasing a rs485 temp hum device at make sure this will works.
Currently I use nano as replacement for sensor and esp32 as gateway, the esp32 later will use mqtt to report to server.
I cannot get pass the rs485 communication part.
The connection is roughly like this
esp32 is power by usb from pc, since i need to debug using serial
all nano and max485 module is from mb102 that directly power from dc adapter
This is slave sketch, we use random value for now to replace temp hum
we use softwareserial since we want to debug using usb serial
// library from https://github.com/angeloc/simplemodbusng
#include <SoftwareSerial.h>
#include "SimpleModbusSlaveSoftwareSerial.h"
const int RS485_DE_RE = 2;
SoftwareSerial rs485Serial(3,4); //RX, TX
unsigned int holdingRegistry[2] = {0};
void setup() {
randomSeed(analogRead(0));
pinMode(RS485_DE_RE, OUTPUT);
Serial.begin(115200);
rs485Serial.begin(9600);
// Slave 1
modbus_configure(&rs485Serial, 9600, 1, RS485_DE_RE, 2);
// Slave 2
// modbus_configure(&rs485Serial, 9600, 2, RS485_DE_RE, 2);
}
void loop() {
static unsigned long lastRead = 0;
if (millis() - lastRead > 1000) {
lastRead = millis();
} else {
return;
}
modbus_update(holdingRegistry);
holdingRegistry[0] = (uint16_t)random(20,40);
holdingRegistry[1] = (uint16_t)random(50,90);
Serial.print("Temp: ");
Serial.print(holdingRegistry[0]);
Serial.print(" °C, Humidity: ");
Serial.print(holdingRegistry[1]);
Serial.println(" %");
}
This is our gateway code
#include <ModbusMaster.h>
#include <HardwareSerial.h>
const int MAX485_CTRL_PIN=4;
const int TX_PIN = 16;
const int RX_PIN = 17;
const int NUM_SLAVES=2; // Move to EEPROM
typedef struct {
ModbusMaster node;
uint8_t slaveID;
uint16_t startAddress;
uint16_t quantity;
} ModbusSlave;
// Use Serial 2 for communication with rs485 slave
HardwareSerial RS485Serial(2);
// Move this to EEPROM
ModbusSlave slaves[NUM_SLAVES] = {
{ModbusMaster(), 1, 0, 2},
{ModbusMaster(), 2, 0, 2},
};
void preTransmission() {
digitalWrite(MAX485_CTRL_PIN, HIGH);
}
void postTransmission() {
digitalWrite(MAX485_CTRL_PIN, LOW);
}
void setup() {
Serial.begin(115200);
pinMode(MAX485_CTRL_PIN, OUTPUT);
digitalWrite(MAX485_CTRL_PIN, 0);
RS485Serial.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN);
for (int i = 0; i < NUM_SLAVES; i++) {
slaves[i].node.begin(slaves[i].slaveID, RS485Serial);
slaves[i].node.preTransmission(preTransmission);
slaves[i].node.postTransmission(preTransmission);
}
}
void loop() {
static unsigned long lastRead = 0;
if (millis() - lastRead > 1000) {
lastRead = millis();
} else {
return;
}
for (int i = 0; i < NUM_SLAVES; i++) {
ModbusMaster &node = slaves[i].node;
Serial.print("Reading from Slave ID ");
Serial.println(slaves[i].slaveID);
uint8_t result = node.readHoldingRegisters(slaves[i].startAddress, slaves[i].quantity);
Serial.print("Slave ");
Serial.print(slaves[i].slaveID);
if (result == node.ku8MBSuccess) {
Serial.print(" value: ");
Serial.println(node.getResponseBuffer(0));
} else {
Serial.print(" error: ");
Serial.println(result);
}
}
}
When debug from slave it print out correctly the temp and hum
When debug from gateway it always print error
Reading from Slave ID 1
Salve 1 error : 226
Reading from Slave ID 2
Salve 2 error : 226
