🚀 Arduino! เชื่อมมือถือให้เป็นจอควบคุม IoT แบบเรียลไทม์


🔥 TRENDING Arduino IoT Project
📱

ใช้สมาร์ทโฟนเป็น Touchscreen สำหรับ Arduino

สร้าง HMI แบบไร้สาย ด้วย WiFi และ Bluetooth

พร้อมอุปกรณ์คุณภาพจาก Global Byte Shop

📰 บทความเทคนิค Global Byte Shop
📅 2 ก.ย. 2025 ⏱️ อ่าน 15 นาที 🏷️ Arduino, ESP32, IoT, HMI 💰 งบ 590-1,890 บาท
🔗

อ้างอิงจาก Hackaday.com

บทความนี้พัฒนาต่อยอดจากเนื้อหาใน "Using a Smartphone as a Touchscreen for Arduino" โดยเพิ่มเติมเทคนิคการใช้งานจริงและแนะนำอุปกรณ์ที่หาซื้อได้ในไทย

🎯 สิ่งที่เพิ่มเติมในบทความนี้:

  • • วิธีสร้าง Web Interface และ Mobile App
  • • การเชื่อมต่อผ่าน WiFi และ Bluetooth LE
  • • รายการอุปกรณ์และราคาจาก Global Byte Shop
  • • โค้ดตัวอย่างภาษาไทยและคำอธิบายละเอียด
  • • การแก้ปัญหาการเชื่อมต่อและ Security
  • • ตัวอย่างการใช้งานจริงในอุตสาหกรรม

📺 วิดีโอสาธิตการใช้งานจริง

🎬 ดูวิดีโอสาธิตการสร้าง Smartphone HMI Interface สำหรับ Arduino พร้อมเทคนิคการเชื่อมต่อและการใช้งานจริง

Quick Setup
ติดตั้งและใช้งานได้ใน 15 นาที
🔧 Step by Step
อธิบายทุกขั้นตอนอย่างละเอียด
💡 Pro Tips
เทคนิคเพิ่มเติมจากผู้เชี่ยวชาญ

👍 กดไลค์และติดตาม Global Byte Shop Channel สำหรับวิดีโอใหม่ๆ

📱 Smartphone HMI คืออะไร?

🎯 ความหมายและประโยชน์

📖 คำจำกัดความ

Smartphone HMI (Human Machine Interface) คือ การใช้สมาร์ทโฟนเป็นหน้าจอสัมผัส สำหรับควบคุมและติดต่อกับ Arduino หรือ Microcontroller อื่นๆ ผ่านการเชื่อมต่อไร้สาย ทำให้สามารถสร้าง Interface ที่ทันสมัยและใช้งานง่ายได้ในราคาประหยัด

จุดเด่น: Cost-effective, Flexible UI, Remote Control, Multi-platform Support

🚀 ข้อดีเหนือ Touchscreen แบบดั้งเดิม

💰 ประหยัดค่าใช้จ่าย:
• ไม่ต้องซื้อ TFT Display แพง
• ใช้โฟนที่มีอยู่แล้ว
• ลดต้นทุนการผลิต
• อัพเกรดได้ง่าย
🎨 UI/UX ที่ดีกว่า:
• หน้าจอความละเอียดสูง
• Multi-touch Support
• Responsive Design
• Rich Graphics & Animation
📡 การเชื่อมต่อหลากหลาย:
• WiFi (ระยะไกล)
• Bluetooth LE (ประหยัดพลังงาน)
• Internet Remote Control
• Multiple Device Support
⚡ ฟีเจอร์เพิ่มเติม:
• Data Logging
• Push Notifications
• Voice Control
• Camera Integration

🎮 Smartphone HMI Simulator

Arduino Controller
LED Control:
Servo:
Temperature: 25.3°C
Humidity: 60.2%
Connection Status
📶
WiFi Connected
ESP32 DevKit
LED Status

WiFi Active

Servo: 90°
Ready for commands...

🧩 อุปกรณ์และราคาจาก Global Byte Shop

🛒 รายการอุปกรณ์หลัก

