#include <Adafruit_NeoPixel.h>
#define PIN 4 // On Trinket or Gemma, suggest changing this to 1
#define NUMPIXELS 219 // Popular NeoPixel ring size
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 10 // Time (in milliseconds) to pause between pixels
int indexI = 0;
int kuning = 9;
int cyan = 41;
int ungu = 72;
int biru = 103;
int hijau = 134;
int merah = 165;
int putih = 196;
#define CLK 2
#define DIN 3
#define CS 5
#define CLK2 6
#define DIN2 7
#define CS2 9
#define CLK3 10
#define DIN3 11
#define CS3 13
#define X_SEGMENTS 4
#define Y_SEGMENTS 3
#define NUM_SEGMENTS (X_SEGMENTS * Y_SEGMENTS)
byte fb[8 * NUM_SEGMENTS];
byte fb2[8 * NUM_SEGMENTS];
byte fb3[8 * NUM_SEGMENTS];
double t1, t2;
int pilih = 5;
int baca = 5;
void shiftAll(byte send_to_address, byte send_this_data)
{
digitalWrite(CS, LOW);
digitalWrite(CS2, LOW);
digitalWrite(CS3, LOW);
for (int i = 0; i < NUM_SEGMENTS; i++) {
shiftOut(DIN, CLK, MSBFIRST, send_to_address);
shiftOut(DIN2, CLK2, MSBFIRST, send_to_address);
shiftOut(DIN3, CLK3, MSBFIRST, send_to_address);
shiftOut(DIN, CLK, MSBFIRST, send_this_data);
shiftOut(DIN2, CLK2, MSBFIRST, send_this_data);
shiftOut(DIN3, CLK3, MSBFIRST, send_this_data);
}
digitalWrite(CS, HIGH);
digitalWrite(CS2, HIGH);
digitalWrite(CS3, HIGH);
}
byte data[8] = { 17, 34, 68, 136, 136, 68, 34, 17};
byte strip[8] = { 1, 1, 1, 1, 1, 1, 1, 1};
byte kosong[8] = {0, 0, 0, 0, 0, 0, 0, 0};
void setup() {
Serial.begin(9600);
pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
pixels.clear(); // Set all pixel colors to 'off'
Serial.print("test");
pinMode(CLK, OUTPUT);
pinMode(DIN, OUTPUT);
pinMode(CS, OUTPUT);
pinMode(CLK2, OUTPUT);
pinMode(DIN2, OUTPUT);
pinMode(CS2, OUTPUT);
pinMode(CLK3, OUTPUT);
pinMode(DIN3, OUTPUT);
pinMode(CS3, OUTPUT);
// Setup each MAX7219
shiftAll(0x0f, 0x00); //display test register - test mode off
shiftAll(0x0b, 0x07); //scan limit register - display digits 0 thru 7
shiftAll(0x0c, 0x01); //shutdown register - normal operation
shiftAll(0x0a, 0x0f); //intensity register - max brightness
shiftAll(0x09, 0x00); //decode mode register - No decode
setupMat();
setMatt();
for(int i=0;i<=8;i++){
pixels.setPixelColor(i, pixels.Color(255, 255, 255));
}
}
void set_pixel(int awal, int akhir, int r, int g, int b) {
for (int a = awal; a < akhir; a++) {
pixels.setPixelColor(a, pixels.Color(r, g, b));
}
}
void RGB(int awal, int akhir, int colorCode) {
int indexAwal = 9;
int indexAkhir = 219;
int r = 0;
int g = 0;
int b = 0;
if (colorCode == 1) {
// Kuning
r = 255;
g = 255;
b = 0;
}
else if (colorCode == 2) {
// cyan
r = 0;
g = 255;
b = 255;
}
else if (colorCode == 3) {
// Serial.println("Ungu");
r = 189;
g = 0;
b = 255;
}
else if (colorCode == 4) {
// Serial.println("Orange");
r = 255;
g = 171;
b = 0;
}
else if (colorCode == 5) {
// Serial.println("hijau");
r = 0;
g = 255;
b = 0;
} else if (colorCode == 6) {
// Serial.println("Merah");
r = 255;
g = 0;
b = 0;
}
else if (colorCode == 7) {
// Serial.println("Putih");
r = 255;
g = 255;
b = 255;
}
Serial.println(String("RGB = ") + r + g + b + " Awal = " + awal + " Akhir = " + akhir);
if (akhir < awal) {
set_pixel(awal, indexAkhir, r, g, b);
set_pixel(indexAwal, akhir, r, g, b);
}
else {
set_pixel(awal, akhir, r, g, b);
}
}
int addVal(int val) {
int Max = 219;
int Min = 10;
if (val > Max) {
return Min;
}
else {
return val + 1;
}
}
void animate_pixel() {
kuning = addVal(kuning);
cyan = addVal(cyan);
ungu = addVal(ungu);
biru = addVal(biru);
hijau = addVal(hijau);
merah = addVal(merah);
putih = addVal(putih);
Serial.println(String("LED = ") + kuning + " " + cyan + " " + ungu + " " + biru + " " + hijau + " " + merah + " " + putih);
RGB(kuning, cyan, 1);
RGB(cyan, ungu, 2);
RGB(ungu, biru, 3);
RGB(biru, hijau, 4);
RGB(hijau, merah, 5);
RGB(merah, putih, 6);
RGB(putih, kuning, 7);
}
unsigned long int neW = 0;
unsigned long int iniT = 0;
int indexHole = 0;
void loop() {
animate_pixel();
if (Serial.available() > 0)
{
baca = Serial.readStringUntil('\n').toInt();
}
trans();
cobaBet(baca);
setMatt();
showw();
delay(50);
// neW = millis();
// if ((neW - iniT) > 1000) {
// iniT = neW;
// pixels.setPixelColor(indexHole, pixels.Color(0, 0, 0));
// indexHole++;
// }
// if (indexHole>8){
// indexHole = 0;
// }
// pixels.setPixelColor(indexHole, pixels.Color(255, 255, 255));
// // pixels.show();
// delay(DELAYVAL);
}
void setupMat()
{
for (int j = 0; j < 50; j++)
{
trans();
setMat();
showw();
delay(50);
}
setMatt();
showw();
}
void trans()
{
for (byte iter = 0; iter < 8; iter++)
{
data[iter] = data[iter] / 128 + data[iter] * 2;
// strip[iter] = strip[iter] / 128 + strip[iter] * 2;
}
}
void cobaBet(int pilihan)
{
memset (fb, 0, sizeof(fb));
memset (fb2, 0, sizeof(fb2));
memset (fb3, 0, sizeof(fb3));
int map_pilih = map(pilihan,1,9,0,8);
neW = millis();
if ((neW - iniT) > 1000) {
iniT = neW;
pixels.setPixelColor(map_pilih, pixels.Color(255, 255, 255));
// indexHole++;
}
// if (indexHole>8){
// indexHole = 0;
// }
pixels.setPixelColor(map_pilih, pixels.Color(0, 0, 0));
if (pilihan > 6 && pilihan <= 9) {
int up, down;
// pixels.setPixelColor(pilihan, pixels.Color(255, 255, 255));
switch (pilihan) {
case 9:
up = 1;
down = 3;
break;
case 8:
up = 4;
down = 6;
break;
case 7:
up = 9;
down = 11;
break;
default:
break;
}
for (byte baris = 0; baris < 8; baris++) {
for (int j = up; j <= down; j++)
{
fb[(12 * baris) + j] = data[baris];
// fb2[(12 * baris) + j] = data[baris];
// fb3[(12 * baris) + j] = data[baris];
}
}
}
if (pilihan > 3 && pilihan <= 6) {
// pixels.setPixelColor(pilihan, pixels.Color(255, 255, 255));
int up, down;
switch (pilihan) {
case 6:
up = 1;
down = 3;
break;
case 5:
up = 4;
down = 6;
break;
case 4:
up = 9;
down = 11;
break;
default:
break;
}
for (byte baris = 0; baris < 8; baris++) {
for (int j = up; j <= down; j++)
{
fb2[(12 * baris) + j] = data[baris];
// fb2[(12 * baris) + j] = data[baris];
// fb3[(12 * baris) + j] = data[baris];
}
}
}
if (pilihan > 0 && pilihan <= 3) {
// pixels.setPixelColor(pilihan, pixels.Color(255, 255, 255));
int up, down;
switch (pilihan) {
case 3:
up = 1;
down = 3;
break;
case 2:
up = 4;
down = 6;
break;
case 1:
up = 9;
down = 11;
break;
default:
break;
}
for (byte baris = 0; baris < 8; baris++) {
for (int j = up; j <= down; j++)
{
fb3[(12 * baris) + j] = data[baris];
// fb2[(12 * baris) + j] = data[baris];
// fb3[(12 * baris) + j] = data[baris];
}
}
}
// else if(){
// }
// else if(){
// }
// switch (pilihan) {
// case 9:
// up = 1;
// down = 3;
// break;
// case 8:
// up = 4;
// down = 6;
// break;
// case 7:
// up = 9;
// down = 11;
// break;
// case 6:
// up = 12;
// down = 14;
// break;
// case 5:
// up = 17;
// down = 19;
// break;
// case 4:
// up = 20;
// down = 22;
// break;
// case 3:
// up = 25;
// down = 27;
// break;
// case 2:
// up = 28;
// down = 30;
// break;
// case 1:
// up = 33;
// down = 35;
// break;
// default:
// up = 17;
// down = 19;
// break;
// }
// for (byte baris = 0; baris < 8; baris++)
// {
// for (int j = up; j <= down; j++)
// {
// fb[(12 * baris) + j] = data[baris];
// fb2[(12 * baris) + j] = data[baris];
// fb3[(12 * baris) + j] = data[baris];
// }
// }
}
void setMatt()
{
for (byte baris = 0; baris < 8; baris++)
{
fb[(12 * baris) + 0] = data[baris];
fb[(12 * baris) + 7] = data[baris];
fb[(12 * baris) + 8] = data[baris];
fb2[(12 * baris) + 0] = data[baris];
fb2[(12 * baris) + 7] = data[baris];
fb2[(12 * baris) + 8] = data[baris];
fb3[(12 * baris) + 0] = data[baris];
fb3[(12 * baris) + 7] = data[baris];
fb3[(12 * baris) + 8] = data[baris];
}
}
void setMat()
{
for (byte baris = 0; baris < 8; baris++)
{
for (int dev = 0; dev < NUM_SEGMENTS; dev++)
{
fb[(12 * baris) + dev] = data[baris];
fb2[(12 * baris) + dev] = data[baris];
fb3[(12 * baris) + dev] = data[baris];
}
}
}
void showw()
{
for (byte row = 0; row < 8; row++)
{
digitalWrite(CS, LOW);
digitalWrite(CS2, LOW);
digitalWrite(CS3, LOW);
byte segment = NUM_SEGMENTS;
while (segment--)
{
if (segment & X_SEGMENTS)
{ // odd rows of segments
shiftOut(DIN, CLK, MSBFIRST, 8 - row);
shiftOut(DIN2, CLK2, MSBFIRST, 8 - row);
shiftOut(DIN3, CLK3, MSBFIRST, 8 - row);
shiftOut(DIN, CLK, LSBFIRST, fb[(12 * row) + segment]);
shiftOut(DIN2, CLK2, LSBFIRST, fb2[(12 * row) + segment]);
shiftOut(DIN3, CLK3, LSBFIRST, fb3[(12 * row) + segment]);
}
else
{ // even rows of segments
shiftOut(DIN, CLK, MSBFIRST, 1 + row);
shiftOut(DIN2, CLK2, MSBFIRST, 1 + row);
shiftOut(DIN3, CLK3, MSBFIRST, 1 + row);
shiftOut(DIN, CLK, MSBFIRST, fb[(12 * row) + segment]);
shiftOut(DIN2, CLK2, MSBFIRST, fb2[(12 * row) + segment]);
shiftOut(DIN3, CLK3, MSBFIRST, fb3[(12 * row) + segment]);
}
}
digitalWrite(CS, HIGH);
digitalWrite(CS2, HIGH);
digitalWrite(CS3, HIGH);
}
pixels.show();
}