/*
Build Back To The Future DELOREAN (DeAGOSTINI/Eaglemoss)
Flux Capacitor Unit V1.091 By LsKaz
Ver1.91 2019/01/25 when FluxUnit = 1 empty blink speed bug fix
*/
/***************************************************
Designed specifically to work with the Adafruit LED Matrix backpacks
----> http://www.adafruit.com/products/1080
----> https://learn.adafruit.com/adafruit-led-backpack/0-8-8x8-matrix
****************************************************/
//int FluxUnit = 0; // Fred Wendland Flux Capacitor board use change 0 to 1
#define MCP4725_ADDR 0x60
#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
//#include <MsTimer2.h>
//#include <TimerOne.h>
Adafruit_8x8matrix matrix = Adafruit_8x8matrix();
Adafruit_8x8matrix matrix2 = Adafruit_8x8matrix();
//Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix();
//Adafruit_BicolorMatrix matrix2 = Adafruit_BicolorMatrix();
int BR=0;
int BR2=0;
int j=2;
int old_j=9;
int jj=0;
int bar1[10]={};
int bar2[10]={};
int MatrixCntmx = 1000;
int MatrixCnt = MatrixCntmx;
int LedSw = 1;
int LedCnt = 0;
int ON_PIN = 11;
int TR_PIN = 12;
int SW_KEY[3]={0,0,0};
int SW_ON[4]={0,0,0,0};
int SW_OFF[3]={0,0,0};
int SW_CNT[4]={0,0,0,0};
int SW_PIN[3]={14,15,16}; // A0:LEDオン A1:アップ A2:ダウン
int EMPTY_Cnt = 0;
int EMPTY_CntOff = 4000;
int EMPTY_CntMAX = 8000;
int FluxUnit = 0;
// 0 1 2 3 4 5 6 7 8
int LedCntmx[9] = {2000, 700, 700, 600, 500, 400, 300, 200, 100};
int LedBright[9] = { 0, 10, 10, 10, 20, 50, 100, 230, 255};
int LedBright2[9] = { 0, 960, 1166, 1372, 1578, 1784, 1990, 2100, 3000};
int LedBright3[9] = { 0, 5, 20, 40, 60, 90, 120, 255, 255};
void setup() {
Serial.begin(9600);
Serial.println("8x8 LED Matrix Start");
randomSeed(analogRead(6)); // 乱数リセット
matrix.begin(0x70); // pass in the address
matrix.clear();
matrix2.begin(0x71); // pass in the address
matrix2.clear();
// matrix.writeDisplay();
// delay(500);
// matrix.setRotation(1);
// loop2();
matrix.setRotation(3);
matrix2.setRotation(3);
// matrix.fillRect(2,2, 4,4, LED_ON);
matrix.writeDisplay();
matrix2.writeDisplay();
// delay(1500);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(SW_PIN[0],INPUT);
pinMode(SW_PIN[1],INPUT);
pinMode(SW_PIN[2],INPUT);
}
void loop() {
//----- main arduino control --------------------------
SW_KEY[0]=digitalRead(SW_PIN[0]);
SW_KEY[1]=digitalRead(SW_PIN[1]);
SW_KEY[2]=digitalRead(SW_PIN[2]);
if (SW_KEY[0] == HIGH) {
if (SW_CNT[0]++ > 10) {SW_CNT[0]=10;}
} else {SW_CNT[0]=0;SW_CNT[1]=0;SW_CNT[2]=0;j=0;}
if (SW_KEY[1] == HIGH && SW_KEY[0] == HIGH) {
if (SW_CNT[1]++ > 30) {SW_CNT[1]=30;
if (SW_ON[1]==0){SW_ON[1]=1;
j++;
Serial.println(j);}
}
} else {SW_CNT[1]=0;SW_ON[1]=0;}
if (SW_KEY[2] == HIGH && SW_KEY[0] == HIGH) {
if (SW_CNT[2]++ > 30) {SW_CNT[2]=30;
if (SW_ON[2]==0){SW_ON[2]=1;
j--;
Serial.println(j);}
}
} else {SW_CNT[2]=0;SW_ON[2]=0;}
if (j < 0){j=0;}
if (j > 8){j=8;}
//---------EMPTY BRINK LED -------------------------------
if (SW_KEY[0] == LOW && SW_KEY[1] == HIGH && SW_KEY[2] == HIGH) {
if (SW_CNT[3]++ > 100) {
SW_CNT[3]=300;j=1;SW_ON[3]=1;
EMPTY_Cnt++;
if (EMPTY_Cnt > EMPTY_CntMAX) {EMPTY_Cnt=0;}
if (EMPTY_Cnt < EMPTY_CntOff) {digitalWrite(8, HIGH);} else {digitalWrite(8, LOW);}
}
} else {EMPTY_Cnt=0;SW_CNT[3]=0;SW_ON[3]=0;digitalWrite(8, LOW);}
//----- main arduino control end------------------------
MatrixCnt++;
if (MatrixCnt > MatrixCntmx) {
// if (digitalRead(TR_PIN) == HIGH and j<8) {j++;};
matrixloop();
MatrixCnt = 0;
}
LedCnt++;
if (LedCnt > (LedCntmx[j]))
{LedCnt=0;LedSw++;
if (LedSw > 4)
{LedSw = 1;jj=random(0,j*2);
if (j > 4 & jj > 4)
{BR=BR+random((j-5)*60,(j-4)*60);
}
}
}
if (BR > 255){BR=255;}
if (SW_KEY[0] == LOW){analogWrite(10, BR);}
if (j > 4 & j < 8) {analogWrite(10, BR);}
if (LedSw == 4 & j == 8) {analogWrite(10, 255);BR=255;}
jj=random(0,3);
if (LedSw == 4 & j == 8 & jj==1) {analogWrite(10,150);}
if (FluxUnit == 0) {
if (LedSw == 4) {analogWrite(3, LedBright[j]);} else {digitalWrite(3,LOW);}
if (LedSw == 3) {analogWrite(5, LedBright[j]);} else {digitalWrite(5,LOW);}
if (LedSw == 2) {analogWrite(6, LedBright[j]);} else {digitalWrite(6,LOW);}
if (LedSw == 1) {analogWrite(9, LedBright[j]);} else {digitalWrite(9,LOW);}
} else {
if (j != old_j) {
old_j=j;
switch(j){
case 0: digitalWrite(5, LOW);Flux_draw();break;
default: analogWrite(5, LedBright3[j]);Flux_draw();break;
}
} else {
/* DUMMY logic START */
if (LedSw == 4) {analogWrite(3, 0);} else {digitalWrite(3,LOW);}
if (LedSw == 3) {analogWrite(3, 0);} else {digitalWrite(3,LOW);}
if (LedSw == 2) {analogWrite(3, 0);} else {digitalWrite(3,LOW);}
if (LedSw == 1) {analogWrite(3, 0);} else {digitalWrite(3,LOW);}
/* DUMMY logic END */
}
}
if (j > 6) {digitalWrite(2, HIGH);} else {digitalWrite(2,LOW);}
if (j == 0) {digitalWrite(4, HIGH);digitalWrite(7, LOW);} else {digitalWrite(4,LOW);digitalWrite(7, HIGH);}
if (BR2++ > 6){
BR2=0;BR=BR-1;
if (BR < 0){BR=0;}
}
}
void matrixloop() {
int i;
for (int x=0; x<8; x++) {
if (j > 3) {i = random(j*2 - 3,j*2+1);} else
{i = random(0,j*2);}
if (j == 8) {i = random(j*2.5 - 2,j*3);}
if (x == 6 ) {i = i / 1.8 ;}
if (x == 5 ) {i = i / 2.3 ;}
if (x == 4 ) {i = i / 1.3 ;}
if (x == 3 ) {i = i / 2.1 ;}
if (x == 0 ) {i = i / 1.2 ;}
if (i > 15 ) {i = 15;}
matrix.drawLine(x,0, x,7, 0);
matrix2.drawLine(x,0, x,7, 0);
if (j >0 && i < 8) {matrix.drawLine(x,0, x,i, LED_ON);}
if (j >0 && i > 7) {matrix.drawLine(x,0, x,7, LED_ON);matrix2.drawLine(x,0, x,i-7, LED_ON);}
matrix.writeDisplay(); // write the changes we just made to the display
matrix2.writeDisplay(); // write the changes we just made to the display
}
}
void Flux_draw(void) {
Wire.beginTransmission(MCP4725_ADDR);
Wire.write(64); // cmd to update the DAC
Wire.write(LedBright2[j] >> 4); // the 8 most significant bits...
Wire.write((LedBright2[j] & 15) << 4); // the 4 least significant bits...
Wire.endTransmission();
}