#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>
// พินสำหรับ Stepper Motor
#define STEP_PIN 4
#define DIR_PIN 5
// พินสำหรับปุ่มกด
#define BUTTON_PIN 2
// กำหนดหน้าจอ LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// กำหนดตัวแปร Stepper Motor
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
// ตัวแปรสำหรับนับรอบ
long stepsPerRevolution = 200; // จำนวนสเต็ปต่อรอบของมอเตอร์ (ปรับตามมอเตอร์)
long stepCount = 0; // จำนวนสเต็ปทั้งหมด
float motorRevolutions = 0.0; // จำนวนรอบของมอเตอร์
// ตัวแปรสถานะปุ่มและมอเตอร์
bool motorRunning = false; // สถานะมอเตอร์เริ่มต้น (หยุด)
bool lastButtonState = HIGH; // สถานะล่าสุดของปุ่ม (HIGH = ไม่กด)
unsigned long lastDebounceTime = 0; // เวลาที่กดปุ่มครั้งล่าสุด
const unsigned long debounceDelay = 50; // เวลาดีบาวน์ (ms)
void setup() {
// เริ่มต้นหน้าจอ LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Stepper Test");
delay(2000);
lcd.clear();
// ตั้งค่า Stepper Motor
stepper.setMaxSpeed(1000); // ความเร็วสูงสุด
stepper.setAcceleration(500); // การเร่งความเร็ว
stepper.setSpeed(1500); // ความเร็วเริ่มต้น
// ตั้งค่าปุ่ม
pinMode(BUTTON_PIN, INPUT_PULLUP); // ตั้งค่าปุ่มเป็น INPUT_PULLUP
}
void loop() {
// อ่านสถานะของปุ่ม
bool reading = digitalRead(BUTTON_PIN);
if(reading == LOW){
motorRunning =!motorRunning;
delay(100);
}
lastButtonState = reading; // อัปเดตสถานะล่าสุดของปุ่ม
// ถ้ามอเตอร์ทำงาน ให้หมุนมอเตอร์
if (motorRunning) {
stepper.setSpeed(200); // ความเร็วเริ่มต้น
stepper.runSpeed();
}
// เพิ่มตัวนับจำนวนสเต็ป
stepCount = stepper.currentPosition();
// คำนวณจำนวนรอบ
motorRevolutions = (float)stepCount / stepsPerRevolution;
// แสดงผลบนหน้าจอ
lcd.setCursor(0, 0);
lcd.print("Steps:");
lcd.print(stepCount);
lcd.print(" "); // ลบค่าที่เกินออก
lcd.setCursor(0, 1);
lcd.print("Revolutions:");
lcd.print(motorRevolutions, 2); // แสดงผลทศนิยม 2 ตำแหน่ง
}