Adventskalender - Warten auf Weihnachten

Ein elektronischer Adventskalender. Mit Hilfe eines Arduinos und dem 12864 LCD aus dem Franzis Lernpaket geht das recht einfach. Mit jedem Tag darf ein neues Türchen mit der rechten Displaytaste geöffnet werden. Es dauert nicht mehr lange dann geht es los.
Adventskalender auf dem Arduino
Die Anwendung
Die Funktionalität der Anwendung ist auf das Wesentliche reduziert. In einer Endlosschleife werden die beiden Displaytaster abgefragt. Die rechte Taste zählt die Tage um eins nach oben. Die linke Taste ist für alle, deren Schoko-Adventskalender den 24. nicht erlebt hat. Ich zähle mich dazu :). Zuerst wird in den Videobuffer das Hintergrundbild geladen. Im Anschluss folgt die Darstellung der einzelnen Türchen. Eine Variable für den aktuellen Tag dient als Indikator ob das jeweilige Türchen dargestellt wird oder nicht.
Der Adventskalender verwendet den Standardbefehlssatz der Display-API. Hier geht's zum Download.
#include "Display.h"
#include "SPI.h"
#include "Advent.h"

#define LCD_BUTTON_LEFT A4
#define LCD_BUTTON_RIGHT A5

Display lcd = Display();
byte day = 0;

void setup() {
  lcd.init(20);
  pinMode(LCD_BUTTON_LEFT, INPUT_PULLUP);
  pinMode(LCD_BUTTON_RIGHT, INPUT_PULLUP);
  draw();
}

void loop() {
  if (!digitalRead(LCD_BUTTON_LEFT)) {
    if (day != 0) {
      day--;
    }
    draw();
    delay(200);
  } else if (!digitalRead(LCD_BUTTON_RIGHT)) {
    if (day < 24) {
      day++;
    }
    draw();
    delay(200);
  }
}

void draw() {
  lcd.clearVideoBuffer();
  lcd.drawBitmap(0, 0, 128, 64, background);
  if (day < 1) { drawWicket(15, 33, 1); }
  if (day < 2) { drawWicket(46, 33, 2); }
  if (day < 3) { drawWicket(1, 34, 3); }
  if (day < 4) { drawWicket(78, 1, 4); }
  if (day < 5) { drawWicket(40, 1, 5); }
  if (day < 6) { drawWicket(34, 49, 6); }
  if (day < 7) { drawWicket(25, 4, 7); }
  if (day < 8) { drawWicket(30, 33, 8); }
  if (day < 9) { drawWicket(3, 2, 9); }
  if (day < 10) { drawWicket(1, 45, 10); }
  if (day < 11) { drawWicket(1, 20, 11); }
  if (day < 12) { drawWicket(66, 30, 12); }
  if (day < 13) { drawWicket(51, 50, 13); }
  if (day < 14) { drawWicket(114, 2, 14); }
  if (day < 15) { drawWicket(60, 8, 15); }
  if (day < 16) { drawWicket(94, 27, 16); }
  if (day < 17) { drawWicket(80, 27, 17); }
  if (day < 18) { drawWicket(95, 45, 18); }
  if (day < 19) { drawWicket(16, 48, 19); }
  if (day < 20) { drawWicket(114, 17, 20); }
  if (day < 21) { drawWicket(114, 32, 21); }
  if (day < 22) { drawWicket(114, 45, 22); }
  if (day < 23) { drawWicket(64, 47, 23); }
  if (day < 24) { drawWicket(95, 1, 24); }
  lcd.show();
}

void drawWicket(byte x, byte y, byte number) {
  lcd.drawBitmap(x, y, 14, 14, empty);
  lcd.invertRectangle(x, y, x+13, y + 13);
  char buffer[50];
  sprintf(buffer, "%d", number); 
  lcd.drawString(x+1, y+3, buffer);
}
Links und Referenzen: