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

Postingan populer dari blog ini

Membuat akun blog

Konfigurasi Jaringan CCTV Hikvision dengan Mikrotik dan Bridge

C++ Life tech VT1 - VT 29