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

Postingan populer dari blog ini

Membuat akun blog

Konfigurasi Jaringan CCTV Hikvision dengan Mikrotik dan Bridge

C++ Life tech VT1 - VT 29