การส่งและรับค่าเซนเซอร์ HCSR04 ผ่าน rx tx ด้วย ESP32

ใข้เซนเซอร์ HCSR04 4 ตัวในการวัดระยะแล้วส่งค่าระยะทางที่วัดได้ให้กับบอร์ด ESP32 อีกตัวนึงเพื่อทำการควบคุมล้อเพื่อหลบสิ่งกีดขวาง แต่ตอนนี้ทดสอบและ Serial Monitor ดูที่วัดได้จากเซนเซอร์ในบอร์ดส่ง ค่าออกมาปกติและตรง แต่พอกดดูในบอร์ดตัวรับ ค่าเซนเซอร์ออกมาไม่ตรงแล้วก็ไม่ Real TIme ค่ะ เลยทำให้การบังคับหลบสิ่งกีดขวางมันช้า อยากจะขอคำแนะนำหน่อยค่ะว่าควรทำอย่างไร ควรเปลี่ยนบอร์ดมั้ย ( ได้ลองปรับ Baud Rate แล้วก็ Upload Speed แล้ว ค่ายังออกมาเพี้ยนและไม่ Real Time ค่ะ) ขอบคุณล่วงหน้าค่ะะ

โค้ดตัวส่ง

#include <HardwareSerial.h>

//HardwareSerial Serial2(2);             //Needed since this is an ESP32

int ultra_val1 = 123; //รหัส อ่าน
int _ultra_val1; // ค่าที่อ่านได้
int ultra_val2 = 223; //รหัส อ่าน
int _ultra_val2; // ค่าที่อ่านได้
int ultra_val3 = 245; //รหัส อ่าน
int _ultra_val3; // ค่าที่อ่านได้
int ultra_val4 = 255; //รหัส อ่าน
int _ultra_val4; // ค่าที่อ่านได้

#define echoPin1 33 // Echo Pin
#define trigPin1 32 // Trigger Pin
#define echoPin2 12// Echo Pin
#define trigPin2 13 // Trigger Pin
#define echoPin3 26 // Echo Pin
#define trigPin3 27 // Trigger Pin
#define echoPin4 22 // Echo Pin
#define trigPin4 23 // Trigger Pin

bool Read_ultra_val1 = false;
bool Read_ultra_val2 = false;
bool Read_ultra_val3 = false;
bool Read_ultra_val4 = false;

