/*Programm das 4 LED die einen binär Zähler darstellen
mit zwei Tastern angesteuert einen der rauf und einen der runterzählt
alle 20s wird der wert auf den digital monitor rausgeschrieben
(kann bei den Variablen geändert werden)
Autor: SCHL
Date: 18.03.24
*/
//Varialen mid d sind zum runterzählen
//Varialen mid u sind zum hinaufzählen
int z = 0;//Zählwert
int statusd = 0;//Status Taster1 (down)
int statusu = 0;//Status Taster2 (up)
int lastStatusd = 1; //Vorheriger Status für Taster1 (down)
int lastStatusu = 1; //Vorheriger Status für Taster2 (up)
//Timer für entprellung
const int Timeout = 75;
//Variabelen für eintprellung
unsigned long Timerbd = 0;
unsigned long Timerbu = 0;
int bd = 0;
int bu = 0;
//Taster Pins
const int pinind = 2;
const int pininu = 3;
//LED Pins
const int pinout1 = 10;
const int pinout2 = 11;
const int pinout3 = 12;
const int pinout4 = 13;
//Variablen für digitalen Monitor
unsigned long Timerserial = 0;
int Timeoutserial = 200;//Zeitabstand zwischen Ausgaben
void setup() {
//Eingänge
pinMode(pinind, INPUT_PULLUP);
pinMode(pininu, INPUT_PULLUP);
//Ausgänge
pinMode(pinout1, OUTPUT);
pinMode(pinout2, OUTPUT);
pinMode(pinout3, OUTPUT);
pinMode(pinout4, OUTPUT);
//Setup vom Serial Monitor:
Serial.begin(9600);
}
void loop() {
//z hinauf bzw. runter zählen
z = zaehlen(pinind, pininu, Timeout);
//LED Pins entsprechend von z setzen
out(z,pinout1,pinout2,pinout3,pinout4);
//Serial Monitor ausgabe
if (millis() > Timeoutserial + Timerserial ) {
Timerserial = millis();
Serial.println(z);
}
}
int zaehlen(int pinind, int pininu, int timeout){
//Eingänge einlesen
statusd = !digitalRead(pinind);
statusu = !digitalRead(pininu);
//Wenn Flanke und Taster gedrückt wurde, z verringern
if ((statusd != lastStatusd && statusd == HIGH)&&(bd == 0)) {
bd = 1;
Timerbd = millis();
}
if ((millis() > timeout + Timerbd)&&(bd == 1)) {
statusd = !digitalRead(pinind);//kurz warten dann noch einmal schauen ob der eingang noch gleich ist
if(statusd == HIGH){
z--;
}
bd = 0;
}
//Wenn Flanke und Taster gedrückt wurde, z erhöhen
if ((statusu != lastStatusu && statusu == HIGH)&&(bu == 0)) {
bu = 1;
Timerbu = millis();
}
if ((millis() > timeout + Timerbu)&&(bu == 1)) {
statusu = !digitalRead(pininu);//kurz warten dann noch einmal schauen ob der eingang noch gleich ist
if(statusu == HIGH){
z++;
}
bu = 0;
}
//Speichern des Status für den nächsten Durchlauf
lastStatusd = statusd;
lastStatusu = statusu;
//Sicherstellen, dass z nicht unter 0 fällt
if(z < 0) {
z = 0;
}
//Sicherstellen, dass z nicht über 15 steigt
if(z > 15){
z = 15;
}
return z;
}
void out(int zahl, int p1, int p2, int p3, int p4){
//gibt auf den pins das dazugehörige bit aus
digitalWrite(p1, zahl & 0b0001); //zahl & 0b0001 gibt nur das erste bit aus
digitalWrite(p2, zahl & 0b0010); //zahl & 0b0010 gibt nur das zwite bit aus
digitalWrite(p3, zahl & 0b0100); //zahl & 0b0100 gibt nur das dritte bit aus
digitalWrite(p4, zahl & 0b1000); //zahl & 0b1000 gibt nur das vierte bit aus
}