#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <AccelStepper.h>
// Дисплей SSD1306 (I2C)
#define SCREEN_WIDTH 128 // Ширина OLED дисплея в пикселях
#define SCREEN_HEIGHT 32 // Высота OLED дисплея в пикселях
#define OLED_RESET -1 // Пин сброса дисплея (не используется)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Шаговый двигатель (A4988 или DRV8825)
#define STEP_PIN 2
#define DIR_PIN 3
#define ENABLE_PIN 8
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
// Пины для кнопок
#define START_BUTTON_PIN 5
#define RESET_BUTTON_PIN 6
// Датчик витков
#define SENSOR_PIN 4
// Пин для буззера
#define BUZZER_PIN 7
// Переменные для логики
volatile long windings = 0; // Количество витков
bool motorRunning = false; // Состояние мотора
long lastEncoderPos = 0; // Для хранения последней позиции энкодера
void setup() {
// Инициализация дисплея
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Остановка программы, если дисплей не найден
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// Отображение приветственного сообщения
display.setCursor(0, 0);
display.println(F("MITA WM-100"));
display.display();
delay(2000); // Задержка 2 секунды
// Настройка пинов
pinMode(START_BUTTON_PIN, INPUT_PULLUP);
pinMode(RESET_BUTTON_PIN, INPUT_PULLUP);
pinMode(SENSOR_PIN, INPUT_PULLUP);
pinMode(ENABLE_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(ENABLE_PIN, HIGH); // Выключаем двигатель по умолчанию
digitalWrite(BUZZER_PIN, LOW); // Выключаем буззер
// Настройка прерывания для датчика витков
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), countWinding, FALLING);
// Начальная скорость и ускорение двигателя
stepper.setMaxSpeed(1000); // Максимальная скорость шагов в секунду
stepper.setAcceleration(500); // Ускорение в шагах на секунду
}
void loop() {
// Обработка кнопки старт/стоп
if (digitalRead(START_BUTTON_PIN) == LOW) {
motorRunning = !motorRunning;
if (motorRunning) {
tone(BUZZER_PIN, 1000, 200); // Пик при старте двигателя
} else {
tone(BUZZER_PIN, 500, 200); // Пик при остановке двигателя
}
delay(300); // Защита от дребезга
}
// Обработка кнопки сброса
if (digitalRead(RESET_BUTTON_PIN) == LOW) {
windings = 0;
motorRunning = false;
delay(300); // Защита от дребезга
}
// Управление мотором
if (motorRunning) {
digitalWrite(ENABLE_PIN, LOW); // Включаем двигатель
stepper.setSpeed(500); // Задаем скорость вращения
stepper.runSpeed();
} else {
digitalWrite(ENABLE_PIN, HIGH); // Отключаем двигатель
}
// Обновление дисплея
display.clearDisplay();
display.setCursor(0, 0);
display.print(F("Windings: "));
display.println(windings);
display.print(F("Status: "));
display.println(motorRunning ? F("Running") : F("Stopped"));
display.display();
}
// Прерывание для подсчета витков
void countWinding() {
windings++;
}