64kanalige Zufalls-Steuerung

Das LightComp System ist ursprünglich entstanden, um die Häuser-Szenerie auf einer Modell-Eisenbahn-Anlage zu steuern. Hierzu sollten die Innen-Beleuchtung der einzelnen Gebäude möglichst zufällig an- und abgeschalten werden.

Mit Hilfe des nachfolgenden Programmes wurde diese Forderung umgesetzt. Es schaltet die Ausgänge von bis zu Treiber-Modulen per Zufallsgenerator ein und aus. Das Programm verwendet dabei eine 60:40 Verteilung der Schaltzeiten, so dass in der Regel mehr Lichter aus als an sein sollten.

Der Programm-Code ist relativ einfach gehalten und sollte die Anpassung an die eigenen Bedürfnisse ermöglichen. Bei Fragen hierzu stehen wir Ihnen aber selbstverständich gerne zur Verfügung.

// --------------------------------
// Benötigte Bibliotheken einbinden
// --------------------------------
#include <TinyWireM.h>          // I2C
 
// ---------------------
// Konstanten definieren
// ---------------------
#define adrModul1       0x20    // I2C-Adresse für erstes Treiber-Modul

// ----------------------------
// globale Variablen definieren
// ----------------------------
boolean channelBit [64];        // speichert den Schaltzustand der
                                // einzelnen Kanäle

unsigned long channelMils [64]; // speichert den nächsten Umschaltzeitpunkt
                                // je Kanal


// --------------------------------------------------------
// Setup-Routine (wird automatisch beim Starten ausgeführt)
// --------------------------------------------------------
void setup(){
  int i;
  // I2C Schnittstelle initialisieren
  TinyWireM.begin();    

  // Zufallszahlen initialisieren
  for (i=0;i<64;i++){
    channelMils[i] =  millis() + random(40000);
    channelBit[i] = HIGH;
  }  
}

// ------------------------------------------------------------
// Haupt-Routine (wird kontinuierlich als Schleife durchlaufen)
// ------------------------------------------------------------
void loop(){
  int i;
  int j;
  int out;
 
  // Zeiten auswerten
  for (i=0;i<64;i++){
    if (channelMils[i] < millis()){
     if (channelBit[i] == LOW){
      channelBit[i] = HIGH;
      channelMils[i] = millis() + random(60000);
     } else {
      channelBit[i] = LOW;
      channelMils[i] = millis() + random(40000);      
     }
    }
  }  
 
  // einzelne Module durchgehen
  for (j=0; j<8; j++){
    // einzelne Bits durchgehen
    for (i=0; i<8; i++){
     bitWrite(out, i, channelBit[i+j*8]);
    }
 
    // Byte an Modul übertragen
    writePort(adrModul1+j, out);   
  }
}

// -----------
// I2C Routine
// -----------
void writePort(int address, byte data) {
  TinyWireM.beginTransmission(address);
  TinyWireM.send(data);
  TinyWireM.endTransmission();
  delay(5);
}