Jam HSV: Jam Digital Warna-Warna yang Dapat Disesuaikan untuk Penggemar Arduino
Komponen dan Perlengkapan
Arduino UNO × 1
Seeed 2.8" TFT Touch Shield (V1.0) × 1
Tentang Proyek
Saat terakhir kali mengunjungi AS, saya membeli Seeed 2.8" TFT Touch Shield (V1.0) dari RadioShack. Saya menggunakannya untuk membuat jam berwarna untuk ayah saya sebagai hadiah ulang tahun ke-80nya.
Wajah Jam (Clock Face)
Wajah jam didasarkan pada grid sel-sel persegi panjang. Sudut-sudut sel diubah sedikit secara acak, dan setiap sel dibagi oleh diagonal acak. Sebaran warna acak diterapkan di seluruh sel, dan setiap segitiga diberi bayangan untuk memberikan tampilan 3D. Secara internal, warna direpresentasikan sebagai HSV (Hue, Saturation & Value) lalu dikonversi ke RGB untuk dikirim ke LCD. Waktu ditampilkan dengan font sederhana melalui pewarnaan sel tertentu dengan warna komplementer.
Kotak Pelindung (Enclosure)
Kotak pelindung terbuat dari bambu yang dipotong laser, dirancang dengan Inkscape, dan dipotong oleh Ponoko.
Pemasangan
Karena shield tidak memiliki lubang pemasangan, saya secara efektif mencengkeramnya ke dalam kotak pelindung terhadap wajah depan. Arduino Uno menumpuk di atas shield melalui pin header.
RTC Eksternal
Saya membutuhkan akses I2C ke RTC eksternal (DS3232). Shield tidak mengekspos pin yang tidak terpakai, jadi saya menggunakan Uno yang memiliki pin SDA/SCL tambahan. Saya membuat konektor header rendah untuk pin-pin ini yang diletakkan di bawah shield. Saya mengambil daya dan ground dari konektor serupa pada pin ICSP, juga di bawah shield.
Dukungan Waktu Penyeberangan (Daylight Savings Time)
Saya menambahkan dukungan sederhana untuk Waktu Penyeberangan ke dalam sketsa (satu jam lagi yang harus diatur dua kali setahun!). Alih-alih menangani logika seperti “Minggu terakhir di September”, ia bergantung pada tabel kecil tanggal awal dan akhir spesifik untuk tahun-tahun mendatang (untuk Uusi Selandia dalam kasus saya).
Layar Sentuh (Touch Screen)
Saya menyederhanakan kode Touch library agar layar sentuh bertindak seperti grid tombol 4x4 yang di-debounce. Misalnya, waktu diatur dengan menyentuh sudut kiri bawah dan kanan atas.
Pengoptimalan Rendering
Saya melakukan upaya besar untuk mempercepat rendering: penggambaran ulang sel membutuhkan sekitar separuh detik. Rendering didasarkan pada penulisan baris piksel horizontal dengan warna tertentu. Saya menggunakan algoritma Bresenham yang dimodifikasi untuk menghitung ekstensi horizontal dari sejumlah pasang garis yang membentuk segitiga dalam suatu sel. Kode yang mengirim piksel ke LCD didasarkan pada library tetapi disisipkan, dibuka (unrolled), disederhanakan, dan dioptimalkan. Karena data warna piksel ditulis di seluruh beberapa PORTx, semua nilai telah dikomputasi sebelumnya saat warna dipilih, sehingga mengatur N piksel dalam baris ke warna tersebut lebih cepat.
Orientasi LCD
LCD digunakan dalam orientasi landscape. Saya kesulitan lama untuk membuat layar diperbarui dalam baris horizontal. Datasheet untuk pengontrolnya membingungkan. Ada perintah untuk mengatur lokasi “kursor”, “DRAM Horizontal/Vertical Address Set (R20h, R21h)”. Data piksel ditulis di lokasi kursor dan kursor diperbarui, membungkus ke baris berikutnya saat diperlukan, dll. Ada juga perintah untuk mengubah orientasi layar, “Entry Mode (R03h)”, yang juga membicarakan penyesuaian increment baris dan kolom kursor. Namun, saya menemukan bahwa mengubah orientasi menjadi Landscape lalu memosisikan kursor tidak berhasil. Solusi yang akhirnya saya temukan (yang mungkin tertutup dalam datasheet) adalah menggunakan perintah “window” alih-alih perintah kursor; “Horizontal and Vertical RAM Address Position (R50h, R51h, R52h, R53h)”. Pengaturan koordinat sudut kiri atas window berarti data piksel dimulai di sana dan diperbarui secara horizontal (dalam landscape).
Rangkaian
Rangkaian sederhana terdiri dari:
TFT shield dipasang pada Uno.
+5VDC, Ground, SDA & SDL dari pin yang diberi label pada Uno ke modul RTC. Ditampilkan dalam tiga foto pertama di bawah (shield dilepas). Perhatikan bahwa karena alasan akses, daya/ground berasal dari konektor ICSP1.