Push button and OLED screen — Esp32 Devkit C V4 simulation

Code for controlling an OLED screen and handling push button inputs.

An interactive Esp32 Devkit C V4 circuit simulation you can run free in your browser on Velxio, by romafrolikov.

Components

Sketch code

#include "hardware.h"
#include "states.h"
#include "mainScreen.h"
#include "settings.h"
#include "stopwatch.h"
#include "brightnes.h"
#include "color.h"
#include "modes.h"
// #include "telegram.h" // закоментовано

// ===== Глобальні об'єкти =====
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
RTC_DS3231 rtc;

Main mainScreen;
Settings settings;
Stopwatch stopwatch;
Brightnes bright;
Color color;
Modes modes;   // <-- тепер Modes, а не Mods

States current_state = MAIN_STATE;

void setup() {
  Serial.begin(115200);

  pinMode(BUTTON_OK, INPUT_PULLUP);
  pinMode(BUTTON_BACK, INPUT_PULLUP);
  pinMode(BUTTON_UP, INPUT_PULLUP);
  pinMode(BUTTON_DOWN, INPUT_PULLUP);

  ledcAttach(BUZZER_PIN, 1000, 8);

  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println("Display init failed");
    while (true);
  }
  if (!rtc.begin()) {
    Serial.println("RTC not found");
    while (true);
  }
  if (rtc.lostPower()) {
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

  display.setTextColor(SSD1306_WHITE);
  display.clearDisplay();
  display.display();
  Serial.println("Setup complete");

  // telegramSetup(); // закоментовано
}

void loop() {
  switch (current_state) {
    case MAIN_STATE:
      display.clearDisplay();
      mainScreen.drawMain();
      break;
    case SETTINGS_STATE:
      display.clearDisplay();
      settings.drawSettings();
      settings.updateSettings();
      break;
    case STOPWATCH_STATE:
      display.clearDisplay();
      stopwatch.drawStopwatch();
      break;
    case BRIGHTNES_STATE:
      bright.drawBrightnes();
      bright.updateBrightnes();
      break;
    case COLOR_STATE:
      color.drawColor();
      color.updateColor();
      break;
    case MODES_STATE:
      modes.drawModes();    // <-- виправлено
      modes.updateModes();  // <-- виправлено
      break;
    default:
      break;
  }

  bool okPressed = isPressedOk();
  bool backPressed = isPressedBack();

  if (okPressed && current_state == MAIN_STATE) {
    ledcWriteTone(BUZZER_PIN, 1000);
    delay(200);
    ledcWriteTone(BUZZER_PIN, 0);
    delay(100);
    ledcWriteTone(BUZZER_PIN, 1500);
    delay(150);
    ledcWriteTone(BUZZER_PIN, 0);

    current_state = SETTINGS_STATE;
    Serial.println("-> SETTINGS");
  }
  else if (backPressed && current_state == SETTINGS_STATE) {
    current_state = MAIN_STATE;
    Serial.println("-> MAIN");
  }
  else if (okPressed && current_state == SETTINGS_STATE && settings.cursorY == 20) {
    current_state = STOPWATCH_STATE;
    stopwatch.reset();
    Serial.println("-> STOPWATCH");
  }
  else if (okPressed && current_state == SETTINGS_STATE && settings.cursorY == 50) {
    current_state = BRIGHTNES_STATE;
    Serial.println("-> BRIGHTNESS");
  }
  else if (okPressed && current_state == SETTINGS_STATE && settings.cursorY == 40) {
    current_state = COLOR_STATE;
    Serial.println("-> COLOR");
  }
  else if (okPressed && current_state == SETTINGS_STATE && settings.cursorY ==