/*
8-Bit-LED-Binaerzaehler mit einem Arduino UNO
Aufbau:
LEDs mit 220 Ohm Widerstaenden an Pins D5 bis D12
Druckschalter (Button) mit 10k Ohm Pullup-Widerstand an Pin D2
Quelle: https://www.roboter-bausatz.de/projekte/
*/
const uint8_t led[8] = {13, 12, 11, 10, 9, 8, 7, 6}; // Array für die Pin-Nummern der LEDs
int button = 2; // Button-Pin deklarieren
long time = 0; // Variable für den Debounce
long debounce = 100; // Anzahl der Milisekunden zum Debounce
int zaehler = 0; // Variable für die Anzahl der Knopfdruecke
void setup(){
for(int i = 0; i < 8; i++){
pinMode(led[i], OUTPUT);
}
pinMode(button, INPUT); // Deklariere Button-Pin als Input
attachInterrupt(0, count, LOW); // Pin 2 am Arduino hat einen Interrupt an Pin 0
}
void loop()
{
for (int zaehler = 0; zaehler < 255; zaehler++); {
int a = zaehler % 2; // LSB berechnen (Least Significant Bit)
int b = zaehler / 2 % 2; // Der Modulo Operator % liefert die Restmenge einer Division. z. B. 5 % 2 = 1
int c = zaehler / 4 % 2;
int d = zaehler / 8 % 2;
int e = zaehler / 16 % 2;
int f = zaehler / 32 % 2;
int g = zaehler / 64 % 2;
int h = zaehler / 128 % 2; //MSB berechnen (Most Significant Bit)
/*beispiel zähler ist 1 dann 1 % 2 = 1
zähler ist 2 dann 2 % 2 = 1
zähler ist 3 dann 3 % 2 = 1 und 3 / 2 = 1.5 was dann 1 sind und dann 1 % 2 = 1 und sommit leuchten 2 led
es wird so oft mit modulo oder geteilt gemacht bis am ende 1 ist und wenn es 1 ist leuchtet die LED */
digitalWrite(6, h); // Ausgabe MSB (LED mit hoechsten Stellenwert)
digitalWrite(7, g);
digitalWrite(8, f);
digitalWrite(9, e);
digitalWrite(10, d);
digitalWrite(11, c);
digitalWrite(12, b);
digitalWrite(13, a); // Ausgabe LSB (LED mit dem niedrigsten Stellenwert)
}
}
void count() {
// Button debounce und Knopfdruck um eins erhoehen
if (millis() - time > debounce) zaehler++;
time = millis();
}
/*const uint8_t button = 5; // Pin-Nummer für den Button
const uint8_t bits[8] = {13, 12, 11, 10, 9, 8, 7, 6}; // Array für die Pin-Nummern der LEDs
uint8_t buttonPress = 0; // Zähler für Button-Presses
void setup() {
Serial.begin(9600);
for (int i = 0; i < 8; i++) {
pinMode(bits[i], OUTPUT);
}
pinMode(button, INPUT); // Button-Pin als Eingang definieren
while (!Serial) {
// Trick 17: Das Hauptprogramm wird erst ausgeführt, wenn die serielle Konsole aufgemacht wurde.
// So verpasst man keine Ausgabe auf der Konsole, weil das Programm losläuft, bevor die Konsole offen ist.
}
}
void loop() {
static bool lastButtonState = LOW;
bool currentButtonState = digitalRead(button);
if (currentButtonState == HIGH && lastButtonState == LOW) {
buttonPress++;
}
lastButtonState = currentButtonState;
// Alle LEDs entsprechend der Binärdarstellung des Zählerwerts steuern
for (int i = 0; i < 8; i++) {
digitalWrite(bits[i], (buttonPress >> i) & 1); // Bitweise Überprüfung und LED-Steuerung
}
Serial.println(buttonPress); // Kontrollausgabe des Zählerwerts auf der seriellen Konsole
delay(100); // Kurze Verzögerung für Stabilität
}*/