Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang memiliki 4 fitur berbeda yaitu Timer Countdown, Stopwatch, Jam Digital, Lap Counter dengan penampilnya menggunakan panel P10 RGB HUB75. untuk lebih jelasnya berikut adalah koding dan komponennya. 
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
#include <Adafruit_GFX.h>   
#include <RGBmatrixPanel.h> 
LiquidCrystal_I2C lcd(0x27, 16, 2);
DS3231  rtc(SDA, SCL);
Time  t;
#define F2(progmem_ptr) (const __FlashStringHelper *)progmem_ptr
#define CLK 8  // MUST be on PORTB! (Use pin 11 on Mega)
#define LAT A3
#define OE  9
#define A   A0
#define B   A1
#define C   A2
RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);
String sjam,smenit,sdetik;
int jam,menit,detik;
int pilih;
float xjam, xmenit, xdetik, xmiliDetik;
int xjamx, xmenitx, xdetikx, xmiliDetikx;
unsigned long over;
int lap;
int btset = 10;
int btup = 11;
int btdown = 12;
int btok = 13;
int btsetx;
int btupx;
int btdownx;
int btokx;
int countdown;
int detikku;
int mulai;
int seconds;
int cs;
long start_time = 0;
int jams,menits;
unsigned long mulaix, selesai, dataStopWatch;
int i=0;
int fPaus = 0;
long lastButton = 0; 
long delayAntiBouncing = 50; 
long dataPaus = 0;
void setup()
{
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  pinMode(btset,INPUT_PULLUP);
  pinMode(btup,INPUT_PULLUP);
  pinMode(btdown,INPUT_PULLUP);
  pinMode(btok,INPUT_PULLUP);
  matrix.begin();
  matrix.setTextWrap(false); // Allow text to run off right edge
  matrix.fillScreen(0);
  rtc.begin();
  //rtc.setDOW(THURSDAY);     // Set Day-of-Week to SUNDAY
  //rtc.setTime(15, 53, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(13, 5, 2022);   // Set the date to January 1st, 2014
}
void loop()
{
    
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);
if(btupx == 0){
delay(200);
pilih++;  
}
if(btdownx == 0){
delay(200);
pilih--;  
}
if(pilih > 3){
pilih = 0;  
}
if(pilih < 0){
pilih = 3;  
}
if(pilih == 0){
  lcd.setCursor(0,0);
  lcd.print("1.Countdown    ");
}
if(pilih == 1){
  lcd.setCursor(0,0);
  lcd.print("2.Stopwatch    ");
}
if(pilih == 2){
  lcd.setCursor(0,0);
  lcd.print("3.Jam          ");
}
if(pilih == 3){
  lcd.setCursor(0,0);
  lcd.print("4.Lap Counter  ");
}
if((btokx == 0)&&(pilih == 0)){
lcd.clear();
delay(2000);
countdownku();  
}
if((btokx == 0)&&(pilih == 1)){
lcd.clear();
delay(2000);
lcd.print("  Tekan Tombol");
lcd.setCursor(0, 1); 
lcd.print("  Start / Stop");
stopwatch();  
}
if((btokx == 0)&&(pilih == 2)){
lcd.clear();
delay(2000);
jamku();  
}
if((btokx == 0)&&(pilih == 3)){
lcd.clear();
delay(2000);
lapcounter();  
}
}
void lapcounter(){
lcd.setCursor(0,0);
lcd.print("Lap: ");
lcd.print(lap);
lcd.print("   ");
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);
if(btupx == 0){
delay(200);
lap++;  
}
if(btdownx == 0){
delay(200);
lap--;  
}
if(btokx == 0){
lcd.clear();
delay(2000);
return; 
}
if(lap <= 9){
matrix.setTextSize(2);
matrix.setTextColor(matrix.Color444(1, 0, 0));
matrix.setCursor(10, 1); //x,y
matrix.print(lap);   
}
if(lap > 9){
matrix.setTextSize(2);
matrix.setTextColor(matrix.Color444(1, 0, 0));
matrix.setCursor(4, 1); //x,y
matrix.print(lap);   
}
delay(100);
matrix.fillScreen(0);
 
