Rabu Melanjutkan kemarin Cek modul MD02 menggunakan RS405 dan ESP32
Alat dan bahan
ESP 32
RS485
MD02
Kode yang dipakai
#include <HardwareSerial.h>
#define HW_SERIAL 1 // Serial1 di ESP32
HardwareSerial RS485(HW_SERIAL);
#define REDE_PIN 4 // Pin kontrol DE/RE
void setup() {
Serial.begin(115200);
RS485.begin(9600, SERIAL_8N1, 17, 16); // TX=17, RX=16
pinMode(REDE_PIN, OUTPUT);
digitalWrite(REDE_PIN, LOW); // default ke mode receive
}
uint16_t calc_modbus_crc(const byte* data, size_t len) {
uint16_t crc = 0xFFFF;
for (size_t i = 0; i < len; i++) {
crc ^= data[i];
for (int j = 0; j < 8; j++) {
if (crc & 1) {
crc >>= 1;
crc ^= 0xA001;
} else {
crc >>= 1;
}
}
}
return crc;
}
int read_input_regs(byte dev_addr, byte func_code, uint16_t start_reg_addr, size_t num_regs, byte *result) {
byte req_frame[8] = { dev_addr, func_code,
(start_reg_addr >> 8) & 0xFF, start_reg_addr & 0xFF,
(num_regs >> 8) & 0xFF, num_regs & 0xFF, 0x00, 0x00 };
uint16_t crc = calc_modbus_crc(req_frame, 6);
req_frame[6] = crc & 0xFF;
req_frame[7] = (crc >> 8) & 0xFF;
RS485.flush();
// --- Mode kirim
digitalWrite(REDE_PIN, HIGH);
RS485.write(req_frame, 8);
RS485.flush();
delay(5); // biar semua data terkirim
// --- Balik ke mode terima
digitalWrite(REDE_PIN, LOW);
// Tunggu balasan sensor
delay(100);
byte resp_frame[32] = {0};
size_t resp_frame_len = RS485.readBytes(resp_frame, sizeof(resp_frame));
if (resp_frame_len < 5) { // minimal: addr + func + len + 2byte data + crc
Serial.println("❌ Tidak ada respons dari sensor!");
return -1;
}
uint16_t expected_crc = (resp_frame[resp_frame_len - 1] << 8) | resp_frame[resp_frame_len - 2];
uint16_t calculated_crc = calc_modbus_crc(resp_frame, resp_frame_len - 2);
if (calculated_crc == expected_crc) {
memcpy(result, resp_frame, resp_frame_len);
return resp_frame_len;
} else {
Serial.print("❌ CRC Error: ");
Serial.print(calculated_crc, HEX);
Serial.print(" != ");
Serial.println(expected_crc, HEX);
return -1;
}
}
void loop() {
static uint8_t dev_addr = 1; // default alamat modbus SHT20 biasanya 1
byte result[32] = {0};
if (read_input_regs(dev_addr, 0x04, 0x0001, 2, result) > 0) {
int16_t temp = (result[3] << 8) | result[4];
int16_t humid = (result[5] << 8) | result[6];
float temperature = temp / 10.0f;
float humidity = humid / 10.0f;
Serial.println("✅ Data dari Sensor:");
Serial.print("📌 Device Address: "); Serial.println(dev_addr);
Serial.print("🌡 Temperature: "); Serial.print(temperature); Serial.println(" °C");
Serial.print("💧 Humidity: "); Serial.print(humidity); Serial.println(" %RH");
} else {
Serial.println("❌ Sensor gagal dibaca!");
}
Serial.println("----------------------");
delay(1000);
}
Contoh berhasil tapi karena terkadang data dari sensor terbaca dan error berarti kemungkinan komunikasi RS485 antara ESP32 dan sensor tidak selalu stabil. Ada beberapa kemungkinan penyebabnya seperti wiring antara RS485 dan ESP32 tidak stabil
Kesimpulan
Hasil dari percobaan yang saya lakukan tidak berhasil dan perlu beberapa hal ulang perlu diperbaiki terutama
Wiring koneksinya
Komentar
Posting Komentar