#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// ประกาศตัวแปรสำหรับเซอร์โวมอเตอร์
Servo pullServo; // มอเตอร์สำหรับดึงสายไฟ
Servo cuttingServo; // มอเตอร์สำหรับตัดสายไฟ
// ประกาศพินที่ใช้สำหรับเซ็นเซอร์และปุ่มกด
const int distanceSensorPin = A0; // ใช้เซ็นเซอร์ระยะทางแบบอนาล็อก
const int slideSwitchPin = 2; // พินที่เชื่อมต่อกับ Slide Switch
const int increaseButtonPin = 3; // พินที่เชื่อมต่อกับปุ่มเพิ่ม
const int decreaseButtonPin = 4; // พินที่เชื่อมต่อกับปุ่มลด
const int startButtonPin = 5; // พินที่เชื่อมต่อกับปุ่มเริ่ม
// กำหนดความยาวเป้าหมายเริ่มต้นเป็น 1 เซนติเมตร
int targetLength = 1;
bool isCutting = false; // ใช้ตรวจจับสถานะการตัดลวด
// สร้างอ็อบเจ็กต์ LiquidCrystal_I2C สำหรับจอ LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // ที่อยู่ I2C, จำนวนคอลัมน์, จำนวนแถว
void setup() {
Serial.begin(9600); // เริ่มต้นการสื่อสารผ่านพอร์ตอนุกรมที่ 9600 บอด
pullServo.attach(9); // กำหนดพินสำหรับเซอร์โวมอเตอร์ที่ขา 9 สำหรับดึงสายไฟ
cuttingServo.attach(10); // กำหนดพินสำหรับเซอร์โวมอเตอร์ที่ขา 10 สำหรับตัดสายไฟ
pinMode(slideSwitchPin, INPUT_PULLUP); // ตั้งค่า slideSwitchPin เป็นอินพุตพร้อมการดึงขึ้น
pinMode(increaseButtonPin, INPUT_PULLUP); // ตั้งค่า increaseButtonPin เป็นอินพุตพร้อมการดึงขึ้น
pinMode(decreaseButtonPin, INPUT_PULLUP); // ตั้งค่า decreaseButtonPin เป็นอินพุตพร้อมการดึงขึ้น
pinMode(startButtonPin, INPUT_PULLUP); // ตั้งค่า startButtonPin เป็นอินพุตพร้อมการดึงขึ้น
lcd.begin(16, 2); // เริ่มต้นการทำงานของ LCD ด้วยพารามิเตอร์ที่ต้องการ
lcd.backlight(); // เปิดไฟพื้นหลังของจอ LCD
updateLCD(); // แสดงข้อมูลเริ่มต้นบน LCD
}
void loop() {
int sensorValue = analogRead(distanceSensorPin); // อ่านค่าเซ็นเซอร์วัดระยะ
float distance = sensorValue * (5.0 / 1023.0) * 100; // แปลงค่าที่อ่านได้เป็นระยะทาง (เซนติเมตร)
bool increasePressed = digitalRead(increaseButtonPin) == LOW; // ตรวจสอบว่าปุ่มเพิ่มถูกกด
bool decreasePressed = digitalRead(decreaseButtonPin) == LOW; // ตรวจสอบว่าปุ่มลดถูกกด
bool startPressed = digitalRead(startButtonPin) == LOW; // ตรวจสอบว่าปุ่มเริ่มถูกกด
// เพิ่มความยาวเป้าหมายถ้าปุ่มเพิ่มถูกกด
if (increasePressed) {
targetLength += 1;
updateLCD();
delay(200); // หน่วงเวลาสำหรับป้องกันการกดซ้ำ
}
// ลดความยาวเป้าหมายถ้าปุ่มลดถูกกด
if (decreasePressed) {
targetLength -= 1;
if (targetLength < 1) {
targetLength = 1; // กำหนดความยาวเป้าหมายไม่ให้ต่ำกว่า 1 เซนติเมตร
}
updateLCD();
delay(200); // หน่วงเวลาสำหรับป้องกันการกดซ้ำ
}
// ตรวจสอบว่าปุ่มเริ่มถูกกดและไม่มีการตัดลวดก่อนหน้านี้
if (startPressed && !isCutting) {
bool slideSwitchOn = digitalRead(slideSwitchPin) == LOW; // ตรวจสอบสถานะของ Slide Switch (NO)
if (distance > 0 && slideSwitchOn) { // ตรวจสอบว่าระยะทางมีค่ามากกว่า 0 และ Slide Switch เปิดอยู่
// ดึงสายไฟจนถึงระยะที่กำหนด
pullServo.write(90); // หมุนเซอร์โวมอเตอร์ไปที่ตำแหน่ง 90 องศาเพื่อดึงสายไฟ
delay(1000); // รอให้เซอร์โวทำการดึงสายไฟ
pullServo.write(0); // หมุนเซอร์โวมอเตอร์กลับไปที่ตำแหน่ง 0 องศา
// ตรวจสอบระยะทางอีกครั้งเพื่อให้มั่นใจว่าสายไฟถึงระยะที่กำหนด
sensorValue = analogRead(distanceSensorPin); // อ่านค่าเซ็นเซอร์อีกครั้ง
distance = sensorValue * (5.0 / 1023.0) * 100; // แปลงค่าที่อ่านได้เป็นระยะทาง (เซนติเมตร)
if (distance >= targetLength) { // ตรวจสอบว่าเราดึงสายไฟถึงระยะที่ต้องการหรือยัง
// ตัดสายไฟ
cuttingServo.write(90); // หมุนเซอร์โวมอเตอร์ที่สองไปที่ตำแหน่ง 90 องศาเพื่อตัดสายไฟ
delay(1000); // รอให้เซอร์โวทำการตัดสายไฟ
cuttingServo.write(0); // หมุนเซอร์โวมอเตอร์กลับไปที่ตำแหน่ง 0 องศา
}
}
isCutting = true; // ตั้งค่าสถานะให้หยุดการตัด
} else if (!startPressed) {
isCutting = false; // รีเซ็ตสถานะการตัดเมื่อปุ่มเริ่มไม่ได้ถูกกด
}
// แสดงข้อมูลบนจอ LCD
lcd.setCursor(0, 0); // ตั้งตำแหน่งเคอร์เซอร์ที่ตำแหน่ง (0, 0)
lcd.print("Len: "); // แสดงข้อความ "Len: "
lcd.print(targetLength); // แสดงความยาวเป้าหมาย
lcd.print(" cm"); // แสดงหน่วย "cm"
lcd.setCursor(0, 1); // ตั้งตำแหน่งเคอร์เซอร์ที่ตำแหน่ง (0, 1)
if (increasePressed) {
lcd.print("Inc pressed "); // แสดงข้อความ "Inc pressed" เมื่อลงแรงปุ่มเพิ่ม
} else if (decreasePressed) {
lcd.print("Dec pressed "); // แสดงข้อความ "Dec pressed" เมื่อลงแรงปุ่มลด
} else if (startPressed) {
lcd.print("Cutting..."); // แสดงข้อความ "Cutting..." เมื่อลงแรงปุ่มเริ่ม
} else {
lcd.print("Idle "); // แสดงข้อความ "Idle" เมื่อลงแรงปุ่มไม่ได้ถูกกด
}
// แสดงข้อมูลการอ่านเซ็นเซอร์และความยาวเป้าหมายใน Serial Monitor
Serial.print("Distance: ");
Serial.println(distance);
Serial.print("Target Length: ");
Serial.println(targetLength);
delay(100); // หน่วงเวลา 100 มิลลิวินาทีก่อนทำงานลูปถัดไป
}
// ฟังก์ชันอัปเดตข้อมูลบน LCD
void updateLCD() {
lcd.clear(); // ล้างข้อความเดิมบน LCD
lcd.setCursor(0, 0); // ตั้งตำแหน่งเคอร์เซอร์ที่ตำแหน่ง (0, 0)
lcd.print("Len: "); // แสดงข้อความ "Len: "
lcd.print(targetLength); // แสดงความยาวเป้าหมาย
lcd.print(" cm"); // แสดงหน่วย "cm"
lcd.setCursor(0, 1); // ตั้งตำแหน่งเคอร์เซอร์ที่ตำแหน่ง (0, 1)
if (digitalRead(slideSwitchPin) == LOW) {
lcd.print("Switch ON "); // แสดงข้อความ "Switch ON" เมื่อ Slide Switch เปิด
} else {
lcd.print("Switch OFF "); // แสดงข้อความ "Switch OFF" เมื่อ Slide Switch ปิด
}
}