Monday, August 26, 2019

Scrolling Teks ke kanan pada Led Matriks Max7219 dengan Arduino

Pendahuluan

Kali ini saya akan membuat program atas permintaan rekan saya, untuk membuat scrolling tulisan ke kanan pada led matriks max7219 dengan Arduino. program ini menggunakan library maxmatrix yang dapat ditemui pada GitHub berikut : https://github.com/riyas-org/max7219/tree/master/MaxMatrix . pada awalnya saya mencari kode program yang sudah mungkin dibuat oleh orang lain di internet namun tidak menemukan. akhirnya saya coba membuat program sendiri  tanpa mencobanya langsung, karena saya tidak mempunyai alat tersebut. sehingga untuk menulis programnya saya hanya mengandalkan logika :).

kita mulai dari membuat Algoritma pemrograman untuk scrolling tulisan ke kanan. berikut Algoritmanya.

Algoritma

1. Reverse String

Input dari program yaitu string berbentuk char array, apabila scrolling ke kiri dimulai dari huruf awal sebuah string, maka untuk scrolling ke kanan dimulai dari huruf terakhir sebuah string. disini kita memerlukan pembalikan huruf pada input-an string. contoh jika input-an string-nya adalah "ABCD" maka jika dibalik menjadi "DCBA" untuk melakukan itu saya menggunakan potongan program berikut ini :

          char string1[] ="ABCD";
    char temp;
    int i = 0;
    int k = sizeof(string1)-2;
    int j = k/2;

    for (i=0; i
        temp = string1[i];
        string1[i] = string1[k];
        string1[k] = temp;
        k--;
      }

2. Ambil Tiap Huruf

untuk mengambil tiap huruf pada string kita bisa melempar setiap array ke sebuah fungsi untuk diproses. fungsi tersebut kita namakan dengan printCharWithShift(* s, speed_shift) dimana  pointer s merupakan char  yang akan diproses dan speed_shift adalah kecepatan geser dengan satuan detik. berikut potongan programnya :

// Extract characters from Scrolling text
void printStringWithShift(char* s, int shift_speed){
while (*s != 0){
printCharWithShift(*s, shift_speed);
s++;
}
}

3. Ambil Font Huruf yang sudah didefinisikan 

proses berikutnya kita akan mengambil font huruf yang sudah didefinisikan sebelumnya yaitu sebagai berikut : 

PROGMEM const unsigned char CH[] = {
3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
.........................
........................
};

caranya adalah dengan mengurangi nilai ASCII karakter tersebut dengan 32, 32 merupakan nilai ASCII untuk spasi, setelah didapat selisihnya kita kalikan dengan 7 karena setiap karakter terdiri dari 7 byte, maka 7 byte kedepan dari nilai yang dikalikan 7 tersebut merupakan font untuk karakter yang kita proses. misal angka 0 kode ASCII-nya yaitu 48 sehingga prosesnya seperti berikut :

48 - 32 = 16  == > menghitung nilai offset dari spasi
16 * 7 = 112   ==> menentukan index awal font karakter
112 + 6 = 118  ==> index akhir font karakter

maka CH[112] - CH[118] merupakan font karakter dari angka 0.

informasi yang terkandung dalam sebuah font yaitu :
index awal merupakan lebar font dan index kedua merupakan tinggi font, selebihnya 5 index berikutnya merupakan nilai disetiap kolom dari kiri ke kanan.

potongan program untuk melakukan hal tersebut yaitu :

char buffer[10];
.............
..............

void printCharWithShift(char c, int shift_speed){

if (c < 32) return;
c -= 32;
memcpy_P(buffer, CH + 7*c, 7);

.................
..................
}

potongan program di atas merupakan mengambil font karakter dan menyimpannya pada variable buffer.

4. Load font karakter dari kiri ke kanan

untuk melakukan ini, yaitu dengan mengambil kode kolom font yang terakhir dimasukan ke kolom pertama led matrix, kemudian delay dan geser kekanan dan masukan kembali font kedua dari terakhir ke kolom pertama led matrix, delay dan geser kekanan kembali begitu seterusnya sampai font kolom font tiba ke kolom yang pertama. untuk melakukan hal tersebut maka potongan programnya adalah sebagai berikut :

for (int i = buffer[0]+1; i > 1 ; i--)
{
m.setColumn(0, buffer[i]);
delay(shift_speed);
m.shiftRight(false, false);
}

lalu yang terakhir adalah membuat jeda satu kolom dengan membuat kolom pertama led matrix off semua dengan kode berikut :

delay(shift_speed);
m.setColumn(0, 0);
m.shiftRight(false, false);

itu adalah Algoritma untuk mengeser teks dari kiri kekanan pada Led Matriks 7219 dengan Arduino. Terima Kasih sudah membaca, tinggalkan komentar jika ingin bertanya.untuk melihat program lengkapanya, berikut dibawah ini

Kode Lengkap Source Code Arduino :


#include "MaxMatrix.h"
PROGMEM const unsigned char CH[] = {
3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // < 
3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // = 
3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @
4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash
2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat
4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
};
int data = 11; // DIN pin of MAX7219 module
int load = 10; // CS pin of MAX7219 module
int clock = 13; // CLK pin of MAX7219 module
int maxInUse = 4; //how many MAX7219 are connected
MaxMatrix m(data, load, clock, maxInUse); // define Library
byte buffer[20];
char string1[]="ASSalam";
void setup(){
m.init(); // module MAX7219
m.setIntensity(9); // LED Intensity 0-15

// reverse string 1 

    char temp;
    int i = 0;
    int k = sizeof(string1)-2;
    int j = k/2;

    for (i=0; i
        temp = string1[i];
        string1[i] = string1[k];
        string1[k] = temp;
        k--;
      
    }
}
void loop(){
printStringWithShift(string1, 100); // Send scrolling Text
delay(1000);
}
// Put extracted character on Display
void printCharWithShift(char c, int shift_speed){
if (c < 32) return;
c -= 32;
memcpy_P(buffer, CH + 7*c, 7);
for (int i = buffer[0]+1; i > 1 ; i--)
{
m.setColumn(0, buffer[i]);
delay(shift_speed);
m.shiftRight(false, false);
}
delay(shift_speed);
m.setColumn(0, 0);
m.shiftRight(false, false);
}
// Extract characters from Scrolling text
void printStringWithShift(char* s, int shift_speed){
while (*s != 0){
printCharWithShift(*s, shift_speed);
s++;
}
}