// Nanoball v1.00.00 (c)27.11.2003
// > < |
// Arduino Nano Pinball
#include <Adafruit_NeoPixel.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define pinTilt 2
#define pinCoin 3
#define pinLED 4
#define intLED 13
#define pinWay 5
#define sda A4
#define scl A5
#define ledNumber 120
#define screenWidth 128
#define screenHeight 64
#define displayAddress 0x3C
#define intLedPin 13
long score[5] = { };
byte games = 0;
byte extraBalls = 0;
byte numberOfPlayers = 1;
byte numberOfBalls = 1;
byte updateStripe = true;
byte updateDisplay = true;
byte switchCoin = LOW;
byte switchCoinOld = HIGH;
volatile byte stateTilt = false;
unsigned long timeTilt;
Adafruit_NeoPixel stripe(ledNumber, pinLED, NEO_GRB + NEO_KHZ800);
Adafruit_SSD1306 display(screenWidth, screenHeight, &Wire, -1, 800000UL, 800000UL); // Display initialisieren
void setup()
{
pinMode(pinTilt, INPUT_PULLUP);
pinMode(pinCoin, INPUT_PULLUP);
pinMode(intLED, OUTPUT);
stripe.begin();
while(!display.begin(SSD1306_SWITCHCAPVCC, displayAddress)) // Wenn Display nicht startet, LED 1x kurz in...
{ // Endlosschleife blinken lassen... // Fehlermeldung seriell ausgeben
digitalWrite(intLedPin, HIGH);
delay(50);
digitalWrite(intLedPin, LOW);
delay(950);
}
attachInterrupt(0, interruptTilt, CHANGE);
attachInterrupt(1, insertCoin, CHANGE);
}
void loop()
{
while(stateTilt)
{
display.clearDisplay();
display.setRotation(270); // 0=Richtig 90=Auf dem Kopf 180=Richtig 270=Auf dem Kopf
display.setTextSize(5); // Display Rotation setzen
display.setTextWrap(false); // Zeilenumbruch deaktivieren // Rechteck zeichnen // Cursor setzen
display.setTextColor(WHITE); // Schriftfarbe weiß
display.ssd1306_command(SSD1306_SETCONTRAST); // Kontrast auf max. setzen
display.ssd1306_command(255);
display.setCursor(7, 14);
if(millis() >= timeTilt + 1000)
{
display.print(F("TILT"));
timeTilt = millis();
}
display.display();
}
updateNEO();
updateCoins();
updateOLED();
}
void updateNEO()
{
if(updateStripe == false)
return;
for (int currentLED = 0; currentLED <= ledNumber; currentLED++)
//stripe.setPixelColor(currentLED, stripe.Color(255, 255, 255));
stripe.setPixelColor(currentLED, stripe.gamma32(stripe.ColorHSV(hue(300), 255, 255)));
stripe.show();
updateStripe = false;
}
int hue(int value)
{
return map(value, 0, 359, 0, 65534);
}
void updateOLED()
{
display.setRotation(270); // 0=Richtig 90=Auf dem Kopf 180=Richtig 270=Auf dem Kopf
display.setTextSize(2); // Display Rotation setzen
display.setTextWrap(false); // Zeilenumbruch deaktivieren // Rechteck zeichnen // Cursor setzen
display.setTextColor(WHITE); // Schriftfarbe weiß
display.ssd1306_command(SSD1306_SETCONTRAST); // Kontrast auf max. setzen
display.ssd1306_command(255);
for(byte player = 1; player <= numberOfPlayers; player++)
{
display.clearDisplay();
display.drawRoundRect(0, 0, screenWidth, screenHeight, 7, WHITE);
display.setCursor(11, 10);
display.print(F("SPIELER "));
display.print(player);
display.setCursor(11, 39);
display.print(score[player]);
display.display();
}
updateDisplay = false;
}
void interruptTilt()
{
stateTilt = true;
}
void insertCoin()
{
//noInterrupts();
games++;
display.clearDisplay();
display.setRotation(270); // 0=Richtig 90=Auf dem Kopf 180=Richtig 270=Auf dem Kopf
display.setTextSize(4); // Display Rotation setzen
display.setTextWrap(false); // Zeilenumbruch deaktivieren // Rechteck zeichnen // Cursor setzen
display.setTextColor(WHITE); // Schriftfarbe weiß
display.ssd1306_command(SSD1306_SETCONTRAST); // Kontrast auf max. setzen
display.ssd1306_command(255);
display.setCursor(0, 0);
display.print(F("SPIELE: "));
display.print(games);
display.display();
//interrupts();
}
void updateCoins()
{
}