แปลงจอ Disposable Vape เป็นจอแสดงผล DIY
เทคโนโลยี รีไซเคิลอัจฉริยะ ที่คุณไม่เคยคิด!
จอ OLED ฟรี! จาก Disposable Vape ที่คุณทิ้ง
รู้ไหมว่าใน Disposable Vape ที่คุณทิ้งทุกวัน มี จอ OLED คุณภาพสูง ซ่อนอยู่? วันนี้เราจะสอนคุณแปลงขยะเป็นทรัพย์สิน สร้างโปรเจกต์ DIY ประหยัดงบ 80%!
🎯 สิ่งที่คุณจะได้เรียนรู้:
- 📊 เปรียบเทียบจอ Vape vs จอ OLED ใหม่ (คุณภาพเท่ากัน!)
- 🧩 วิธีถอดและต่อวงจรอย่างปลอดภัย (เริ่มต้น 50 บาท)
- 🏗️ สถาปัตยกรรม I2C และการเชื่อมต่อ Arduino
- 💻 โค้ด Arduino ควบคุมจอ OLED ใช้งานได้ทันที
- 🧪 เทคนิคการทดสอบและแก้ไขปัญหาการแสดงผล
- 🚀 ไอเดียโปรเจกต์ 15+ แบบ จากจอเดียว
🔬 การเปลี่ยนแปลงจาก Vape เป็น Display
🚮 Before: Disposable Vape
✨ After: OLED Display
🌍 ผลกระทบต่อสิ่งแวดล้อม
⏰ ใช้เวลา 2 ชั่วโมง | 💰 เริ่มต้น 50 บาท
📋 สารบัญ
📱 ภาพรวมจอ Disposable Vape OLED
🔍 ข้อมูลจำเพาะจอ OLED ใน Vape
🚬 ประเภท Disposable Vape ที่มีจอ
Premium Vapes (5000+ puffs)
มีจอ OLED แสดงแบตเตอรี่และจำนวน puff
Smart Vapes
จอแสดงข้อมูลแบบ Real-time
✨ เปรียบเทียบคุณภาพจอ
จุดเด่นของจอ Vape
- • คุณภาพเท่าจอ OLED ใหม่ (ใช้ IC เดียวกัน)
- • ขนาดเล็กกะทัดรัด เหมาะโปรเจกต์พกพา
- • ได้ฟรี! จากของที่จะทิ้งอยู่แล้ว
- • ทดสอบการทำงานแล้ว (ใช้งานได้จริง)
ข้อควรระวัง
- • ต้องถอดออกจากวงจรเดิมอย่างระมัดระวัง
- • ขาต่อเล็กมาก ต้องใช้เครื่องมือละเอียด
- • ไม่มี breakout board ต้องต่อเอง
- • อาจมีสารเคมีตกค้าง ต้องทำความสะอาด
📊 วิเคราะห์เทคนิคและเปรียบเทียบโมเดล
🔬 การวิเคราะห์เทคนิค
🧬 โครงสร้างฮาร์ดแวร์
- • OLED Panel: Organic Light-Emitting Diode
- • Driver IC: SSD1306 (128x64 resolution)
- • Interface: I2C (2-wire communication)
- • Power: 3.3V logic, 12V OLED drive
- • Backlight: Self-illuminating (ไม่ต้องไฟ backlight)
⚡ ข้อมูลทางไฟฟ้า
- • Supply Voltage: 3.3V - 5V DC
- • Logic Level: 3.3V TTL Compatible
- • Current Draw: 20mA (typical), 50mA (max)
- • I2C Address: 0x3C (default), 0x3D (alternate)
- • Clock Speed: Up to 400kHz (Fast Mode)
⚖️ เปรียบเทียบจอ OLED
แหล่งที่มา | ราคา | คุณภาพ | ความพร้อมใช้ | คะแนน |
---|---|---|---|---|
Vape Screen | ฟรี! | เยี่ยม | ต้องถอดเอง | 9.5/10 |
OLED 0.96" ใหม่ | ฿180-250 | เยี่ยม | พร้อมใช้ | 8.0/10 |
LCD 16x2 | ฿120-180 | ปานกลาง | พร้อมใช้ | 7.0/10 |
TFT 1.8" | ฿350-450 | ดีมาก | พร้อมใช้ | 7.5/10 |
💡 ข้อดีเทคนิค
🔋 ประสิทธิภาพพลังงาน
🎯 ความเข้ากันได้
🧩 อุปกรณ์และต้นทุนที่แท้จริง
🔧 เครื่องมือที่จำเป็น
⚡ อุปกรณ์อิเล็กทรอนิกส์
💰 เปรียบเทียบต้นทุน
DIY Vape Screen
฿795
- • เครื่องมือ: ฿500
- • อุปกรณ์: ฿295
- • จอ OLED: ฟรี!
ซื้อจอใหม่
฿1,020
- • อุปกรณ์: ฿295
- • จอ OLED: ฿225
- • เครื่องมือ: ฿500
💡 เคล็ดลับประหยัดงบ
- • หาเครื่องมือยืมจากเพื่อน ประหยัด 500฿
- • ใช้ Arduino Uno ที่มีอยู่แล้ว ประหยัด 180฿
- • ซื้อ Kit รวม ประหยัดได้ 10-15%
- • เก็บ Vape หลายตัวแล้วค่อยทำ ได้จอหลายตัว
🛡️ อุปกรณ์ความปลอดภัย
⚠️ ข้อควรระวัง
- • ใส่แว่นตาป้องกัน (กันสะเก็ดตะกั่ว)
- • ทำงานในที่อากาศถ่ายเท (กันควันตะกั่ว)
- • ล้างมือหลังจากงาน (กันสารเคมี)
- • ใช้ที่รองกันความร้อน
🧤 อุปกรณ์ป้องกัน
฿50 - ฿120
฿80 - ฿150
🏗️ สถาปัตยกรรมระบบและการเชื่อมต่อ
🔌 Pin Configuration
📱 OLED Display Pins
เชื่อมต่อ Arduino 3.3V
เชื่อมต่อ Arduino GND
เชื่อมต่อ Arduino A5
เชื่อมต่อ Arduino A4
🤖 Arduino Nano Connections
VCC → 3.3V, GND → GND
SDA → A4, SCL → A5
4.7kΩ บน SDA และ SCL
⚡ แผนผังวงจร
Arduino Nano + OLED Connection
Arduino Nano OLED Display ┌─────────────┐ ┌──────────────┐ │ │ │ │ │ 3.3V├────────────────┤VCC │ │ │ │ │ │ GND├────────────────┤GND │ │ │ │ │ │ A4 ├────┬───────────┤SDA │ │ │ │ │ │ │ A5 ├────┼─┬─────────┤SCL │ │ │ │ │ │ │ └─────────────┘ │ │ └──────────────┘ │ │ ┌──┴─┴──┐ │4.7kΩ │ Pull-up Resistors │4.7kΩ │ └───┬───┘ │ 3.3V
📡 I2C Communication Protocol
1. I2C Address Configuration
0x3C (60 decimal)
0x3D (61 decimal)
2. Communication Timing
100 kHz Clock Speed
400 kHz Clock Speed
3. Data Transfer Process
SDA goes LOW while SCL HIGH
8-bit address + R/W bit
SDA goes HIGH while SCL HIGH
💻 โค้ดตัวอย่างที่ใช้งานได้จริง 100%
🎮 Basic OLED Control
/*
* Vape OLED Display Controller
* Compatible with SSD1306 128x64 OLED
* Author: Global Byte Shop Thailand
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// OLED display configuration
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
// Create display object
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
Serial.begin(9600);
Serial.println("🚀 Initializing Vape OLED Display...");
// Initialize I2C communication
Wire.begin();
// Initialize display
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println("❌ SSD1306 allocation failed");
for(;;); // Don't proceed, loop forever
}
Serial.println("✅ OLED Display initialized successfully!");
// Clear display buffer
display.clearDisplay();
// Display startup message
showStartupMessage();
delay(2000);
}
void loop() {
// Demo sequence
showBasicText();
delay(2000);
showSystemInfo();
delay(2000);
showGraphics();
delay(2000);
showAnimation();
delay(2000);
}
void showStartupMessage() {
display.clearDisplay();
// Title
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("VAPE");
display.println("OLED");
// Subtitle
display.setTextSize(1);
display.setCursor(0, 40);
display.println("Recycled Display");
display.setCursor(0, 50);
display.println("Global Byte Shop");
display.display();
}
void showBasicText() {
display.clearDisplay();
// Header
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("=== BASIC TEXT ===");
// Content
display.setCursor(0, 16);
display.println("Hello World!");
display.setCursor(0, 26);
display.println("Thai: สวัสดีครับ");
display.setCursor(0, 36);
display.println("Numbers: 12345");
display.setCursor(0, 46);
display.println("Symbols: @#$%^&*");
// Footer
display.setCursor(0, 56);
display.println("Text Demo Complete");
display.display();
}
void showSystemInfo() {
display.clearDisplay();
// Title
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("=== SYSTEM INFO ===");
// System information
display.setCursor(0, 12);
display.print("Uptime: ");
display.print(millis() / 1000);
display.println("s");
display.setCursor(0, 22);
display.print("Free RAM: ");
display.print(getFreeRAM());
display.println(" bytes");
display.setCursor(0, 32);
display.print("Display: 128x64");
display.setCursor(0, 42);
display.print("I2C Addr: 0x");
display.print(SCREEN_ADDRESS, HEX);
// Status indicator
display.setCursor(0, 52);
display.print("Status: ");
display.print(millis() % 2000 < 1000 ? "ACTIVE" : "READY ");
display.display();
}
void showGraphics() {
display.clearDisplay();
// Title
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("=== GRAPHICS ===");
// Draw shapes
// Rectangle
display.drawRect(10, 15, 30, 20, SSD1306_WHITE);
display.fillRect(12, 17, 26, 16, SSD1306_WHITE);
// Circle
display.drawCircle(70, 25, 15, SSD1306_WHITE);
display.fillCircle(70, 25, 10, SSD1306_WHITE);
// Triangle
display.drawTriangle(100, 15, 85, 35, 115, 35, SSD1306_WHITE);
// Lines
display.drawLine(0, 45, 127, 45, SSD1306_WHITE);
display.drawLine(0, 47, 127, 47, SSD1306_WHITE);
// Progress bar
display.setCursor(0, 52);
display.print("Progress: ");
int progress = (millis() / 100) % 100;
display.print(progress);
display.print("%");
// Progress bar visual
display.drawRect(70, 52, 50, 8, SSD1306_WHITE);
display.fillRect(72, 54, (progress * 46) / 100, 4, SSD1306_WHITE);
display.display();
}
void showAnimation() {
for(int i = 0; i < 64; i++) {
display.clearDisplay();
// Title
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("=== ANIMATION ===");
// Moving circle
int x = (i * 2) % 128;
display.fillCircle(x, 32, 8, SSD1306_WHITE);
// Bouncing text
int textY = 45 + sin(i * 0.2) * 10;
display.setCursor(30, textY);
display.println("BOUNCING!");
// Rotating line
float angle = i * 0.1;
int centerX = 100, centerY = 32;
int endX = centerX + cos(angle) * 15;
int endY = centerY + sin(angle) * 15;
display.drawLine(centerX, centerY, endX, endY, SSD1306_WHITE);
display.display();
delay(50);
}
}
// Utility function to get free RAM
int getFreeRAM() {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
// I2C Scanner function
void scanI2C() {
Serial.println("🔍 Scanning I2C devices...");
byte error, address;
int nDevices = 0;
for(address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("✅ I2C device found at address 0x");
if (address < 16) Serial.print("0");
Serial.print(address, HEX);
Serial.println(" !");
nDevices++;
}
}
if (nDevices == 0) {
Serial.println("❌ No I2C devices found");
} else {
Serial.print("✅ Found ");
Serial.print(nDevices);
Serial.println(" I2C device(s)");
}
}
🚀 Advanced Features Code
/*
* Advanced Vape OLED Features
* Temperature Monitor, Clock, Menu System
*/
#include <DHT.h>
#include <RTClib.h>
// Sensor configuration
#define DHT_PIN 2
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
RTC_DS3231 rtc;
// Menu system
int currentMenu = 0;
const int maxMenus = 4;
String menuItems[] = {"Home", "Sensors", "Clock", "Settings"};
// Button pins
#define BUTTON_UP 3
#define BUTTON_DOWN 4
#define BUTTON_SELECT 5
void setup() {
Serial.begin(9600);
// Initialize sensors
dht.begin();
if (!rtc.begin()) {
Serial.println("❌ RTC not found");
}
// Initialize buttons
pinMode(BUTTON_UP, INPUT_PULLUP);
pinMode(BUTTON_DOWN, INPUT_PULLUP);
pinMode(BUTTON_SELECT, INPUT_PULLUP);
// Initialize display (same as previous code)
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println("❌ SSD1306 allocation failed");
for(;;);
}
Serial.println("✅ Advanced OLED system ready!");
}
void loop() {
handleButtons();
updateDisplay();
delay(100);
}
void handleButtons() {
static unsigned long lastButtonPress = 0;
unsigned long currentTime = millis();
// Debounce buttons
if (currentTime - lastButtonPress < 200) return;
if (digitalRead(BUTTON_UP) == LOW) {
currentMenu = (currentMenu - 1 + maxMenus) % maxMenus;
lastButtonPress = currentTime;
Serial.println("⬆️ Menu Up: " + menuItems[currentMenu]);
}
if (digitalRead(BUTTON_DOWN) == LOW) {
currentMenu = (currentMenu + 1) % maxMenus;
lastButtonPress = currentTime;
Serial.println("⬇️ Menu Down: " + menuItems[currentMenu]);
}
if (digitalRead(BUTTON_SELECT) == LOW) {
lastButtonPress = currentTime;
Serial.println("✅ Selected: " + menuItems[currentMenu]);
}
}
void updateDisplay() {
display.clearDisplay();
switch(currentMenu) {
case 0: showHomeScreen(); break;
case 1: showSensorScreen(); break;
case 2: showClockScreen(); break;
case 3: showSettingsScreen(); break;
}
// Draw menu indicator
drawMenuIndicator();
display.display();
}
void showHomeScreen() {
// Header
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("HOME");
// Quick info
display.setTextSize(1);
display.setCursor(0, 20);
display.print("Temp: ");
display.print(dht.readTemperature(), 1);
display.println("C");
display.setCursor(0, 30);
display.print("Humidity: ");
display.print(dht.readHumidity(), 1);
display.println("%");
// Time
DateTime now = rtc.now();
display.setCursor(0, 40);
display.print("Time: ");
if (now.hour() < 10) display.print("0");
display.print(now.hour());
display.print(":");
if (now.minute() < 10) display.print("0");
display.print(now.minute());
// Status
display.setCursor(0, 50);
display.print("Status: ");
display.print(millis() % 2000 < 1000 ? "ACTIVE" : "STANDBY");
}
void showSensorScreen() {
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("=== SENSORS ===");
// Temperature
float temp = dht.readTemperature();
display.setCursor(0, 12);
display.print("Temperature:");
display.setCursor(0, 22);
display.setTextSize(2);
display.print(temp, 1);
display.print("C");
// Humidity
float humidity = dht.readHumidity();
display.setTextSize(1);
display.setCursor(0, 40);
display.print("Humidity:");
display.setCursor(0, 50);
display.setTextSize(2);
display.print(humidity, 1);
display.print("%");
// Heat index
float heatIndex = dht.computeHeatIndex(temp, humidity, false);
display.setTextSize(1);
display.setCursor(70, 50);
display.print("HI:");
display.print(heatIndex, 1);
}
void showClockScreen() {
DateTime now = rtc.now();
// Large time display
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 10);
if (now.hour() < 10) display.print("0");
display.print(now.hour());
display.print(":");
if (now.minute() < 10) display.print("0");
display.print(now.minute());
// Seconds
display.setTextSize(1);
display.setCursor(100, 20);
if (now.second() < 10) display.print("0");
display.print(now.second());
// Date
display.setCursor(0, 35);
display.print("Date: ");
display.print(now.day());
display.print("/");
display.print(now.month());
display.print("/");
display.print(now.year());
// Day of week
String days[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
display.setCursor(0, 45);
display.print("Day: ");
display.print(days[now.dayOfTheWeek()]);
// Uptime
display.setCursor(0, 55);
display.print("Uptime: ");
display.print(millis() / 1000);
display.print("s");
}
void showSettingsScreen() {
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("=== SETTINGS ===");
// System info
display.setCursor(0, 12);
display.print("Display: 128x64");
display.setCursor(0, 22);
display.print("I2C: 0x");
display.print(SCREEN_ADDRESS, HEX);
display.setCursor(0, 32);
display.print("Free RAM: ");
display.print(getFreeRAM());
display.setCursor(0, 42);
display.print("Version: 1.0");
display.setCursor(0, 52);
display.print("Global Byte Shop");
}
void drawMenuIndicator() {
// Draw menu dots at bottom
int dotY = 58;
int startX = 40;
for (int i = 0; i < maxMenus; i++) {
int dotX = startX + (i * 12);
if (i == currentMenu) {
display.fillCircle(dotX, dotY, 3, SSD1306_WHITE);
} else {
display.drawCircle(dotX, dotY, 2, SSD1306_WHITE);
}
}
}
🧪 การทดสอบและแก้ไขปัญหา
⚠️ ปัญหาที่พบบ่อยและวิธีแก้ไข
❌ จอไม่แสดงผล
Display not found หรือ blank screen
- • ตรวจสอบการต่อสาย VCC, GND, SDA, SCL
- • ใช้ I2C Scanner หา address ที่ถูกต้อง
- • ตรวจสอบ Pull-up resistors 4.7kΩ
- • ลองเปลี่ยน address เป็น 0x3D
⚠️ จอแสดงผลผิดเพี้ยน
ตัวอักษรหรือภาพไม่ชัด มีจุดแปลกๆ
- • ตรวจสอบแรงดันไฟ (ต้อง 3.3V-5V)
- • เพิ่ม Capacitor 100µF กรองไฟ
- • ลดความยาวสาย I2C (<30cm)
- • ใช้สาย Shielded Cable
⚡ การสื่อสาร I2C ขัดข้อง
I2C timeout หรือ communication error
- • ลด Clock Speed เป็น 100kHz
- • ตรวจสอบ Pull-up resistors
- • ใช้ Wire.setClock(100000)
- • เพิ่ม delay ระหว่างคำสั่ง
🔧 จอถอดจาก Vape เสียหาย
ขาหลุด หรือ IC เสียหาย
- • ใช้ Flux paste ช่วยบัดกรี
- • บัดกรีขาใหม่ด้วยลวดเล็ก
- • ใช้ Multimeter ตรวจสอบ continuity
- • หาจอ Vape ตัวใหม่มาทดแทน
🔍 เครื่องมือทดสอบ
📊 I2C Scanner
// I2C Device Scanner
void scanI2C() {
Serial.println("Scanning I2C...");
for(byte addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
byte error = Wire.endTransmission();
if (error == 0) {
Serial.print("Device at 0x");
if (addr < 16) Serial.print("0");
Serial.println(addr, HEX);
}
}
}
🎯 Display Test
// Display Test Pattern
void testDisplay() {
// Test all pixels
display.clearDisplay();
display.fillScreen(SSD1306_WHITE);
display.display();
delay(1000);
// Test patterns
for(int i = 0; i < 128; i += 8) {
display.clearDisplay();
display.drawLine(i, 0, i, 63, SSD1306_WHITE);
display.display();
delay(50);
}
}
🔧 ขั้นตอนการแก้ไขปัญหา
1️⃣ ตรวจสอบฮาร์ดแวร์
- 1. ตรวจสอบการต่อสายทุกเส้น
- 2. วัดแรงดันไฟ VCC = 3.3V-5V
- 3. ตรวจสอบ Ground connection
- 4. ทดสอบ continuity ด้วย Multimeter
2️⃣ ทดสอบซอฟต์แวร์
- 1. รัน I2C Scanner หา device address
- 2. ทดสอบ basic display functions
- 3. ตรวจสอบ library version
- 4. ลองใช้ example code
3️⃣ การแก้ไขขั้นสูง
- 1. ปรับ I2C clock speed
- 2. เพิ่ม delay ระหว่างคำสั่ง
- 3. ใช้ external pull-up resistors
- 4. ตรวจสอบ power supply noise
🚀 ไอเดียโปรเจกต์จากจอ Vape
💡 15+ ไอเดียโปรเจกต์สุดเจ๋ง
🏠 Smart Home Projects
แสดงอุณหภูมิ ความชื้น
นาฬิกา + ปฏิทิน + แจ้งเตือน
ตรวจสอบแบตเตอรี่ UPS
วัดการใช้ไฟฟ้า
🎮 Entertainment & Gaming
เกมงูคลาสสิค
แสดงคลื่นเสียง
แสดงข้อมูลจาก API
ลูกเต๋าดิจิทัล
🔧 Utility Tools
ไม้บรรทัดดิจิทัล
นาฬิกาจับเวลา
เครื่องคิดเลข
บันทึกข้อมูล sensor
🚗 Automotive & IoT
แสดงข้อมูลรถยนต์
ตรวจสอบสัญญาณ WiFi
แสดงข้อมูลจาก Cloud
รับแจ้งเตือนจากมือถือ
⭐ โปรเจกต์แนะนำ: Smart Weather Station
🌤️ ฟีเจอร์หลัก
- • แสดงอุณหภูมิ ความชื้น
- • ความดันอากาศ
- • คุณภาพอากาศ (PM2.5)
- • พยากรณ์อากาศ
- • กราฟแสดงแนวโน้ม
- • แจ้งเตือนผ่าน LINE
🧩 อุปกรณ์เพิ่มเติม
- • DHT22 (อุณหภูมิ/ความชื้น) - ฿180
- • BMP280 (ความดัน) - ฿120
- • PMS7003 (PM2.5) - ฿850
- • ESP32 (WiFi) - ฿220
- • Case กันน้ำ - ฿150
- • รวม: ฿1,520 + จอฟรี!
📈 ระดับความยาก
🟢 ระดับเริ่มต้น (1-2 ชั่วโมง)
🟡 ระดับกลาง (3-5 ชั่วโมง)
🔴 ระดับสูง (6+ ชั่วโมง)
♻️ พร้อมเริ่มโปรเจกต์รีไซเคิลแล้วหรือยัง?
เปลี่ยนขยะเป็นทรัพย์สิน! สร้างโปรเจกต์ DIY อัจฉริยะจากจอ Disposable Vape ประหยัดงบ 80% และช่วยโลกไปในตัว
🌍 ผลกระทบต่อสิ่งแวดล้อม
💡 คุณรู้ไหม? การรีไซเคิลจอ Vape 1 ตัว = ประหยัดพลังงาน 50 วัตต์ชั่วโมง!
© 2024 Global Byte Shop Thailand. All rights reserved.
🇹🇭 Made with ❤️ for Thai Makers and Environment
🔗 Shop Components: Global Byte Shop
♻️ Go Green, Go DIY! - เปลี่ยนขยะเป็นนวัตกรรม