การควบคุมและส่งข้อมูลผ่าน WiFi ด้วย Arduino และ ESP-01

บทนำและแนวคิดของโปรเจกต์ (The Concept)
ในโลกของ IoT (Internet of Things) การควบคุมอุปกรณ์แบบไร้สายมักมีต้นทุนสูงและมีความซับซ้อน โปรเจกต์นี้มีเป้าหมายที่จะสร้างชุดควบคุมที่ทำงานผ่านเครือข่าย WiFi โดยเน้นที่ความประหยัดและประสิทธิภาพสูงสุด ผลลัพธ์ที่ได้คือระบบที่สามารถควบคุมเอาต์พุตได้สูงสุด 10 ช่อง (On/Off) และอ่านค่า analog input จากเซ็นเซอร์ได้สูงสุด 8 ช่อง เพื่อเฝ้าระวังสภาพแวดล้อมต่างๆ ในพื้นที่แบบ real-time
หัวใจหลักของโปรเจกต์นี้คือโมดูล ESP-01 WiFi จาก Espressif Systems ซึ่งถือเป็นโมดูลเสริมสำหรับ Arduino ที่ราคาถูกที่สุดในตลาด (ประมาณ 60-70 บาท) แม้จะมีขนาดเล็ก แต่ก็มีความสามารถในการเชื่อมต่ออินเทอร์เน็ตที่แข็งแกร่ง
สำหรับการใช้งานเชิงลึก คุณสามารถอ้างอิงคู่มือการเขียนโปรแกรม (AT Instruction Set) ได้จากเว็บไซต์ของ Espressif ในชื่อ 4a-esp8266_at_instruction_set_en.pdf ซึ่งครอบคลุมคำสั่งการใช้งานโมดูลในโหมด Modem (AT Mode) ดังที่เราใช้ในโปรเจกต์นี้
บอร์ดควบคุมหลักที่เราใช้คือ Arduino UNO R3 เนื่องจากมีพอร์ตเชื่อมต่อที่ครอบคลุมและใช้งานง่ายสำหรับผู้เริ่มต้น อย่างไรก็ตาม โปรเจกต์นี้ได้รับการออกแบบมาให้มีความยืดหยุ่นเพียงพอที่จะปรับใช้กับบอร์ดตระกูล Arduino อื่นๆ เช่น Nano หรือ Mega ได้
ความท้าทายทางเทคนิค: เนื่องจาก Arduino UNO มีพอร์ต Hardware Serial เพียงพอร์ตเดียว (ซึ่งถูกใช้โดย USB สำหรับการเขียนโปรแกรมและการดีบัก) เราจึงไม่สามารถเชื่อมต่อ ESP-01 เข้ากับพอร์ตนั้นได้โดยตรง เพราะจะทำให้เกิดการชนกันของข้อมูล ดังนั้น เราจึงเลือกใช้ไลบรารี SoftwareSerial.h เพื่อจำลอง Digital pins 2 และ 3 ให้เป็น Serial Port ทางเลือกสำหรับการสื่อสารกับโมดูล WiFi
โครงสร้างฮาร์ดแวร์และการประกอบ (The Hardware)
เพื่อให้แน่ใจว่าการเชื่อมต่อระหว่าง Arduino UNO และ ESP-01 มีความแข็งแรงและถอดออกได้ง่าย ผมได้สร้าง "Bracket" หรือฐานยึดพิเศษโดยใช้ Stripboard และ Pin Headers ที่เสียบเข้ากับบอร์ด Arduino ได้โดยตรงเพื่อดึงไฟ 3.3V และ GND

เนื่องจากโมดูล ESP-01 มี 8 ขาเรียงกันสองแถว ผมจึงใช้ Socket สองแถวบัดกรีลงบน Stripboard โดยให้ด้านทองแดงหงายขึ้นเพื่อความสะดวกในการเชื่อมต่อสายไฟระหว่าง Socket กับขาที่จะเสียบเข้ากับบอร์ด Arduino

นอกจากนี้ ผมยังใช้ลวดทองแดงหนาๆ ดัดเป็นโครงรองรับและเคลือบด้วย Epoxy Resin เพื่อช่วยเสริมความแข็งแรงของโครงสร้าง ทำให้ทนทานต่อการเสียบและถอดซ้ำๆ และป้องกันความเสียหายของขา Signal
การเชื่อมต่อวงจร (Pin Mapping):

- ESP-01 Pin 1 (GND): เชื่อมต่อกับ GND ของ Arduino
- ESP-01 Pin 5 (VCC): เชื่อมต่อกับ ไฟ 3.3V เท่านั้น (ห้ามเชื่อมต่อ 5V เด็ดขาด)
- ESP-01 Pin 7 (CH_PD / EN): เชื่อมต่อกับ 3.3V เพื่อเปิดใช้งานชิป
- ESP-01 Pin 8 (TX): เชื่อมต่อกับ Digital Port 2 (SoftwareSerial RX)
- ESP-01 Pin 4 (RX): เชื่อมต่อกับ Digital Port 3 (SoftwareSerial TX)

