#include <AccelStepper.h>
#include <Wire.h>
#include <U8g2lib.h>
#include <Bounce2.h>
// Настройки для шаговых двигателей
#define DIR_PIN_SLIDER 2
#define STEP_PIN_SLIDER 3
#define DIR_PIN_ROTATE 4
#define STEP_PIN_ROTATE 5
AccelStepper stepperSlider(AccelStepper::DRIVER, STEP_PIN_SLIDER, DIR_PIN_SLIDER);
AccelStepper stepperRotate(AccelStepper::DRIVER, STEP_PIN_ROTATE, DIR_PIN_ROTATE);
// Дисплей SSD1306 (I2C)
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA);
// Кнопки для управления меню
#define BUTTON_NEXT_PIN 6
#define BUTTON_SELECT_PIN 7
#define BUTTON_BACK_PIN 8
Bounce buttonNext = Bounce();
Bounce buttonSelect = Bounce();
Bounce buttonBack = Bounce();
// Параметры меню
int menuIndex = 0;
String menuItems[] = {"Move Slider", "Move Rotate", "Timelapse", "Settings"};
int numMenuItems = 4;
// Функция для отображения меню на OLED
void displayMenu() {
u8g2.clearBuffer(); // Очищаем буфер перед отрисовкой
// Установим компактный шрифт, чтобы текст помещался на дисплее
u8g2.setFont(u8g2_font_6x10_mf); // Компактный шрифт
// Перебираем пункты меню и рисуем их
for (int i = 0; i < numMenuItems; i++) {
if (i == menuIndex) {
u8g2.drawStr(0, 15 + (i * 12), ">"); // Стрелка перед текущим пунктом
}
u8g2.drawStr(10, 15 + (i * 12), menuItems[i].c_str()); // Пункты меню
}
u8g2.sendBuffer(); // Отправляем данные на дисплей
}
// Инициализация
void setup() {
// Инициализация дисплея
u8g2.begin();
// Инициализация кнопок
pinMode(BUTTON_NEXT_PIN, INPUT_PULLUP);
pinMode(BUTTON_SELECT_PIN, INPUT_PULLUP);
pinMode(BUTTON_BACK_PIN, INPUT_PULLUP);
buttonNext.attach(BUTTON_NEXT_PIN);
buttonSelect.attach(BUTTON_SELECT_PIN);
buttonBack.attach(BUTTON_BACK_PIN);
buttonNext.interval(25);
buttonSelect.interval(25);
buttonBack.interval(25);
// Начальная отрисовка меню
displayMenu();
}
// Основной цикл программы
void loop() {
buttonNext.update();
buttonSelect.update();
buttonBack.update();
// Переключение между пунктами меню при нажатии кнопки "Next"
if (buttonNext.fell()) {
menuIndex = (menuIndex + 1) % numMenuItems;
Serial.print("Current Menu Index: ");
Serial.println(menuIndex); // Вывод текущего индекса меню в монитор порта
displayMenu(); // Обновляем отображение меню
}
// Обработка выбора пункта меню
if (buttonSelect.fell()) {
switch (menuIndex) {
case 0:
// Движение слайдера
stepperSlider.move(1000);
break;
case 1:
// Поворот платформы
stepperRotate.move(1000);
break;
case 2:
// Включение таймлапса
// Логика для таймлапса
break;
case 3:
// Настройки
// Логика для настроек
break;
}
}
// Обновляем шаговые двигатели
stepperSlider.run();
stepperRotate.run();
}