#include <Arduino.h>
#include "BrewknotMenu.h"
#include "BrewknotPID.h"
#include <SPI.h>
#include <OneWire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#include "AiEsp32RotaryEncoder.h"
#include "BKTicker.h"
#include <vector>
#define ROTARY_ENCODER_A_PIN 27
#define ROTARY_ENCODER_B_PIN 26
#define ROTARY_ENCODER_BUTTON_PIN 14
#define ROTARY_ENCODER_VCC_PIN -1
#define ROTARY_ENCODER_STEPS 4
#define SDA_PIN 25
#define SCL_PIN 33
#define SCREEN_ADDRESS 0x3c
#define OLED_RESET -1
#define MENU_TIMEOUT 3000
Preferences prefs;
void cancelMenu();
BKTicker menuTicker(cancelMenu, MENU_TIMEOUT, 1);
Adafruit_SH1107 display = Adafruit_SH1107(128, 128, &Wire, OLED_RESET);
AiEsp32RotaryEncoder rotaryEncoder = AiEsp32RotaryEncoder(ROTARY_ENCODER_A_PIN, ROTARY_ENCODER_B_PIN, ROTARY_ENCODER_BUTTON_PIN, ROTARY_ENCODER_VCC_PIN, 4);
BrewknotMenu oledMenu(&rotaryEncoder, &display, &menuTicker);
BrewknotPrefs brewknotPrefs(&display, &rotaryEncoder, &menuTicker, &prefs);
BrewknotPID brewknotPID(&display, &prefs);
void IRAM_ATTR readEncoderISR()
{
rotaryEncoder.readEncoder_ISR();
}
void cancelMenu()
{
Serial.println("menu timeout");
oledMenu.exitMenu(0);
menuTicker.pause();
BrewknotMenu::isMenuActive = false;
}
void showInitInfo();
void setup()
{
Serial.begin(115200);
Serial.println("----------- init esp ... -----------");
brewknotPID.begin();
Wire.begin(SDA_PIN, SCL_PIN);
delay(200);
if (!display.begin(SCREEN_ADDRESS, true))
{
Serial.println("⚠️ Display nicht gefunden!");
// while (true);
delay(400);
}
Serial.println("----------- load prefs -----------");
prefs.begin("brewknot", false);
brewknotPID.setTargetTemp(prefs.getFloat("aktTempSoll", 32.2));
brewknotPrefs.setHeatCool(prefs.getBool("coolMode", false));
brewknotPrefs.setCalibrateTemp(prefs.getFloat("calibrateTemp", 10));
prefs.end();
rotaryEncoder.begin();
rotaryEncoder.setup(readEncoderISR);
rotaryEncoder.setBoundaries(-30, 110, false);
rotaryEncoder.setAcceleration(80);
rotaryEncoder.reset(brewknotPID.getTargetTemp());
delay(200);
display.display();
display.clearDisplay();
oledMenu.setDefaultCallback(std::bind(&BrewknotPID::defaultScreen, &brewknotPID, std::placeholders::_1));
oledMenu.addMenuItem("Calibrate Sensor", -100, 200, std::bind(&BrewknotPrefs::showPrefCalibrateTemp, &brewknotPrefs, std::placeholders::_1));
oledMenu.addMenuItem("Heat or Cool", 0, 1, std::bind(&BrewknotPrefs::showPrefHeatOrCool, &brewknotPrefs, std::placeholders::_1));
oledMenu.begin();
// oledMenu.printMenu();
// oledMenu.selectedId=2;
// oledMenu.execItem();
}
void loop()
{
// rotary_loop();
oledMenu.rotary_loop();
menuTicker.update();
brewknotPID.heaterTicker->update();
brewknotPID.tempSensorTicker->update();
delay(50);
}