วิธีใช้ RS485 High Precision SHT20 Temperature Humidity Sensor

Somsak Lima
5 min readNov 6, 2020

--

สั่งซื้อ Sensor SHT20 แบบ RS485 ได้จากเวป Aliexpress คลิก

คู่มือการใช้ คลิก

การทดสอบกับ PC ต้องมี USB-RS485 Adapter โดยเชื่อมสายไฟตามรูป

สายไฟสีแดง — +5V
สายไฟสีดำ — -5V
สายไฟสีเหลือง — A
สายไฟสีขาว — B

1.การอ่านค่า Temp แบบ Modbus ด้วยโปรแกรม CAS Modbus Scanner

Download โปรแกรม CAS Mobus Scanner จากเวป https://store.chipkin.com/products/tools/cas-modbus-scanner

เรียกโปรแกรม CAS Modbus Scanner

คลิกขวาที่ช่างว่างด้านซ้ายจะเห็นคำว่า Add Connection

จะมีหน้าต่าง Add Connection ปรากฎขึ้นมา

เลือก Serial Port ที่ถูกต้อง Baud rate 9600, Data bits 8, Stop Bits 1, Parity None แล้วคลิก Add Serial Connection

คลิกบรรทัด COM แล้วคลิกขวาเลือก Add Device

ใส่ Slave ID เป็น 1แล้วคลิก Add Device

คลิกขวาที่ Device แล้วเลือก Add task

เลือก 04 Read Input register (3xxxx) Offset 2 Length 2

เริ่มอ่านตำแหน่งที่ 2 จำนวน 2 ค่า

ให้กดเลือกบรรทัด Read Input แล้วคลิกที่ Poll

จะเห็นข้อมูลที่อ่านจาก Sensor ได้ 2 ค่าคือ HEX 0x0135 และ 0x021A

หรือ int 16 คือ 309 และ 538 ซึ่งเท่ากับ 30.9 องศา และ 53.8 % RH

นอกจากนั้นแล้ว CAS Modbus Scanner ยังสามารถใช้ ฟังงค์ชั่น SCAN เพื่อหา Device ที่เชื่อมอยู่บน Bus ได้

โดยคลิกที่ Discover ดูละเอียดได้จาก คลิก

2.การอ่านค่า Temp แบบ Modbus ด้วยโปรแกรม qModMaster 0.5.2–3 (ไม่ควรใช้ Beta มี bug)

ดาวน์โหลดได้จาก เวป https://sourceforge.net/projects/qmodmaster/

คลิกลิ้งค์ https://sourceforge.net/projects/qmodmaster/files/qModMaster-Win32-exe-0.5.2-3.zip/download

แตกไฟล์ในโฟดเดอร์แล้วเรียกใช้งานโปรแกรม qmodmaster.exe

คลิกเลือกรูป Port (Modbus RTU) แล้วเลือก Port Serial ให้ถูกต้อง

Function Code เลือก Read Input Register (0x04) แก้ Number of Coils เป็น 2

ให้คลิก รูป terminal (Bus Monitor)

จะมีหน้าต่าง Bus Monitor Popup ขึ้นมา

คลิก Connect

คลิก READ/WRITE

ดูหน้าจอ ฺBUS/MASTER

จะเห็นข้อมูล RX ดังนี้คือ 01 04 04 01 36 02 17 5B 18

แปลงจาก 0x0136 ไปเป็น DEC หารด้วย 10 จะได้ค่าอุณหภูมิ

แปลงจาก 0x0217 ไปเป็น DEC หารด้วย 10 จะได้ค่าความชื้น

3. การอ่านค่า Temp แบบ Serial

ดาวน์โหลดโปรแกรม Hercules SETUP utility ได้ที่ คลิก
เรียกใช้โปรแกรม

เลือก TAB Serial

กำหนด Port Serial ให้ตรงแล้วคลิก Open

ในช่อง Send ให้พิมพ์ READ เสร็จแล้วคลิก Send

จะเห็นค่าอุณหภูมิที่อ่านได้และค่าความชืื้นตามตัวอย่างคือ 28.7 องศา และ Humid 52.9%

แสดงว่าอุปกรณ์ Sensor ทำงานปรกติ

เปลี่ยนคำสั่งเป็น PARAM จะเป็นข้อมูลดังภาพ

อ่านค่าจาก Sensor ด้วย ESP32 Dev Board