lapcounter();  
}
void setjam(){
lcd.setCursor(0,0);
lcd.print("Jam: ");
lcd.print(jam);
lcd.print("   ");
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);
if(btupx == 0){
delay(200);
jam++;  
}
if(btdownx == 0){
delay(200);
jam--;  
}
if(btokx == 0){
lcd.clear();
delay(2000);
return; 
}
if(jam > 23){
jam = 0;
}
if(jam < 0){
jam = 23;
}  
setjam();
}
void setmenit(){
  lcd.setCursor(0,0);
  lcd.print("Min: ");
  lcd.print(menit);
  lcd.print("   ");
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);
if(btupx == 0){
delay(200);
menit++;  
}
if(btdownx == 0){
delay(200);
menit--;  
}
if(btokx == 0){
lcd.clear();
delay(2000);
return; 
}
if(menit > 59){
menit = 0;
}
if(menit < 0){
menit = 59;
}  
setmenit();
}
void setdetik(){
  lcd.setCursor(0,0);
  lcd.print("Detik: ");
  lcd.print(detik);
  lcd.print("   ");
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);
if(btupx == 0){
delay(200);
detik++;  
}
if(btdownx == 0){
delay(200);
detik--;  
}
if(btokx == 0){
lcd.clear();
delay(2000);
t.hour = jam;
t.min = menit;
t.sec = detik;
rtc.setTime(jam,menit,detik);     // Set the time to 12:00:00 (24hr format)
return; 
}
if(detik > 59){
detik = 0;
}
if(detik < 0){
detik = 59;
}  
setdetik();
}
void jamku(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);
if((btupx == 0)&&(btdownx == 0)){
lcd.clear();
delay(2000);
return;
}
if(btsetx == 0){
delay(200);
lcd.clear();  
setjam();
setmenit();
setdetik();  
}
 t = rtc.getTime();
 
  lcd.setCursor(0,0);
  lcd.print(t.hour);
  lcd.print(":");
  lcd.print(t.min);
  lcd.print(":");
  lcd.print(t.sec);
  lcd.print("   ");
  matrix.setTextSize(1);
  matrix.setTextColor(matrix.Color444(1, 0, 0));
  matrix.setCursor(1, 8); //x,y
  matrix.print(t.hour);
  matrix.setTextColor(matrix.Color444(3, 1, 0));
  matrix.print(":");
  matrix.setTextColor(matrix.Color444(0, 1, 0));
  matrix.print(t.min);
 
  matrix.setCursor(10, 1); //x,y
  matrix.setTextColor(matrix.Color444(0, 0, 1));
  matrix.print(t.sec);
 
  delay(1000);
  matrix.fillScreen(0);
  
jamku();  
}
void countdownku(){
matrix.setTextSize(2);
    
t = rtc.getTime();
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);
if((btupx == 0)&&(btdownx == 0)){
lcd.clear();
delay(2000);
return;
}
if(btsetx == 0){
delay(200);
lcd.clear();  
setjam();
setmenit();
setdetik();  
}
  lcd.setCursor(0,0);
  lcd.print(t.hour);
  lcd.print(":");
  lcd.print(t.min);
  lcd.print(":");
  lcd.print(t.sec);
  lcd.print("   ");
