ตู้จำหน่ายผ้าอนามัยหยอดเหรียญ แจ้งเตือนผ่านไลน์ ( Coin-operated sanitary napkin vending machine Notification via LINE )

ผู้เขียนบทความ :

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/

วิดิโอการทำงานของตู้ขายผ้าอนามัยหยอดเหรียญ

You may also like...

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *