Hello,
I have some problem to convert an arduino sketch to esphome integrations.
/*
Note:
*Serial Port 0 is not used to connect the RS485 Converter (MAX485) because its used for debugging.
*The Serial Port 1 (TX1, RX1) is used for ModBus communication interface.
*Wiring of Sensor, Arduino, and MAX485 TTL to RS485 Converter:
___________________________________________________________________________________________
| Sensor (SHT20) | MAX485 TTL to RS485 Converter
| A (Yellow) | A (Terminal block)
| B (White) | B (Terminal block)
| GND (Black) | GND (External Supply)
| Vs (Red) | 5-30V (External Supply)
___________________________________________________________________________________________
| MAX485 TTL to RS485 Converter | Arduino (Hardware Serial) | Arduino (Software Serial) ESP
| RO (Reciever Output) | D19 (RX1) | D9 (RX) D19
| RE (Reciever Enable) | D2 | D2 D2
| DE (Driver Enable) | D3 | D3 D4
| DI (Driver Input) | D18 (TX1) | D10 (TX) D18
___________________________________________________________________________________________
*/
// Define the pins used by the RS-485 module
#define MAX485_RE_NEG 2
#define MAX485_DE 4
void setup() {
// Initialize program Serial port at 115200 baud rate
Serial.begin(115200);
// Initialize modbus Serial port at 4800 baud rate
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
// Start the Modbus serial Port, for Soil_sensor
Serial1.begin(4800, SERIAL_8N1, 18, 19); // Use Serial1 with pins 18 (RX) and 19 (TX)
delay(1000);
}
void loop() {
// Read Soil Moisture/Humidity
preTransmission();
byte soil_humidity_request[] = { 0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0a };
Serial1.write(soil_humidity_request, sizeof(soil_humidity_request));
Serial1.flush();
postTransmission();
byte soil_humidity_buff[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Serial1.readBytes(soil_humidity_buff, 16);
float humidity = word(soil_humidity_buff[4], soil_humidity_buff[5]);
humidity = humidity / 10.0;
// Print received response for Humidity
Serial.print("Received response for Humidity: ");
for (int i = 0; i < 8; i++) {
Serial.print(soil_humidity_buff[i], HEX);
Serial.print(" ");
}
Serial.println();
delay(1000);
// Read Soil Temperature
preTransmission();
byte soil_temperature_request[] = { 0x01, 0x03, 0x00, 0x01, 0x00, 0x01, 0xd5, 0xca };
Serial1.write(soil_temperature_request, sizeof(soil_temperature_request));
Serial1.flush();
postTransmission();
byte soil_temperature_buff[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
Serial1.readBytes(soil_temperature_buff, 16);
float temperature = word(soil_temperature_buff[4], soil_temperature_buff[5]);
temperature = temperature / 10.0;
// Print received response for Temperature
Serial.print("Received response for Temperature: ");
for (int i = 0; i < 8; i++) {
Serial.print(soil_temperature_buff[i], HEX);
Serial.print(" ");
}
Serial.println();
// Print sensor parameters
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print("% ");
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print("°C ");
Serial.println();
delay(1000);
}
void preTransmission() {
digitalWrite(MAX485_RE_NEG, HIGH);
digitalWrite(MAX485_DE, HIGH);
}
void postTransmission() {
digitalWrite(MAX485_RE_NEG, LOW);
digitalWrite(MAX485_DE, LOW);
}
Below my yaml code:
esphome:
name: esp-jardin
friendly_name: ESP_JARDIN
esp32:
board: esp32dev
framework:
type: arduino
# Enable Home Assistant API
api:
encryption:
key: "xxxx"
ota:
password: "xxxx"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
domain: .totot.gt
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Esp-Vmc Fallback Hotspot"
password: "unFvoFHElM4h"
# Définition des capteurs
sensor:
# - platform: modbus_controller
# name: "Humidity"
# address: 0x01
# # register_type: holding
# # register_count: 2
# custom_command: [ 0x1, 0x3, 0x00, 0x1, 0x00, 0x1, 0xd5, 0xca]
# value_type: FP32
# unit_of_measurement: "%"
# accuracy_decimals: 1
# device_class: humidity
- platform: modbus_controller
modbus_controller_id: modbus_jardin
name: "Temperature"
address: 0x0001
register_type: holding
# register_count: 2
value_type: S_WORD
unit_of_measurement: "°C"
accuracy_decimals: 1
device_class: temperature
# Définition des broches UART
uart:
rx_pin: GPIO19
tx_pin: GPIO18
parity: NONE
baud_rate: 4800
id: uart_modbus
stop_bits: 1
debug:
direction: BOTH
dummy_receiver: false
after:
timeout: 1s
sequence:
- lambda: UARTDebug::log_hex(direction, bytes,' ');
# Configuration du MAX485 pour la réception
modbus:
id: modbus_id
uart_id: uart_modbus
flow_control_pin: GPIO2
modbus_controller:
id: modbus_jardin
modbus_id: modbus_id
update_interval: 10s
address: 0x1
# output:
# - platform: gpio
# pin: GPIO2
# id: max485_re_neg
# - platform: gpio
# pin: GPIO4
# id: max485_de
# Affichage des données sur la console série
logger:
level: VERY_VERBOSE
i have no response :
Modbus command to device=1 register=0x01 countdown=0 no response received - removed from send queue
Please if you have any advice,
Thank you