ก่อนอื่นต้องขอสวัสดี FC ทุก ๆ ท่านนะครับ ขออภัยที่ห่างหายการเขียนบทความไปร่วมเดือน พอดีผมติดงาน “หาเงินซื้อกล้องเอาไว้ทำวีดีโอสอนทุกท่านนั้นแหละครับ ….ใกล้เเล้วนะ อดใจรอหน่อย” เอาหล่ะเข้าเรื่องเลยล่ะกัน หลังจากที่มีคนขอเข้ามาเยอะ ก็เลยจัดให้ตามคำขู่ เอ้ย!! คำเรียกร้องครับ และแน่นอนในบทความชุด Arduino Tips & Tricks นี้ก็จะเป็นบทความสั้น ๆ กระชับ เน้นเนื้อ ๆ ไม่อ้อมไปกินฝักกินน้ำกันเหมือนเดิม โดยใน EP นี้จะเป็นการแนะนำโค๊ดโปรแกรมสำหรับการส่งข้อมูลระหว่างบอร์ด Arduino กับบอร์ด Arduino และสามารถนำไปใช้งานส่งขอมูลระหว่างบอร์ด Arduino กับบอร์ด NodeMCU ได้อีกด้วย ผ่านทาง Libraries ที่มีชื่อว่า SoftwareSerial เอาหล่ะเอาไปไล่กันตั้งแต่ง่ายๆ จนถึงยากกันเลยล่ะกันนะครับ
วิธีเชื่อมต่ออุปกรณ์
Arduino | NodeMCU | |
10 | >> | D2 |
11 | >> | D3 |
GND | >> | GND |
หลักการทำงาน
การส่งค่าก็เหมือนการแสดงผลออกทาง Serial ทั่วไป โดยใช้คำสั่ง print แต่พอเรา print เสร็จจะต้องส่ง "\n" ไปด้วย เพราะเราจะใช้ "\n" นี้เพื่อให้โปรแกรมฝั่งรับได้รู้ว่าจบชุดข้อความแล้วนะ ส่วนฝั่งรับค่าจะทำการตวจสอบค่าที่รับมาว่ามีค่าหรือไม่ ด้วยคำสั่ง available() > 0 ถ้ามีก็จะทำการวนรับค่าทีล่ะตัวอักษรไปเรื่อยๆ จากนั้นจะทำการตรวจสอบทุก ๆ ครังว่าเจอ "\n" หรือไม่ ถ้าเจอก็แสดงว่าจบข้อความ 1 ชุด ก็จะทำารแสดงผลออกไป จากนั้นก็เคลียร์ค่าในตัวแปรเพื่อวนรับค่าใหม่ (ในการนำไปใช้งานจริงไม่จำเป็นต้องใช้ "\n" ก็ได้นะ ใช้ "_" ก็ได้ แล้วแต่จะดีไซน์)
โค๊ดโปรแกรม (Arduino)
/*
* Coding By : Arduinos Pro www.arduinospro.com
* Sample Coding : Converting : Arduino Serial to Arduino;
*/
#include <SoftwareSerial.h>
int Rx_Pin = 11; // กำหนดขา 11 เป็นขารับข้อมูล
int Tx_Pin = 10; // กำหนดขา 10 เป็นขารส่งข้อมูล
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() {
NodeSerial.print("Hi NodeMCU"); // ส่งค่า "Hi Arduino" ออกไปยัง ArduinoSerial
NodeSerial.print("\n"); // ส่งค่า "\n" ออกไปยัง ArduinoSerial เพื่อขึ้นบรรทัดใหม่
delay(100); // หน่วงเวลา 100 Millisecond
while (NodeSerial.available() > 0){ // วนลูปหากมีค่าส่งเข้ามาใน NodeSerial
char recieved = NodeSerial.read(); // สร้างตัวแปรชื่อ recieved เป็นชนิด char เพื่อรับข้อมูลจาก NodeSerial
dataIn += recieved; // นำค่าที่ได้จาก recieved มารวมใว้ใวตัวแปร dataIn
if (recieved == '\n') { // หากค่าที่รับได้เป็น '\n'
Serial.println("Serial : In >>>>>>>>>>>>>>>>"); // แสดงผล "Serial : In >>>>>>>>>>>>>>>>" ออกทาง Serial
Serial.print(String("NodeSerial Received: ") + dataIn); // แสดงค่าใน dataIn ออกทาง Serial
dataIn = ""; // กำหนดให้ dataIn ว่าง
}
}
}
โค๊ดโปรแกรม (NodeMCU)
/*
* Coding By : Arduinos Pro www.arduinospro.com
* Sample Coding : Converting : Arduino Serial to Arduino;
*/
#include <SoftwareSerial.h> // นำเข้าไรบลารี่ SoftwareSerial.h
int Rx_Pin = D2; // กำหนดขา D2 เป็นขารับข้อมูล
int Tx_Pin = D3; // กำหนดขา D3 เป็นขารส่งข้อมูล
SoftwareSerial ArduinoSerial(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
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'
Serial.println("Serial : In >>>>>>>>>>>>>>>>"); // แสดงผล "Serial : In >>>>>>>>>>>>>>>>" ออกทาง Serial
Serial.print(String("ArduinoSerial Received: ") + dataIn); // แสดงค่าใน dataIn ออกทาง Serial
dataIn = ""; // กำหนดให้ dataIn ว่าง
}
}
}
ผลการทดลอง
การทดลองบน Arduino
การทดลองบน NodeMCU
เอาหล่ะ!! พอมาถึงจุดนี้หลายคนก็จะเกิดคำถามว่า อ่าว! แล้วถ้าผมมีข้อมูลบน Sensor สัก 10 ชุดหล่ะพี่ และส่งไปพร้อมกันเลย แล้วเอาไปแยกที่ฝั่งรับได้ไหมพี่ เดี๋ยวผมจะเอาไปขึ้น IoT ต่อ ...... โอ้วว บอกไว้เลยว่าทำได้แน่นอนครับ โอเค ไปต่อที่ Arduino Tips & Tricks [EP3] ล่ะกันนะครับ