สอนใช้งาน UART Serial บน ESP32 เชื่อมต่อ ESP32 สองตัวแบบ Master-Slave เพื่อส่งคำสั่งควบคุมหรืออ่านค่ากลับมา เหมาะกับงาน Smart Farm และระบบ Local ที่ไม่พึ่ง WiFi

ESP32 UART Serial เชื่อมต่อบอร์ด 2 ตัว ส่งข้อมูลแบบ Local ไม่ต้องใช้ WiFi

เชื่อม ESP32 สองตัวด้วย UART Serial – ระบบ Local แบบง่ายไม่พึ่ง WiFi

รู้จัก UART: ช่องทางส่งข้อมูลที่เร็ว ง่าย ไม่ต้องตั้งค่า WiFi

ถ้าใครกำลังทำระบบ Smart Farm หรือควบคุมอุปกรณ์หลายจุด แล้วไม่อยากวุ่นกับระบบเน็ตเวิร์กหรือ WiFi แนะนำให้ลองใช้ UART Serial บน ESP32 ครับ

ESP32 รองรับ UART สูงสุด 3 ช่อง ใช้เชื่อมต่อระหว่าง ESP32 หลายตัวได้ เหมาะกับระบบ Master–Slave เช่น:

  • Master ส่งคำสั่งเปิด/ปิดไปยัง Slave
  • Slave อ่านค่าจากเซ็นเซอร์ แล้วส่งข้อมูลกลับไปให้ Master

“ก่อนจะลงมือเขียนโค้ด แนะนำให้อ่าน ESP32 Pinout เพื่อเลือกพินให้ถูกต้อง”
“เมื่อรู้พินแล้ว มาลอง อ่าน/เขียน Digital IO กันต่อ”

การต่อสาย ESP32 ↔ ESP32

การเชื่อมต่อทำง่ายมาก แค่ต่อสายดังนี้:

MasterSlave
TXRX
RXTX
GNDGND

🧠 แนะนำ: ใช้ Serial2 เพื่อแยกออกจาก UART0 ที่ใช้กับ Serial Monitor

โค้ดตัวอย่างฝั่ง Slave: รับคำสั่งจาก Master แล้วควบคุม LED

/* 
 *  Deva DIY 
 *  โค๊ดโปรแกรม Slave สื่อสารข้อมูลผ่าน Serial UART
 *  รับข้อมูลคำสั่ง เปิด ปิด LED ทาง UART จาก ESP32 Master และส่งข้อมูลสถานะ LED กลับไป
 */

 //กำหนดขา Pins ESP32
const int led_pins = 23;

//ตัวแปรเก็บค่า ON-OFF LED 
String State_led = "OFF";

void setup() {
  Serial.begin(115200);
  Serial2.begin(115200);
  
  pinMode(led_pins, OUTPUT);
  digitalWrite(led_pins, LOW);
}

void loop() {
  
  // รับข้อมูลจาก Master ESP32 คำสั่ง เปิด ปิด LED
  static bool flagReady = false;
  String Buf = "";
  while (Serial2.available() > 0) {
    char Recv = (char)Serial2.read();  
    Buf += Recv;                  
    if (Recv == '\n') {
      Buf.trim();
      State_led = Buf;
      flagReady = true;
      //Serial.print("State_led = ");
      //Serial.println(State_led);
    }
  }

  // เปิด-ปิด LED จากคำสั่งที่ได้รับจาก ESP32 Master และ ส่งค่าสถานะ LED ปัจจุบันกลับไป Master
    if(flagReady){
      if(State_led == "ON"){
      digitalWrite(led_pins, HIGH);
      Serial2.println("ON");
      flagReady = false; 
      }
      else if(State_led == "OFF"){
        digitalWrite(led_pins, LOW);
        Serial2.println("OFF");
        flagReady = false;
        }  
      }
}

โค้ดตัวอย่างฝั่ง Master: ส่งคำสั่งและรอรับสถานะ

/* 
 *  Deva DIY 
 *  โค๊ดโปรแกรม Master สื่อสารข้อมูลผ่าน Serial UART
 *  ส่งข้อมูลคำสั่ง เปิด ปิด LED ทาง UART ไปที่ ESP32 Slave และรับข้อมูลสถานะ LED
 */

//กำหนดขา Pins ESP32
const int touch_pins = 15;

//ตัวแปรสำหรับเก็บค่า Touch 
int touch_Value;

//ตัวแปรเก็บค่า ON-OFF LED จาก Slave ESP32
String State_led = "OFF";

void setup() {
  Serial.begin(115200);
  Serial2.begin(115200);
}

