#include <Wire.h> // voor I2C-communicatie
#include <Adafruit_GFX.h> // Adafruit Graphics Library
#include <Adafruit_SSD1306.h> // Adafruit OLED-displaydriver
//voor OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//algemeen
bool vorigeknop = LOW;
byte aantalspelers = 4;
byte snelheid = 100;
bool varzuiger = HIGH;
bool varyas = LOW;
bool varxas = HIGH;
bool varzas = LOW;
bool varcas = HIGH;
//variabelen zodat de code weet waar de gebruiker zich bevind in het menu
byte staatalgemeen = 0;
/*
0 = startscherm zienbaar
1 = aantal spelers wordt aangepast
2 = configuratiescherm zienbaar
3 = snelheid wordt aangepast
4 = manueelscherm zienbaar
*/
byte staatstart = 0;
/*
0 = Deel uit geselecteerd
1 = Aantal spelers geselecteerd
2 = Configuratie geselecteerd
*/
byte staatconfiguratie = 0;
/*
0 = Terug geselecteerd
1 = Snelheid geselecteerd
2 = Manuele bediening geselecteerd
*/
byte staatmanueel = 0;
/*
0 = Terug geselecteerd
1 = Zuiger geselecteerd
2 = Y-as geselecteerd
3 = X-as geselecteerd
4 = Z-as geselecteerd
5 = C-as geselecteerd
*/
//voor rotary encoder
int pinA = 7;
int pinB = 6;
int knop = 5;
bool vorigeA;
bool nuA;
//arrays om de verschillende titels van het menu in op te slagen
String opties1[3] = {
"Deel uit",
"Aantal Spelers:",
"Configuratie"
};
String opties2[3] = {
"Terug",
"Snelheid:",
"Manuele bediening"
};
String opties3[6] = {
"Terug",
"Zuiger:",
"Y-as:",
"X-as:",
"Z-as:",
"C-as:" //as voor kaart op te pakken
};
void setup() { //SCL van OLED op A5, SDA van OLED op A4 van arduino
Serial.begin(9600);
//voor rotary encoder
pinMode(pinA, INPUT);
pinMode(pinB, INPUT);
pinMode(knop, INPUT);
vorigeA = digitalRead(pinA);
//OLED display klaarmaken
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialiseer OLED-display met het juiste I2C-adres
display.clearDisplay(); // wis het display
display.setTextSize(1); // kies tekstgrootte
display.setTextColor(WHITE); // kies tekstkleur
//startscherm opzetten
display.setCursor(3,4); // zet cursor aan het begin
display.println(opties1[0]);
display.setCursor(3,26);
display.println(opties1[1]);
display.setCursor(3,48);
display.println(opties1[2]);
display.setCursor(96,26);
display.println(aantalspelers);
display.drawRect(0, 0, 122, 17, 1);
display.display();
}
void cwbeweging() { //wanneer cw wordt gedraaid
if (staatalgemeen == 0) { //als startscherm te zien is
if (staatstart == 0) { //Deel uit was geselecteerd, nu #spelers
display.drawRect(0, 0, 122, 17, 0);
display.drawRect(0, 22, 122, 17, 1);
display.display();
staatstart ++;
}
else if (staatstart == 1) { //#spelers was geselecteerd, nu configuratie
display.drawRect(0, 22, 122, 17, 0);
display.drawRect(0, 44, 122, 17, 1);
display.display();
staatstart ++;
}
}
else if (staatalgemeen == 1) { //+1 speler
if (aantalspelers < 4) {
display.fillRect(95, 26, 8, 8, 0);
display.setCursor(96,26);
aantalspelers ++;
display.println(aantalspelers);
}
display.display();
Serial.println(aantalspelers);
}
else if (staatalgemeen == 2) { //als configuratiescherm te zien is
if (staatconfiguratie == 0) { //Terug was geselecteerd, nu snelheid
display.drawRect(0, 0, 122, 17, 0);
display.drawRect(0, 22, 122, 17, 1);
display.display();
staatconfiguratie ++;
}
else if (staatconfiguratie == 1) { //Snelheid was geselecteerd, nu manuele bediening
display.drawRect(0, 22, 122, 17, 0);
display.drawRect(0, 44, 122, 17, 1);
display.display();
staatconfiguratie ++;
}
}
else if (staatalgemeen == 3) { //+5 snelheid
if (snelheid != 255) {
snelheid += 5;
}
display.fillRect(95, 26, 18, 8, 0);
display.setCursor(96,26);
display.println(snelheid);
display.display();
Serial.println(snelheid);
}
else if (staatalgemeen == 4) { //als manueelscherm te zien is
if (staatmanueel == 0) { //Terug was geselecteerd, nu zuiger
display.drawRect(0, 0, 122, 17, 0);
display.drawRect(0, 22, 122, 17, 1);
display.display();
staatmanueel ++;
}
else if (staatmanueel == 1) { //Zuiger was geselecteerd, nu Y-as
display.clearDisplay();
display.setCursor(3,4);
display.println(opties3[1]);
display.setCursor(3,26);
display.println(opties3[2]);
display.setCursor(3,48);
display.println(opties3[3]);
display.setCursor(96,4);
display.println(varzuiger);
display.setCursor(96,26);
display.println(varyas);
display.setCursor(96,48);
display.println(varxas);
display.drawRect(0, 22, 122, 17, 1);
display.display();
staatmanueel ++;
}
else if (staatmanueel == 2) { //Y-as was geselecteerd, nu X-as
display.clearDisplay();
display.setCursor(3,4);
display.println(opties3[2]);
display.setCursor(3,26);
display.println(opties3[3]);
display.setCursor(3,48);
display.println(opties3[4]);
display.setCursor(96,4);
display.println(varyas);
display.setCursor(96,26);
display.println(varxas);
display.setCursor(96,48);
display.println(varzas);
display.drawRect(0, 22, 122, 17, 1);
display.display();
staatmanueel ++;
}
else if (staatmanueel == 3) { //X-as was geselecteerd, nu Z-as
display.clearDisplay();
display.setCursor(3,4);
display.println(opties3[3]);
display.setCursor(3,26);
display.println(opties3[4]);
display.setCursor(3,48);
display.println(opties3[5]);
display.setCursor(96,4);
display.println(varxas);
display.setCursor(96,26);
display.println(varzas);
display.setCursor(96,48);
display.println(varcas);
display.drawRect(0, 22, 122, 17, 1);
display.display();
staatmanueel ++;
}
else if (staatmanueel == 4) { //Z-as was geselecteerd,nu C-as
display.drawRect(0, 22, 122, 17, 0);
display.drawRect(0, 44, 122, 17, 1);
display.display();
staatmanueel ++;
}
}
}
void ccwbeweging() { //wanneer ccw wordt gedraaid
if (staatalgemeen == 0) { //als startscherm te zien is
if (staatstart == 2) { //configuratie was geselecteerd, nu #spelers
display.drawRect(0, 44, 122, 17, 0);
display.drawRect(0, 22, 122, 17, 1);
display.display();
staatstart --;
}
else if (staatstart == 1) { //#spelers was geselecteerd, nu deel uit
display.drawRect(0, 22, 122, 17, 0);
display.drawRect(0, 0, 122, 17, 1);
display.display();
staatstart --;
}
}
else if (staatalgemeen == 1) { //-1 speler
if (aantalspelers > 1) {
display.fillRect(95, 26, 8, 8, 0);
display.setCursor(95,26);
aantalspelers --;
display.println(aantalspelers);
}
display.display();
Serial.println(aantalspelers);
}
else if (staatalgemeen == 2) { //als configuratiescherm te zien is
if (staatconfiguratie == 2) { //Manuele bediening was geselecteerd, nu snelheid
display.drawRect(0, 44, 122, 17, 0);
display.drawRect(0, 22, 122, 17, 1);
display.display();
staatconfiguratie --;
}
else if (staatconfiguratie == 1) { //snelheid was geselecteerd, nu 'Terug'
display.drawRect(0, 22, 122, 17, 0);
display.drawRect(0, 0, 122, 17, 1);
display.display();
staatconfiguratie --;
}
}
else if (staatalgemeen == 3) { //-5 snelheid
if (snelheid != 5) {
snelheid -= 5;
}
display.fillRect(95, 26, 18, 8, 0);
display.setCursor(96,26);
display.println(snelheid);
display.display();
Serial.println(snelheid);
}
else if (staatalgemeen == 4) { //als manueelscherm te zien is
if (staatmanueel == 5) { //C-as was geselecteerd,nu Z-as
display.drawRect(0, 44, 122, 17, 0);
display.drawRect(0, 22, 122, 17, 1);
display.display();
staatmanueel --;
}
else if (staatmanueel == 4) { //Z-as was geselecteerd, nu X-as
display.clearDisplay();
display.setCursor(3,4);
display.println(opties3[2]);
display.setCursor(3,26);
display.println(opties3[3]);
display.setCursor(3,48);
display.println(opties3[4]);
display.setCursor(96,4);
display.println(varyas);
display.setCursor(96,26);
display.println(varxas);
display.setCursor(96,48);
display.println(varzas);
display.drawRect(0, 22, 122, 17, 1);
display.display();
staatmanueel --;
}
else if (staatmanueel == 3) { //X-as was geselecteerd, nu Y-as
display.clearDisplay();
display.setCursor(3,4);
display.println(opties3[1]);
display.setCursor(3,26);
display.println(opties3[2]);
display.setCursor(3,48);
display.println(opties3[3]);
display.setCursor(96,4);
display.println(varzuiger);
display.setCursor(96,26);
display.println(varyas);
display.setCursor(96,48);
display.println(varxas);
display.drawRect(0, 22, 122, 17, 1);
display.display();
staatmanueel --;
}
else if (staatmanueel == 2) { //Y-as was geselecteerd, nu zuiger
display.clearDisplay();
display.setCursor(3,4);
display.println(opties3[0]);
display.setCursor(3,26);
display.println(opties3[1]);
display.setCursor(3,48);
display.println(opties3[2]);
display.setCursor(96,26);
display.println(varzuiger);
display.setCursor(96,48);
display.println(varyas);
display.drawRect(0, 22, 122, 17, 1);
display.display();
staatmanueel --;
}
else if (staatmanueel == 1) { //Zuiger was geselecteerd, nu 'Terug'
display.drawRect(0, 22, 122, 17, 0);
display.drawRect(0, 0, 122, 17, 1);
display.display();
staatmanueel --;
}
}
}
void knopduw() { //wanneer de knop wordt ingeduwd
if (staatalgemeen == 0) { //als startscherm te zien is
if (staatstart == 0) { //Deel uit was geselecteerd
Serial.println("begint uit te delen");
}
else if (staatstart == 1) { //#spelers was geselecteerd
display.drawRect(1, 23, 120, 15, 1);
display.display();
staatalgemeen = 1; //rest van de code laten weten dat #spelers veranderd worden
}
else if (staatstart == 2) { //Configuratie was geselecteerd
display.drawRect(1, 45, 120, 15, 1); //grotere rechthoek
display.display(); //zodat het wel nog lijkt alsof erop geduwd werd
delay(100);
display.clearDisplay();
staatalgemeen = 2; //vanaf nu in configuratiescherm
staatconfiguratie = 0;
display.setCursor(3,4); //configuratiescherm opzetten
display.println(opties2[0]);
display.setCursor(3,26);
display.println(opties2[1]);
display.setCursor(3,48);
display.println(opties2[2]);
display.setCursor(96,26);
display.println(snelheid);
display.drawRect(0, 0, 122, 17, 1);
display.display();
}
}
else if (staatalgemeen == 1) { //Als op knop wordt geduwd, wanneer #spelers werd aangepast
display.drawRect(1, 23, 120, 15, 0);
display.display();
staatalgemeen = 0; //terug startscherm bedienen
delay(800); //delay zodat er niet 2 keer op knop wordt geduwd
}
else if (staatalgemeen == 2) { //Als op knop wordt geduwd, binnen configuratiescherm
if (staatconfiguratie == 0) { //Terug was geselecteerd
display.drawRect(1, 1, 120, 15, 1); //grotere rechthoek
display.display(); //zodat het wel nog lijkt alsof erop geduwd werd
delay(100);
display.clearDisplay();
staatalgemeen = 0; //vanaf nu in startscherm
staatstart = 2;
//startscherm opzetten
display.setCursor(3,4);
display.println(opties1[0]);
display.setCursor(3,26);
display.println(opties1[1]);
display.setCursor(3,48);
display.println(opties1[2]);
display.setCursor(96,26);
display.println(aantalspelers);
display.drawRect(0, 44, 122, 17, 1);
display.display();
}
if (staatconfiguratie == 1) { //Snelheid was geselecteerd
display.drawRect(1, 23, 120, 15, 1);
display.display();
staatalgemeen = 3;
}
if (staatconfiguratie == 2) { //Manuele bediening was geselecteerd
display.drawRect(1, 45, 120, 15, 1); //grotere rechthoek
display.display(); //zodat het wel nog lijkt alsof erop geduwd werd
delay(100);
display.clearDisplay();
staatalgemeen = 4; //vanaf nu in manueelscherm
staatmanueel = 0;
display.setCursor(3,4); //manueelscherm opzetten
display.println(opties3[0]);
display.setCursor(3,26);
display.println(opties3[1]);
display.setCursor(3,48);
display.println(opties3[2]);
display.setCursor(96,26);
display.println(varzuiger);
display.setCursor(96,48);
display.println(varyas);
display.drawRect(0, 0, 122, 17, 1);
display.display();
}
}
else if (staatalgemeen == 3) { //Als op knop wordt geduwd, wanneer snelheid werd aangepast
Serial.println("ja");
display.drawRect(1, 23, 120, 15, 0);
display.display();
staatalgemeen = 2;
}
else if (staatalgemeen == 4) { //Als op knop wordt geduwd, binnen manueelscherm
if (staatmanueel == 0) { //Terug was geselecteerd
display.drawRect(1, 1, 120, 15, 1); //grotere rechthoek
display.display(); //zodat het wel nog lijkt alsof erop geduwd werd
delay(100);
display.clearDisplay();
staatalgemeen = 2; //vanaf nu in configuratiescherm
staatconfiguratie = 2;
//configuratiescherm opzetten
display.setCursor(3,4);
display.println(opties2[0]);
display.setCursor(3,26);
display.println(opties2[1]);
display.setCursor(3,48);
display.println(opties2[2]);
display.setCursor(96,26);
display.println(snelheid);
display.drawRect(0, 44, 122, 17, 1);
display.display();
}
if (staatmanueel == 1) { //Zuiger was geselecteerd
display.drawRect(1, 23, 120, 15, 1); //grotere rechthoek
display.display(); //zodat het wel nog lijkt alsof erop geduwd werd
varzuiger = !varzuiger;
delay(100);
display.drawRect(1, 23, 120, 15, 0);
display.fillRect(95, 26, 8, 8, 0);
display.setCursor(95,26);
display.println(varzuiger);
display.display();
}
if (staatmanueel == 2) { //Y-as was geselecteerd
display.drawRect(1, 23, 120, 15, 1); //grotere rechthoek
display.display(); //zodat het wel nog lijkt alsof erop geduwd werd
varyas = !varyas;
delay(100);
display.drawRect(1, 23, 120, 15, 0);
display.fillRect(95, 26, 8, 8, 0);
display.setCursor(95,26);
display.println(varyas);
display.display();
}
if (staatmanueel == 3) { //X-as was geselecteerd
display.drawRect(1, 23, 120, 15, 1); //grotere rechthoek
display.display(); //zodat het wel nog lijkt alsof erop geduwd werd
varxas = !varxas;
delay(100);
display.drawRect(1, 23, 120, 15, 0);
display.fillRect(95, 26, 8, 8, 0);
display.setCursor(95,26);
display.println(varxas);
display.display();
}
if (staatmanueel == 4) { //Z-as was geselecteerd
display.drawRect(1, 23, 120, 15, 1); //grotere rechthoek
display.display(); //zodat het wel nog lijkt alsof erop geduwd werd
varzas = !varzas;
delay(100);
display.drawRect(1, 23, 120, 15, 0);
display.fillRect(95, 26, 8, 8, 0);
display.setCursor(95,26);
display.println(varzas);
display.display();
}
if (staatmanueel == 5) { //C-as was geselecteerd
display.drawRect(1, 45, 120, 15, 1); //grotere rechthoek
display.display(); //zodat het wel nog lijkt alsof erop geduwd werd
varcas = !varcas;
delay(100);
display.drawRect(1, 45, 120, 15, 0);
display.fillRect(95, 48, 8, 8, 0);
display.setCursor(95,48);
display.println(varcas);
display.display();
Serial.println(varcas);
}
}
}
void loop() {
//beweging rotary encoder detecteren
nuA = digitalRead(pinA);
if (vorigeA == LOW && nuA == HIGH) {
if (digitalRead(pinB) == nuA) { //pinB was HIGH voor pinA, ccw
Serial.println("ccw");
ccwbeweging(); //als beweging tegen de klok in is -> counter clockwards (ccw)
}
else { //pinA was HIGH voor pinB, cw
Serial.println("cw");
cwbeweging(); //als beweging met de klok mee is -> clockwards (cw)
}
}
vorigeA = nuA;
/*
* als er op de knop op de rotary encoder geduwd wordt
* zal de code hieronder dit detecteren en de void 'knopduw' activeren
* binnenin deze void zal de code dan beslissen wat er vervolgens moet gebeuren
*/
if (digitalRead(knop) != vorigeknop) {
vorigeknop = digitalRead(knop);
Serial.println("knop");
knopduw();
delay(100); //debounce tijd
}
}