ESP32 DevKit V1 (WiFi + Bluetooth)

Microcontroller หลักพร้อม WiFi และ Bluetooth LE

🛒 ดูสินค้าที่ Global Byte Shop
฿590

Arduino Uno R3 + ESP8266 WiFi Module

สำหรับผู้ที่ต้องการใช้ Arduino Uno แบบดั้งเดิม

🛒 ดูสินค้าที่ Global Byte Shop
฿890

DHT22 Temperature & Humidity Sensor

เซ็นเซอร์วัดอุณหภูมิและความชื้นความแม่นยำสูง

🛒 ดูสินค้าที่ Global Byte Shop
฿180

SG90 Micro Servo Motor

เซอร์โวมอเตอร์ขนาดเล็กสำหรับควบคุมผ่านแอป

🛒 ดูสินค้าที่ Global Byte Shop
฿120

LED Kit + Resistors + Breadboard

ชุด LED หลากสี พร้อมตัวต้านทานและเบรดบอร์ด

🛒 ดูสินค้าที่ Global Byte Shop
฿250

📶 WiFi Connection

ข้อดี: ระยะไกล, ความเร็วสูง, Internet Access
เหมาะสำหรับ: Home Automation, IoT Dashboard, Remote Monitoring
ระยะทำงาน: 50-100 เมตร (ในบ้าน)

🔵 Bluetooth LE

ข้อดี: ประหยัดพลังงาน, เชื่อมต่อง่าย, ไม่ต้อง WiFi
เหมาะสำหรับ: Portable Device, Battery Powered, Personal Control
ระยะทำงาน: 10-30 เมตร

💰 สรุปราคาโปรเจค

🥉 Basic WiFi Kit

฿1,140

ESP32 + Sensors + LEDs
  • • WiFi Web Interface
  • • Basic Control
  • • Temperature Monitor

🥈 Standard Kit

฿1,480

+ Servo + More Sensors
  • • Motor Control
  • • Multiple Sensors
  • • Advanced Interface

🥇 Professional Kit

฿2,890

+ Arduino + ESP8266 + Tools
  • • Dual Platform
  • • Complete Toolkit
  • • Production Ready

⚙️ วิธีการสร้าง Smartphone Interface

🌐 วิธีที่ 1: Web Interface (แนะนำสำหรับมือใหม่)

✅ ข้อดีของ Web Interface

  • ไม่ต้องติดตั้งแอปเพิ่มเติม ใช้ Browser ธรรมดา
  • ทำงานได้ทุกระบบปฏิบัติการ (iOS, Android, Windows)
  • พัฒนาและแก้ไขได้ง่าย ใช้ HTML/CSS/JavaScript
  • สามารถเข้าถึงจากหลายอุปกรณ์พร้อมกัน
  • รองรับ Responsive Design สำหรับหน้าจอทุกขนาด

💻 โค้ดตัวอย่าง ESP32 Web Server

#include <WiFi.h>
#include <WebServer.h>
#include <DHT.h>

// WiFi Configuration
const char* ssid = "YourWiFiName";
const char* password = "YourWiFiPassword";

// Hardware Configuration
#define DHT_PIN 4
#define DHT_TYPE DHT22
#define LED_PIN 2
#define SERVO_PIN 18

DHT dht(DHT_PIN, DHT_TYPE);
WebServer server(80);

// Global Variables
bool ledState = false;
int servoPosition = 90;

void setup() {
  Serial.begin(115200);
  
  // Initialize Hardware
  pinMode(LED_PIN, OUTPUT);
  dht.begin();
  
  // Connect to WiFi
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi");
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println();
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());
  
  // Setup Web Server Routes
  server.on("/", handleRoot);
  server.on("/api/led", HTTP_POST, handleLED);
  server.on("/api/servo", HTTP_POST, handleServo);
  server.on("/api/sensors", HTTP_GET, handleSensors);
  
  server.begin();
  Serial.println("Web server started!");
}

void loop() {
  server.handleClient();
  delay(10);
}

