#include <LiquidCrystal.h>
#include <Stepper.h>
// ---------------- Pin definitions ----------------
// LCD pins
#define LCD_RS PB4
#define LCD_EN PB5
#define LCD_D4 PB6
#define LCD_D5 PB7
#define LCD_D6 PB8
#define LCD_D7 PB9
// Stepper motor 1 coil pins (A+, A-, B+, B-)
#define STEPPER1_A_PLUS PA0
#define STEPPER1_A_MINUS PA1
#define STEPPER1_B_PLUS PA2
#define STEPPER1_B_MINUS PA3
// Stepper motor 2 coil pins (A+, A-, B+, B-)
#define STEPPER2_A_PLUS PA8
#define STEPPER2_A_MINUS PA9
#define STEPPER2_B_PLUS PA10
#define STEPPER2_B_MINUS PA11
// Relay pins
#define RELAY1_PIN PA4
#define RELAY2_PIN PA5
// Buzzer and LED pins
#define BUZZER_PIN PA6
#define LED_PIN PA7
// Pushbutton pins (active LOW)
#define BTN_STEPPER1 PB11
#define BTN_STEPPER2 PB1
#define BTN_RELAY1 PB2
#define BTN_RELAY2 PB13
// LCD object
LiquidCrystal lcd(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
// Stepper objects (4 pins, 200 steps/rev)
Stepper stepper1(200, STEPPER1_A_PLUS, STEPPER1_A_MINUS, STEPPER1_B_PLUS, STEPPER1_B_MINUS);
Stepper stepper2(200, STEPPER2_A_PLUS, STEPPER2_A_MINUS, STEPPER2_B_PLUS, STEPPER2_B_MINUS);
// ---------------- Setup ----------------
void setup() {
// LCD init
lcd.begin(16, 2);
lcd.clear();
lcd.print("Control Panel");
delay(1000);
lcd.clear();
// Relay outputs
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
// Buzzer & LED
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
// Buttons (with internal pull-up)
pinMode(BTN_STEPPER1, INPUT_PULLUP);
pinMode(BTN_STEPPER2, INPUT_PULLUP);
pinMode(BTN_RELAY1, INPUT_PULLUP);
pinMode(BTN_RELAY2, INPUT_PULLUP);
// Stepper speeds (RPM)
stepper1.setSpeed(60);
stepper2.setSpeed(60);
}
// ---------------- Loop ----------------
void loop() {
// Stepper 1 control
if (digitalRead(BTN_STEPPER1) == LOW) {
lcd.setCursor(0, 0);
lcd.print("Stepper1: Run ");
stepper1.step(200); // 1 revolution
tone(BUZZER_PIN, 1000, 200);
}
// Relay 1 control
if (digitalRead(BTN_RELAY1) == LOW) {
digitalWrite(RELAY1_PIN, !digitalRead(RELAY1_PIN));
lcd.setCursor(0, 1);
lcd.print("Relay1 toggled ");
delay(300); // debounce
}
// Relay 2 control
if (digitalRead(BTN_RELAY2) == LOW) {
digitalWrite(RELAY2_PIN, !digitalRead(RELAY2_PIN));
lcd.setCursor(0, 1);
lcd.print("Relay2 toggled ");
delay(300); // debounce
}
// Stepper 2 control
if (digitalRead(BTN_STEPPER2) == LOW) {
lcd.setCursor(0, 0);
lcd.print("Stepper2: Run ");
stepper2.step(200); // 1 revolution
tone(BUZZER_PIN, 800, 200);
}
// LED status blink
digitalWrite(LED_PIN, millis() / 500 % 2);
}