Good evening,
im new to arduino. Here i'm trying to make a oled menu controlled with 3 buttons, also i'm using a Arduino UNO.
The code works so far, but after 5 minutes or so, it freezes.
I tried a couple of methods to stop it from freezing, without success.
Does anybody know what could be wrong with my code?
Thank you!
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <AccelStepper.h>
#include <avr/pgmspace.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define F
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_SSD1306 SSD1306 = Adafruit_SSD1306();
int menu = 1;
const int dirPin PROGMEM = 2;
const int stepPin PROGMEM = 3;
const int DownButton PROGMEM = 7;
const int UpButton PROGMEM = 6;
const int OkButton PROGMEM = 5;
int motorinterface = 1;
int stepMaxSpeed = 5000;
int stepAccel = 1000;
AccelStepper stepper = AccelStepper(motorinterface,stepPin,dirPin);
int GEWICHT = 0;
int OK;
int CursorPos = 1;
int PrevCursorPos;
String Cur=">";
//----------------------------------------Setup Routine--------------------------------
void setup ()
{
Serial.begin(9600);
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3D for 128x64
stepper.setMaxSpeed(stepMaxSpeed);
stepper.setAcceleration(stepAccel);
pinMode(UpButton,INPUT_PULLUP);
pinMode(DownButton,INPUT_PULLUP);
pinMode(OkButton,INPUT_PULLUP);
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
display.clearDisplay();
}
//----------------------------------------MainMenu--------------------------------
void MainMenu()
{
menu = 1;
if(CursorPos > 3)
{
CursorPos = 1;
}
else if (CursorPos < 1)
{
CursorPos = 3;
}
if(OK == 1 && CursorPos == 1) // menuauswahl
{
menu = 2;
OK = 0;
PrevCursorPos = CursorPos;
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print(F("JOKER Durchstosstest"));
display.setCursor(10,20); display.print(F("mm/min: ")); display.print(F(stepMaxSpeed));
if (CursorPos == 1)
{
display.setCursor(0,20); display.print(F(Cur));
}
display.setCursor(100,20);display.print(CursorPos);
if (CursorPos == 2)
{
display.setCursor(0,30); display.print(F(Cur));
}
display.setCursor(10,30); display.print(F("Max kg: ")); display.print(F(GEWICHT)); display.print(F("kg"));
if (CursorPos == 3)
{
display.setCursor(30,50); display.print(F(Cur));
}
display.setCursor(40,50); display.print(F("Start!"));
}
//--------------------------------------Untermenu-geschwindigkeit------------------------------------
void mm_minuten()
{
if(!digitalRead(DownButton))
{
Serial.println(F("Down pressed!"));
stepMaxSpeed++;
}
if(!digitalRead(UpButton))
{
Serial.println(F("Up pressed!"));
stepMaxSpeed--;
}
if(!digitalRead(OkButton))
{
menu = 1;
OK = 0;
CursorPos = PrevCursorPos;
while(!digitalRead(OkButton));
}
display.clearDisplay();
display.setCursor(0,0);display.print(F("Milimeter/Minute"));
display.setCursor(10,30); display.print(F("mm/min:"));
display.setCursor(64,30); display.setTextSize(2);
display.print(F(stepMaxSpeed));
display.setTextSize(1);
}
//-----------------------------------------loop Function-----------------------------------------
void loop()
{
display.clearDisplay();
if (stepMaxSpeed > 10000 || stepMaxSpeed < 1000)
{
stepMaxSpeed = 5000;
}
if (menu == 1)
{
MainMenu();
Buttons();
}
else if (menu == 2)
{
mm_minuten();
}
display.display();
}
//-------------------------------------------What does the Button do?----------------------------
void Buttons()
{
downbutton();
upbutton();
okbutton();
}
//--------------------------------------------------
void downbutton()
{
if(!digitalRead(DownButton))
{
//Serial.println(F("Down pressed!"));
CursorPos++;
while(!digitalRead(DownButton));
}
}
//-------------------------------------------------
void upbutton()
{
if(!digitalRead(UpButton))
{
//Serial.println(F("Down pressed!"));
CursorPos--;
while(!digitalRead(UpButton));
}
}
//-------------------------------------------------
void okbutton()
{
if(!digitalRead(OkButton))
{
//Serial.println(F("Down pressed!"));
OK = 1;
PrevCursorPos = CursorPos;
while(!digitalRead(OkButton));
}
}
//---------------------Refresh Display--------------------------
void refresh()
{
display.display();
delay(00);
display.clearDisplay();
}