void loop() {

// อ่านสถานะของค่า Touch pins:
  touch_Value = touchRead(touch_pins);
  //Serial.print("touch_Value = ");
  //Serial.println(touch_Value);
  
// ถ้ากดสวิตช์สัมผัสค่า touch_Value < 20 และค้างไว้ 1 วินาที
// ให้ส่งข้อมูล transmitter ไป Slave ESP32 เพื่อเปิด-ปิด LED
  
  static bool touch_change = false;
  static bool touch_state = false;
  static bool hold_state = false;
  const long debounceDelay = 1000;
  static unsigned long lastDebounceTime;

  if(touch_Value < 20){    
      if (touch_change == false) {
        touch_change = true;
        lastDebounceTime = millis();
      }
      else if ((millis() - lastDebounceTime >= debounceDelay) && (!hold_state)) {;
        touch_state = true;
        hold_state = true;
        //Serial.print("touch_state = ");
        //Serial.println(touch_state);
      }
      else {
        touch_state = false;
      } 
    }
    else if (touch_Value > 20) {
      touch_change = false;
      hold_state = false;
      touch_state = false;
    }
    
  if(touch_state){
    if(State_led == "ON"){
    Serial2.println("OFF");
    Serial.println(" OFF LED to Slave ");
    }
    else if (State_led == "OFF"){
      Serial2.println("ON");
      Serial.println(" ON LED to Slave ");
      } 
  }
  

// รับข้อมูลจาก Slave ESP32 สถานะเปิดปิด LED
  String Buf = "";
  while (Serial2.available() > 0) {
    char Recv = (char)Serial2.read();  
    Buf += Recv;                  
    if (Recv == '\n') {
      Buf.trim();
      State_led = Buf;
      //Serial.print("State_led = ");
      //Serial.println(State_led);
    }
  }  
}

ข้อดีของ UART Serial สำหรับ Smart Farm

  • ✅ ใช้งานแบบ Local ได้เลย ไม่ต้องเชื่อม WiFi

  • ✅ สั่งเปิด/ปิดอุปกรณ์ และอ่านค่ากลับได้

  • ✅ เสถียร ไม่หลุดง่ายเหมือน WiFi

  • ✅ ใช้งานกับรีเลย์ เซ็นเซอร์ และ Node ต่าง ๆ ได้

กรุณา เข้าสู่ระบบ เพื่อดาวน์โหลด

💬 FAQ

Q: UART คืออะไรใน ESP32?

A: UART (Universal Asynchronous Receiver/Transmitter) คือช่องทางสื่อสารแบบอนุกรม ใช้สายแค่ 2 เส้น (TX, RX) ส่งข้อมูลระหว่าง ESP32 กับอุปกรณ์อื่น เช่น ESP32 อีกตัว, เซ็นเซอร์, หรือ PLC

Q: ESP32 มี UART กี่ช่อง?A: มีทั้งหมด 3 ช่อง: UART0, UART1, UART2
  • UART0 ใช้กับ Serial Monitor (โปรแกรม / Debug)
  • UART1 / UART2 ใช้สื่อสารกับอุปกรณ์อื่นได้ (เลือกขา GPIO เองได้)

Q: ต้องใช้สายอะไรเชื่อม ESP32 2 ตัว?

A: ใช้สาย TX ↔ RX และ GND ร่วมกัน หรือใช้ USB ต่อทั้งคู่กับคอมพิวเตอร์ก็ได้

Q: จะรู้ได้ไงว่า Master กับ Slave เชื่อมกันสำเร็จ?

A: ทดสอบส่งข้อความจาก Master ไป Slave แล้วให้ Slave ตอบกลับ ถ้า Serial Monitor ของ Master แสดงค่าที่ส่งกลับมา แสดงว่าเชื่อมสำเร็จ

Q: ทำไมข้อมูลส่งมาไม่ครบ หรือกลายเป็นอักขระเพี้ยน?

A: อาจเกิดจาก Baud Rate ไม่ตรงกัน หรือใช้พิน TX/RX ซ้ำกับฟังก์ชันอื่น ให้ตรวจสอบว่า:

  • Serial2.begin(baud) ของทั้งสองฝั่งตั้งค่าเหมือนกัน
  • ใช้พินที่รองรับ UART จริง

Q: ใช้ ESP32 UART ควบคุมรีเลย์ หรือเซ็นเซอร์ได้ไหม?

A: ได้ครับ นิยมมากในระบบ Smart Farm เช่น:

  • Master ควบคุมการเปิด/ปิดรีเลย์ของ Slave

  • Slave ส่งค่าจากเซ็นเซอร์กลับมาให้ Master ประมวลผล

Q: จะขยายระบบเป็น 1 ต่อหลาย (1 Master คุมหลาย Slave) ได้ไหม?

A: ได้โดยใช้ UART ร่วมกับ Multiplexer, RS485 หรือเปลี่ยนเป็นระบบ Protocol เช่น Modbus หรือ I2C ก็ได้ แต่ต้องออกแบบให้ดีขึ้น

Shopping Cart
Scroll to Top