การทดลอง Arduino 2.1 การรับและส่งข้อมูลผ่าน Serial Protocol ที่มากกว่า1ตัวอักษร (Advance ระดับ2)

สวีดัด สวัดดีคับ
วันนี้ว่างเลยมาเขียนต่อ
หลังจากได้ศึกษา Arduino มาอีกสกพัก ก็มีหลายทริกผที่อยกานำมาเขียน วันนี้ก็เอาเรื่อง Serial Port สักหน่อย
ศึกษาไปเขียนไป เผื่อคนอื่นจะได้รู้เพิ่มบ้าง

เมื่อเราใช้ Arduino Board หรือ ESP32 เรามักจะใช้ Serial Port กำนหดค่า Speed ในการส่งและรับข้อมูลไว้ที่ setup() ที baud rate 9600 โดยคำสั่งข้างล่าง
Serial.begin(9600); 

ข้องสังเกตุ 9600 เป็น speed ที่เสถียรสำหรับ Arduino Uno board ที่ผมทดสอบ ถ้าเปลี่ยนเป็นความเร็วสูงขึ้น อาจมปัญหาว่าได้บ้างไม่ได้บ้าง สำหรับ ESP32 ปรับไปที่ 115200 ได้เลย

กรณี่ที่เราต่อสาย USB อยู่กับบอร์ด มันก็จะบังคับให้เราส่งข้อมูลกับ Arduino IDE ใน คอมผ่านทาาง UART
แต่ถ้าเราไม่ต่อกับคอมมันก็จะส่งไปที่ Serial ที่ต่อกับมันอยู่ เช่น ถ้าเรา pair BLE กับ Arduino Board กับมือถือ มันก็จะส่งข้อมูล ผ่านทางนี้นี่เอง (BLE คือ ตัวย่อของ Bluetooth Low Energy) เช่น HC-06 (Bluetooth 4.0 ถ้าจำไม่ผิด )
โดย HC-06 จะมีรุ่น4ขา และ 6ขา
รุ่น 4ขา จะทำเป็น Slave Mode ได้อย่างเดียว (อันนี้ผมใช้ในโครงการนี้)
รุ่น 6ขา จะเป็นได้ทั้ง Master Mode และ Slave mode ส่วนต่างกันยังไงไม่ขออธิบายในหน้านี้
ปล รอ BLE v5.0 มาทดสอบอยู่เหมือนกัน อยากให้มันไกลเกิน 10m ซะที
ส่วนโปรแกรมที่ไว้ใช้ ทดสอบบนมือถือ ก็ใช้บน Android ชื่อ Bluetooth Terminal
อันไหนฟรีก็ลองไป อันไหนจ่ายตังก็อด ยกเว้นมีสปอนเซอร์มาให้รีวิว 555

มาเริ่มกัน โดยส่งและรับข้อมูลผ่าน USB serial กับคอมก่อนเลย
ไดอะแกรมไม่มี น่าจะต่อเป็นทุกคนแล้ว

เสก็ตตัวนี้ จะรับข้อมูลที่เราพิมผ่านหน้า Tools > Serial Monitor 1ตัวอักษร หรือ ข้อมูลขนาด 1 byte
หลังจากนั้น Arduino จะไปประมวลผล แล้วแสดงกลับมาทาง Serial Monitor เช่นกัน  ในที่นี้จะให้แสดงผลตัวอักษรที่เป็นตัวถัดไปแทน
Ardunio Uno ไม่ support Keybord.h และ Mouse.h เนื่องจากใช้ชิบ ATmega328p จะsupportเฉพาะ บอร์ดที่ใช้ ATmega32u4 

Sketch Solution 1
/////////////////////////////////////////////////////////////Start///////////////////////////////////////
void setup() {
  Serial.begin(9600); // กำหนดใช้งาน serial port:ที่ความเร็ว 9600 bit/sec
 }

void loop() {
 if (Serial.available() > 0) {  // เช็คว่ามีข้อมูลเข้ามาทาง serial หรือไม่:
  int inChar = Serial.read(); // กำหนดให้ข้อมูลที่เข้ามากลายเป็นชนิดตัวเลขและเก็บในตัวแปร inChar:
  Serial.print(inChar + 1); // พิมตัวอักษรถัดไปส่งคืนไปที่หน้าจอ:
   Serial.println(char(inChar + 1));
  }
}
/////////////////////////////////////////////////////////////End///////////////////////////////////////
  ก็จะได้ประมานนี้











แต่ถ้าลองพิมเป็น สองตัวอักษรสิ












จะเห็นได้ว่า มันจะรับตัวอักษรทีละตัวเท่านั้น แต่ถ้าเราใส่สองตัวเช่นตัวเลขสองหลัก มันก็จะรับทีละหลัก
วิธีการแก้ก็ง่ายมาก ลองใช้คำสั่ง

Serial.parseInt();
  เพื่อรับข้อมูลที่เป็น Integer ได้มากกว่า 1หลัก
Sketch Solution 2
/////////////////////////////////////////////////////////////Start///////////////////////////////////////
void setup() {
  Serial.begin(9600); // กำหนดใช้งาน serial port:ที่ความเร็ว 9600 bit/sec
  }

void loop() {
 int val=0;
while(Serial.available() > 0) {
    val = Serial.parseInt();
    Serial.println(val);
    }
  val = 0;
}
/////////////////////////////////////////////////////////////End///////////////////////////////////////
  ก็จะได้ประมานนี้ 


เขียนเรื่องการรับข้อมูลแบบ array[] รอแปป 







ความคิดเห็น