void handleRoot() {
  String html = R"(
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Arduino Controller</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; background: #f0f0f0; }
        .container { max-width: 400px; margin: 0 auto; background: white; padding: 20px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        .control-group { margin: 15px 0; padding: 15px; background: #f8f9fa; border-radius: 8px; }
        .btn { padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; margin: 5px; }
        .btn-primary { background: #007bff; color: white; }
        .btn-danger { background: #dc3545; color: white; }
        .btn-success { background: #28a745; color: white; }
        .slider { width: 100%; height: 40px; }
        .sensor-value { font-size: 18px; font-weight: bold; margin: 10px 0; }
        .status { padding: 10px; border-radius: 5px; margin: 10px 0; text-align: center; }
        .status.connected { background: #d4edda; color: #155724; }
    </style>
</head>
<body>
    <div class="container">
        <h1 style="text-align: center; color: #333;">🏠 Arduino Smart Home</h1>
        
        <div class="status connected">
            ✅ เชื่อมต่อสำเร็จ - IP: )" + WiFi.localIP().toString() + R"(
        </div>
        
        <div class="control-group">
            <h3>💡 LED Control</h3>
            <button id="ledBtn" class="btn btn-danger" onclick="toggleLED()">LED OFF</button>
        </div>
        
        <div class="control-group">
            <h3>🔄 Servo Control</h3>
            <input type="range" id="servoSlider" class="slider" min="0" max="180" value="90" onchange="updateServo(this.value)">
            <div>Position: <span id="servoValue">90</span>°</div>
        </div>
        
        <div class="control-group">
            <h3>🌡️ Sensor Data</h3>
            <div class="sensor-value">Temperature: <span id="temperature">--</span>°C</div>
            <div class="sensor-value">Humidity: <span id="humidity">--</span>%</div>
            <button class="btn btn-primary" onclick="updateSensors()">🔄 Refresh</button>
        </div>
    </div>

    <script>
        let ledState = false;
        
        function toggleLED() {
            ledState = !ledState;
            fetch('/api/led', {
                method: 'POST',
                headers: {'Content-Type': 'application/json'},
                body: JSON.stringify({state: ledState})
            })
            .then(response => response.json())
            .then(data => {
                const btn = document.getElementById('ledBtn');
                if (data.state) {
                    btn.textContent = 'LED ON';
                    btn.className = 'btn btn-success';
                } else {
                    btn.textContent = 'LED OFF';
                    btn.className = 'btn btn-danger';
                }
            });
        }
        
        function updateServo(value) {
            document.getElementById('servoValue').textContent = value;
            fetch('/api/servo', {
                method: 'POST',
                headers: {'Content-Type': 'application/json'},
                body: JSON.stringify({position: parseInt(value)})
            });
        }
        
        function updateSensors() {
            fetch('/api/sensors')
            .then(response => response.json())
            .then(data => {
                document.getElementById('temperature').textContent = data.temperature;
                document.getElementById('humidity').textContent = data.humidity;
            });
        }
        
        // Auto-update sensors every 5 seconds
        setInterval(updateSensors, 5000);
        updateSensors(); // Initial load
    </script>
</body>
</html>
  )";
  
  server.send(200, "text/html", html);
}

void handleLED() {
  if (server.hasArg("plain")) {
    String body = server.arg("plain");
    
    // Simple JSON parsing (for production, use ArduinoJson library)
    if (body.indexOf("true") > 0) {
      ledState = true;
      digitalWrite(LED_PIN, HIGH);
    } else {
      ledState = false;
      digitalWrite(LED_PIN, LOW);
    }
    
    server.send(200, "application/json", "{\"state\":" + String(ledState ? "true" : "false") + "}");
  }
}

void handleServo() {
  if (server.hasArg("plain")) {
    String body = server.arg("plain");
    
    // Extract position value (simplified parsing)
    int pos = body.substring(body.indexOf(":") + 1, body.indexOf("}")).toInt();
    servoPosition = constrain(pos, 0, 180);
    
    // Control servo here (add servo library if needed)
    Serial.println("Servo position: " + String(servoPosition));
    
    server.send(200, "application/json", "{\"position\":" + String(servoPosition) + "}");
  }
}

void handleSensors() {
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();
  
  if (isnan(temperature) || isnan(humidity)) {
    server.send(500, "application/json", "{\"error\":\"Sensor read failed\"}");
    return;
  }
  
  String json = "{";
  json += "\"temperature\":" + String(temperature, 1) + ",";
  json += "\"humidity\":" + String(humidity, 1);
  json += "}";
  
  server.send(200, "application/json", json);
}

📱 การใช้งานบนสมาร์ทโฟน

  1. เปิด WiFi บนโฟนและเชื่อมต่อเครือข่ายเดียวกับ ESP32
  2. เปิด Browser (Chrome, Safari, Firefox)
  3. พิมพ์ IP Address ที่แสดงใน Serial Monitor
  4. บันทึก Bookmark สำหรับเข้าใช้งานง่าย
  5. สามารถเพิ่มไอคอนลงหน้าจอหลักได้ (Add to Home Screen)

📱 วิธีที่ 2: Mobile App Development

🚀 ข้อดีของ Mobile App

  • Performance ดีกว่า เข้าถึง Native Features
  • Push Notifications และ Background Processing
  • Offline Capability และ Local Storage
  • Better Security และ Authentication
  • Professional Look & Feel

🛠️ เครื่องมือพัฒนา

MIT App Inventor:
• ฟรี, ใช้งานง่าย
• Drag & Drop Interface
• เหมาะสำหรับมือใหม่
Flutter:
• Cross-platform
• Professional Grade
• ต้องเขียนโค้ด Dart
React Native:
• JavaScript Based
• Large Community
• Facebook Support

📋 ขั้นตอนการพัฒนา

  1. ออกแบบ UI/UX Layout
  2. สร้าง Communication Protocol
  3. Implement Network Functions
  4. Add Error Handling
  5. Test บนอุปกรณ์จริง
  6. Deploy to App Store (Optional)

⚠️ ข้อควรพิจารณา

ความซับซ้อน: ต้องเรียนรู้การพัฒนาแอป ใช้เวลานานกว่า

ค่าใช้จ่าย: อาจต้องจ่าย Developer Account (iOS $99/ปี)

Maintenance: ต้องอัพเดทตาม OS Version ใหม่

แนะนำ: เริ่มจาก Web Interface ก่อน แล้วค่อยพัฒนาเป็นแอป

🔵 วิธีที่ 3: Bluetooth LE Communication

⚡ ข้อดีของ Bluetooth LE

  • ประหยัดพลังงานมาก เหมาะสำหรับ Battery Powered
  • เชื่อมต่อได้ง่าย ไม่ต้องตั้งค่า WiFi
  • Latency ต่ำ เหมาะสำหรับ Real-time Control
  • Security ดี มี Encryption Built-in

💻 โค้ดตัวอย่าง ESP32 Bluetooth LE

#include "BLEDevice.h"
#include "BLEServer.h"
#include "BLEUtils.h"
#include "BLE2902.h"

// BLE Configuration
#define SERVICE_UUID        "12345678-1234-1234-1234-123456789abc"
#define CHARACTERISTIC_UUID "87654321-4321-4321-4321-cba987654321"

BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic = NULL;
bool deviceConnected = false;

class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
      Serial.println("Device connected");
    };

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
      Serial.println("Device disconnected");
    }
};

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      String value = pCharacteristic->getValue();
      
      if (value.length() > 0) {
        Serial.print("Received: ");
        Serial.println(value);
        
        // Parse commands
        if (value == "LED_ON") {
          digitalWrite(2, HIGH);
          pCharacteristic->setValue("LED turned ON");
        } else if (value == "LED_OFF") {
          digitalWrite(2, LOW);
          pCharacteristic->setValue("LED turned OFF");
        } else if (value.startsWith("SERVO_")) {
          int pos = value.substring(6).toInt();
          // Control servo here
          Serial.println("Servo position: " + String(pos));
          pCharacteristic->setValue("Servo moved to " + String(pos));
        }
        
        pCharacteristic->notify();
      }
    }
};