void setup() {

  Serial.begin(115200);
  Serial2.begin(921600, SERIAL_8N1, 16, 17);
  pinMode(trigPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(trigPin3, OUTPUT);
  pinMode(echoPin3, INPUT);
  pinMode(trigPin4, OUTPUT);
  pinMode(echoPin4, INPUT);

}

void loop() {  

  //Ultrasonic NO1
  digitalWrite(trigPin1, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin1, LOW);
  const unsigned long duration1 = pulseIn(echoPin1, HIGH);
  int distance1 = duration1 / 29 / 2;
  _ultra_val1 = (distance1);
    if(Read_ultra_val1 == false){
       Serial2.write(ultra_val1);
       Serial2.write(_ultra_val1);
       Serial.println("Send_ultra_val1");
       delay(100);
       Read_ultra_val1 = Serial2.read();
    }


  //Ultrasonic NO2
  digitalWrite(trigPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin2, LOW);
  const unsigned long duration2 = pulseIn(echoPin2, HIGH);
  int distance2 = duration2 / 29 / 2;
  _ultra_val2 = (distance2);
    if((Read_ultra_val2 == false) && (Read_ultra_val1 == true)){
       Serial2.write(ultra_val2);
       Serial2.write(_ultra_val2);
       Serial.println("Send_ultra_val2");
       delay(100);
       Read_ultra_val2 = Serial2.read();
    }

  //Ultrasonic NO3  
  digitalWrite(trigPin3, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin3, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin3, LOW);
  const unsigned long duration3 = pulseIn(echoPin3, HIGH);
  int distance3 = duration3 / 29 / 2;
  _ultra_val3 = (distance3);
    if((Read_ultra_val3 == false) && (Read_ultra_val2 == true)){
       Serial2.write(ultra_val3);
       Serial2.write(_ultra_val3);
       Serial.println("Send_ultra_val3");
       delay(100);
       Read_ultra_val3 = Serial2.read();
    }

   //Ultrasonic NO4  
  digitalWrite(trigPin4, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin4, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin4, LOW);
  const unsigned long duration4 = pulseIn(echoPin4, HIGH);
  int distance4 = duration4 / 29 / 2;
  _ultra_val4 = (distance4);
    if((Read_ultra_val4 == false) && (Read_ultra_val3 == true)){
       Serial2.write(ultra_val4);
       Serial2.write(_ultra_val4);
       Serial.println("Send_ultra_val4");
       delay(100);
       Read_ultra_val4 = Serial2.read();
    }

       Read_ultra_val1 = false;
       Read_ultra_val2 = false;
       Read_ultra_val3 = false;
       Read_ultra_val4 = false;

 Serial.println(String("ค่าจากเซ็นเซอร์ตัวที่ 1 :") + _ultra_val1);
 Serial.println(String("ค่าจากเซ็นเซอร์ตัวที่ 2 :") + _ultra_val2);
 Serial.println(String("ค่าจากเซ็นเซอร์ตัวที่ 3 :") + _ultra_val3);
 Serial.println(String("ค่าจากเซ็นเซอร์ตัวที่ 4 :") + _ultra_val4);
 delay(500);
       
}

โค้ดตัวรับ

#include <HardwareSerial.h>

int Get_data_esp2;

bool Read_ultra_val1 = false;
bool Read_ultra_val2 = false;
bool Read_ultra_val3 = false;
bool Read_ultra_val4 = false;

int _ultra_val1; // ค่าที่อ่านได้
int _ultra_val2; // ค่าที่อ่านได้
int _ultra_val3; // ค่าที่อ่านได้
int _ultra_val4; // ค่าที่อ่านได้

void setup() {

  // initialize serial:

  Serial.begin(115200);
  Serial2.begin(921600,SERIAL_8N1, 16, 17);

}

void loop() {

Get_data_esp2 = Serial2.read();

Serial.println(String("กำลังอ่านข้อมูล => ") + Get_data_esp2);

  if (Get_data_esp2 == 123){
  _ultra_val1 = Serial2.read();
  Serial.println("อ่านเซ็นเซอร์ตัวที่3 Temp");
  Read_ultra_val1 = true;
  Serial2.write(Read_ultra_val1);
  delay(100);
 }

  if (Get_data_esp2 == 223){
  _ultra_val2 = Serial2.read();
  Serial.println("อ่านเซ็นเซอร์ตัวที่3 Humidity");
  Read_ultra_val2 = true;
  Serial2.write(Read_ultra_val2);
  delay(100);
 }

 if (Get_data_esp2 == 245){
  _ultra_val3 = Serial2.read();
  Serial.println("อ่านจากเซ็นเซอร์ตัวที่4 Temp");
  Read_ultra_val3 = true;
  Serial2.write(Read_ultra_val3);
  delay(100);
 }

if (Get_data_esp2 == 255){
  _ultra_val4 = Serial2.read();
  Serial.println("อ่านเซ็นเซอร์ตัวที่4 Humidity");
  Read_ultra_val4 = true;
  Serial2.write(Read_ultra_val4);
  delay(100);
 }

 Serial.println(String("ค่าจากเซ็นเซอร์ตัวที่1 :") + _ultra_val1);
 Serial.println(String("ค่าจากเซ็นเซอร์ตัวที่2 :") + _ultra_val2);
 Serial.println(String("ค่าจากเซ็นเซอร์ตัวที่3 :") + _ultra_val3);
 Serial.println(String("ค่าจากเซ็นเซอร์ตัวที่4 :") + _ultra_val4);
 delay(500);
}

อ้างอิงโค้ดจากกระทู้นี้
[> ส่วนอ้างถึง](https://eleceasy.com/t/rx-tx-esp32/3050)

เบื้องต้นความเร็วสูงสุดที่ใช้ได้คือ 345600 ครับ ลองเปลี่ยนดู

Serial2.begin(345600, SERIAL_8N1, 16, 17); //กำหนด Port สำหรับส่งค่าไปที่ บอร์ดที่ 1

อีกประเด็นคือผมยังมองภาพไม่ออกนะครับ ลองถ่ายภาพมาดูหน่อยว่าต่อยังไง ทำไมต้องใช้ถึง 2 บอร์ด ใช้บอร์ดเดียวได้ไหม