
Arduino Serial to Arduino Multi Value
จาก EP3 ที่ผ่านมาเราได้ศึกษาการ Sprint การตัดชุดอักขระ (String) กันไปแล้ว และใน EP นี้เราก็จะนำเอาการ Sprint มาใช้ในการตัดข้อความที่เราทำการรวมข้อมูลหลาย ๆ แหล่งมาเป็นชุดเดียว ที่ได้ทำการส่งผ่าน Serial ข้ามจาก Arduino มายัง NodeMCU
หลักการทำงาน
คอนเซ็ปจะเป็นอย่างนี้นะครับ เนื่องจากเรามีข้อมูลจาก Sensor หลายตัวและต่างชนิดกัน เราอยากให้ข้อมูลจากทุก ๆ Sensor ส่งมาพร้อม ๆ กัน ในเวลาเดียวกัน ไม่ใช่การส่งมาทีล่ะตัว โดยนำคำสั่ง Sprintf ในการนำข้อมูลจาก Sensor มาเรียงต่อกันและคั้นด้วยเครื่องหมา “/” เพื่อจะได้นำไป Sprint แยกในภายหลังเมื่อข้อมูลถูกส่งเสร็จสิ้นแล้ว โดยค่าจาก Sensor ที่เราจำลองมีดังนี้
int Sensor1 = 1234; จำลองขอ้มูลที่ได้จาก Sensor ตัวที่ 1 เป็นชนิด int
float Sensor2 = 3.14; จำลองขอ้มูลที่ได้จาก Sensor ตัวที่ 2 เป็นชนิด float
char Sensor3 = 'A'; จำลองขอ้มูลที่ได้จาก Sensor ตัวที่ 3 เป็นชนิด char
String Sensor4 = "Active"; จำลองขอ้มูลที่ได้จาก Sensor ตัวที่ 4 เป็นชนิด String ซึ่ง
พอเราใช้คำสั่ง Sprintf รวมข้อความเสร็จ ข้อความที่ได้จะมีหน้าตาแบบนี้
1234/3.14/A/ Active
จากนั้นเราก็จะใช้ Sprint ตัดด้วยเครื่องหมาย “/” ข้อความที่คาดว่าจะได้หลังตัดเสร็จก็จะได้แบบนี้
Sensor:1 = 1234
Sensor:2 = 3.14
Sensor:3 = A
Sensor:4 = Active
นี่คือคอนเซ็ปโดยรวมทั้งหมด เอาหล่ะครับ อาจจะยังไม่เห็นภาพ เราไปศึกษาจากโค๊ดโปรแกรมกันเลยดีกว่าครับ
โค๊ดโปรแกรม
โค๊ดโปรแกรมฝั่ง Arduino

/*
* Coding By : Arduinos Pro www.arduinospro.com
* Sample Coding : Converting : Arduino Serial to Arduino Multi Value;
*/
#include
int Rx_Pin = 11; // กำหนดขา 11 เป็นขารับข้อมูล
int Tx_Pin = 10; // กำหนดขา 10 เป็นขารส่งข้อมูล
int Sensor1 = 1234; // จำลองขอ้มูลที่ได้จาก Sensor ตัวที่ 1 เป็นชนิด int
float Sensor2 = 3.14; // จำลองขอ้มูลที่ได้จาก Sensor ตัวที่ 2 เป็นชนิด float
char Sensor3 = 'A'; // จำลองขอ้มูลที่ได้จาก Sensor ตัวที่ 3 เป็นชนิด char
String Sensor4 = "Active"; // จำลองขอ้มูลที่ได้จาก Sensor ตัวที่ 4 เป็นชนิด String
SoftwareSerial NodeSerial(Rx_Pin, Tx_Pin); // กำหนดขารับส่งข้อมูล RX, TX
String dataIn; // ตัวแปรสำหรับเก็บข้อมูลบที่ได้รับ
void setup() {
pinMode(Rx_Pin, INPUT); // กำหนดขา Rx_Pin เป็น INPUT
pinMode(Tx_Pin, OUTPUT); // กำหนดขา Tx_Pin เป็น OUTPUT
Serial.begin(9600); // กำหนด baud rate ของ Serial เป็น 9600
NodeSerial.begin(115200); // กำหนด baud rate ของ NodeSerial เป็น 115200
}
void loop() {
char str[20]; //สร้างตัวแปร str ชนิด char แบบอาเรย์สำหรับเก็บค่าชุดตัวอักษรที่จะส่ง
// จัดเรียงข้อมูลจาก Sensor เป็นชุดเดียวโดยใช้ใช้คำสั่ง sprintf
sprintf(str, "%d/%d.%02d/%c/%s", Sensor1, (int)Sensor2, (int)(Sensor2*100)%100, Sensor3, Sensor4.c_str());
Serial.println(str); // แสดงค่าที่จัดเก็บออกไปยัง Serial Monitor
NodeSerial.print(str); // ส่งค่าใน str ออกไปยัง ArduinoSerial
NodeSerial.print("\n"); // ส่งค่า "\n" ออกไปยัง ArduinoSerial เพื่อขึ้นบรรทัดใหม่
delay(1000); // หน่วงเวลา 100 Millisecond
}