void setup() {
  Serial.begin(115200);
  pinMode(2, OUTPUT);
  
  // Initialize BLE
  BLEDevice::init("Arduino Controller");
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  BLEService *pService = pServer->createService(SERVICE_UUID);

  pCharacteristic = pService->createCharacteristic(
                      CHARACTERISTIC_UUID,
                      BLECharacteristic::PROPERTY_READ |
                      BLECharacteristic::PROPERTY_WRITE |
                      BLECharacteristic::PROPERTY_NOTIFY
                    );

  pCharacteristic->setCallbacks(new MyCallbacks());
  pCharacteristic->addDescriptor(new BLE2902());

  pService->start();
  
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(false);
  pAdvertising->setMinPreferred(0x0);
  BLEDevice::startAdvertising();
  
  Serial.println("BLE Server started, waiting for connections...");
}

void loop() {
  if (deviceConnected) {
    // Send sensor data every 5 seconds
    static unsigned long lastSensorRead = 0;
    if (millis() - lastSensorRead > 5000) {
      String sensorData = "TEMP:25.3,HUM:60.2";
      pCharacteristic->setValue(sensorData);
      pCharacteristic->notify();
      lastSensorRead = millis();
    }
  }
  
  delay(100);
}

📱 แอปสำหรับ Bluetooth LE

