Hola a todos, necesito ayuda con la configuración de una conexión que incluye un ESP32, un módulo RS485 y un sensor de radiación solar. Intento que la comunicación entre los componentes sea correcta, pero tengo algunos problemas. Si alguien tiene experiencia con este tipo de configuración o puede compartir alguna guía o ejemplos de cableado, ¡se lo agradecería mucho!
¿Cuál es el procolo?
Según tengo entendido , protocolo Modbus RTU sobre RS485 , no consigo la comunicación con el sensor y no me detecta datos , el sensor es un RS-RA photoelectric total solar radiation sensor
ESP32.
Adjunta el código (ver Normas del Foro en Español, punto 7) sino es difícil ayudarte.
#include <WiFi.h>
#include <HardwareSerial.h>
// Pines para RS485
#define RXD2 16 // Pin RX del ESP32 conectado a RO del RS485
#define TXD2 17 // Pin TX del ESP32 conectado a DI del RS485
#define RE_DE 4 // Pin de control para RE/DE
const char* ssid = "CELERITY_CF_RIOBAMBA";
const char* password = "Riofit2025@";
HardwareSerial RS485(2); // Usamos Serial2 para RS485
void setup() {
Serial.begin(115200);
delay(1000);
// Conexión WiFi
Serial.println("Conectando a WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\n✅ Conectado a WiFi");
Serial.print("Dirección IP del ESP32: ");
Serial.println(WiFi.localIP());
// Configuración del puerto RS485
RS485.begin(9600, SERIAL_8N1, RXD2, TXD2);
pinMode(RE_DE, OUTPUT);
digitalWrite(RE_DE, LOW); // Modo recepción
Serial.println("RS485 listo para recibir datos...");
}
void loop() {
if (RS485.available()) {
Serial.print("📨 Datos recibidos: ");
while (RS485.available()) {
uint8_t data = RS485.read();
Serial.print("0x");
if (data < 0x10) Serial.print("0"); // Para mantener formato 0x0A
Serial.print(data, HEX);
Serial.print(" ");
}
Serial.println();
}
delay(200);
}
lo siento , soy nuevo aqui y no encontre las reglas al principio
este es mi codigo el cual me deja conectarme a la red wifi pero no me da respuesta del rs485 ni del sendor
Tu código no coincide con las conexiones del esquema.
Estás usando los pines incorrectos, 16 y 17 se refieren a GPIO16 y GPIO17, no a los terminales 16 y 17 de la placa (si, es confuso al principio).
Fijate en el esquema, estás conectando el adaptador al serial 1 (RX1, TX1) en lugar de al serial 2 (RX2, TX2).
Tienes que conectar RO y DI en los terminales 27 y 28 respectivamente, por eso no recibes los datos.
Enserio broo, gracias no tome en cuenta las conexiones, voy a corregirlo y a probar , volveré a reportar como me fue
En tu código solo veo un dispositivo Rs485 "a la escucha". Si realmente tu dispositivo es modbus , no recibirás nada a menos que el sensor sea maestro (cosa rara en un sensor), y en ese caso solo recibirás una serie de bytes sin sentido. Por empezar necesitas una librería modbus compatible con tu microprocesador .
Sería conveniente que pusieras un enlace al manual del sensor....
save.jnrsmcu.com/rk/230A/230A.html este es el enlace del sensor que escanee en el QR del mismo , tengo otra programacion que adjunto con protocolo modbus , pero me estoy centrando en primero recibir los datos con la anterior
#include <WiFi.h>
#include <HardwareSerial.h>
// CONFIGURACIÓN DE WIFI
const char* ssid = "CELERITY_CF_RIOBAMBA";
const char* password = "Riofit2025@";
// CONFIGURACIÓN DE PINES RS485 EN ESP32
#define RXD2 16 // RO del módulo RS485
#define TXD2 17 // DI del módulo RS485
#define RE_DE 4 // Control RE/DE del módulo RS485
HardwareSerial RS485(2); // Serial2 en ESP32
// MODBUS CONFIGURABLE
const uint8_t SLAVE_ID = 0x01; // Dirección del sensor (cambia si usas otra)
const uint16_t START_ADDRESS = 0x0000; // Registro a leer
const uint16_t NUM_REGISTERS = 0x0001; // Registros a leer
// Cálculo manual de CRC Modbus (para el paquete)
uint16_t modbusCRC(byte* buffer, int length) {
uint16_t crc = 0xFFFF;
for (int pos = 0; pos < length; pos++) {
crc ^= (uint16_t)buffer[pos];
for (int i = 8; i != 0; i--) {
if ((crc & 0x0001) != 0) {
crc >>= 1;
crc ^= 0xA001;
} else
crc >>= 1;
}
}
return crc;
}
void setup() {
Serial.begin(115200);
delay(1000);
// Conexión a WiFi
Serial.println("Conectando a WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n✅ Conectado a WiFi");
Serial.print("Dirección IP del ESP32: ");
Serial.println(WiFi.localIP());
// RS485 setup
RS485.begin(9600, SERIAL_8N1, RXD2, TXD2);
pinMode(RE_DE, OUTPUT);
digitalWrite(RE_DE, LOW); // Modo recepción
Serial.println("🟢 RS485 listo");
}
void loop() {
// Crear petición Modbus RTU
byte request[8];
request[0] = SLAVE_ID; // Dirección del dispositivo
request[1] = 0x03; // Función Modbus: Leer registros
request[2] = START_ADDRESS >> 8;
request[3] = START_ADDRESS & 0xFF;
request[4] = NUM_REGISTERS >> 8;
request[5] = NUM_REGISTERS & 0xFF;
uint16_t crc = modbusCRC(request, 6);
request[6] = crc & 0xFF;
request[7] = crc >> 8;
// Enviar la petición
digitalWrite(RE_DE, HIGH); // Activar transmisión
RS485.write(request, sizeof(request));
RS485.flush(); // Espera a que termine
digitalWrite(RE_DE, LOW); // Activar recepción
delay(200); // Esperar respuesta del sensor
// Leer y mostrar respuesta
if (RS485.available()) {
Serial.print("📨 Datos recibidos: ");
while (RS485.available()) {
uint8_t data = RS485.read();
Serial.print("0x");
if (data < 0x10) Serial.print("0");
Serial.print(data, HEX);
Serial.print(" ");
}
Serial.println();
} else {
Serial.println("⚠️ No se recibió respuesta");
}
delay(1000); // Esperar antes de la siguiente consulta
}
ya realiza las conexiones correctamente , ya no tengo una serie de datos sin sentido pero aun asi no detecta el sensor solo se queda con el mensaje esperando respuesta
Es que no vas a tener repuesta, aún si está bien conectado, en protocolo modbus el esclavo no envía nada si el maestro no pregunta.
Es muy raro que el sensor sea maestro, que seria el único caso donde o tendrías reuesta
según la traducción del enlace que pusiste es un sensor analógico, no tiene puerto de comunicación
Tal y como dice @PeterKantTropus el sensor (si el enlace es correcto) es analógico con salida 4-20mA (I20), 0-5V (V05) ó 0-10V (V10). El número entre paréntesis forma parte del número de modelo.
El sensor posee 4 cables 2 que son la alimentación , 2 que son A y B las señales , entones si es señal analógica debo de leer con un pin analógico del sp32 creo , rescribir el código o conseguir un convertidor ADS externo , poseo el manual del sensor pero no me deja subirlo es un archivo pdf