Jag har inte skrivit så mycket här, mest knackat kod och jobbat. Men nu är jag nog framme vid version 1.0!
Har bjudit hem "beställaren" för avprovning, det går ju att dividera sig gul och blå på hur saker ska fungera, så jag tänkte att det är nog lättare att han själv tar en titt och tycker till.
Kod: Markera allt
#include <Time.h>
#include <Timer.h>
Timer t;
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 200; // the debounce time; increase if the output flickers
int pinBTN1 = 3; //StartFromZero
int pinBTN2 = 18; //StartFromSet
int pinBTN3 = 19; //Pause
int pinBTN4 = 20; //StopAndZero
int pinBTN5 = 21; //PointCountActive
int pinLED1 = 9; //StartFromZero
int pinLED2 = 10; //StartFromSet
int pinLED3 = 11; //Pause
int pinLED4 = 12; //StopAndZero
int pinLED5 = 13; //PointCountActive
int pinBCD11 = 39; //Minutsiffra 1
int pinBCD12 = 41;
int pinBCD14 = 43;
int pinBCD18 = 45;
int pinBCD21 = 47; //Minutsiffra 2
int pinBCD22 = 49;
int pinBCD24 = 51;
int pinBCD28 = 53;
int pinBCD31 = 38; //Poäng hemma
int pinBCD32 = 40;
int pinBCD34 = 42;
int pinBCD38 = 44;
int pinBCD41 = 46; //Poäng Borta
int pinBCD42 = 48;
int pinBCD44 = 50;
int pinBCD48 = 52;
int pinRLK = 30; //Latch
int pinSLK = 28; //Clock
int pinDAT = 26; //Data
int pinDP1 = 22;
int pinDP2 = 24;
String sToDisp;
String iMM;
String iSS;
String iMMSS;
char OneChar;
volatile int StartFromZero = LOW;
volatile int StartFromSet = LOW;
volatile int Pause = LOW;
volatile int StopAndZero = LOW;
volatile int PointCountActive = LOW;
int pinDP1state = LOW;
int pinDP2state = LOW;
int enableTick;
int runMode = 0; //Runmodes. 0=init. 1=Roll logo. 2=StartFromZero. 3=StartFromSet. 4=Pause. 5=StopAndZero.
int enablePoints = LOW;
int StartFromZeroInit = LOW;
int StartFromSetInit = LOW;
int PauseInit = LOW;
int ipMM;
int ipSS;
int lastRunMode = 0;
void setup()
{
pinMode(pinBTN1, INPUT_PULLUP); //StartFromZero
pinMode(pinBTN2, INPUT_PULLUP); //StartFromSet
pinMode(pinBTN3, INPUT_PULLUP); //Pause
pinMode(pinBTN4, INPUT_PULLUP); //StopAndZero
pinMode(pinBTN5, INPUT_PULLUP); //PointCountActive
pinMode(pinBCD11, INPUT_PULLUP); //Minutsiffra 1
pinMode(pinBCD12, INPUT_PULLUP);
pinMode(pinBCD14, INPUT_PULLUP);
pinMode(pinBCD18, INPUT_PULLUP);
pinMode(pinBCD21, INPUT_PULLUP); //Minutsiffra 2
pinMode(pinBCD22, INPUT_PULLUP);
pinMode(pinBCD24, INPUT_PULLUP);
pinMode(pinBCD28, INPUT_PULLUP);
pinMode(pinBCD31, INPUT_PULLUP); //Poäng hemma
pinMode(pinBCD32, INPUT_PULLUP);
pinMode(pinBCD34, INPUT_PULLUP);
pinMode(pinBCD38, INPUT_PULLUP);
pinMode(pinBCD41, INPUT_PULLUP); //Poäng Borta
pinMode(pinBCD42, INPUT_PULLUP);
pinMode(pinBCD44, INPUT_PULLUP);
pinMode(pinBCD48, INPUT_PULLUP);
pinMode(pinLED1, OUTPUT); //StartFromZero
pinMode(pinLED2, OUTPUT); //StartFromSet
pinMode(pinLED3, OUTPUT); //Pause
pinMode(pinLED4, OUTPUT); //StopAndZero
pinMode(pinLED5, OUTPUT); //PointCountActive
pinMode(pinDAT, OUTPUT);
pinMode(pinDAT, OUTPUT);
pinMode(pinSLK, OUTPUT);
pinMode(pinRLK, OUTPUT);
pinMode(pinDP1, OUTPUT);
pinMode(pinDP2, OUTPUT);
attachInterrupt(1, intrptBTN1, FALLING); //StartFromZero
attachInterrupt(5, intrptBTN2, FALLING); //StartFromSet
attachInterrupt(4, intrptBTN3, FALLING); //Pause
attachInterrupt(3, intrptBTN4, FALLING); //StopAndZero
attachInterrupt(2, intrptBTN5, FALLING); //PointCountActive
Serial.begin(9600);
t.every(500, DP12tick);
t.every(5000, showScore);
}
void loop() {
t.update();
//Runmodes. 0=init. 1=Roll logo. 2=StartFromZero. 3=StartFromSet. 4=Pause. 5=StopAndZero
switch (runMode) {
case 0:
initScoreBoard();
break;
case 1: //Roll logo
digitalWrite(pinLED1, HIGH);//StartFromZero LED
digitalWrite(pinLED2, HIGH);//StartFromSet LED
digitalWrite(pinLED3, HIGH);//Pause LED
digitalWrite(pinLED4, LOW);//StopAndZero LED
enableTick = LOW;
RollLogo();
break;
case 2: //StartFromZero
digitalWrite(pinLED1, LOW);//StartFromZero LED
digitalWrite(pinLED2, HIGH);//StartFromSet LED
digitalWrite(pinLED3, HIGH);//Pause LED
digitalWrite(pinLED4, HIGH);//StopAndZero LED
PauseInit = LOW;
enableTick = HIGH;
CountFromZero();
break;
case 3: //StartFromSet
digitalWrite(pinLED1, HIGH);//StartFromZero LED
digitalWrite(pinLED2, LOW);//StartFromSet LED
digitalWrite(pinLED3, HIGH);//Pause LED
digitalWrite(pinLED4, HIGH);//StopAndZero LED
PauseInit = LOW;
enableTick = HIGH;
CountFromSet();
break;
case 4: //Pause
digitalWrite(pinLED1, HIGH);//StartFromZero LED
digitalWrite(pinLED2, HIGH);//StartFromSet LED
digitalWrite(pinLED3, LOW);//Pause LED
digitalWrite(pinLED4, HIGH);//StopAndZero LED
enableTick = LOW;
PauseTime();
break;
case 5: //StopAndZero
StartFromZeroInit = LOW;
StartFromSetInit = LOW;
digitalWrite(pinLED1, HIGH);//StartFromZero LED
digitalWrite(pinLED2, HIGH);//StartFromSet LED
digitalWrite(pinLED3, HIGH);//Pause LED
digitalWrite(pinLED4, LOW);//StopAndZero LED
enableTick = LOW;
digitalWrite(pinDP1, LOW); digitalWrite(pinDP2, LOW);
runMode = 1;
break;
}
}
void PauseTime() {
if (PauseInit == LOW) {
ipMM = minute();
ipSS = second();
PauseInit = HIGH;
}
setTime(00,ipMM,ipSS,01,01,2001);
enableTick = LOW;
digitalWrite(pinDP1, HIGH); digitalWrite(pinDP2, HIGH);
}
void CountFromZero() {
if (StartFromZeroInit == LOW) {
setTime(00,00,00,01,01,2001);
StartFromZeroInit = HIGH;
}
iMM = String(minute(), DEC);
if (iMM.length() == 1) { iMM = "0" + iMM; }
iSS = String(second(), DEC);
if (iSS.length() == 1) { iSS = "0" + iSS; }
iMMSS = iMM + iSS;
DispOut(iMMSS);
}
void CountFromSet() {
int iSetMM;
String sMM;
if (StartFromSetInit == LOW) {
iSetMM = BCDminut1() * 10;
iSetMM = iSetMM + BCDminut2();
setTime(00,iSetMM,00,01,01,2001);
StartFromSetInit = HIGH;
}
iMM = String(minute(), DEC);
if (iMM.length() == 1) { iMM = "0" + iMM; }
iSS = String(second(), DEC);
if (iSS.length() == 1) { iSS = "0" + iSS; }
iMMSS = iMM + iSS;
DispOut(iMMSS);
}
void showScore() {
if (PointCountActive == HIGH) {
String sBuildScore = "";
int hemmaP = BCDhemmap();
int bortaP = BCDbortap();
sBuildScore = sBuildScore + String(hemmaP, DEC);
sBuildScore = sBuildScore + " ";
sBuildScore = sBuildScore + String(bortaP, DEC);
DispOut(sBuildScore);
delay(3000);
}
}
void initScoreBoard() {
DispOut("8888");
digitalWrite(pinDP1, HIGH); digitalWrite(pinDP2, HIGH);
digitalWrite(pinLED1, LOW); digitalWrite(pinLED2, LOW); digitalWrite(pinLED3, LOW); digitalWrite(pinLED4, LOW); digitalWrite(pinLED5, LOW);
delay(2000);
digitalWrite(pinDP1, LOW); digitalWrite(pinDP2, LOW);
digitalWrite(pinLED1, HIGH); digitalWrite(pinLED2, HIGH); digitalWrite(pinLED3, HIGH); digitalWrite(pinLED4, LOW); digitalWrite(pinLED5, HIGH);
runMode = 1;
lastRunMode = 1;
enableTick = LOW;
}
void RollLogo() {
int dly1 = 200;
int dly2 = 500;
if (runMode == 1) { DispOut(" "); delay(dly1); DispOut(" A"); delay(dly1); DispOut(" AS"); delay(dly1); DispOut(" ASb"); delay(dly1); DispOut("ASby"); delay(500); }
if (runMode == 1) { DispOut("Sby "); delay(dly1); DispOut("by "); delay(dly1); DispOut("y "); delay(dly1); DispOut(" "); delay(dly2); }
if (runMode == 1) { DispOut(" 1"); delay(dly1); DispOut(" 1F"); delay(dly1); DispOut(" 1F "); delay(dly2); }
if (runMode == 1) { DispOut("1F "); delay(dly1); DispOut("F "); delay(dly1); DispOut(" "); delay(dly2); }
}
void DP12tick(){
pinDP1state = !pinDP1state;
pinDP2state = !pinDP2state;
if (enableTick == HIGH) { digitalWrite(pinDP1, pinDP1state); digitalWrite(pinDP2, pinDP1state);}
if (enableTick == LOW) { digitalWrite(pinDP1, LOW); digitalWrite(pinDP2, LOW); }
}
int BCDminut1() {
int BCDsum = 0;
if (digitalRead(pinBCD11) == LOW) BCDsum = BCDsum + 1;
if (digitalRead(pinBCD12) == LOW) BCDsum = BCDsum + 2;
if (digitalRead(pinBCD14) == LOW) BCDsum = BCDsum + 4;
if (digitalRead(pinBCD18) == LOW) BCDsum = BCDsum + 8;
return BCDsum;
}
int BCDminut2() {
int BCDsum = 0;
if (digitalRead(pinBCD21) == LOW) BCDsum = BCDsum + 1;
if (digitalRead(pinBCD22) == LOW) BCDsum = BCDsum + 2;
if (digitalRead(pinBCD24) == LOW) BCDsum = BCDsum + 4;
if (digitalRead(pinBCD28) == LOW) BCDsum = BCDsum + 8;
return BCDsum;
}
int BCDhemmap() {
int BCDsum = 0;
if (digitalRead(pinBCD31) == LOW) BCDsum = BCDsum + 1;
if (digitalRead(pinBCD32) == LOW) BCDsum = BCDsum + 2;
if (digitalRead(pinBCD34) == LOW) BCDsum = BCDsum + 4;
if (digitalRead(pinBCD38) == LOW) BCDsum = BCDsum + 8;
return BCDsum;
}
int BCDbortap() {
int BCDsum = 0;
if (digitalRead(pinBCD41) == LOW) BCDsum = BCDsum + 1;
if (digitalRead(pinBCD42) == LOW) BCDsum = BCDsum + 2;
if (digitalRead(pinBCD44) == LOW) BCDsum = BCDsum + 4;
if (digitalRead(pinBCD48) == LOW) BCDsum = BCDsum + 8;
return BCDsum;
}
void intrptBTN1() {
if ((millis() - lastDebounceTime) > debounceDelay) {
runMode = 2; //StartFromZero
}
lastDebounceTime = millis();
}
void intrptBTN2() {
if ((millis() - lastDebounceTime) > debounceDelay) {
runMode = 3; //StartFromSet
}
lastDebounceTime = millis();
}
void intrptBTN3() {
if ((millis() - lastDebounceTime) > debounceDelay) {
runMode = 4; //Pause
}
lastDebounceTime = millis();
}
void intrptBTN4() {
if ((millis() - lastDebounceTime) > debounceDelay) {
runMode = 5; //StopAndZero
}
lastDebounceTime = millis();
}
void intrptBTN5() {
if ((millis() - lastDebounceTime) > debounceDelay) {
PointCountActive = !PointCountActive;
digitalWrite(pinLED5, !PointCountActive);
}
lastDebounceTime = millis();
}
byte CharMap(char sData) {
byte rData = 0;
if (sData == '0') rData = 126;
if (sData == '1') rData = 12;
if (sData == '2') rData = 182;
if (sData == '3') rData = 158;
if (sData == '4') rData = 204;
if (sData == '5') rData = 218;
if (sData == '6') rData = 250;
if (sData == '7') rData = 14;
if (sData == '8') rData = 254;
if (sData == '9') rData = 222;
if (sData == 'A') rData = 238;
if (sData == 'b') rData = 248;
if (sData == 'c') rData = 176;
if (sData == 'E') rData = 242;
if (sData == 'F') rData = 226;
if (sData == 'g') rData = 222;
if (sData == 'h') rData = 232;
if (sData == 'L') rData = 112;
if (sData == 'n') rData = 168;
if (sData == 'o') rData = 184;
if (sData == 'P') rData = 230;
if (sData == 'r') rData = 160;
if (sData == 'S') rData = 218;
if (sData == 'U') rData = 124;
if (sData == 'y') rData = 220;
return rData;
}
void DispOut(String cData) {
byte bDig = 0;
digitalWrite(pinRLK, LOW); //Latch
for (int i=3; i >= 0; i--){
OneChar = cData.charAt(i);
bDig = CharMap(OneChar);
Serial.println(bDig);
shiftOut(pinDAT, pinSLK, MSBFIRST, bDig);
}
digitalWrite(pinRLK, HIGH); //Latch
}