Android:
• BLE Scanner
• nRF Connect
• Serial Bluetooth Terminal
iOS:
• LightBlue Explorer
• BLE Scanner 4.0
• Nordic nRF Toolbox

🔧 การแก้ไขปัญหาที่พบบ่อย

❌ ปัญหา: เชื่อมต่อ WiFi ไม่ได้

อาการ: ESP32 ไม่สามารถเชื่อมต่อ WiFi หรือเชื่อมต่อแล้วหลุด

สาเหตุและวิธีแก้:

  • ตรวจสอบชื่อ WiFi และรหัสผ่านให้ถูกต้อง
  • ใช้ WiFi 2.4GHz (ESP32 ไม่รองรับ 5GHz)
  • ตรวจสอบ Signal Strength ให้อยู่ในระยะที่เหมาะสม
  • เพิ่ม delay ในการเชื่อมต่อ และ retry mechanism
  • ตรวจสอบ Router Security (WPA2 แนะนำ)

⚠️ ปัญหา: Web Interface ช้าหรือค้าง

อาการ: หน้าเว็บโหลดช้า หรือการควบคุมมี Delay

วิธีแก้:

  • ลด HTML Size โดยใช้ Minified CSS/JS
  • ใช้ AJAX แทนการ Refresh ทั้งหน้า
  • เพิ่ม RAM โดยใช้ PSRAM หรือ External Memory
  • Optimize การประมวลผลใน loop()
  • ใช้ Async Web Server Library

🔵 ปัญหา: Bluetooth LE เชื่อมต่อไม่ได้

อาการ: ไม่เจอ Device หรือเชื่อมต่อแล้วหลุดบ่อย

วิธีแก้:

  • ตรวจสอบ Bluetooth Permission บนโฟน
  • Clear Bluetooth Cache (Android)
  • ตรวจสอบ UUID ให้ตรงกันทั้งสองฝั่ง
  • เพิ่ม Connection Interval และ Timeout
  • ใช้ Advertising ที่เหมาะสม

✅ เทคนิคการ Debug

เครื่องมือที่แนะนำ:

  • Serial Monitor สำหรับดู Log และ Debug Message
  • WiFi Analyzer App เพื่อตรวจสอบ Signal
  • Postman หรือ curl สำหรับทดสอบ API
  • Browser Developer Tools สำหรับ Debug JavaScript
  • Wireshark สำหรับวิเคราะห์ Network Traffic

🏭 การใช้งานจริงในอุตสาหกรรม

🏠 Smart Home Automation

ระบบควบคุมแสงไฟ: เปิด/ปิด, ปรับความสว่าง, เปลี่ยนสี RGB
ระบบปรับอากาศ: ควบคุมอุณหภูมิ, ความชื้น, พัดลม
ระบบรักษาความปลอดภัย: กล้องวงจรปิด, เซ็นเซอร์เคลื่อนไหว
ระบบรดน้ำต้นไม้: ตรวจสอบความชื้นดิน, รดน้ำอัตโนมัติ

