ผู้เขียนบทความ :
1.นางสาวกรรฒิมา ณ สงขลา 001 #COE16
2.นางสาวธัญยชนาถ โชติช่วง 009 #COE16
3.นายณัฐรัตน์ คชรัตน์ 030 #COE16
คณะวิศวกรรมศาสตร์ สาขาวิศวกรรมคอมพิวเตอร์
วิชา : 04-513-201 การโปรแกรมคอมพิวเตอร์ขั้นสูง 1/2567
1.ความเป็นมา
เนื่องจากบางสถานการณ์อาจจะมีนักศึกษาหรือบุคคลกรหญิงบางคน เกิดปัญหาการแคลนการผ้าอนามัยในช่วงเวลาสำคัญ ในทุก ๆ เดือนผู้คนประมาณ 1.8 พันล้านคนทั่วโลกอยู่ในภาวะมีประจำเดือน และมีทั้งเด็กหญิง ผู้หญิง ผู้ชายข้ามเพศ และบุคคลในเพศสภาพต่าง ๆ อีกหลายล้านคนที่ประสบปัญหาไม่สามารถจัดการเรื่องรอบเดือนของตนเองได้อย่างถูกหลักอนามัย
ดังนั้น เพื่อการแก้ปัญหาดังกล่าวผู้จัดทำจึงคิดค้นตู้จำหน่ายผ้าอนามัยหยอดเหรียญส่งเสริมความเท่าเทียมของประจำเดือนโดยลดอุปสรรคในการเข้าถึงผลิตภัณฑ์สุขอนามัยประจำเดือน โดยเฉพาะในสถานศึกษาและพื้นที่สาธารณะ
2.วัตถุประสงค์
2.1 เพื่อพัฒนาตู้จำหน่ายผ้าอนามัยหยอดเหรียญ แจ้งเตือนผ่านไลน์
3.ขอบเขต
3.1 สามารถส่งข้อความแจ้งเตือนไปยังแชทของผู้ขายเมื่อมีการซื้อสินค้า
3.2 สามารถจ่ายสินค้าได้จำนวนครั้งละหนึ่งชิ้น
3.3 สามารถแสดงผลราคาสินค้าผ่านหน้าจอ LCD
3.4 สามารถเชื่อมต่อกับอินเทอร์เน็ตและเซิร์ฟเวอร์ของไลน์ เพื่อส่งข้อความไปยังไลน์ของผู้ขาย
4.ประโยช์นที่คิดว่าจะได้รับ
4.1 ช่วยลดปัญหาการขาดแคลนผ้าอนามัยในช่วงเวลาสำคัญ
4.2 ลดอุปสรรคในการเข้าถึงผลิตภัณฑ์สุขอนามัยประจำเดือน
4.2 ได้ศึกษาและเข้าใจการเขียนโปรแกรมภาษา python และบอร์ด ESP 32 เพื่อจำหน่ายผ้าอนามัย
5.ความรู้ที่เกี่ยวข้อง
1.บอร์ด ESP32
- MCU – ESP32 เป็น Micro Controller ที่รองรับการเชื่อมต่อ WiFi , Bluetooth – BLE ในตัว ภาษาที่ใช้ในการพัฒนาโปรแกรมคือ ภาษา C หรือ Python ภาษา Python ต้องทำการอัพเกรดเฟิร์มแวร์ให้รองรับ Python การพัฒนาโปรแกรมขึ้นอยู่กับผู้ที่พัฒนา โปรแกรม IDE ที่ใช้พัฒนาคือ Arduino IDE หรือ Visual Studio สำหรับ Visual Studio จำเป็นต้องติดตั้ง Plugin Espressif IDF หรือ PlatformIO IDE และต้อง Enable (Arduino)
2.เครื่องหยอดเหรียญ
- เป็นอุปกรณ์ที่ใช้ในการรับเหรียญเพื่อนำไปใช้ในการเปิดใช้งานบริการหรือสินค้าต่างๆ เช่น ตู้จำหน่ายสินค้าอัตโนมัติ เครื่องซักผ้าอัตโนมัติ หรือระบบบริการอื่นๆ ที่ต้องการการชำระเงินด้วยเหรียญ เครื่องหยอดเหรียญจะทำการตรวจสอบว่าเหรียญที่หยอดเข้าไปเป็นเหรียญที่ถูกต้องหรือไม่ จากนั้นจะส่งสัญญาณเพื่อให้ระบบทำงานต่อไป
ฟังก์ชันหลักของเครื่องหยอดเหรียญ
- การตรวจสอบเหรียญ เครื่องจะมีเซ็นเซอร์ที่สามารถตรวจจับขนาด รูปร่าง และวัสดุของเหรียญเพื่อตรวจสอบว่าเป็นเหรียญที่ถูกต้องหรือไม่
- การบันทึกการชำระเงิน เมื่อเหรียญถูกยอมรับ เครื่องจะบันทึกยอดเงินที่ได้รับเพื่อใช้ในการเปิดใช้งานบริการ
- การคืนเหรียญ หากเหรียญไม่ถูกต้องหรือมีปัญหา เครื่องหยอดเหรียญสามารถคืนเหรียญให้กับผู้ใช้ได้
3.ปุ่มกดสินค้า
- ปุ่มกดสินค้า คือ อุปกรณ์ที่ใช้สำหรับให้ผู้ใช้งานเลือกสินค้าหรือบริการที่ต้องการจากเครื่องจำหน่าสินค้าอัตโนมัติ หรือเครื่องบริการอื่นๆ
4.หน้าจอ LCD
- จอ LCD เป็นเทคโนโลยีจอแสดงผลที่ใช้ผลึกเหลวในการสร้างภาพ โดยมักจะใช้ในอุปกรณ์อิเล็กทรอนิกส์ต่างๆ เช่น โทรทัศน์ คอมพิวเตอร์ สมาร์ทโฟน เครื่องเล่นเกม และอุปกรณ์ที่ใช้แสดงข้อมูล เช่น เครื่องขายสินค้าอัตโนมัติ เครื่องมือวัด และอุปกรณ์ IoT
5.เซอร์โว
- เป็นอุปกรณ์ที่ใช้ในการควบคุมการเคลื่อนไหวอย่างแม่นยำ โดยทั่วไปแล้วเซอร์โวมักจะใช้ในระบบที่ต้องการการเคลื่อนไหวที่ถูกต้องและควบคุมได้ เช่น โรบอท เครื่องจักรกล ระบบอัตโนมัติ และอุปกรณ์อิเล็กทรอนิกส์อื่นๆ
6.เซ็นเซอร์วัดระยะทาง
- เป็นเซ็นเซอร์วัดระยะทางแบบอัลตราโซนิก (Ultrasonic Distance Sensor) ที่ใช้ในการวัดระยะห่างระหว่างเซ็นเซอร์และวัตถุ โดยทำงานโดยการส่งคลื่นเสียงความถี่สูง (อัลตราโซนิก) แล้ววัดเวลาที่คลื่นเสียงกลับมาถึงเซ็นเซอร์ ซึ่งสามารถคำนวณระยะทางได้จากเวลาในการเดินทางของคลื่นเสียง
7.แอพพลิเคชั่น LINE
- แอพพลิเคชั่น LINE เป็นแอพพลิเคชั่นสำหรับการสื่อสารที่ใช้ในการส่งข้อความ โทรศัพท์ และวิดีโอคอล โดยให้บริการฟรีผ่านเครือข่ายอินเทอร์เน็ต
Code ในส่วนของการเชื่อมต่อ WiFi
connectToWiFi()
ใช้สำหรับเชื่อมต่อกับเครือข่าย WiFi โดยรอจนกว่าจะเชื่อมต่อสำเร็จ
isConnected()
ใช้ตรวจสอบว่าอุปกรณ์เชื่อมต่อ WiFi อยู่หรือไม่
class WiFiManager {
private:
const char* ssid;
const char* password;
public:
WiFiManager(const char* ssid, const char* password) {
this->ssid = ssid;
this->password = password;
}
void connectToWiFi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi");
}
bool isConnected() {
return WiFi.status() == WL_CONNECTED;
}
};
Code ในส่วนของการส่ง LINE Notification
sendLineNotification(String message)
ส่งข้อความไปยัง LINE Notify โดยใช้ HTTP POST
class LineNotifier {
private:
String lineNotifyToken;
public:
LineNotifier(String token) {
lineNotifyToken = token;
}
void sendLineNotification(String message) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin("https://notify-api.line.me/api/notify");
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
http.addHeader("Authorization", "Bearer " + lineNotifyToken);
String payload = "message=" + message;
int httpResponseCode = http.POST(payload);
if (httpResponseCode > 0) {
Serial.println(httpResponseCode);
Serial.println(http.getString());
} else {
Serial.println("Error on sending POST");
}
http.end();
} else {
Serial.println("Error in WiFi connection");
}
}
};
Code ในส่วนของการแสดงผลบนหน้าจอ LCD
init()
สำหรับเริ่มต้นการทำงานของหน้าจอ LCD และเปิด backlight
displayMessage(String line1, String line2)
แสดงข้อความ 2 บรรทัดบนหน้าจอ LCD
class LCDManager {
private:
LiquidCrystal_I2C lcd;
public:
LCDManager() : lcd(0x27, 16, 2) {}
void init() {
lcd.begin();
lcd.backlight();
}
void displayMessage(String line1, String line2) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(line1);
lcd.setCursor(0, 1);
lcd.print(line2);
}
};
Code ในส่วนของการควบคุมเซอร์โวมอเตอร์
init()
เริ่มต้นการทำงานของเซอร์โวมอเตอร์
rotate(int angle, int delayTime)
ใช้หมุนเซอร์โวมอเตอร์ไปที่องศาที่กำหนด จากนั้นหยุดหลังจากผ่านเวลาที่กำหนด
class ServoController {
private:
Servo myServo;
int servoPin;
public:
ServoController(int pin) {
servoPin = pin;
}
void init() {
myServo.attach(servoPin);
myServo.write(90); // เริ่มที่ตำแหน่งกลาง
}
void rotate(int angle, int delayTime) {
myServo.write(angle);
delay(delayTime);
myServo.write(90); // หยุดเซอร์โว
}
};
Code ในส่วนของการควบคุมเซ็นเซอร์อัลตร้าโซนิค
getDistance()
อ่านค่าระยะห่างจากเซ็นเซอร์และแปลงค่าเป็นเซนติเมตร
class UltrasonicSensor {
private:
int trigPin;
int echoPin;
public:
UltrasonicSensor(int trigPin, int echoPin) {
this->trigPin = trigPin;
this->echoPin = echoPin;
}
long getDistance() {
long duration, cm;
pinMode(trigPin, OUTPUT);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(5);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
cm = duration / 29 / 2;
return cm;
}
};
Code ในส่วนของการตรวจจับเหรียญ
init()
เริ่มต้นการทำงานของเซ็นเซอร์ตรวจจับเหรียญ
doCounter()
ฟังก์ชันที่ใช้ตรวจจับการหยอดเหรียญ
getCount()
คืนค่าจำนวนเหรียญที่หยอด
class CoinCounter {
private:
int sensorPin;
volatile int count;
boolean isCounter;
public:
CoinCounter(int sensorPin) {
this->sensorPin = sensorPin;
count = 0;
isCounter = false;
}
void init() {
pinMode(sensorPin, INPUT);
attachInterrupt(digitalPinToInterrupt(sensorPin), CoinCounter::doCounter, FALLING);
}
static void IRAM_ATTR doCounter() {
isCounter = true;
count++;
}
int getCount() {
if (isCounter) {
isCounter = false;
return count;
}
return 0;
}
};
6.ผลการดำเนินงาน
Diagram : การทำงานของระบบวงจรตู้ขายผ้าอนามัยหยอดเหรียญ
Flowchart : ลำดับการทำงานของระบบวงจรตู้ขายผ้าอนามัยหยอดเหรียญ
ขั้นตอนในการทำงาน
ขั้นตอนที่ 1 ศึกษาอุปกรณ์ต่างๆ เพื่อทำความเข้าใจอุปกรณ์ก่อนทำงานจริง
ขั้นตอนที่ 2 เริ่มทำการแก้ไขในส่วนของโค๊ดและทำการออกแบบโมเดลจำลอง
ขั้นตอนที่ 3 สรุปผลการทดลอง
ตารางที่ 1 ผลการทดลองการส่งข้อมูลเมื่อสินค้าหมดผ่าน Line
การทดลอง | รายละเอียด | ผลการทดลอง |
การทดลองครั้งที่ 1 | มีสินค้าอยู่ในตู้ | ไม่มีการแจ้งเตือนไปยังเจ้าของตู้ |
การทดลองครั้งที่ 2 | ไม่มีสินค้าอยู่ในตู้ | มีการแจ้งเตือนไปยังเจ้าของตู้ |
ตารางที่ 2 ผลการทดลองการทดสอบการหยอดเหรียญ โดยเครื่องหยอดเหรียญจะทำงานเมื่อหยอดเหรียญ 5 บาทเพียงเท่านั้น
จำนวนเหรียญที่หยอด | เครื่องหยอดเหรียญทำงาน | เครื่องหยอดเหรียญไม่ทำงาน |
เหรียญ 1 บาท | ✓ | |
เหรียญ 2 บาท | ✓ | |
เหรียญ 5 บาท | ✓ | |
เหรียญ 10 บาท | ✓ |
7.สรุปผลการทดลอง
ระบบตู้ผ้าอนามัยหยอดเหรียญที่เชื่อมต่อกับการแจ้งเตือนผ่าน LINE ทำงานโดยรับเฉพาะเหรียญ 5 บาทเท่านั้น เมื่อมีการหยอดเหรียญ 5 บาทที่ถูกต้อง ระบบจะยอมรับและอนุญาตให้ปุ่มกดสินค้าทำงานได้ หลังจากกดปุ่ม ระบบจะสั่งให้ Servo Motor หมุนเพื่อจ่ายสินค้าผ้าอนามัยออกมา พร้อมกับแสดงข้อความผ่านจอ LCD แจ้งสถานะการทำงาน ระบบนี้ยังมีเซ็นเซอร์ตรวจสอบสินค้าภายในตู้ หากสินค้าหมด เซ็นเซอร์จะตรวจจับและส่งสัญญาณแจ้งเตือนให้ทราบผ่านจอ LCD เพื่อแจ้งเตือนว่าสินค้าไม่สามารถกดได้ นอกจากนี้ ระบบยังส่งข้อความแจ้งเตือนผ่าน LINE Notify ไปยังผู้ดูแลเพียงครั้งเดียวเมื่อสินค้าหมด เพื่อให้ทราบและดำเนินการเติมสินค้าใหม่ ตู้จะกลับมาทำงานได้อีกครั้งหลังจากเติมสินค้าและหยอดเหรียญใหม่
8.ข้อมูลอ้างอิง
1.Cybertice การใช้งานของ ESP32 ที่ใช้ควบคุม Servo Moto. [ออนไลน์] 2565.
[สืบค้นวันที่ 3 ตุลาคม 2567].
จาก https://www.cybertice.com/article/909
2.Cybertice การใช้งานของการอ่านค่าเครื่องหยอดเหรียญ. [ออนไลน์] 2565.
[สืบค้นวันที่ 3 ตุลาคม 2567].
จาก https://www.cybertice.com/article/356/
3.Allnewstep การใช้งานปุ่มกดสินค้า. [ออนไลน์] 2564.
[สืบค้นวันที่ 3 ตุลาคม 2567].
จาก https://www.allnewstep.com/article/157/4
4.Analogread การใช้งานหน้าจอ LCD. [ออนไลน์] 2564.
[สืบค้นวันที่ 3 ตุลาคม 2567].
จาก https://www.analogread.com/article/89/
5.Cybertice การใช้งานเซ็นเซอร์วัดระยะทาง. [ออนไลน์] 2567.
[สืบค้นวันที่ 3 ตุลาคม 2567].
จาก https://www.cybertice.com/article/1039/