ข้อควรระวังสำคัญ: โมดูล ESP-01 ทำงานที่แรงดัน 3.3V สำหรับทั้งแหล่งจ่ายไฟและสัญญาณ Logic การเชื่อมต่อโดยตรงกับ 5V อาจทำให้โมดูลเสียหายถาวร

สำหรับการทดสอบเอาต์พุต ผมใช้ LED ที่เชื่อมต่อผ่านตัวต้านทาน 1K Ohm ไปยังกราวด์ สิ่งนี้ช่วยให้เห็นภาพการทำงานเมื่อได้รับคำสั่งเปิด/ปิดผ่านเครือข่าย
การวิเคราะห์ซอฟต์แวร์และ Logic การทำงาน (The Software)
โปรแกรมนี้ออกแบบมาเพื่อเปลี่ยน ESP-01 ให้เป็น Access Point (AP) และ TCP Server โดยที่ Arduino จะส่ง AT Commands ไปยังโมดูลเพื่อตั้งค่าระบบเครือข่ายทั้งหมด
Logic การทำงานของโค้ด:
1. การเริ่มต้น (Setup): โปรแกรมจะเริ่มต้นด้วยการปิดการ Echo (`ATE0`), ตั้งค่าโหมดเป็น Access Point (`CWMODE=2`), กำหนด IP เป็น `192.168.5.1` และเปิด TCP Server บน Port 80
2. การตรวจสอบ Loop: Arduino จะตรวจสอบข้อมูลที่เข้ามาผ่าน Software Serial อย่างต่อเนื่อง หากได้รับข้อมูล ระบบจะส่งข้อมูลนั้นไปยังฟังก์ชัน `readFromWifi()` เพื่อแปลงเป็น String และทำให้เป็นตัวพิมพ์ใหญ่เพื่อการตรวจสอบที่ง่ายขึ้น
3. การแยกวิเคราะห์คำสั่ง (Command Parsing):
- HELLO: ตอบกลับด้วยสถานะการเชื่อมต่อ
- LEDON: เปิด LED บน pin 13 (Built-in LED)
- LEDOFF: ปิด Digital Outputs ทั้งหมด (pins 4-13)
- LEDONNxxxx: คำสั่งขั้นสูงที่ใช้ Bitwise Operation เพื่อควบคุมเอาต์พุต 10 ตัวพร้อมกัน โดยการส่งตัวเลข 4 หลักเพื่อแปลงเป็น Logic State สำหรับแต่ละ pin
4. การส่งข้อมูลตอบกลับ (Data Feedback): ทุกครั้งที่ออกคำสั่ง ระบบจะเรียกใช้ฟังก์ชัน `Sensor_Read()` เพื่ออ่านค่า Analog A0-A7 และส่งกลับไปยัง Client เพื่อยืนยันสถานะปัจจุบันของอุปกรณ์
// Important Code Snippets
#include <SoftwareSerial.h>
int serialRx = 2; // Software Serial RX
int serialTx = 3; // Software Serial TX
SoftwareSerial portOne(serialRx, serialTx);
void setup() {
portOne.begin(115200); // Initialize communication with ESP-01
delay(200);
sendToWifi("ATE0",100); // Disable command echo
sendToWifi("AT+CWMODE=2",10); // Set as Access Point
sendToWifi("AT+CIPAP_CUR=\"192.168.5.1\"",10); // Assign board IP
sendToWifi("AT+CIPSERVER=1,80",10); // Open Server Port 80
}
วิธีใช้งานกับ TCP Client
หลังจากอัปโหลดโค้ดไปยัง Arduino สำเร็จ คุณสามารถควบคุมบอร์ดได้โดยทำตามขั้นตอนเหล่านี้:
- เชื่อมต่อ WiFi: บนคอมพิวเตอร์หรือสมาร์ทโฟนของคุณ ค้นหาเครือข่าย WiFi ชื่อ "ESP8266" และป้อนรหัสผ่าน "1234567890"
- เปิดโปรแกรม TCP Client: คุณสามารถใช้โปรแกรมเช่น Realterm (บน PC) หรือแอป TCP Client (บน Android/iOS)
- กำหนดค่าการเชื่อมต่อ: ระบุ IP Address เป็น
192.168.5.1และ Port เป็น80 - ส่งคำสั่งควบคุม:

ตัวอย่างการตอบสนองของระบบ:

- เมื่อส่ง
HELLO: บอร์ดจะตอบกลับว่า "Wifi says : Hello" พร้อมสถานะของ 8 ช่อง Analog - เมื่อส่ง
LEDONN0001: บอร์ดจะเปิดไฟบน pin 4 และตอบกลับด้วยเลขไบนารีเพื่อยืนยันสถานะของ pins ทั้งหมด - Analog Reads 0-7: ข้อมูลจะถูกส่งกลับเสมอหลังจากทุกคำสั่ง โดยค่าของแต่ละ pin จะคั่นด้วยเครื่องหมายจุลภาค ทำให้โปรแกรมรับข้อมูลจัดการได้ง่าย