Jumat Menyelesaikan tugas selasa
Alat dan bahan
ESP 32
RS485
MD02
Wiring koneksi
Kode yang dipakai
#include <HardwareSerial.h>
#define HW_SERIAL 1 // pakai UART1 ESP32
HardwareSerial RS485(HW_SERIAL);
// --- CRC16 Modbus ---
uint16_t modbus_crc16(const uint8_t *buf, uint8_t len) {
uint16_t crc = 0xFFFF;
for (uint8_t pos = 0; pos < len; pos++) {
crc ^= (uint16_t)buf[pos];
for (int i = 0; i < 8; i++) {
if (crc & 0x0001) {
crc >>= 1;
crc ^= 0xA001;
} else {
crc >>= 1;
}
}
}
return crc;
}
// --- Baca register input dari MD02 ---
int read_input_regs(uint8_t dev_addr, uint16_t start_reg, uint16_t num_regs, uint8_t *result) {
uint8_t frame[8];
frame[0] = dev_addr; // alamat device
frame[1] = 0x04; // function code = Read Input Registers
frame[2] = start_reg >> 8; // start address high
frame[3] = start_reg & 0xFF; // start address low
frame[4] = num_regs >> 8; // num regs high
frame[5] = num_regs & 0xFF; // num regs low
uint16_t crc = modbus_crc16(frame, 6);
frame[6] = crc & 0xFF; // CRC low
frame[7] = crc >> 8; // CRC high
// kirim frame
RS485.write(frame, 8);
RS485.flush();
delay(100); // tunggu respon
// baca respon
uint8_t resp[32];
int len = RS485.readBytes(resp, sizeof(resp));
if (len < 5) return -1; // respon tidak valid
// cek CRC
uint16_t calc_crc = modbus_crc16(resp, len - 2);
uint16_t recv_crc = resp[len - 2] | (resp[len - 1] << 8);
if (calc_crc != recv_crc) return -2; // CRC error
memcpy(result, resp, len);
return len; // panjang data respon
}
void setup() {
Serial.begin(115200);
RS485.begin(9600, SERIAL_8N1, 16, 17); // RX=16, TX=17
Serial.println("MD02 RS485 Test");
}
void loop() {
uint8_t result[32];
int len = read_input_regs(0x01, 0x0001, 2, result); // dev addr=1, reg=1, jumlah=2
if (len > 0) {
// result[3..4] = suhu, result[5..6] = kelembaban (format 16-bit)
float temperature = (int16_t)((result[3] << 8) | result[4]) / 10.0;
float humidity = (int16_t)((result[5] << 8) | result[6]) / 10.0;
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %RH");
} else {
Serial.print("Read error: ");
Serial.println(len);
}
delay(2000);
}
Hasil dari kode data dari sensor dapat dibaca oleh esp32
Kesimpulan
Setelah beberapa kali percobaan saya mengalami beberapa kesalahan terutama dalam wiring koneksi antar perngkat
Komentar
Posting Komentar