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
2. RS485
4. Kabel Jumper (Male to male/Female to female/Male to female)
[3] Wiring
#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);
}
Komentar
Posting Komentar