Mondlicht mit ATTiny84 und Tilt-Sensor

Ein Mondlicht ist eine Lampe die eigenständig in einem sanften  Verlauf ihre Farben wechselt, wobei die 3 Grundfarben Rot, Grün und Blau nach dem Zufallsprinzip gemischt werden. Die Lampe startet standardmäßig mit dem Farbwechsel. Wenn man dies nicht möchte und die Lampe gerade eine der eigenen Lieblingsfarben anzeigt, braucht man nur an der Lampe zu klopfen um den Farbwechsel anzuhalten. Ein weiteres klopfen setzt den Farbwechsel fort. Das erfolgreiche Umschalten zwischen Farbwechsel und einzelner Farbe wird ebenfalls durch einen Signalton angezeigt.

Ich werde in diesem Projekt einmal den Aufbau und die Programmierung direkt mit einem Arduino UNO und im zweiten Teil den Aufbau der Schaltung mit einem ATTiny84 erklären. Den ATtiny werde ich mit dem Arduino UNO als Programmer programmieren.

Mondlicht

Übersicht der einzelnen Schritte

  1. verbinden aller Bauteile mit einem Arduino UNO
  2. Sketch für den Arduino UNO
  3. verbinden des ATtiny84 mit dem Arduino UNO
  4. verbinden aller Bauteile mit dem ATtiny84
  5. einrichten des Arduino UNO als Programmer
  6. programmieren des ATtiny84 mit dem Arduino UNO als Programmer

1 . Verbinden aller Bauteile mit einem Arduino UNO

Benötigte Bauteile

  • 1 x Arduino UNO
  • 1 x RGB LED
  • 1 x Tilt-Sensor (Erschütterungssensor)
  • 1 x Piezo (Tongeber)
  • 1 x 220 Ohm Widerstand für den Tilt Sensor
  • 3 x Widerstände für die RGB LED

Herstellen der Verbindung der einzelnen Bauteile mit dem Arduino UNO auf einem Breadboard.

Mondlicht - Arduino Uno - Breadboard

 

2. Sketch zum testen auf dem Arduino UNO

Um das Sketch auf den Arduino zu brennen, wählen Sie in der Arduino IDE im Menü „Werkzeuge“ folgende Werte.

  • Platine: Arduino UNO
  • Programmer: AVRISP mkII
//Ab hier anpassen
const byte redPin   = 11;    // Digitaler PWM Pin für rot in RGB LED
const byte greenPin = 10;    // Digitaler PWM Pin für grün in RGB LED
const byte bluePin  = 9;     // Digitaler PWM Pin für blau in RGB LED
const byte piezoPin = 8;     // Digitaler Pin für den Piezo Sensor
const byte tiltPin  = 7;     // Digitaler Pin für den Tilt Sensor

int fadeSpeed = 20;          // Geschwindigkeit mit der die Farbe gewechselt wird
int ledState  = LOW;         // Aktueller Status der LED (LOW = an) beim einschalten

boolean fadeLEDColor = true; // true = LED Farbwechsel, false = kein Farbwechsel
boolean DEBUG = true;        // true = Seriellen Monitor verwenden

// Ab hier nichts mehr ändern
long randomNumber;           // Variable für den Zufallswert der LED Farbe
int redVal;                  // Wert für rote LED
int greenVal;                // Wert für grüne LED
int blueVal;                 // Wert für blaue LED
int tiltState;               // HIGH bei Erschütterung
int lastTiltState;           // für entprellen des Tilt Sensors



void setup () {
  if(DEBUG) Serial.begin(9600);

  pinMode (tiltPin, INPUT);
  
  pinMode (redPin, OUTPUT);
  pinMode (greenPin, OUTPUT);
  pinMode (bluePin, OUTPUT);

  digitalWrite(redPin, ledState);   // HIGH = LED aus weil gemeinsame Kathode
  digitalWrite(greenPin, ledState);
  digitalWrite(bluePin, ledState);

  randomSeed (analogRead (0)); // Initialisieren der random() Funktion mit einem Wert des nicht angeschlossenen analogen Port A0
}



void loop () {
  redVal = fadeLED(redPin, redVal);
  blueVal = fadeLED(bluePin, blueVal);
  greenVal = fadeLED(greenPin, greenVal);
}



// Farbe und Helligkeit der LED nach dem Zufallsprinzip ändern
int fadeLED (int pin, int ledBrightness) { 
  randomNumber = random (0,256);
  
  do {
    if(ledState == LOW) { // Wenn LED eingeschaltet ist
      fadeLEDColorTilt(); // Tilt-Sensor zum beenden und fortführen des Farbwechsels abfragen

      if(fadeLEDColor == true) { // und die LED-Farbe sich ändern soll
        if (ledBrightness < randomNumber) { // Farbe und Helligkeit der LED ständig anpassen
          ledBrightness++;
        } else {
          ledBrightness--;
        }
      }  
      analogWrite (pin, ledBrightness);
      delay (fadeSpeed);
    }
  } while (ledBrightness != randomNumber);
  return ledBrightness;
}



