SHT20

[1] Pembukaan


SHT20 adalah sensor suhu dan kelembaban digital berakurasi tinggi yang dikembangkan oleh Sensirion, menggunakan protokol komunikasi RS485 dan umumnya dalam format Modbus RTU untuk transmisi data yang andal pada jarak jauh.

yang dimana selama hari Selasa-Jumat saya telah mengalami kegagalan beberapa dikarenakan sensor tidak bsa membaca data yang dikirim dan Data yang dibaca sensor hasilnya tidak sesuai dan terus mengalami loop. 


[2] Tugas

Sensor SHT20 bisa membaca data suhu


[3] Komponen Yang di Butuhkan

1. Sensor SHT20


2. RS485


3, ESP32 


4. Kabel Jumper (Male to male/Female to female/Male to female)




[3] Wiring




[4] Code

#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);
}


[5] Bukti Berhasil




















































































Komentar

Postingan populer dari blog ini

Desain PCB Menggunakan EasyEDA

Cara kerja PZEM beserta fungsinya

Life Tech