การใช้ Arduino ร่วมกับ NodeMCU/ESP8266 จะมีด้วยกันหลายแบบ เช่น I2C, Serial เพื่อเพิ่ม I/O เช่นเพิ่มขา digital, ขา analog ในที่นี้จะยกตัวอย่างการสื่อสารแบบ Serial ก่อนเพราะเป็นตัวอย่างที่ง่ายต่อการเข้าใจ ในตัวอย่างจะเป็นการส่งค่าระหว่าง Arduino กับ NodeMCU โดยกำหนดให้ Arduino ส่งค่า int (จำนวนเต็ม) และ float (ทศนิยม) ไปยัง NodeMCU โดยสมมติว่า Arduino กำลังส่งค่าอะไรบางอย่างเป็นจำนวนเต็ม (int) และกำลังอ่านค่า Sensor เป็นทศนิยม (float) จากตัวอย่าง เราสามารถนำค่าที่ NodeMCU อ่านได้เป็น int และ float ไปใช้งานได้เลยโดยใช้ฟังก์ชั่น parseInt(), parseFloat() ในส่วนของโค้ดโปรแกรมจะมีด้วยกันสองฝั่งคือ ฝั่งArduino และ ฝั่งNodeMCU
หมายเหตุ สามารถใช้กับ Arduino รุ่นใดก็ได้ หรือจะเอาไปใช้งานในการเพิ่ม output ให้กับ Nodemcu ก็ได้
ตัวอย่างการต่อวงจร
Arduino Nano | NodeMCU |
VIN | VIN |
GND | GND |
D2 | D2 |
D3 | D3 |
หากต้องการสื่อสาร ระหว่าง uno กับ nodemcu ด้วย serial
การต่อ tx , rx จาก uno ไป node mcu ต้องต่อผ่าน Logic Level Converter ก่อนครับ
เพราะ tx , rx ของ uno ทำงานที่ 5v แต่ nocd MCU tx,rx ทำงานที่ 3.3v
UNO NodeMcu
Tx – Logic level convert –> rx
rx <— — tx
โค้ดฝั่ง Arduino
int i_data = 1234;
float f_data = 567.89;
#include <SoftwareSerial.h>
SoftwareSerial NanoSerial(3, 2); // RX | TX
void setup()
{
pinMode(3,INPUT);
pinMode(2,OUTPUT);
Serial.begin(9600);
NanoSerial.begin(57600);
}
void loop() {
Serial.print(i_data); Serial.print(“\t”);
Serial.println(f_data);
NanoSerial.print(i_data); NanoSerial.print(” “);
NanoSerial.print(f_data); NanoSerial.print(“\n”);
delay(100);
}
โค้ดฝั่ง NodeMCU
#include <ESP8266WiFi.h>
#include <SoftwareSerial.h>
SoftwareSerial NodeSerial(D2,D3); // RX | TX
void setup() {
pinMode(D2, INPUT);
pinMode(D3, OUTPUT);
Serial.begin(9600);
NodeSerial.begin(57600);
Serial.println();
Serial.println();
Serial.println(“NodeMCU/ESP8266 Run”);
}
void loop() {
while (NodeSerial.available() > 0)
{
int i_data = NodeSerial.parseInt();
float f_data = NodeSerial.parseFloat();
if (NodeSerial.read() == ‘\n’)
{
Serial.print(“NodeMCU or ESP8266″); Serial.print(” : “);
Serial.print(i_data); Serial.print(” : “);
Serial.println(f_data);
}
delay(50);
}
delay(10);
}
ผลการทดสอบ