// Tilt-Sensor zum starten oder anhalten des Farbwechsels der LED abfragen
void fadeLEDColorTilt(void) {
  tiltState = digitalRead(tiltPin);

  if (tiltState != lastTiltState) {
    if (tiltState == HIGH) {
      if (fadeLEDColor == true) {
        fadeLEDColor = false;
        if (DEBUG) Serial.println("Fading Off");
      } else {
        fadeLEDColor = true;
        if (DEBUG) Serial.println("Fading On");
      }
      playTone();
    }
    lastTiltState = tiltState;
    delay(100);
  }
}



// Ton über Piezo ausgeben
void playTone() {
  if(fadeLEDColor) {
    tone(piezoPin, 440);
    delay(100);
    tone(piezoPin, 660);
    delay(100);
  } else {
    tone(piezoPin, 220);
    delay(100);
    tone(piezoPin, 330);
    delay(100);
  }
  noTone(piezoPin);
}

 

3. Verbinden des ATTiny84 mit dem Arduino UNO

Entfernen Sie jetzt alle Jumper Kabel außer GND und +5V vom Arduino.
Um das Sketch später mit dem Arduino UNO als Programmer auf den ATtiny84 brennen zu können, müssen wir als erstes die Verbindung von SCK, MISO, MOSI und RESET zwischen dem ATTiny84 und dem Arduino UNO herstellen. Verbinden Sie dazu einfach die Pins wie auf der folgenden Zeichnung zu sehen mit dem Arduino. Also Pin 8 am ATTiny84 mit Pin 12 am Arduino Uno usw.

ATTINY44-84 Arduino UNO as Programmer PIN-Belegung

4. Verbinden aller Bauteile mit dem ATTiny84

Benötigte Bauteile

  • 1 x Arduino UNO
  • 1 x ATtiny84
  • 1 x RGB LED
  • 1 x Tilt-Sensor (Erschütterungssensor)
  • 1 x Piezo (Tongeber)
  • 1 x 220 Ohm Widerstand für den Tilt Sensor
  • 3 x Widerstände für die RGB LED

Mondlicht - ATTiny84 - Breadboard

5. Einrichten des Arduino UNO als Programmer

Ganz Wichtig!
Um das Sketch auf den ATtiny84 brennen zu können, müssen wir erst ein spezielles Sketch auf den Arduino UNO brennen.
Gehen Sie dazu ins Menü und wählen Sie unter  „Datei->Beispiele“ zuerst das Sketch „Arduino ISP„.

Vergewissern Sie sich nochmals, dass im Menü folgende Einstellungen gewählt wurden.

  • Werkzeuge->Platine: Arduino UNO
  • Werkzeuge->Programmer: AVRISP mkII

Brennen Sie anschließen das Sketch „Arduino ISP“ auf den Arduino UNO.

6. programmieren des ATtiny84 mit dem Arduino UNO als Programmer

Sketch für den ATTiny84

Beachten Sie hier bitte dass ich eine RGB LED mit gemeinsamer Kathode (Plus) verwende, weshalb ledState = HIGH bedeutet dass die LED aus und nicht an ist. Bei einer RGB LED mit gemeinsamer Anode (GND) muss dementsprechend LOW für aus und HIGH für ein angegeben werden. Für die Einbelegung habe ich folgende Zeichnung verwendet.

ATTINY44-84 PIN-Belegung

//Ab hier anpassen
const byte tiltPin  =   9;   // Digitaler Pin für den Tilt Sensor
const int redPin    =   8;   // Digitaler PWM Pin für rot in RGB LED
const int greenPin  =   7;   // Digitaler PWM Pin für grün in RGB LED
const int bluePin   =   6;   // Digitaler PWM Pin für blau in RGB LED
const byte piezoPin =  10;   // Digitaler Pin für den Piezo Sensor

int fadeSpeed  = 100;        // Geschwindigkeit mit der die Farbe gewechselt wird
int ledState   = LOW;        // Aktuelle Status der LED (wechselt bei Erschütterung) HIGH = aus

boolean fadeLEDColor = true; // true = LED Farbwechsel, false = kein Farbwechsel

//Ab hier nichts mehr ändern
long randomNumber;           // Variable für den Zufallswert für LED Farbe
int redVal;                  // Wert für rote LED
int greenVal;                // Wert für grüne LED
int blueVal;                 // Wert für blaue LED
int tiltState;               // HIGH bei Erschütterung
int lastTiltState;           // für entprellen des Tilt Sensors