ตัวอย่างการเชื่อมต่อ
การเชื่อมต่อกับ ESP32 จะใช้อุปกรณ์ที่เรียกว่า RS485-TTL ดูตัวอย่างได้จาก คลิก

เชื่อมไป 5V และ GND เข้า VCC กับ GND ตามลำดับ
สายสีเหลืองจาก Sensor เชื่อมกับ A+
สายสีขาวจาก Sensor เชื่อมกับ B-
TX เข้า P17 ของ ESP32
RX เข้า P16 ของ ESP32

โปรแกรมตัวอย่างและ Arduino Lib
ดาวน์โหลด Library ได้จาก คลิก ตัวอย่างที่มากับ Library ใช้กับ Software Serial
แก้ไขโปรแกรมตัวอย่าง.ให้ใช้ Hardware Serial ของ ESP32 Dev Board ดังต่อไปนี้

/* Modified From https://robokits.co.in
*/
#include <ModbusMaster.h>
#define RXD2 16
#define TXD2 17
#define MODBUS_DATA_TRANSACTION_PIN 8 //DE & RE Pin of MAX485
ModbusMaster node; //object for ModbusMaster
short a1,a2,a3,a4;
short b1,b2;
uint8_t Slave_ID = 1; //Slave ID of the Sensor
void setup()
{
pinMode(MODBUS_DATA_TRANSACTION_PIN, OUTPUT);
digitalWrite(MODBUS_DATA_TRANSACTION_PIN, 0);
Serial.begin(57600); //Baud rate is 57600 8N1
Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
node.begin(Serial2);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
Serial.println("Temperature And Humidity Sensor");
Serial.print("Slave ID :");
Serial.println(Slave_ID);
}
void loop()
{
a3 = node.readInputRegisters(Slave_ID, 1, 1);
b1 = node.getResponseBuffer(0);
delay(2);
node.clearResponseBuffer();
a4 = node.readInputRegisters(Slave_ID, 2, 1);
b2 = node.getResponseBuffer(0);
delay(2);
node.clearResponseBuffer();

Serial.print("Temperature :");
//if value is 293 that means it is 29.3℃ temperature
Serial.print(b1,1);
Serial.print("\t\tHumidity :");
//if value is 493 that means it is 49.3% humidity
Serial.println(b2,1);
}
void preTransmission()
{
digitalWrite(MODBUS_DATA_TRANSACTION_PIN, 1);
}
void postTransmission()
{
digitalWrite(MODBUS_DATA_TRANSACTION_PIN, 0);
}

ผลจากการ RUN ดูจาก Serial monitor ที่ Speed 57600bps

ค่าที่ได้จะต้องหารด้วย 10 จึงจะเป็นค่าจริง

Sensor นอกจากสีดำที่ยกตัวอย่างมาอาจเลือกใช้ XY-MD02 ตามรูปก็ได้ ้การใช้งานกับโปรแกรมก็ใช้แบบเดียวกัน

ศึกษาเพิ่มเติม

คู่มือการใชงาน Modbus RTU Sensor H/T V2 คลิก
Temperature and humidity transmitter SHT20 sensor Modbus RS485 คลิก
ROBOKITS INDIA คลิก
How to work with RS485 interface on ESP32 คลิก
Using an Arduino to read a simple MODBUS/RTU RS-485 sensor คลิก
Overview of a simple MODBUS/RTU RS-485 temperature sensor คลิก
MODBUS and RS485 — a Python test rig คลิก
Modbus communication in Raspberry Pi คลิก
Complete Modbus Guide คลิก
Arduino / ESP8266 RS485 MODBUS Anemometer คลิก
[Industrial Communications] Modbus Protocol คลิก
python modbus realizes RTU communication คลิก
MODBUS-RTU data frame format and message example คลิก

สรุป

เราสามารถอ่านค่าที่ได้จาก Sensor แล้วส่งด้วย LoRaWAN ขึ้น Dashboard ได้ ซึ่งจะสามารถติดตามค่าต่างๆ แบบ Real time

--

--

Somsak Lima
Somsak Lima

Written by Somsak Lima

สนับสนุนและส่งเสริมให้ผู้สนใจสามารถใช้งานเทคโนโลยี LoRa และ LoRaWAN ได้ โดยนำความรู้ที่ได้ไปต่อยอดเพื่อใช้งาน

Responses (1)