🏭 Industrial IoT

ระบบ Monitoring: ตรวจสอบเครื่องจักร, อุณหภูมิ, ความดัน
Quality Control: ตรวจสอบคุณภาพสินค้า, นับจำนวน
Predictive Maintenance: วิเคราะห์การสั่นสะเทือน, เสียง
Energy Management: ตรวจสอบการใช้ไฟฟ้า, ปรับปรุงประสิทธิภาพ

🚗 Automotive & Transportation

Vehicle Diagnostics: ตรวจสอบสถานะเครื่องยนต์, OBD-II
Fleet Management: ติดตาม GPS, การใช้เชื้อเพลิง
Smart Parking: ระบบจอดรถอัจฉริยะ, การชำระเงิน

🏥 Healthcare & Medical

Patient Monitoring: วัดชีพจร, อุณหภูมิร่างกาย
Medical Equipment: ควบคุมเครื่องมือแพทย์
Medication Reminder: แจ้งเตือนการกินยา

🎯 สรุป: สมาร์ทโฟนคือ Touchscreen ที่ดีที่สุด

การใช้ สมาร์ทโฟนเป็น Touchscreen Interface สำหรับ Arduino เป็นวิธีที่ทันสมัย และประหยัดค่าใช้จ่าย ด้วยอุปกรณ์คุณภาพจาก Global Byte Shop คุณสามารถสร้างระบบควบคุมที่ทันสมัยได้ในราคาเพียง 590 บาท

💡 ง่ายต่อการใช้งาน

Web Interface ใช้ Browser ธรรมดา
ไม่ต้องติดตั้งแอปเพิ่มเติม

🌐 เชื่อมต่อได้หลากหลาย

WiFi สำหรับระยะไกล
Bluetooth LE ประหยัดพลังงาน

🚀 ขยายได้ไม่จำกัด

เพิ่มเซ็นเซอร์และฟีเจอร์
ตามความต้องการ

⏰ จัดส่งฟรีทั่วไทย | 🔧 รับประกัน 1 ปี | 💬 Support 24/7

แท็ก

ฝากความคิดเห็น

ฝากความคิดเห็น


Blog posts

  • 6502 กลับมาแล้ว! คราวนี้วิ่งเร็วในแบบ FPGA  ที่ Maker รอคอย

    , โดย Global Byte Shope 6502 กลับมาแล้ว! คราวนี้วิ่งเร็วในแบบ FPGA ที่ Maker รอคอย

  • ESP32 พลิกเกม! เมื่อการโค้ดไม่ได้หยุดแค่ IoT แต่ไปไกลถึง “งานศิลปะ

    , โดย Global Byte Shope ESP32 พลิกเกม! เมื่อการโค้ดไม่ได้หยุดแค่ IoT แต่ไปไกลถึง “งานศิลปะ

  • Arduino ไม่ได้มีดีแค่หุ่นยนต์… คราวนี้วัดชีพจรมนุษย์ได้แล้ว !

    , โดย Global Byte Shope Arduino ไม่ได้มีดีแค่หุ่นยนต์… คราวนี้วัดชีพจรมนุษย์ได้แล้ว !

  • Pico2ROMEmu : คืนชีพเครื่อง Retro ง่ายกว่าเดิม ขนาดไม่ถึงฝ่ามือ แต่จำลอง ROM ได้หลายเมกะไบต์ทันที

    , โดย Global Byte Shope Pico2ROMEmu : คืนชีพเครื่อง Retro ง่ายกว่าเดิม ขนาดไม่ถึงฝ่ามือ แต่จำลอง ROM ได้หลายเมกะไบต์ทันที

© 2025 บริษัท โกลบอลโทรนิค อินเตอร์เทรด จํากัด, ขับเคลื่อนโดย Shopify

    • PayPal

    เข้าสู่ระบบ

    ลืมรหัสผ่านใช่ไหม?

    ยังไม่มีบัญชีใช่ไหม?
    สร้างบัญชี