void setup () {
  pinMode (tiltPin, INPUT);
  
  pinMode (redPin, OUTPUT);
  pinMode (greenPin, OUTPUT);
  pinMode (bluePin, OUTPUT);
  pinMode (piezoPin, OUTPUT);

  digitalWrite(redPin, ledState);
  digitalWrite(greenPin, ledState);
  digitalWrite(bluePin, ledState);

  randomSeed (analogRead (0));  // Initialisieren der random() Funktion mit einem Wert des nicht angeschlossenen analogen Port A0
}



void loop () {  
  redVal = fadeLED(redPin, redVal);
  blueVal = fadeLED(bluePin, blueVal);
  greenVal = fadeLED(greenPin, greenVal);
}



// Farbe und Helligkeit der LED nach dem Zufallsprinzip ändern
int fadeLED (int pin, int ledBrightness) { 
  randomNumber = random (0,256);
  
  do {    
    if(ledState == LOW) { // Wenn LED eingeschaltet ist
      fadeLEDColorTilt(); // Tilt-Sensor zum beenden und fortführen des Farbwechsels abfragen

      if(fadeLEDColor == true) { // und die LEDfarbe sich ändern soll
        if (ledBrightness < randomNumber) { // Farbe und Helligkeit der LED ständig anpassen
          ledBrightness++;
        } else {
          ledBrightness--;
        }
      }  
      analogWrite (pin, ledBrightness);
      delay (fadeSpeed);
    }    
  } while (ledBrightness != randomNumber);
  return ledBrightness;
}



// Tilt-Sensor zum starten oder anhalten des Farbwechsels der LED abfragen
void fadeLEDColorTilt(void) {
  tiltState = digitalRead(tiltPin);

  if (tiltState != lastTiltState) {
    if (tiltState == HIGH) {
      if (fadeLEDColor == true) {
        fadeLEDColor = false;
      } else {
        fadeLEDColor = true;
      }
      playTone();
      delay(2000);
    }
    lastTiltState = tiltState;
  }
}



// Ton über Piezo ausgeben
void playTone() {
  if(fadeLEDColor) {
    beep(piezoPin,440,400);
    delay(1000);
    beep(piezoPin,660,400);
    delay(1000);
  } else {
    beep(piezoPin,60,400);
    delay(1000);
    beep(piezoPin,40,400);
    delay(1000);
  }
}



void beep (int freq, long ms) {
  int x;   
  long delayVal = (long)(1000000/freq);
  long loopTime = (long)((ms*1000)/(delayVal*2));
  for (x=0;x<loopTime;x++)   
  {  
    digitalWrite(piezoPin,HIGH);
    delayMicroseconds(delayVal);
    digitalWrite(piezoPin,LOW);
    delayMicroseconds(delayAmount);
  }  
}

Gehen Sie nun erneut ins Menü und setzen Sie folgende Werte.

  • Platine: ATtiny
  • Prozessor: ATtiny84
  • Clock: 1MHz (internal)
  • Programmer: Arduino AS ISP

Wenn Sie die Unterstützung für den ATTiny 84 noch nicht installiert haben, lesen Sie am besten vorher den Beitrag ATtiny Support unter Arduino 1.6 installieren oder wenn Sie eine ältere Version der Arduino IDE verwenden lesen Sie diesen Beitrag Programmieren eines Attiny mit Arduino 1.0.1

Konnten Sie die genannten Einstellungen vornehmen, klicken Sie anschließend zum brennen des ATTiny84 bei gedrückter Umschalttaste auf den „Hochladen-Button“ (Hochladen mit Programmer).

Wenn alles geklappt hat, die Verkabelung richtig vorgenommen wurde und das Mondlicht mit Strom versorgt wird, sollte die LED nun anfangen zu leuchten und die Farbe zu wechseln. Klopfen Sie auf das Glas wird der Farbwechsel gestoppt bis Sie ein weiteres mal am Glas klopfen.

Sie können die komplette Schaltung nun auf einer Lochrasterplatine unterbringen oder sich eine Platine ätzen und das ganze am besten in einem Milchglas unterbringen. Ein wirklich stimmungsvolles Licht für laue Sommerabende auf der Terrasse.  :-)

Ich hoffe Ihnen hat dieses Projekt gefallen.
Bei Fragen oder Anregungen können Sie gern die Kommentarfunktion nutzen.

Über Enrico S.

Programmierer, Webdesigner, Grafiker, Blogger, Screencaster, Arduino- und eMobility Enthusiast. nefilim3006 ist auch bei Google+ vertreten

Ein Kommentar zu “Mondlicht mit ATTiny84 und Tilt-Sensor

  1. Danke für den Bauvorschlag.
    Ich habe den Sketch modifiziert.
    1x Fade off
    2x LED’S aus
    3x Fade On

    Somit kann man das Mondlicht auch durch Klopfen ausschalten und braucht keinen Ausschalter.