/*Autor: Roland Pritz

Aufgabe: Binärzähler beim betätigen einer Taster soll die LED darstellung
 um eins nach oben gesetz werden,
beim betätigen des anderen Schalters wird nach unten gezählt
Die Zahl darf nicht über 15 und unter 0 gehen.
Die Taster müssen entbouncen und sollen nur bei der Positven Flanke angesteuerst sein
Alle 10sec soll der Wert der Zahl im SerialMonitor angezeigt werden
*/
unsigned long altzeit;
unsigned long dtime = 0;
unsigned long deltatime = 0;
unsigned long time = 0;
int statusUp = 0;
int statusDown = 0;
int statustasteroldup = 1;
int statustasterolddown = 1;

int led1 = 10;
int led2 = 11;
int led3 = 12;
int led4 = 13;
const int buttonPinUp = 2;    //nicht bei 0 oer 1 anschließen
const int buttonPinDown = 3;  //Probleme mit Serial Monitor
int zahl = 0;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(buttonPinUp, INPUT_PULLUP);
pinMode(buttonPinDown, INPUT_PULLUP);
}

void loop() {
time = millis();                           //millis für Bounce, Flanke, Monitor...

//für positve Flanke
if (time-dtime >25){
  statustasteroldup = digitalRead(buttonPinUp);
  statustasterolddown = digitalRead(buttonPinDown);
  dtime = time;
}
//bounce und zahl für nach oben zählen
if(zahl<15){
  if(time-deltatime>170){
    if (digitalRead(buttonPinUp) == LOW && statusUp == 0 && statustasteroldup==1){
      zahl++;
      statusUp = 1;
      deltatime =millis();
    }
    else if(digitalRead(buttonPinUp)  == HIGH){
      statusUp =0;
    }
  }
}
//bounce und zahl für nach unten zählen
if(zahl>0){
  if(time-deltatime>170){
    if (digitalRead(buttonPinDown) == LOW && statusDown == 0 && statustasterolddown==1){
      zahl--;
      statusDown = 1;
      deltatime=millis();
    }
    else if(digitalRead(buttonPinDown)  == HIGH){
      statusDown =0;
    }
  }
}
//***************************************** LEDs ***************************************
//1.Led
if (zahl % 2 == 1 ){
  digitalWrite(led1, HIGH);
}
else 
  digitalWrite(led1,LOW);

//2.led
if(zahl % 4 > 1){
  digitalWrite(led2,HIGH);
}
else
  digitalWrite(led2,LOW);

//3.LED
if(zahl % 8 > 3){
  digitalWrite(led3, HIGH);
}
else
  digitalWrite(led3,LOW);

//4.LED
if(zahl % 16 > 7){
  digitalWrite(led4, HIGH);
}
else
  digitalWrite(led4, LOW);

//Ausgabe alle 10 Sekunden 
  if(time - altzeit> 10000){
    Serial.println(zahl);
  altzeit=time;}
}