So im making my own project where i now tried to make myself a menu with 4 options , so far i made it work, im switching up and down between points with rotary encoder, but when i tried to implement pushing button on any of menus options, i cant make it do something. Can anyone help me how to implement the button selection?
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // Šířka displeje v pixelech
#define SCREEN_HEIGHT 64 // Výška displeje v pixelech
#define BUTTON 32 // Tlačítko
#define UP 35
#define DOWN 34
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
int menuCounter = 0;
int pozice1 = 0; // pozice v menu
int pozice2 = 0;
int pozice3 = 0;
int pozice4 = 0;
bool pozice1_vybrano = false;
bool pozice2_vybrano = false;
bool pozice3_vybrano = false;
bool pozice4_vybrano = false;
bool ButtonPress = false;
//statusy
int CLKNow;
int CLKPrevious;
int DTNow;
int DTPreviouse;
bool refresh = true; //refreshne hodnoty
bool refreshselection = false; //refreshne výběr (>/X)
void PrintOCD();
void rotate();
void PushBUTTON();
void UpdateCursorPosition();
void setup()
{
Serial.begin(115200); // Nastaveni rychlosti
pinMode(BUTTON,INPUT_PULLUP);// Nastavení pinnů
pinMode(UP,INPUT_PULLUP);
pinMode(DOWN,INPUT_PULLUP);
// Inicializace displeje
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
{
Serial.println(F("SSD1306 inicializace selhala"));
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
//Ukládání pozice enkoderu
CLKPrevious = digitalRead(DOWN);
DTPreviouse = digitalRead(UP);
attachInterrupt(digitalPinToInterrupt(DOWN), rotate , CHANGE);
attachInterrupt(digitalPinToInterrupt(BUTTON), PushBUTTON , FALLING);
}
void loop()
{
if(refresh == true)
{
//UpdateCursorPosition();
if(pozice1_vybrano == true || pozice2_vybrano == true || pozice3_vybrano == true || pozice4_vybrano == true)
{
// nic (tak to má být)
}
else
{
UpdateCursorPosition();
}
refresh = false;
}
if(refreshselection == true)
{
refreshselection = false;
}
}
void rotate()
{
//pozice1
if(pozice1_vybrano == true)
{
CLKNow = digitalRead(DOWN);// přečte stav DOWN pinu
if(CLKNow != CLKPrevious && CLKNow == 1)
{
if(digitalRead(UP) !=CLKNow)
{
if(pozice1 < 100)
{
pozice1++;
}
else
{
pozice1 = 0;
}
}
else
{
if(pozice1 < 1)
{
pozice1 = 100;
}
else
{
pozice1--;
}
}
}
CLKPrevious = CLKNow;
}
//pozice2
if(pozice2_vybrano == true)
{
CLKNow = digitalRead(DOWN);// přečte stav DOWN pinu
if(CLKNow != CLKPrevious && CLKNow == 1)
{
if(digitalRead(UP) !=CLKNow)
{
if(pozice2 < 100)
{
pozice2++;
}
else
{
pozice2 = 0;
}
}
else
{
if(pozice2 < 1)
{
pozice2 = 100;
}
else
{
pozice2--;
}
}
}
CLKPrevious = CLKNow;
}
//pozice 3
if(pozice3_vybrano == true)
{
CLKNow = digitalRead(DOWN);// přečte stav DOWN pinu
if(CLKNow != CLKPrevious && CLKNow == 1)
{
if(digitalRead(UP) !=CLKNow)
{
if(pozice3 < 100)
{
pozice3++;
}
else
{
pozice3 = 0;
}
}
else
{
if(pozice3 < 1)
{
pozice3 = 100;
}
else
{
pozice3--;
}
}
}
CLKPrevious = CLKNow;
}
//pozice4
if(pozice4_vybrano == true)
{
CLKNow = digitalRead(DOWN);// přečte stav DOWN pinu
if(CLKNow != CLKPrevious && CLKNow == 1 )
{
if(digitalRead(UP) !=CLKNow)
{
if(pozice4 < 100)
{
pozice4++;
}
else
{
pozice4 = 0;
}
}
else
{
if(pozice4 < 1)
{
pozice4 = 100;
}
else
{
pozice4--;
}
}
}
CLKPrevious = CLKNow;
}
else //pozice counter
{
CLKNow = digitalRead(DOWN);// přečte stav DOWN pinu
if(CLKNow != CLKPrevious && CLKNow == 1)
{
if(digitalRead(UP) !=CLKNow)
{
if(menuCounter < 3)
{
menuCounter++;
}
else
{
menuCounter = 0;
}
}
else
{
if(menuCounter < 1)
{
menuCounter = 3;
}
else
{
menuCounter--;
}
}
}
CLKPrevious = CLKNow;
}
refresh = true;
}
void PushBUTTON()
{
switch(menuCounter)
{
case 0:
pozice1_vybrano = !pozice1_vybrano;
break;
case 1:
pozice2_vybrano = !pozice2_vybrano;
break;
case 3:
pozice3_vybrano = !pozice3_vybrano;
break;
case 4:
pozice4_vybrano = !pozice4_vybrano;
break;
}
refresh = true;
refreshselection = true;
}
void PrintOCD()
{
display.setCursor(0,0);
display.print(F("Reakce na LED"));
display.setCursor(0,10);
display.print(F("Reakce na Zvuk"));
display.setCursor(0,20);
display.print(F("Reakce na kombinaci"));
display.setCursor(0,30);
display.print(F("Test4 Saimon says"));
}
void UpdateCursorPosition()
{
switch(menuCounter)
{
case 0:
display.clearDisplay();
display.setCursor(110,0);
display.print("<");
PrintOCD();
display.display();
break;
case 1:
display.clearDisplay();
display.setCursor(110,10);
display.print("<");
PrintOCD();
display.display();
break;
case 2:
display.clearDisplay();
display.setCursor(110,20);
display.print("<");
PrintOCD();
display.display();
break;
case 3:
display.clearDisplay();
display.setCursor(110,30);
display.print("<");
PrintOCD();
display.display();
break;
}
}