Einführung in die LightComp Programmierung

Herzstück des LightComp Systems sind kleine Digispark Controller Boards. Diese können Sie ganz einfach an Ihrem eigenen PC programmieren (erste Schritt mit dem Digispark). Hier nun möchten wir Ihnen an konkreten Beispielen erläutern, wie Sie mit dem LightComp System eine individuelle Steuerung realisieren können.

Sehen wir uns zunächst einmal ein minimales Programmbeispiel an, um eine einzelne LED, die an eine Treiber Platine angeschlossen ist blinken zu lassen:

// --------------------------------
// benötigte Bibliotheken einbinden

// --------------------------------
#include <TinyWireM.h>      // I2C Master Bibliothek

 

// -------------
// Setup-Routine
// -------------
void setup(){
  // I2C Bus initialisieren
  TinyWireM.begin();
}

// ------------------------------------------------------
// Hauptroutine (wird permanent als Schleife durchlaufen)
// ------------------------------------------------------
void loop(){
  // Ausgang 1 einschalten
  TinyWireM.beginTransmission(0x20);
  TinyWireM.send(0b11111110); // 0=Ein; 1=Aus
  TinyWireM.endTransmission();

  // eine Sekunde warten
  delay(1000);

  // Ausgang 1 ausschalten
  TinyWireM.beginTransmission(0x20);
  TinyWireM.send(0b11111111); // 0=Ein; 1=Aus
  TinyWireM.endTransmission();

  // eine Sekunde warten
  delay(1000);
 
}

Da die Treiber-Platinen per I2C Bus angesteuert werden, müssen wir hierfür zunächst eine vorgefertigte Bibliothek einbinden, in der der größte Teil der Programmierung bereits erledigt wurde. Dies geschieht mit Hilfe der #include Anweisung.

Um den I2C Bus aber auch tatsächlich verwenden zu können, muss er innerhalb der Setup-Routine per TinyWireM.begin() noch initialisiert werden.

Nun kann innerhalb der Haupt-Routine auf den I2C Bus und damit auf die Treiber-Platinen zugegriffen werden. Zunächst müssen wir dem Programm mitteilen, auf welche der bis zu 8 Treiber-Platinen wir zugreifen wollen. Dies geschiet über den Aufruf der TinyWireM.beginTransmission() Methode. Dieser Prozedur muss ein Parameter mit der Adresse der Treiber-Platine mitgegeben werden. Sind alle drei Adress-Wahl-Schalter der Treiber Platine auf 0 gestellt, dann kann dieser Baustein über die Adresse 0x20 erreicht werden.

Als nächstes können nun mit der TinyWireM.send() Methode die einzelnen Kanäle der Treiber-Platine an- bzw. ausgeschalten werden. Im Beispiel verwenden wir hierfür die sog. Binär-Schreibweise. Diese wird eingeleitet durch den Wert 0b gefolgt von den Werten für die 8 Kanäle des Moduls. Beachten Sie dabei zwei Dinge: der Wert für Kanal 1 steht ganz rechts, der für Kanal 8 ganz links. Eine 1 schaltet einen Kanal aus während eine 0 ihn einschaltet. Der Wert 0b11111110 schaltet demnach den 1 Kanal ein und alle andern aus.

Nach dem Übertrages des Wertes müssen wir dem Programm durch Aufruf der TinyWireM.endTransmission() Methode noch mitteilen, dass wir mit dieser Treiber-Platine erstmal fertig sind. Dies ist wichtig um den I2C Bus wieder frei zu geben.

Mit Hilfe der Delay() Funktion wird nun 1000 Milisekunden = 1 Sekunde gewartet und dann der Ausgang 1 wieder gemäß soeben beschriebenen Ablauf wieder ausgeschalten.

Um nun nicht immer gleich 3 Zeilen Code schreiben zu müssen, nur um einen Kanal umzuschalten, können die erforderlichen Schritte in eine eigene Prozedur ausgelagert werden:

// ----------------------------------------------------------
// I2C Prozedur zum Ausgeben eines Bytes an ein Treiber-Modul
// ----------------------------------------------------------
void writePort(int I2C_Adresse, byte Wert){
  TinyWireM.beginTransmission(I2C_Adresse);
  TinyWireM.send(Wert);
  TinyWireM.endTransmission();

}

Damit können wir den Programmcode innerhalb der Hauptroutine deutlich vereinfachen:

// --------------------------------
// benötigte Bibliotheken einbinden

// --------------------------------
#include <TinyWireM.h>      // I2C Master Bibliothek

// -------------
// Setup-Routine
// -------------
void setup(){
  // I2C Bus initialisieren
  TinyWireM.begin();
}

// ------------------------------------------------------
// Hauptroutine (wird permanent als Schleife durchlaufen)
// ------------------------------------------------------
void loop(){
  // Ausgang 1 einschalten
  writePort(0x20, 0b11111110);

  // eine Sekunde warten
  delay(1000);

  // Ausgang 1 ausschalten
  writePort(0x20, 0b11111111);

  // eine Sekunde warten
  delay(1000);
 
}

 

// ----------------------------------------------------------
// I2C Prozedur zum Ausgeben eines Bytes an ein Treiber-Modul
// ----------------------------------------------------------
void writePort(int I2C_Adresse, byte Wert){
  TinyWireM.beginTransmission(I2C_Adresse);
  TinyWireM.send(Wert);
  TinyWireM.endTransmission();

}