Lompat ke konten Lompat ke sidebar Lompat ke footer

Arduino part 13. Cara membuat Running Text dot matrix (8x32)

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.

Untuk membuat suatu running teks kita membutuhkan alat dan komponen antara lain:

  • Modul dot matriks MAX7219 (8x32)
  • Arduino Uno
  • Potensiometer 10 KΩ
  • Kabel jumper
  • Komputer/ PC




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();
}

Kalau sudah diketik programnya maka silahkan lakukan verify guna memastikan ada tidaknya kesalahan dalam pengetikan sketch program. Jika program sukses maka teks akan berjalan dan untuk mengatur kecepatannya bisa diputar  potensiometernya.

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.

Hasil akhir penyalaannya bisa di lihat pada video ini :

Demikianlah cara membuat running teks dari dot matrix. Silahkan tulislah dikolom komentar jika ada yang ingin ditanyakan atau di diskusikan.

2 komentar untuk "Arduino part 13. Cara membuat Running Text dot matrix (8x32)"