#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "Side.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);//LCD display lcd wird erstellt
byte numbers[5] = {
B10000,
B01000,
B00100,
B00010,
B00001
};
int OledUpdateFrame = 100;
int LCDupdateFrame = 3;
float x = 10;
float y = 10;
float speedx = .8f;
float speedy = .8f;
int maxX = 128;
int maxY = 54;
int minX = 0;
int minY = 0;
int scoreL = 0;
int scoreR = 0;
int Buzzer = 1;
int totalLoops = 0;
Side side(10,20,10,minY,maxY,.5f);
Side side2(118,20,10,minY,maxY,.5f);
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
void setup() {
lcd.init();
lcd.backlight();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
//display.display();
display.clearDisplay();
display.display();
pinMode(0,INPUT);
}
void loop() {
if(totalLoops%LCDupdateFrame==0){ //LCD display update
byte customChar[8] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000
};
customChar[gerundet(((y/27.0f-gerundet(y/54.0f))*8.0f)-1)] = numbers[gerundet(((x/8.0f-gerundet(x/8.53f))*5.0f)-1)];
lcd.createChar(0, customChar);
lcd.clear();
lcd.setCursor(gerundet(x/8.53f),gerundet(y/54.0f));
lcd.write(0);
drawSideOnLCD(gerundet(side.y/3.375f),1,1);
drawSideOnLCD(gerundet(side2.y/3.375f),14,3);
}
if(side.checkCollision(x,y)){
speedx = -speedx;
tone(Buzzer, 200, 25);
}
if(side2.checkCollision(x,y)){
speedx = -speedx;
tone(Buzzer, 200, 25);
}
checkWalls();
updateBall();
if(totalLoops%OledUpdateFrame==0){ // Oled display update
display.clearDisplay();
drawBall();
side.updateSide(display);
side2.updateSide(display);
display.setTextColor(WHITE, BLACK);//https://media.discordapp.net/attachments/1140745905021128864/1155559788382535781/voicemessage.gif?ex=661c156a&is=6609a06a&hm=008dd0451d2540476211eff8ecaabca22ed350fd572f46cbbacbb63ff02f038c&=
display.setCursor(0, 56);
display.print(scoreL);
display.setCursor(122, 56);
display.print(scoreR);
display.display();
}
if(digitalRead(A0)==HIGH){
side.up();
}
if(digitalRead(A1)==HIGH){
side.down();
}
if(digitalRead(A3)==HIGH){
side2.up();
}
if(digitalRead(A2)==HIGH){
side2.down();
}
++totalLoops;
}
void drawSideOnLCD(byte y,byte x,byte customCharNumber){
byte bigByte[16] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000
};
bigByte[y] = B00100;
bigByte[y+1] = B00100;
bigByte[y+2] = B00100;
byte char1[8] = {bigByte[0],bigByte[1],bigByte[2],bigByte[3],bigByte[4],bigByte[5],bigByte[6],bigByte[7]};
byte char2[8] = {bigByte[8],bigByte[9],bigByte[10],bigByte[11],bigByte[12],bigByte[13],bigByte[14],bigByte[15]};
lcd.createChar(customCharNumber, char1);
lcd.setCursor(x,0);
lcd.write(customCharNumber);
lcd.createChar(customCharNumber+1, char2);
lcd.setCursor(x,1);
lcd.write(customCharNumber+1);
}
int gerundet(float x){
float y = x-(int)x;
if(y>=.5f){
return (int)(x-y+1);
}
else{
return (int)(x-y);
}
}
void updateBall(){
x+=speedx;
y+=speedy;
}
void drawBall(){
display.drawPixel(x,y,WHITE);
}
void checkWalls(){
if(y>=maxY){
speedy = -speedy;
tone(Buzzer, 200, 25);
}else if(y<=minY){
speedy = -speedy;
tone(Buzzer, 200, 25);
}
if(x>=maxX){
speedx = -speedx;
tone(Buzzer, 200, 25);
++scoreL;
}else if(x<=minX){
speedx = -speedx;
tone(Buzzer, 200, 25);
++scoreR;
}
}