Sebagai pembuka saya ingin berbagi bahwa sensor suhu inframerah memiliki beberapa kekurangan yang perlu dipertimbangkan:
1. **Akurasi terbatas**: Akurasi sensor suhu inframerah dapat dipengaruhi oleh berbagai faktor seperti emisivitas objek yang diukur, suhu lingkungan, kelembaban, dan jarak sensor dari objek. Hal ini dapat mengakibatkan pembacaan yang kurang tepat dibandingkan dengan sensor suhu kontak.
2. **Efek permukaan**: Sensor suhu inframerah mengukur suhu permukaan objek. Hal ini dapat menjadi kelemahan ketika berurusan dengan material dengan konduktivitas termal rendah atau permukaan yang tidak merata dalam suhu. Misalnya, permukaan yang mengkilap atau reflektif dapat memantulkan radiasi inframerah lingkungan, menyebabkan pembacaan yang tidak akurat.
3. **Rentang terbatas**: Beberapa sensor suhu inframerah memiliki rentang pengukuran yang terbatas, yang mungkin tidak sesuai untuk semua aplikasi. Sebagai contoh, beberapa sensor mungkin tidak dapat mengukur suhu yang sangat tinggi atau rendah dengan akurat.
4. **Waktu respons**: Sensor suhu inframerah mungkin memiliki waktu respons yang lebih lambat dibandingkan dengan sensor suhu kontak, terutama ketika mengukur suhu yang berubah dengan cepat atau objek yang bergerak.
5. **Interferensi lingkungan**: Faktor lingkungan seperti asap, debu, atau partikel lainnya di udara dapat mengganggu pengukuran suhu inframerah, menyebabkan ketidakakuratan.
6. **Biaya**: Sensor suhu inframerah dapat lebih mahal dibandingkan dengan sensor suhu kontak, terutama untuk model presisi tinggi atau yang memiliki fitur canggih.
7. **Kalibrasi**: Kalibrasi berkala diperlukan untuk menjaga akurasi sensor suhu inframerah. Hal ini membutuhkan peralatan dan keahlian khusus, menambah biaya dan kompleksitas penggunaan sensor tersebut.
8. **Kedalaman penetrasi terbatas**: Radiasi inframerah hanya dapat menembus permukaan objek yang diukur sampai kedalaman tertentu. Hal ini dapat menjadi keterbatasan ketika mengukur suhu material tebal atau tidak tembus pandang.
Meskipun memiliki kelemahan-kelemahan ini, sensor suhu inframerah tetap banyak digunakan dalam berbagai industri karena sifat non-kontaknya, kemudahan penggunaan, dan kecocokannya untuk beberapa aplikasi tertentu.
Praktek kita kali ini menggunakan TTL to RS485 agar data modbus dari sensor suhu infra red (bisa baca dulu
disini untuk belajar cara akses sensor ini), dapat diubah level tegangan nya. Dan beberapa tulisan saya mengenai Modbus telah membahas juga namun kebetulan sekali ini adalah kali pertama saya membaca alat modbus menggunakan arduino uno sebagai master. Sebelumnya saya menggunakan esp8266 sebagai master modbus IOT dan arduino micro sebagai slave modbus, bisa dibaca
disini dan
disini .
Prinsip parsing data modbus pada pembahasan saya terdahulu tahun 2020 (jaman pandemi) seperti script berikut ini :
void loop()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= 5000) {
// timer baca dht11 tiap 5 detik
previousMillis = currentMillis;
//kirim perintah ke modbus baca dht 11
mod.write(humitemp, sizeof(humitemp));
}
//check modbus timeout
long millisResponModbus = millis() + 1000;
while (!mod.available())
{
if (millisResponModbus < millis())
{
break;//timeout
}
}
// baca data serial yang masuk dari modbus lalu simpan pada pointer
while (mod.available())
{
byte b = mod.read();
*ptr++ = b;
Serial.print("0x");
Serial.print(String(b, HEX));
Serial.print(" ");
delay(2);
}
//proses komparasi data yg masuk (DHT11) dengan array jawaban lalu parsing
if (memcmp(bufferDataModbus, dhtOK, sizeof(dhtOK)) == 0) {
ptr = bufferDataModbus;
Serial.println("");
Serial.print(F("SUHU :"));
Serial.print(ptr[4]); //alamat byte ke 4
Serial.print(F(","));
Serial.print(ptr[6]); //alamat byte ke 6
Serial.print(F(" C HUMI :"));
Serial.print(ptr[8]); //alamat byte ke 8
Serial.println(" %");
memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus));
}
}
Jadi script diatas dulu itu akan menunggu membaca data OK berdasarkan Check Sum / CRC modbus 16bit. Namun sepertinya itu bisa diabaikan karena hampir error jarang sekali terjadi. Jadi untuk membaca sensor suhu RS-WD-HW-N01 RS485, kira kira scriptnya seperti berikut :
/* Cara baca Sensor Suhu Infra merah
type : RS-WD-HW-N01 RS485
www.aisi555.com
ahocool@gmail.com
*/
#include <SoftwareSerial.h>
SoftwareSerial mod(12, 10); // RX, TX ke rs485
//perintah baca suhu, baca penjelasan di blog
byte baca[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};
byte bufferDataModbus[10];
byte *ptr;
int incomingByte ;
int suhune, puluhan, satuan;
bool terima = false;
unsigned long previousMillis = 0;
void setup() {
Serial.begin(9600);
Serial.println(F("Testing Sensor Infra Ke Serial"));
Serial.println(F("http://www.aisi555.com"));
Serial.println();
//baud rate default 4800
mod.begin(4800);
ptr = bufferDataModbus;
}
void loop() {
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= 5000) {
// timer baca sensor tiap 5 detik
previousMillis = currentMillis;
//kirim perintah ke modbus baca sensor
mod.write(baca, sizeof(baca));
}
//check modbus timeout
long millisResponModbus = millis() + 1000;
while (!mod.available())
{
if (millisResponModbus < millis())
{
break;//timeout
}
}
// baca data serial yang masuk dari modbus lalu simpan pada pointer
while (mod.available())
{
byte b = mod.read();
*ptr++ = b;
Serial.print("0x");
Serial.print(String(b, HEX));
Serial.print(" ");
delay(1);
terima = true;
}
//parsing data suhu dan tampilkan di serial debug
if (terima){
ptr = bufferDataModbus;
suhune = (ptr[3] *256) + ptr[4];
puluhan = suhune / 10;
satuan = suhune % 10;
Serial.print("Suhu = ");
Serial.print(puluhan);
Serial.print(",");
Serial.print(satuan);
Serial.println(" Celcius");
memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus));
terima =false;
}
}
Hasil dari tangkapan layar debug seperti ini :
Data suhu yang akan dibaca adalah data ke-4 (0x1) dan data ke-5 (0x3E). Data lainnya bisa diabaikan, sehingga rumus parsing saya dilakukan dengan script berikut:
if (terima){
ptr = bufferDataModbus; // pindahkan data
//ini rumus sederhana untuk merubah 2byte modbus jadi desimal
suhune = (ptr[3] *256) + ptr[4]; //pointer memori mulai dari nol
puluhan = suhune / 10;
satuan = suhune % 10;
Serial.print("Suhu = ");
Serial.print(puluhan);
Serial.print(",");
Serial.print(satuan);
Serial.println(" Celcius");
//bersihkan memori
memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus));
terima =false;
}
Sehingga secara gampangannya , 0x01 merupakan High Byte sehingga dapat dikalikan 256 (desimal) untuk mendapatkan nilai desimal High Byte, sedangkan 0x3E (Low Byte) bernilai desimal 62, dan selanjutnya tinggal ditambahkan saja yaitu 256 + 62 = 318. Ini cocok hasilnya dengan hexa 0x13E. Sebenernya ada cara lebih "elegan" yaitu dengan geser byte ke kiri, namun saya yakin pembaca akan tambah bingung.