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.
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.