ATTINY Lauflicht

ATTINY Lauflicht

Per Software variabel einsetzbar, Bauteile rd. 3€

🔍 Funktionsbeschreibung

Das Programm steuert mehrere LEDs direkt über die Portpins PB0 bis PB4 des ATtiny85 und erzeugt ein Lauflicht (Sequenz von aufleuchtenden LEDs).
Die LEDs werden nacheinander eingeschaltet, wodurch ein sich bewegender Lichtpunkt entsteht. Je nach Einstellung läuft das Muster entweder hin- und her (Ping-Pong) oder rotierend im Kreis.

🔧 Erweiterungsmöglichkeiten

🧩 I/O-Erweiterung mit PCF8574 oder MCP23017 : Erweiterung auf 8 – 16 zusätzliche Ausgänge über I²C.

💡 PWM- oder Helligkeitssteuerung; sanfte Übergänge oder „atmen“-Effekte realisieren

🎛️ Externe Steuerung (RC, Taster, Potentiometer) : RC-Eingang: Änderung der Blinkrichtung oder Geschwindigkeit per Fernsteuerung. Taster: Umschalten zwischen Lauflichtmodi. Poti: Stufenlose Einstellung der Laufgeschwindigkeit.

Software Code

/******************************************************************
Project         :  Lauflicht mit ATtiny85
CPU             :  ATtiny45/85 oder Digispark
Ausgänge        :  5 Stück an PB0–PB4 (über Vorwiderstand)
Autor           :  Matthias Drinkmann (2020–25)

Kurzbeschreibung:
- Die LEDs leuchten nacheinander auf
- Je nach Einstellung läuft das Muster entweder hin- und her (Ping-Pong-Effekt) 
- oder kontinuierlich im Kreis

Einstellungen:
- STEP_MS:     Geschwindigkeit (Verzögerung pro Schritt in Millisekunden)
- PING_PONG:    true = hin-und-her (Knight-Rider-Effekt), false = kreisend
- ACTIVE_LOW:  true = LED an, wenn Pin LOW (für LEDs gegen VCC)

LIZENZ: Public Domain / ohne Gewähr
******************************************************************/

// EINSTELLUNGEN
// ---------------------------------------------------------

constexpr uint16_t STEP_MS = 120;   // Schrittgeschwindigkeit (kleiner = schneller)
constexpr bool PINGPONG = true;     // true = hin-und-her, false = kreisend
constexpr bool ACTIVE_LOW = false;  // true = LEDs an VCC, false = LEDs an GND

// LED-Pinliste (PB0 bis PB4)
// -> PB5 bleibt Reset, kann optional aktiviert werden (RSTDISBL-Fuse!)
// z.B. so : const uint8_t LED_PINS[] = {0,1,2,3,4,5}; // PB0..PB5
const uint8_t LED_PINS[] = {0, 1, 2, 3, 4};
const uint8_t N = sizeof(LED_PINS) / sizeof(LED_PINS[0]);


// HILFSFUNKTIONEN
// ---------------------------------------------------------

// LED-Zustand setzen (on = true = LED leuchtet)
inline void ledWrite(uint8_t idx, bool on) {
  uint8_t pin = LED_PINS[idx];
  digitalWrite(pin, (ACTIVE_LOW ? !on : on)); // invertieren bei aktiv-LOW
}

// Alle LEDs ausschalten
void clearLeds() {
  for (uint8_t i = 0; i < N; ++i)
    ledWrite(i, false);
}

// Nur eine LED leuchtet, alle anderen sind aus
void lightOne(uint8_t idx) {
  for (uint8_t i = 0; i < N; ++i)
    ledWrite(i, i == idx);
}


// SETUP – Initialisierung
// ---------------------------------------------------------
void setup() {
  // Alle definierten Pins als Ausgang konfigurieren
  for (uint8_t i = 0; i < N; ++i)
    pinMode(LED_PINS[i], OUTPUT);

  // Zu Beginn alle LEDs ausschalten
  clearLeds();
}

// LOOP – Hauptprogramm: LED-Lauflicht
// ---------------------------------------------------------
void loop() {
  if (PINGPONG) {
    // Variante 1: Hin-und-her-Lauflicht (Knight-Rider-Stil)
    for (int8_t i = 0; i < N; ++i) {
      lightOne(i);
      delay(STEP_MS);
    }
    // Rücklauf (ohne die Enden doppelt zu zeigen)
    for (int8_t i = N - 2; i >= 1; --i) {
      lightOne(i);
      delay(STEP_MS);
    }
  } else {
    // Variante 2: Rotierendes Lauflicht
    static uint8_t pos = 0;
    lightOne(pos);
    delay(STEP_MS);
    pos = (pos + 1) % N; // nächste LED
  }
}

Simulation der Schaltung (YouTube)


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert