#include "TM1637Display.h"
//#include "Wire.h" // I2C control
#include "Bounce2.h"
#define CLK A5 //can be any digital pin
#define DIO A4 //can be any digital pin
TM1637Display display(CLK, DIO);
uint8_t data[] = {0x0, 0x0, 0x0, 0x0};
//byte diaplayAddr = 0x70 >> 1; // Address of the I2C control
int digitBytes[16]={63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113}; // 0 1 2 3 4 5 6 7 8 9, decimal point = +128
//light barrier
int LSFrontPin = A0; //light barrier at the front of the barrel
int LSBackPin = A1; //light barrier at the back of the barrel
int TriggerPin = 11;
float meanVal = 0;
float meanCount = 0;
//Datenverarbeitung
int LSFrontVal = 0;
int LSBackVal = 0;
int BaseLineFront = 0;
int BaseLineBack = 0;
//threshold, to recognise a dart
int TriggerFront = 0;
int TriggerBack = 0;
//measuring the speed
int measuringBack = 0;
float length = 0.169; //m
int loopTime = 100; //time of the measuring point in micro seconds
unsigned long measureLoops = 0;
unsigned long heartBeat = 0;
float TempBaseLineFront = 0;
float TempBaseLineBack = 0;
Bounce Taster = Bounce();
void setup(){
Serial.begin(9600);
// Wire.begin(); // start up I2C bus
delay(500);
//createDisplay();
pinMode(LSFrontPin, INPUT);
pinMode(LSBackPin, INPUT);
pinMode(TriggerPin, INPUT);
// Setup the button
pinMode( TriggerPin ,INPUT);
// Activate internal pull-up (optional)
digitalWrite( TriggerPin ,HIGH);
// After setting up the button, setup the object
Taster .attach( TriggerPin );
Taster .interval(5);
delay(1000);
//create a base line
for (int ii=0; ii<100; ii++){
TempBaseLineFront = TempBaseLineFront + analogRead(LSFrontPin);
TempBaseLineBack = TempBaseLineBack + analogRead(LSBackPin);
delay(10);
}
BaseLineFront = (int)(TempBaseLineFront / 100);
TriggerFront = (int)(0.8*BaseLineFront);
BaseLineBack = (int)(TempBaseLineBack / 100);
TriggerBack = (int)(0.8*BaseLineBack);
//Show that the initialisation is done: blink three times with the base line values
writeNumber(TriggerFront, 500);
delay(200);
writeNumber(TriggerBack, 500);
delay(200);
// writeNumber(888, 500);
// delay(200);
// writeNumber(888, 500);
// delay(200);
// writeNumber(888, 500);
// delay(200);
measuringBack = 1; //start measuring and wait for the darts
}
/*void createDisplay(){
Wire.beginTransmission(display);
Wire.write(B00000000); // entgegen
// Subadressing: B00000001 = Digit 1, Subadressing: B00000010 = Digit 2, Subadressing: B00000011 = Digit 3, Subadressing: B00000100 = Digit 4
Wire.write(B00110111); // control byte (dynamic modus on, 9 mA)
Wire.endTransmission();
Wire.beginTransmission(display);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(digitBytes[0]); // digit 1 (RHS)
Wire.write(digitBytes[1]); // digit 2
Wire.write(digitBytes[2]); // digit 3
Wire.endTransmission();
Wire.beginTransmission(display);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(digitBytes[9]); // digit 1 (RHS)
Wire.write(digitBytes[0] + 128); // digit 2 + Dezimal point
Wire.write(digitBytes[1]); // digit 3
Wire.endTransmission();
} */
void writeNumber(int number, int waitTime){
// creat number and show it for waitTime ms
int digit1 = number/100;
int digit2 = (number - (digit1*100)) / 10;
int digit3 = number - digit1*100 - digit2*10;
Serial.println(number);
Serial.print("digit1: "); Serial.println(digit1);
Serial.print("digit2: "); Serial.println(digit2);
Serial.print("digit3: "); Serial.println(digit3);
/* Wire.beginTransmission(display);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(digitBytes[digit3]); // digit 1 (RHS)
Wire.write(digitBytes[digit2] + 128); // digit 2 + decimal point
Wire.write(digitBytes[digit1]); // digit 3
Wire.endTransmission();
delay(waitTime);
Wire.beginTransmission(display);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(0); // digit 1 (RHS)
Wire.write(0); // digit 2 + decimal point
Wire.write(0); // digit 3
Wire.endTransmission(); */
display.showNumberDec(number);
delay(waitTime);
display.showNumberDec(number);
}
void heartBeatBeat(){
//lets the decimal point blink
/* Wire.beginTransmission(display);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(0); // digit 1 (RHS)
Wire.write(128); // digit 2 + decimal point
Wire.write(0); // digit 3
Wire.endTransmission();
delay(100);
Wire.beginTransmission(display);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(0); // digit 1 (RHS)
Wire.write(0); // digit 2 + decimal point
Wire.write(0); // digit 3
Wire.endTransmission(); */
display.setBrightness(2);
display.showNumberDec(1,false,1,0); //1000
delay(100);
display.setSegments(data);
display.showNumberDec(2,false,1,1); //0200
delay(100);
display.setSegments(data);
display.showNumberDec(3,false,1,2); //0030
delay(100);
display.setSegments(data);
display.showNumberDec(4,false,1,3); //0004
delay(100);
display.setSegments(data);
/*for (int i=0; i < 12; i++){
display.showNumberDec(i);
delay(50);
}*/
//uint8_t segto; int value = 1244; segto = 0x80 | display.encodeDigit((value / 100)%10); display.setSegments(&segto, 1, 1);
//delay(500);
//display.setSegments(data);
}
void loop(){
//Hearbeat interval
if (millis() > (heartBeat + 5000)){
heartBeat = millis();
heartBeatBeat();
}
//read the push button
Taster.update();
int TasterStatus = Taster.read();
unsigned long duration = Taster.duration();
if ((TasterStatus == HIGH) && (duration < 2000)){
writeNumber((int)(meanVal*10/meanCount), 1000);
}
else if (TasterStatus == HIGH){
Serial.println("reset");
writeNumber(0, 500); delay(200);
writeNumber(0, 500); delay(200);
writeNumber(0, 500); delay(200);
meanVal = 0;
meanCount = 0;
delay(500);
}
//delayMicroseconds(loopTime);
//if (digitalRead(TriggerPin) == HIGH) { Serial.println("Trigger!"); }
if (measuringBack == 1){
//Pfeil wurde noch nicht detektiert
LSBackVal = analogRead(LSBackPin);
if (LSBackVal < TriggerBack) { measuringBack = 0; measureLoops = micros(); Serial.print("Start Trigger :"); Serial.println(TriggerBack); Serial.println(LSBackVal); }
}
else
{
//dart was detected, but didn't arrive in the front
LSFrontVal = analogRead(LSFrontPin);
if (LSFrontVal < TriggerFront){
unsigned long stopTime=micros();
float deltaTus = (float)(stopTime-measureLoops);
deltaTus = deltaTus / 1.0e6;
float mSpeed = length / deltaTus;
measuringBack = 1;
Serial.println(measureLoops);
Serial.println(stopTime);
Serial.println(deltaTus);
Serial.println(mSpeed);
meanCount = meanCount + 1;
meanVal = meanVal + mSpeed;
Serial.println(meanVal);
Serial.println(meanCount);
writeNumber((int)(mSpeed*10), 500);
delay(200);
}
}
//#Reset after 1 s
if ((measuringBack == 0) && (micros() > (measureLoops + 1000000)))
{
measuringBack = 1;
}
}