โค๊ดโปรแกรมฝั่ง NodeMCU

/*
* Coding By : Arduinos Pro www.arduinospro.com
* Sample Coding : Converting : Arduino Serial to Arduino Multi Value;
*/
#include
int Rx_Pin = D2; // กำหนดขา D2 เป็นขารับข้อมูล
int Tx_Pin = D3; // กำหนดขา D3 เป็นขารส่งข้อมูล
SoftwareSerial ArduinoSerial(Rx_Pin, Tx_Pin); // กำหนดขารับส่งข้อมูล RX, TX
String dataIn; // ตัวแปรสำหรับเก็บข้อมูลบที่ได้รับ
void splint_string(char sz[]){ // สร้างฟังชันต์ชื่อ splint_string กำหนดตัวแปรนำเข้าชื่อ sz ชนิด char แบบอาเรย์
char *p = sz; // สร้างตัวแปรชื่อ p ชนิด Pointer มีค่าเท่ากับ sz
char *str; // สร้างตัวแปรชื่อ str ชนิด Pointer
int counter = 0; // สร้างตัวแปรชื่อ counter ชนิด int สำหรับทำการนับครั้งที่ตัด
while ((str = strtok_r(p, "/", &p)) != NULL){ // วนทำลูป while ซ้ำ โดยเรียกฟังชันต์ strtok_r() โดยทำการตัดค่าใน p เมื่อเจอเครื่องหมาย','
counter++;
Serial.print(String("Sensor:") + counter + String(" = ")); // แสดงผลจำนวนครั้งที่ตัด
Serial.println(str); // แสดงผลค่าที่ตัดได้
}
counter = 0; // เคลียร์ค่าใน counter เป็น 0
}
void setup() {
pinMode(Rx_Pin, INPUT); // กำหนดขา Rx_Pin เป็น INPUT
pinMode(Tx_Pin, OUTPUT); // กำหนดขา Tx_Pin เป็น OUTPUT
Serial.begin(9600); // กำหนด baud rate ของ Serial เป็น 9600
ArduinoSerial.begin(115200); // กำหนด baud rate ของ ArduinoSerial เป็น 115200
}
void loop() {
ArduinoSerial.print("Hi Arduino"); // ส่งค่า "Hi Arduino" ออกไปยัง ArduinoSerial
ArduinoSerial.print("\n"); // ส่งค่า "\n" ออกไปยัง ArduinoSerial เพื่อขึ้นบรรทัดใหม่
delay(100); // หน่วงเวลา 100 Millisecond
while (ArduinoSerial.available() > 0){ // วนลูปหากมีค่าส่งเข้ามาใน ArduinoSerial
char recieved = ArduinoSerial.read(); // สร้างตัวแปรชื่อ recieved เป็นชนิด char เพื่อรับข้อมูลจาก ArduinoSerial
dataIn += recieved; // นำค่าที่ได้จาก recieved มารวมใว้ใวตัวแปร dataIn
if (recieved == '\n') { // หากค่าที่รับได้เป็น '\n'
char charBuf[100];
dataIn.toCharArray(charBuf, 100); // คัดลอกอักขระของชุดอักขระไปยังตัวแปร charBuf
splint_string(charBuf); // เรียกใช้งานฟังชั่น Splint String
dataIn = ""; // กำหนดให้ dataIn ว่าง
}
}
}

Arduino.MakerZone