ไอเดียนี้มันหมักหมมในหัวพี่มานานแล้ววว น้องรู้ไหม พี่ถ่ายคลิปเกี่ยวกับเทคโนโลยีไว้เพียบ แล้วก็อยากจะล้วงลึกเข้าไปในโลกของหุ่นยนต์และวิศวะ สุดท้ายเลยปิ๊งไอเดียโปรเจกต์นี้ขึ้นมา
พูดตรงๆ เลยนะ พี่รู้สึกหดหู่กับระบบการศึกษาในบ้านเรามาก ตอนนี้เขายังวัดกันแค่ความรู้ในตำรา ไม่ได้มองสิ่งที่อยู่นอกกรอบเลย พี่เป็นคนประเภทที่ชอบตั้งคำถามกับตัวเองตลอดว่า "ไอ้สิ่งนี้มันทำงานยังไงวะ?" มองปัญหาแบบ practical เน้นๆ ไม่เหมือนคนอื่นเขา ด้วย mindset แบบนี้แหละที่ผลักดันให้พี่อยากมาสำรวจโลกผ่านสายตาของวิศวกร พี่เชื่อว่า สักวันหนึ่งเทคโนโลยีแบบ Iron Man มันต้องเป็นจริงให้ได้!
พี่เชื่อสุดๆ ว่าไอเดียเดียวสามารถเปลี่ยนโลกได้ สิ่งสำคัญคือเราจะไปถึงไอเดียนั้นยังไง ไอเดียระดับเทพมักไม่ได้มาจากคนที่เรียนเก่งสุดๆ (ส่วนใหญ่) แต่มันมักปิ๊งขึ้นในหัวของคนอีกกลุ่มนึง (ที่พี่ว่าหาได้ยากมากในระบบ) คำตอบหรือคำถามสำหรับไอเดียพวกนี้ก็หาไม่เจอในระบบการศึกษา (โรงเรียน) ด้วย เราต้องหาคนแบบนี้ให้เจอ แล้วส่งเสริมเขา สิ่งที่พี่ทำน่ะ พี่ไม่ได้ทำเพื่อตัวเอง แต่ทำเพื่อชีวิตที่ดีขึ้นของมนุษย์บนโลกใบนี้ จัดไปวัยรุ่น! มาส่งเสริมคนแบบพี่ (ที่พี่เชื่อว่าเป็นหนึ่งในนั้น) กันเถอะ ให้เขาทำในสิ่งที่จำเป็น และสร้างกระแสใหม่ในวงการเทคโนโลยีล้ำสมัย ทุกๆ สามสิบปี จะมีการปฏิวัติครั้งใหญ่ ในอดีตจนถึงปัจจุบันมันคือสมาร์ทโฟน พี่เชื่อว่าครั้งต่อไปคือ "ตัวคน" นี่แหละ มาช่วยกันเปลี่ยนอนาคต ปฏิวัติโลกใบนี้ ทำให้เทคโนโลยีเป็นมิตรกับสิ่งแวดล้อมมากขึ้น และทำงานเพื่อเป้าหมายที่ยิ่งใหญ่กัน 🤚🏻😀
ด้วยความคิดแบบนี้ พี่เลยอยากโชว์ศักยภาพทุกอย่างที่พี่มีออกมา ซึ่งนั่นก็คือที่มาของโปรเจกต์นี้ไงล่ะ
แม้ว่าโปรเจกต์ของพี่ตอนนี้จะยังเป็นแค่การจำลอง เพราะพี่มีทรัพยากรจำกัด แต่พี่หวังว่าใครก็ตามที่มาดูโปรเจกต์นี้อยู่ ขอให้ช่วยต่อยอดไอเดียเหล่านี้ไปให้ไกลที่สุดนะ ไอเดียทั้งหมดนี้เพื่อโลกของเราและเพื่อมนุษย์ทุกคน
พื้นฐานของระบบบ้านอัตโนมัติ: ควบคุม RGB ผ่านบลูทูธ
"อินเทอร์เน็ตของสรรพสิ่ง" (IoT) ถูกสร้างขึ้นจากความสามารถของอุปกรณ์ต่างๆ ในการสื่อสารแบบไร้สายและดำเนินการตามคำสั่งจากระยะไกล โปรเจกต์นี้ใช้ โมดูลบลูทูธ HC-05 เป็นตัวกลางเชื่อมระหว่าง Arduino Uno กับสมาร์ทโฟน ทำให้สามารถควบคุม LED RGB แบบแคโทดร่วม (Diffused common-cathode) ได้อย่างแม่นยำผ่านระบบไร้สาย
การสื่อสารแบบอนุกรมไร้สาย: HC-05
โมดูล HC-05 นี้เป็นโมดูล SPP (Serial Port Profile) อเนกประสงค์ที่ทำหน้าที่เหมือนเป็นสายอนุกรมโปร่งใสเลย
- ไลบรารี SoftwareSerial: แทนที่จะไปแย่งพิน RX/TX ฮาร์ดแวร์ (ที่ต้องใช้ในการอัปโหลดโค้ด) โปรเจคนี้ใช้
SoftwareSerial.hในการกำหนดพินอนุกรมเสมือนขึ้นมาแทน - อัตราบอด (Baud Rate): ทำงานที่ 9600 baud เพื่อให้มั่นใจว่าสัญญาณข้อมูลจากแอปมือถือไปหา Arduino จะไหลลื่น ไม่สะดุด
ตรรกะสุดสมาร์ท: การแยกข้อมูลสีหลายช่องสัญญาณ
ความเจ๋งของโค้ดส่วนนี้อยู่ที่มันจัดการคำสั่งที่ซับซ้อนได้
- ข้อมูลแบบบัฟเฟอร์: เวลาที่เราส่งสายอักขระตัวเลขจากเทอร์มินัลบลูทูธในมือถือ (เช่น "255,100,0") Arduino จะเก็บข้อมูลนี้ไว้ในบัฟเฟอร์อนุกรมก่อน
- การแยกค่าจำนวนเต็ม (Integer Parsing): ใช้ฟังก์ชัน
parseInt()เพื่อดึงค่าจำนวนเต็มสามค่าออกมาแยกกันสำหรับ สีแดง, สีเขียว, และ สีน้ำเงิน - การป้องกันค่าผิดเพี้ยน (Constraint Protection): โค้ดใช้
constrain(value, 0, 255)เพื่อล็อกไม่ให้สัญญาณใดๆ เลยเถิดออกนอกช่วงที่ถูกต้องสำหรับ PWM (Pulse Width Modulation) ป้องกันไฟกระพริบแปลกๆ หรือข้อผิดพลาดทางลอจิก
วงจรตอบสนองแบบเห็นภาพ
เมื่อแยกค่าออกมาได้แล้ว ค่าเหล่านั้นจะถูกส่งไปยังพิน RGB ผ่านคำสั่ง analogWrite()
- การออกแบบแบบแคโทดร่วม (Common Cathode Design): ในวงจรนี้ ขายาวของ LED RGB จะต่อกับ GND ส่วนขาสีทั้งสามจะต่อผ่าน ตัวต้านทาน 330 โอห์ม เข้ากับพิน PWM ของ Arduino (พิน 9, 10, 11)
- การดีบั๊กผ่านพอร์ตอนุกรม (Serial Debugging): Arduino จะพิมพ์ค่าที่ได้รับกลับไปที่ Serial Monitor บนคอมด้วย ทำให้เราตรวจสอบได้ว่าการเชื่อมต่อบลูทูธส่งข้อมูลมาถูกต้องหรือเปล่า
#include <SoftwareSerial.h>
SoftwareSerial BT(0,1);
#define redPin 13
#define greenPin 12
#define bluePin 11
void setup()
{
//Serial setup
Serial.begin(9600);
BT.begin(9600);
pinMode(4, OUTPUT);
digitalWrite(4,HIGH);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
setColor(255, 0, 0);
delay(500);
setColor(0, 255, 0);
delay(500);
setColor(0, 0, 255);
delay(500);
setColor(255, 255, 255);
}
void loop()
{
while (BT.available() > 0)
{
int redInt = BLU.parseInt();
int greenInt = BLU.parseInt();
int blueInt = BLU.parseInt();
redInt = constrain(redInt, 0, 255);
greenInt = constrain(greenInt, 0, 255);
blueInt = constrain(blueInt, 0, 255);
if (BT.available() > 0)
{
setColor(redInt, greenInt, blueInt);
Serial.print("Red: ");
Serial.print(redInt);
Serial.print(" Green: ");
Serial.print(greenInt);
Serial.print(" Blue: ");
Serial.print(blueInt);
Serial.println();
BT.flush();
}
}
}
void setColor(int red, int green, int blue)
{
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}