Signal | Master | <------> | Slave |
VCC | ต่อ VCC แยกกัน | ||
SDA | A4 | <------> | A4 |
SCL | A5 | <------> | A5 |
GND | GND | <------> | GND |
#include อันนี้คงรู้กันทุกคนแล้วนะครับ เป็นการ include Library เข้ามาเพื่อเรียกใช้งานนั่นเอง |
|
begin(address) คำสั่งเริ่มการใช้งาน Wire Library นั่นเอง ใช้คำสั่งนี้เพียงครั้งเดียวใน Setup เพื่อให้บอร์ดตัวนั้นเข้าไปอยู่ในวง I2C โดยมีรูปแบบดังนี้ | |
Wire.begin(address); | |
โดยที่ address คือค่า Address ที่เรากำหนดให้กับบอร์ดตัวนั้น โดยจะเป็น 7-bit Address ตามมาตรฐาน I2C เราจะกำหนดเป็นอะไรก็ได้ ใช้เลขฐานอะไรก็ได้ แต่ต้องไม่ซ้ำกันหากใช้ 10 ตัวก็ต้อง 10 Address ไม่ซ้ำ และหากเราไม่ใส่ Address ปล่อยวงเล็บให้ว่างไว้จะหมายถึงบอร์ดตัวนั้นทำหน้าที่ Master นั่นเอง |
|
requestFrom() เป็นคำสั่งที่ใช้ในตัว Master สำหรับเรียกข้อมูลจาก Slave โดยมีรูปแบบดังนี้ | |
Wire.requestFrom(address, quantity, stop); | |
โดยที่ address คือ Address ของ Slave ที่ต้องการเรียกข้อมูล quantity คือ จำนวนข้อมูล (เป็น bytes) ที่จะขอ stop คือ Stop Message เป็น Boolean หากใส่ true ตัว Master จะส่ง Stop Message หลังจากส่งคำสั่งออกไปเพื่อปล่อยบัสให้ว่างพร้อมทำงาน หากใส่เป็น false จะเป็นการส่ง Restart Message แทน ทำให้บัสไม่ว่าง เพื่อป้องกันคำสั่งจากตัวอื่นเข้ามารบกวนการทำงาน ทำให้การทำงานผิดพลาด หากเราไม่ใส่ค่า คำสั่งจะใช้ค่า Default คือ true |
|
beginTransmission(address) เริ่มการส่งข้อมูลไปยัง Slave ตัวที่มี Address ที่กำหนดไว้ (เป็นการส่ง Address bit นั่นเอง) มีรูปแบบดังนี้ | |
Wire.beginTransmission(address); | |
โดยที่ address คือ Address ของ Slave ที่ต้องการเรียกข้อมูล |
|
endTransmission() เป็นคำสั่งจบการสื่อสารในรอบนั้น ๆ คือหลังจาก beginTransmission และ write เรียบร้อยก็ใช้ตัวนี้จบการสื่อสาร มีรูปแบบดังนี้ |
|
Wire.endTransmission(stop); |
|
โดยที่ stop เป็นค่า Boolean หากเป็น true จะทำการส่ง Stop Message เพื่อปลดให้บัสว่าง หากเป็น false จะเป็นการส่ง Restart ให้บัสไม่ว่างเพื่อคงการเชื่อมต่อ ไม่ให้ข้อมูลจากตัวอื่นเข้ามาขัดจังหวะ หากปล่อยว่างจะเป็นค่า Default คือ true นอกจากนี้ endTransmission ยังสามารถคืนค่าออกมาเป็น Error Code อีกด้วย ซึ่งมีรหัสดังนี้ 0 คือการส่งข้อมูลสำเร็จเรียบร้อยดี, 1 คือข้อมูลยาวเกินกว่าบัฟเฟอร์ที่มี(เรื่องบัฟเฟอร์จะอธิบายในโอกาสหน้าครับ), 2 คือได้รับ NACK จากการส่งที่อยู่, 3 คือได้รับ NACK จากการส่งข้อมูล และ 4 คือความผิดพลาดอื่น ๆ |
|
write() ตามชื่อครับ ใช้ส่งข้อมูลที่ต้องการ ไม่ว่าจะเป็นจาก Master ไป Slave หรือจาก Slave มายัง Master โดยจะต้องอยู่ระหว่างคำสั่ง beginTransmission และ endTransmission รูปแบบคำสั่งมีหลายแบบดังนี้ | |
Wire.write(value);
Wire.write(string);
Wire.write(data, length);
|
|
โดยที่ value คือ ข้อมูล 1 byte ที่ต้องการส่งไป string คือ ชุดข้อความที่อยู่ในรูปหลาย ๆ bytes data คือ Array ของชุดข้อความหลาย ๆ bytes lenght คือ ความยาวเป็น bytes ของข้อความที่จะส่งออกไป จะเห็นว่าแม้มีถึง 3 รูปแบบ แต่การใช้งานนั้นเหมือนกันเป๊ะ ๆ ต่างกันที่ชนิดของข้อมูลที่จะส่งออกไปนั่นเองครับ |
|
available() ใช้เช็คค่าที่เรียกคำสั่งไป โดยจะคืนค่าเป็นจำนวน bytes ที่อ่านได้ โดยคำสั่งนี้ใน Master จะเรียกหลังจาก requestFrom() และเรียกหลังคำสั่ง onReceive() สำหรับใน Slave มีรูปแบบในการใช้งานดังนี้ | |
Wire.avilable(); |
|
read() เป็นคำสั่งที่ใช้สำหรับอ่านข้อมูลที่ส่งมา โดยจะเรียกใช้ใน Slave เป็นส่วนใหญ่เพื่อรับคำสั่ง ส่วนใน Master เราจะวางคำสั่งนี้หลังจาก requestFrom(), avilable() โดยคำสั่งนี้จะคืนค่าเป็นข้อมูลที่อ่านได้นั่นเอง | |
Wire.read(); |
|
|
|
setClock() ใช้ตั้งค่าความเร็วในการสื่อสาร คือตั้ง I2C Mode ต่าง ๆ ตามที่เคยพูดถึงไปแล้วนั่นแหละครับ | |
Wire.setClock(frequency); | |
โดยที่ frequency คือ ค่าความเร็วในการสื่อสาร (ในหน่วย Hz) สามารถตั้งค่าได้ดังนี้ 100000 - Standard Mode 400000 - Fast Mode ค่า Default จะเป็น Standard Mode ทั้งนี้สำหรับบอร์ดบางรุ่นอาจตั้งค่าได้มากกว่านี้เช่น 10000, 1000000, 3400000 (Mode ต่าง ๆ ที่พูดถึงตอน I2C นั่นเอง) ให้ศึกษา Datasheet ของแต่ละตัวนะครับ แต่ใช้เซฟ ๆ ก็ Standard Mode นี่แหละ |
|
onReceive(handler) เป็นคำสั่งที่ใช้ในฝั่ง Slave ให้ทำงานตามฟังก์ชั่นที่กำหนดเมื่อ Slave ได้รับคำสั่งจาก Master | |
Wire.onReceive(handler); | |
โดยที่ handler คือ ฟังก์ชั่นที่ต้องการเรียกใช้งาน (ควรส่งค่ากลับเป็น int หรือไม่มีค่าส่งกลับ) |
|
onRequest(handler) เป็นคำสั่งคู่แฝดกับ onReceive คือจะใช้ในฝั่ง Master ให้เรียกฟังก์ชั่นที่กำหนดไว้ขึ้นมาทำงานเมื่อมีข้อมูลส่งมาจาก Slave นั่นเอง |
|
Wire.onRequest(handler); | |
โดยที่ handler คือ ฟังก์ชั่นที่ต้องการเรียกใช้งาน ไม่มีค่าส่งกลับ (void handler()) |