ESP8266 NodeMCU ติดต่อ Arduino แบบ Serial
เราสามารถใช้ NodeMCU ติดต่อกับ Arduino เพื่อสั่งงานให้ Arduino ทำงานให้ เช่น ขยายขาเพื่อควบคุม IO หรืออ่านค่า Analog ประมวลผลจาก Arduino เข้ามาให้กับ nodemcu โดยสามารถติดต่อได้หลายแบบเช่น I2C , SPI , Serial โดยในตัวอย่างนี้เป็นการติดต่อแบบ Serial ซึ่งใช้สายไฟเพียง 2 เส้น
ต่อขา ESP8266 Arduino ดังนี้
Arduino - NodeMCU
- VIN - VIN
- GND - GND
- 3 - D3
- 2 - D2

ตัวอย่าง : ต้องการให้ NodeMCU ส่งค่าไปให้ Arduino แล้วให้ Arduino แสดงค่าที่ได้รับเข้ามา
โคดส่วน NodeMCU
#include
#include
SoftwareSerial NodeSerial(D2, D3); // RX | TX
void setup() {
pinMode(D2, INPUT);
pinMode(D3, OUTPUT);
Serial.begin(115200);
NodeSerial.begin(4800);
}
void loop() {
NodeSerial.print(10);
NodeSerial.print("\n");
delay(100);
}
โคดส่วน Arduino
#include
SoftwareSerial ArduinoSerial(3, 2); // RX, TX
void setup() {
Serial.begin(115200);
ArduinoSerial.begin(4800);
}
void loop() {
while (ArduinoSerial.available() > 0) {
float val = ArduinoSerial.parseFloat();
if (ArduinoSerial.read() == '\n') {
Serial.println(val);
}
}
delay(100);
}
เมื่ออัพโคดเสร็จแล้วเปิด Serial Monitor ของ Arduino เพื่อดูว่า Arduino ได้รับค่าอะไรเข้ามา

ทำให้ NodeMCU สั่งงานให้ Arduino เปิดปิดไฟที่ขา 13
โคดฝั่ง NodeMCU
#include
#include
//Code By ArduinoALL
SoftwareSerial NodeSerial(D2, D3); // RX | TX
void setup() {
pinMode(D2, INPUT);
pinMode(D3, OUTPUT);
Serial.begin(115200);
NodeSerial.begin(4800);
}
void loop() {
NodeSerial.print(10);
NodeSerial.print("\n");
delay(1000);
NodeSerial.print(11);
NodeSerial.print("\n");
delay(1000);
}
โคดฝั่ง Arduino
#include
//Code By ArduinoALL
SoftwareSerial ArduinoSerial(3, 2); // RX, TX
void setup() {
Serial.begin(115200);
ArduinoSerial.begin(4800);
pinMode(13, OUTPUT);
}
void loop() {
while (ArduinoSerial.available() > 0) {
float val = ArduinoSerial.parseFloat();
if (ArduinoSerial.read() == '\n') {
if (val == 10) {
digitalWrite(13, 1);
} else if (val == 11) {
digitalWrite(13, 0);
}
Serial.println(val);
}
}
delay(100);
}
เมื่ออัพโหลดโคดเสร็จทั้ง 2 บอร์ด จะเห็นไฟขา 13 กระพริบทุก ๆ 1 วินาที
ทำเป็นฟังก์ชันให้เรียกใช้งานง่าย ๆ
โคดฝั่ง NodeMCU
#include
#include
//Code By ArduinoALL
SoftwareSerial NodeSerial(D2, D3); // RX | TX
void setup() {
pinMode(D2, INPUT);
pinMode(D3, OUTPUT);
Serial.begin(115200);
NodeSerial.begin(4800);
}
void loop() {
ArduinoOnPin(13);
delay(1000);
ArduinoOffPin(13);
delay(1000);
}
void ArduinoOnPin(int pin) {
if (pin == 13) {
NodeSerial.print(0x113); // 1-13 แปลว่า เปิด-ขา 13
NodeSerial.print("\n");
}
}
void ArduinoOffPin(int pin) {
if (pin == 13) {
NodeSerial.print(0x013); // 0-13 แปลว่า ปิด-ขา 13
NodeSerial.print("\n");
}
}
โคดฝั่ง Arduino
#include
//Code By ArduinoALL
SoftwareSerial ArduinoSerial(3, 2); // RX, TX
void setup() {
Serial.begin(115200);
ArduinoSerial.begin(4800);
pinMode(13, OUTPUT);
}
void loop() {
while (ArduinoSerial.available() > 0) {
float val = ArduinoSerial.parseFloat();
if (ArduinoSerial.read() == '\n') {
if (val == 0x113) {
digitalWrite(13, 1);
} else if (val == 0x013) {
digitalWrite(13, 0);
}
Serial.println(val);
}
}
delay(100);
}
ทดลองอ่านค่า Analog จาก Arduino
โคดฝั่ง NodeMCU
#include
#include
//Code By ArduinoALL
SoftwareSerial NodeSerial(D2, D3); // RX | TX
void setup() {
pinMode(D2, INPUT);
pinMode(D3, OUTPUT);
Serial.begin(115200);
NodeSerial.begin(4800);
}
void loop() {
NodeSerial.print(0xA0);
NodeSerial.print("\n");
while (NodeSerial.available() > 0) {
float val = NodeSerial.parseFloat();
if (NodeSerial.read() == '\n') {
Serial.println(val);
}
}
delay(100);
}
โคดฝั่ง Arduino
#include
//Code By ArduinoALL
SoftwareSerial ArduinoSerial(3, 2); // RX, TX
void setup() {
Serial.begin(115200);
ArduinoSerial.begin(4800);
pinMode(13, OUTPUT);
}
void loop() {
while (ArduinoSerial.available() > 0) {
float val = ArduinoSerial.parseFloat();
if (ArduinoSerial.read() == '\n') {
if (val == 0xA0) {
int A0 = analogRead(A0);
ArduinoSerial.print(A0);
ArduinoSerial.print("\n");
}
}
}
delay(100);
}
เปิด Serial Monitor ของ NodeMCU จะพบว่าสามารถดึงค่า Analog จาก Arduino มาใช้งานได้แล้ว
คลิปวีดีโอสอน Arduino ESP8266 NodeMCU ติดต่อ Arduino แบบ Serial