#include <Adafruit_NeoPixel.h>
#include <font5x7.h>
// Penentuan lebar dan tinggi
const byte lebar = 8;
const byte tinggi = 8;
// Deklarasi objek strip
Adafruit_NeoPixel strip((lebar * tinggi), 8, NEO_GRB + NEO_KHZ800);
// Penentuan tulisan / running text
String tulisan = "selamat datang";
// Perhitungan jumlah modul untuk dibuatkan array bitmap
const byte jumlahModul = lebar/8;
byte bitmap[tinggi][jumlahModul];
// Penentuan konfigurasi scrolling dan variabelnya
int scrollSpeed = 70; // Atur ini untuk mengubah kecepatan
unsigned long scrollTiming = 0;
int scrollStep = 0;
// Fungsi untuk melakukan scrolling text
void scrollingText() {
// Melakukan pergeseran bitmap kekiri disetiap [scrollSpeed] milidetik
if (millis() - scrollTiming >= scrollSpeed) {
scrollTiming = millis();
scrollStep++;
// Mereset scroll step jika melebihi jumlah lebar karakter (6 kolom + jarak antar karakter)
// (Scroll step digunakan untuk mengetahui karakter mana yang akan di print berdasarkan sejauh mana pergeseran)
if (scrollStep > tulisan.length() * 6) scrollStep = 1;
uint8_t charIndexScreen = floor((scrollStep - 1) / 6); // Indeks karakter dari variabel tulisan
uint8_t charIndex = tulisan[charIndexScreen] - 32; // Indeks karakter berdasarkan kode ASCII yang ada di library font5x7
uint8_t col = (scrollStep - 1) % 6; // Kolom dari setiap karakter yang akan di print (juga berdasarkan pergeseran / scrollstep) pastinya
// Melakukan pergeseran bitmap ke arah kiri
// selagi menambahkan bit baru berdasarkan [col] untuk membentuk huruf baru
for (int row = 0; row < tinggi; row++) {
// melakukan perulangan setiap modul, agar pada modul 1 dapat bergeser ke modul 2 dst..
for (int col = 1; col < jumlahModul; col++) {
bitmap[row][col] <<= 1; // Ini gan pergeserannya
bitWrite(bitmap[row][col], 0, bitRead(bitmap[row][col-1], 7));
}
// Menambahkan bit baru untuk huruf baru di kanan
bitmap[row][0] <<= 1;
if (col >= 5) {
bitmap[row][0] |= 0; // Jika col lebih dari 5, maka kita gunakan untuk spasi antar huruf
}
else {
bitmap[row][0] |= bitRead(pgm_read_byte(&Font5x7[charIndex*5+col]), row); // Jika tidak, berarti kita tambahkan bit baru tsb..
}
}
}
}
void setup() {
strip.begin();
strip.show();
}
void loop() {
scrollingText(); // Melakukan scrolling text ALIAS pergeseran bit ke kiri
refresh(); // menampilkan bitmap ke strip matrix
}
// Fungsi untuk menampilkan array bitmap ke strip matrix
void refresh() {
// Rumus berdasarkan urutan led strip:
// f(row, col) = (tinggi - row + 1) * lebar - col;
for (uint8_t row = 0; row < tinggi; row++) {
for (int modul = jumlahModul - 1; modul >= 0; modul--) {
for (int col = 7; col >= 0; col--) {
byte bitCond = bitRead(bitmap[row][modul], col);
uint8_t indexStrip = ((tinggi - (row + 1) + 1) * lebar) - (8 - col);
strip.setPixelColor(indexStrip, ((bitCond == 1) ? strip.Color(0, 0, 255): 0)); // warna disetting biru
}
}
}
strip.show();
}
