Sambungan dari praktek membaca sensor suhu infra red RS-WD-HW-N01 yang saya bahas sebelumnya disini , saya akan ajarkan bagaimana menampilkan suhunya di dot matrix display P10. Display dot matrix ini paling umum digunakan di layar sekolah, toko, masjid dll, ini sangat banyak yang membahas di blog maupun youtube, dengan harga yang sangat murah (menyebabkan 10 tahun lalu saya berhenti jadi pengrajin display led matrix), namun kali ini kebetulan ada proyek dan akan saya bagi ilmunya secara perlahan.
PINOUT
Pinoutnya berupa header 2x8 dan beberapa seller online shop diluar sana menjual header converter ke arduino uno seperti gambar diatas. Jika ingin buat sendiri tentunya tidak akan menjadi kesulitan. Untuk tegangan 5 volt sebaiknya diberikan terpisah dari arduino dengan adaptor 5v yang mempunyai ampere lebih tinggi.
LIBRARY
Library asli dibuat oleh produsen aslinya yaitu FREETRONICS dan dapat di unduh disini. Pemilihan portnya berbasiskan port SPI dimana akan memanfaatkan 2 pin MOSI (13) dan SCK (11). Sedangkan pemilihan pin OE (output enable) harus berhubungan dengan timer1 sehingga kakinya jangan dirubah dari nomer 9.
Untuk menambahkan font yang lebih keren, beberapa pengembang elektronika mikrokontroller di Indonesia berkreasi dengan library DMD3 yang bisa di googling sendiri.
SCRIPT
Saya bagi aja langsung dan semoga bermanfaat untuk belajar kalian maupun tugas di sekolah/kampus.
/* Sensor Suhu Infra merah Tampilan ke Led Matrix P10 type : RS-WD-HW-N01 RS485 www.aisi555.com ahocool@gmail.com */ #include "BIG7SEGMENT.h" #include "DMD3.h" #include "DejaVuSans9.h" #include "bmz9.h" #include "bmz6x7.h" #include <SoftwareSerial.h> SoftwareSerial mod(12, 10); // RX (A) , TX (B) ke rs485 sensor DMD3 display (1,1); byte baca[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};//perintah baca suhu byte bufferDataModbus[18]; byte *ptr; int incomingByte ; int suhune, puluhan, satuan; bool terima = false; unsigned long previousMillis = 0; char dmdBuff1[10]; //Suhu Digit Depan koma char dmdBuff2[10]; //belakang koma void scan() { display.refresh(); } void setup() { Serial.begin(9600); Serial.println(F("Sensor infra red ke p10")); Serial.println(F("http://www.aisi555.com")); Serial.println(); mod.begin(4800); ptr = bufferDataModbus; Timer1.initialize(1350); Timer1.attachInterrupt(scan); Timer1.pwm(9,255); } void loop() { unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= 5000) { // timer baca sensor tiap 5 detik previousMillis = currentMillis; //kirim perintah ke modbus baca suhu 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(2); terima = true; } 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; display.clear(); //tulis suhu ke p10 display.setFont(BIG7SEGMENT); sprintf(dmdBuff1, "%.2d", puluhan); sprintf(dmdBuff2, "%.1d", satuan); display.drawText(0, 0, dmdBuff1); display.setFont(bmz9); display.drawText(26, -1, "C"); display.drawRect(22,1,24,3,1); display.setFont(bmz6x7); display.drawRect(22,13,23,14,1); display.drawText(25, 8 , dmdBuff2); } }
0 komentar:
Posting Komentar