detikku = 59 - t.sec;
if(t.sec == 30){
  matrix.drawLine(4, 3, 5, 3 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 4, 6, 4 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 5, 7, 5 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 6, 8, 6 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 7, 9, 7 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 8, 9, 8 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 9, 8, 9 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 10, 7, 10 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 11, 6, 11 , matrix.Color333(1, 0, 0));
  matrix.drawLine(4, 12, 5, 12 , matrix.Color333(1, 0, 0));
countdown = 30;
matrix.setTextColor(matrix.Color444(1, 1, 1));
matrix.setCursor(10, 1); //x,y
matrix.print(countdown); 
delay(2000);
matrix.fillScreen(0);
}
if(detikku == 10){
  
  matrix.drawLine(4, 3, 5, 3 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 4, 6, 4 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 5, 7, 5 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 6, 8, 6 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 7, 9, 7 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 8, 9, 8 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 9, 8, 9 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 10, 7, 10 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 11, 6, 11 , matrix.Color333(1, 0, 0));
  matrix.drawLine(4, 12, 5, 12 , matrix.Color333(1, 0, 0));
countdown = 10;
  
matrix.setTextColor(matrix.Color444(1, 1, 1));
matrix.setCursor(10, 1); //x,y
matrix.print(countdown);   
delay(1000);
matrix.fillScreen(0);
}
if((detikku > 0 )&&(detikku <= 5)){
matrix.setTextColor(matrix.Color444(1, 1, 1));
matrix.setCursor(15, 1); //x,y
matrix.print(detikku);   
}
if(detikku > 0){
  matrix.drawLine(4, 3, 5, 3 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 4, 6, 4 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 5, 7, 5 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 6, 8, 6 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 7, 9, 7 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 8, 9, 8 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 9, 8, 9 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 10, 7, 10 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 11, 6, 11 , matrix.Color333(1, 0, 0));
  matrix.drawLine(4, 12, 5, 12 , matrix.Color333(1, 0, 0));
}
if(detikku == 0){
  matrix.drawLine(4, 3, 5, 3 , matrix.Color333(0, 1, 0));
  matrix.drawLine(3, 4, 6, 4 , matrix.Color333(0, 1, 0));
  matrix.drawLine(2, 5, 7, 5 , matrix.Color333(0, 1, 0));
  matrix.drawLine(1, 6, 8, 6 , matrix.Color333(0, 1, 0));
  matrix.drawLine(0, 7, 9, 7 , matrix.Color333(0, 1, 0));
  matrix.drawLine(0, 8, 9, 8 , matrix.Color333(0, 1, 0));
  matrix.drawLine(1, 9, 8, 9 , matrix.Color333(0, 1, 0));
  matrix.drawLine(2, 10, 7, 10 , matrix.Color333(0, 1, 0));
  matrix.drawLine(3, 11, 6, 11 , matrix.Color333(0, 1, 0));
  matrix.drawLine(4, 12, 5, 12 , matrix.Color333(0, 1, 0));
  matrix.setTextColor(matrix.Color444(0, 1, 0));
  matrix.setCursor(10, 1); //x,y
  matrix.print("GO");   
  delay(3000);
  matrix.fillScreen(0);
}
  delay(1000);
  matrix.fillScreen(0);
    
countdownku();  
}
void stopwatch(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);
if((btupx == 0)&&(btdownx == 0)){
lcd.clear();
delay(2000);
return;
}
if (btsetx == 0){
  if ((millis() - lastButton) > delayAntiBouncing){
      if (i==0){
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Start Timer");
          mulaix = millis();
          fPaus = 0;
        }
       else if (i==1){
        lcd.setCursor(0, 0);
        lcd.print("Stop Timer  ");
        dataPaus = dataStopWatch;
        fPaus = 1;
        }
       i =!i;
      }
      lastButton = millis();
  }
  
if ((btupx == 0) && (fPaus == 1)){
  dataStopWatch = 0;
  dataPaus = 0; 
  lcd.clear();
  lcd.print("Reset Stopwatch");
  lcd.setCursor(0, 1); 
  lcd.print("0:0:0.0");  
  xjamx = 0;
  xmenitx = 0;
  xdetikx = 0;
  xmiliDetikx = 0;
 }
  
  if (i==1){
      selesai = millis(); 
      // MATH time!!!
      dataStopWatch = selesai - mulaix;
      dataStopWatch = dataPaus + dataStopWatch;
      xjam = int(dataStopWatch / 3600000);
      over = dataStopWatch % 3600000;
      xmenit = int(over / 60000);
      over = over % 60000;
      xdetik = int(over / 1000);
      xmiliDetik = over % 100;
      lcd.setCursor(0, 1);
      lcd.print(xjam, 0); 
      lcd.print(":"); 
      lcd.print(xmenit, 0);
      lcd.print(":");
      lcd.print(xdetik, 0);
      lcd.print(".");
      if (xjam < 10){
          lcd.print(xmiliDetik, 0);
          lcd.print("   ");
       }
   }
xjamx = xjam;
xmenitx = xmenit;
xdetikx = xdetik;
xmiliDetikx = xmiliDetik;
   
matrix.setTextSize(1);
matrix.setTextColor(matrix.Color444(1, 0, 0));
matrix.setCursor(1, 1); //x,y
matrix.print(xjamx);   
matrix.print(":");   
matrix.print(xmenitx);  
matrix.setCursor(1, 8); //x,y
matrix.print(xdetikx);  
matrix.print(":");   
matrix.print(xmiliDetikx);   
delay(1);
matrix.fillScreen(0);
  
stopwatch();  
}