สำหรับโพสต์นี้ แล้วจะมาดูเรื่อง การใช้ Hardware serial ของ esp32 กันนะครับ ผมจะอ้างข้อมูลจากโพสของ @Remy_Martin กันนะครับ
UART | RX IO | TX IO | CTS | RTS |
---|---|---|---|---|
UART0 | GPIO3 | GPIO1 | N/A | N/A |
UART1 | GPIO9 | GPIO10 | GPIO6 | GPIO11 |
UART2 | GPIO16 | GPIO17 | GPIO8 | GPIO7 |
จากตารางนี้เราจะเห็นว่า esp32 จะมี uart จำนวนทั้งหมด 3 ชุดด้วยกันซึ่งแต่ละชุดจะถูกกำหนดค่าเอาไว้แล้วดังแสดงในตาราง โดยในที่นี้ผมจะสนใจเฉพาะขา RX และ TX เท่านั้นครับ
โดยตารางชุดนี้จะมาจาก ไฟล์ที่ชื่อว่า Hardware Serial.ccp โดยจะสามารถหาได้ในตำแหน่งนี้ C:\Users\ชื่อเครื่องคอมพิวเตอร์ของเรา\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\cores\esp32\HardwareSerial.cpp
if(_uart_nr == 0 && rxPin < 0 && txPin < 0) {
rxPin = 3;
txPin = 1;
}
if(_uart_nr == 1 && rxPin < 0 && txPin < 0) {
rxPin = RX1;
txPin = TX1;
}
if(_uart_nr == 2 && rxPin < 0 && txPin < 0) {
rxPin = RX2;
txPin = TX2;
}
โดยชุด code ในไฟล์นี้เราสามารถเปลี่ยนตำแหน่งขาให้เป็นขาอื่นๆตามที่เราต้องการได้ยกตัวอย่างเช่น
if(_uart_nr == 0 && rxPin < 0 && txPin < 0) {
rxPin = 16;
txPin = 17;
}
if(_uart_nr == 1 && rxPin < 0 && txPin < 0) {
rxPin = 13;
txPin = 15;
}
if(_uart_nr == 2 && rxPin < 0 && txPin < 0) {
rxPin = 12;
txPin = 14;
}
จากนั้นก็ทำการบันทึกไฟล์ และมากำหนดค่า Pin ในโค้ดของเราอีกที
#include <PZEM004Tv30.h>
#include <HardwareSerial.h>
//--- Phase A
#define RX2 14
#define TX2 12
PZEM004Tv30 pzem_A(&Serial2);
//-----------------------------------
//--- Phase B
#define RX1 13
#define TX1 15
PZEM004Tv30 pzem_B(&Serial1);
//-----------------------------------
//--- Phase C
PZEM004Tv30 pzem_C(&Serial);
void setup()
{
Serial2.begin(9600, SERIAL_8N1, RX2, TX2);
Serial1.begin(9600, SERIAL_8N1, RX1, TX1);
Serial.begin(9600, SERIAL_8N1);
}
สังเกตนะครับว่า Serial ที่เราใช้ไป เราใช้ไปหมดแล้วเพราะฉะนั้น Serial Monitor ที่ใช้ในการ Monitor ของ arduino ide ก็จะไม่สามารถใช้งานได้อีก
ยังไงลองนำไปประยุกต์ใช้งานดูครับ