Untuk membuat teks berjalan atau running text kita
bisa menggunakan dot matrix led yang dikendalikan oleh arduino uno. Dot matriks
yang kita gunakan adalah 4 buah modul dot matrix MAX7219 disusun secara horisontal sehingga akan menjadi dot matrix dengan ukuran 8X32.
Jika
ingin lebih panjang lagi bisa ditambah lagi. Hasil running text nya akan tampil
seperti ini:
Dot Matrix led bisa menampilkan karakter seperti
gambar, huruf atau angka. Jika anda ingin mendesign sendiri bentuk gambar
seperti gambar emoji dll anda bisa baca di link ini : emoji dot matrix
Di dalam program running teks ini kita tidak perlu
lagi mendesign sendiri karakter huruf dan angkanya karena sudah disediakan oleh
librarynya. Jadi cukup mengetikkan teks dalam bentuk angka/huruf yang kita
inginkan ke dalam program. Teks yang tampil juga bisa diubah-ubah caranya cukup ketikkan teks yang kita inginkan di dalam serial
monitor. Sehingga tugas kita lebih sederhana saat ingin mebuat teks, mengganti teks atau angkanya.
Setelah alat dan komponennya lengkap silahkan rakit
rangkaiannya seperti pada gambar di bawah ini:
Pada rangkaian di atas terlihat ada komponen potensiometer. Fungsi potensiometer adalah untuk mengatur kecepatan running teksnya. Saat potensiometer diputar ke kiri maka kecepatannya akan lambat dan saat diputar ke kanan maka running teksnya akan semakin cepat.
Jika rangkaian sudah dirakit maka lakukan
pengetikan sketch programnya. Langkah pertama sebelum megetikkan sketch program
kita harus kita harus meng-install dulu library arduinonya khusus untuk driver
MAX7219 dengan cara pilih tool >>
library manager >> lalu install MD_MAX72XX. Setelah selesai
menginstall lalu lanjutkan mengetik
sketch programnya.
Jika anda tidak ingin susah mengetik sketch programnya maka
bisa mengambil contoh sketch program yang
sudah ada. Caranya buka File >> examples >> MD_MAX72XX >>
MD_MAX72XX_Message-Serial. Hanya saja ada beberapa perintah yang harus kita modifikasi
seperti contoh berikut ini :
//
----------------------------------------------------------------------
// Running Text by Hendry Kurniawan,S.Pd
// www.elektronikahendry.com
//
----------------------------------------------------------------------
#include <MD_MAX72xx.h>
#include <SPI.h>
#define IMMEDIATE_NEW 0
#define USE_POT_CONTROL 1
#define PRINT_CALLBACK 0
#define PRINT(s, v) { Serial.print(F(s));
Serial.print(v); }
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN
13
#define DATA_PIN
11
#define CS_PIN
10
// SPI hardware interface
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN,
MAX_DEVICES);
// Arbitrary pins
//MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE,
DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
// Scrolling parameters
#if USE_POT_CONTROL
#define SPEED_IN
A5
#else
#define SCROLL_DELAY 75 //
in milliseconds
#endif // USE_POT_CONTROL
#define CHAR_SPACING 1 // pixels between characters
// Global message buffers shared by Serial and
Scrolling functions
#define BUF_SIZE
75
uint8_t curMessage[BUF_SIZE] = {
"www.elektronikahendry.com" }; //teks ini bisa diganti
uint8_t newMessage[BUF_SIZE];
bool newMessageAvailable = false;
uint16_t
scrollDelay; // in milliseconds
void readSerial(void)
{
static
uint8_t putIndex = 0;
while
(Serial.available())
{
newMessage[putIndex] = (char)Serial.read();
if
((newMessage[putIndex] == '\n') || (putIndex >= BUF_SIZE-3)) // end of
message character or full buffer
{
// put
in a message separator and end the string
newMessage[putIndex++] = ' ';
newMessage[putIndex] = '\0';
//
restart the index for next filling spree and flag we have a message waiting
putIndex = 0;
newMessageAvailable = true;
}
else if
(newMessage[putIndex] != '\r')
// Just
save the next char in next location
putIndex++;
}
}
void scrollDataSink(uint8_t dev,
MD_MAX72XX::transformType_t t, uint8_t col)
// Callback function for data that is being
scrolled off the display
{
#if PRINT_CALLBACK
Serial.print("\n cb ");
Serial.print(dev);
Serial.print(' ');
Serial.print(t);
Serial.print(' ');
Serial.println(col);
#endif
}
uint8_t scrollDataSource(uint8_t dev,
MD_MAX72XX::transformType_t t)
// Callback function for data that is required for
scrolling into the display
{
static
uint8_t* p = curMessage;
static enum
{ NEW_MESSAGE, LOAD_CHAR, SHOW_CHAR, BETWEEN_CHAR } state = LOAD_CHAR;
static
uint8_t curLen, showLen;
static
uint8_t cBuf[15];
uint8_t
colData = 0; // blank column is the
default
#if IMMEDIATE_NEW
if
(newMessageAvailable) // there is a new
message waiting
{
state =
NEW_MESSAGE;
mx.clear(); // clear the display
}
#endif
// finite
state machine to control what we do on the callback
switch(state)
{
case
NEW_MESSAGE: // Load the new message
memcpy(curMessage, newMessage, BUF_SIZE); // copy it in
newMessageAvailable = true; //
used it!
p =
curMessage;
state =
LOAD_CHAR;
break;
case
LOAD_CHAR: // Load the next character from the font table
showLen
= mx.getChar(*p++, sizeof(cBuf)/sizeof(cBuf[0]), cBuf);
curLen
= 0;
state =
SHOW_CHAR;
// if
we reached end of message, opportunity to load the next
if (*p
== '\0')
{
p =
curMessage; // reset the pointer to
start of message
#if !IMMEDIATE_NEW
if
(newMessageAvailable) // there is a new
message waiting
{
state = NEW_MESSAGE; // we will
load it here
break;
}
#endif
}
// !!
deliberately fall through to next state to start displaying
case
SHOW_CHAR: // display the next part of the character
colData
= cBuf[curLen++];
if
(curLen == showLen)
{
showLen = CHAR_SPACING;
curLen = 0;
state
= BETWEEN_CHAR;
}
break;
case
BETWEEN_CHAR: // display inter-character spacing (blank columns)
colData
= 0;
curLen++;
if
(curLen == showLen)
state
= LOAD_CHAR;
break;
default:
state =
LOAD_CHAR;
}
return(colData);
}
void
scrollText(void)
{
static
uint32_t prevTime = 0;
// Is it
time to scroll the text?
if
(millis()-prevTime >= scrollDelay)
{
mx.transform(MD_MAX72XX::TSL); //
scroll along - the callback will load all the data
prevTime
= millis(); // starting point for
next time
}
}
uint16_t getScrollDelay(void)
{
#if USE_POT_CONTROL
uint16_t
t;
t =
analogRead(SPEED_IN);
t = map(t,
0, 1023, 250, 25);
return(t);
#else
return(SCROLL_DELAY);
#endif
}
void setup()
{
mx.begin();
mx.setShiftDataInCallback(scrollDataSource);
mx.setShiftDataOutCallback(scrollDataSink);
#if USE_POT_CONTROL
pinMode(SPEED_IN, INPUT);
#else
scrollDelay
= SCROLL_DELAY;
#endif
newMessage[0] = '\0';
Serial.begin(57600);
Serial.print("\n[MD_MAX72XX Message Display]\nType a message for
the scrolling display\nEnd message line with a newline");
}
void loop()
{
scrollDelay
= getScrollDelay();
readSerial();
scrollText();
}
Untuk merubah tampilan teks maka
bisa dilakukan melalui serial monitor. Atur kecepatan baudratenya sebesar 57600 setelah itu ketiklah teks baru yang akan kita tampilkan lalu tekan enter.
Teks baru yang
kita ketikkan di serial monitor tidak akan tersimpan secara permanen, jadi teks hanya
tampil selama arduino menyala saja. Teks perubahan ini akan terhapus jika arduinonya
di reset atau di matikan. Untuk membuat teks permanen yang tampil di awal maka bisa kita
ketikkan langsung saja ke dalam program, bukan di serial monitor.
Demikianlah cara membuat running
teks dari dot matrix. Silahkan tulislah dikolom komentar jika ada yang ingin
ditanyakan atau di diskusikan.
Mantaap...
BalasHapusTerimakasih
Hapus