Hola, estoy intentando realizar una comunicación RS485 MODBUS RTU entre un ESP32 (maestro) y el sensor de ruido RK300-06B (esclavo). Para esto el maestro le tiene que mandar una secuencia de bytes hexadecimal al esclavo así este responde con el valor del registro del ruido. El problema es que me salta el error "Tiempo de respuesta agotado" y no lo pude solucionar.
Los 4 cables de la izquierda son del sensor: Rojo (alimentación 5V), Negro (GND), Blanco (A) y Amarillo (B).
Los cables de abajo del ESP32 son alimentación: Rojo (3,3V), Verde (5V) y Azul (GND).
El módulo C25B es un conversor RS485 a TTL con el integrado Max485, el cual está: alimentado con 3,3V, conectado al sensor y conectados a la ESP32, DI al Tx (17), RO al Rx (16) y DE y RE (que estan puenteados por abajo) a un GPIO (22).
#include <ModbusMaster.h>
byte direc[] = {0x01,0x03,0x00,0x06,0x00,0x01,064,0x0B};
ModbusMaster node; // Crear una instancia de la clase ModbusMaster
#define DE_RE 22 // Pines del módulo RS485
void preTransmission() {
digitalWrite(DE_RE, HIGH);
delay(10);
}
void postTransmission() {
digitalWrite(DE_RE, LOW);
delay(10);
}
void setup() {
pinMode(DE_RE, OUTPUT); // Configurar el pin DE/RE del módulo RS485 como salida
digitalWrite(DE_RE, LOW); // Inicializar el pin DE/RE en LOW
Serial.begin(9600); // Inicializar la comunicación serial para depuración
Serial2.begin(9600, SERIAL_8N1, 16, 17); // Inicializar la comunicación serial para RS485, RX=16, TX=17
Serial2.setTimeout(3000);
node.begin(1, Serial2); // Iniciar la instancia de ModbusMaster, la dirección del esclavo es 1
node.preTransmission(preTransmission); // Asignar funciones de pre y post transmisión
node.postTransmission(postTransmission);
delay(2000); // Pequeña demora para asegurarse de que todo esté listo
}
void loop() {
uint8_t result = node.readHoldingRegisters(0x0006, 1); // Leer un registro (16 bits) comenzando en la dirección 6
uint16_t data[16];
delay(30);
if (result == node.ku8MBSuccess) { // Si la comunicación fue exitosa
Serial.print("Noise Level: ");
Serial.print(node.getResponseBuffer(0) / 10.00);
Serial.println(" dB");
delay(30);
} else {
switch(result) {
case node.ku8MBIllegalFunction: Serial.println("Error: Función ilegal"); break;
case node.ku8MBIllegalDataAddress: Serial.println("Error: Dirección de datos ilegal"); break;
case node.ku8MBIllegalDataValue: Serial.println("Error: Valor de datos ilegal"); break;
case node.ku8MBSlaveDeviceFailure: Serial.println("Error: Falla del dispositivo esclavo"); break;
case node.ku8MBInvalidSlaveID: Serial.println("Error: ID de esclavo inválido"); break;
case node.ku8MBInvalidFunction: Serial.println("Error: Función inválida"); break;
case node.ku8MBResponseTimedOut: Serial.println("Error: Tiempo de respuesta agotado"); break;
case node.ku8MBInvalidCRC: Serial.println("Error: CRC inválido"); break;
default: Serial.println("Error desconocido");
}
}
delay(1000); // Esperar un segundo antes del siguiente ciclo
}