- I2C Communication Protocol คืออะไร?
- วัสดุที่จำเป็น
- โมดูล I2C
- แผนภูมิวงจรรวม
- รหัสสำหรับค้นหาที่อยู่คอนโทรลเลอร์ I2C
- รหัสสำหรับ ESP32
ในบทช่วยสอนก่อนหน้านี้ OLED เชื่อมต่อกับ ESP32 โดยใช้การสื่อสาร SPI ซึ่งใช้ 5 พิน ในการกวดวิชานี้เราติดต่อ 16x2 แอลซีดีพร้อม ESP32โดยใช้เพียง 2 ขา, ด้วยความช่วยเหลือของการสื่อสาร I2C ช่วยลดจำนวนพินที่ ESP32 ใช้เพื่อให้จำนวนพิน ESP32 มากขึ้นยังคงว่างสำหรับการเชื่อมต่อเซ็นเซอร์ต่างๆ
I2C Communication Protocol คืออะไร?
I2C คำย่อมาจาก“ อินเตอร์แบบบูรณาการวงจร”โดยปกติจะแสดงเป็นIIC หรือ I กำลังสอง Cหรือแม้กระทั่งเป็นโปรโตคอลอินเทอร์เฟซ 2 สาย (TWI) ในบางสถานที่ แต่ทุกอย่างมีความหมายเหมือนกัน I2C เป็นโปรโตคอลการสื่อสารแบบซิงโครนัสซึ่งหมายความว่าอุปกรณ์ทั้งสองที่ใช้ข้อมูลร่วมกันจะต้องใช้สัญญาณนาฬิการ่วมกัน มีสายไฟเพียงสองสายคือ SDA และ SCL ในการแบ่งปันข้อมูลซึ่งSCLใช้สำหรับสัญญาณนาฬิกาและSDAใช้สำหรับการส่งและรับข้อมูล
คุณสามารถซื้อโมดูล LCD I2C ที่มีตัวควบคุม LCD I2C1602 อยู่ในตัวหรือคุณสามารถซื้อคอนโทรลเลอร์ I2C เพื่อเชื่อมต่อ LCD 16x2 กับ ESP32
วัสดุที่จำเป็น
- ESP32
- จอ LCD 16 * 2
- ตัวควบคุม LCD I2C
- สายไฟ
- เขียงหั่นขนม
โมดูล I2C
คอนโทรลเลอร์ I2C มี IC PCF8574 ซึ่งให้การขยาย I / O ระยะไกลสำหรับวัตถุประสงค์ทั่วไปผ่านนาฬิกาอนุกรม I2C บัสสองทิศทาง (SCL) และข้อมูลอนุกรม (SDA) เป็น IC ที่มีประโยชน์มากและสามารถใช้ในแผงป้าย LED, จอแสดงผล, คีย์แพด, การควบคุมอุตสาหกรรม ฯลฯ มี 8 I / O pins, 3 pins (A0, A1, A2) สำหรับ I2C bus address และ SDA, SCL.
บอร์ดควบคุม LCD มีโพเทนชิออมิเตอร์ในตัวเพื่อควบคุมความคมชัดของ LCD
แผนภาพพินของตัวควบคุม IC และ LCD แสดงไว้ด้านล่าง
แผนภูมิวงจรรวม
การเชื่อมต่อสำหรับการเชื่อมต่อ LCD กับ ESP32มีดังต่อไปนี้
- เชื่อมต่อพิน 1-16 ของโมดูล I2C กับขา 1-16 ของจอ LCD
- ขา SDA ของโมดูล I2C -> ขา SDA ของ ESP32 เช่น D21
- ขา SCL ของโมดูล I2C -> พิน SCL ของ ESP32 เช่น D22
ฉันได้เชื่อมต่อ 3v ของ ESP32 ถึง 5v ของ I2C เพื่อการสาธิตเท่านั้น แต่เราต้องการแหล่งจ่ายไฟ5V สำหรับโมดูล I2Cเพื่อแสดงข้อมูลอย่างถูกต้องเนื่องจาก ESP32 สามารถให้ 3.3 โวลต์ซึ่งต่ำสำหรับโมดูล I2C เท่านั้นและข้อมูลจะไม่สามารถมองเห็นได้ชัดเจน ดังนั้นควรใช้แหล่งจ่ายไฟ 5V ภายนอกจะดีกว่า
เราต้องการไฟล์บอร์ดสำหรับ ESP32 ดังนั้นหากคุณยังใหม่กับ ESP32 ก่อนอื่นให้ทำตามการเริ่มต้นใช้งาน ESP32 บทช่วยสอนแล้วข้ามกลับมาที่นี่ คุณยังสามารถเชื่อมต่อ LCD กับ ESP32 โดยไม่ใช้ I2C ได้ แต่จะใช้พินของ ESP32 มากกว่า
รหัสสำหรับค้นหาที่อยู่คอนโทรลเลอร์ I2C
ก่อนที่จะเข้าสู่รหัสหลักเราต้องหาที่อยู่ของโมดูล I2Cก่อน
ตัวควบคุม I2C มีบิต ADDRESS ในตัวซึ่งใช้ในการควบคุมบัส I2C ADDRESS เริ่มต้นคือ 0x27 แต่ในบางกรณีอาจเป็น 0x3f ดังนั้นในการตรวจสอบที่อยู่ของคอนโทรลเลอร์ I2Cให้เชื่อมต่อวงจรดังที่แสดงด้านบนอัปโหลดรหัสที่ระบุด้านล่างและเปิดจอภาพอนุกรมคุณจะเห็นที่อยู่เป็นเลขฐานสิบหก
# รวม
โปรดทราบว่าเราใช้ ที่อยู่ นี้ในรหัสอินเทอร์เฟซ LCD ของเรา
ในตัวควบคุม I2C ดังที่คุณเห็นมีจัมเปอร์ / แผ่นบัดกรีสามตัวที่ระบุว่า A0, A1 และ A2 สิ่งเหล่านี้ใช้เพื่อเปลี่ยนที่อยู่ของโมดูล ต่อไปนี้คือการเปลี่ยนแปลงที่อยู่จากค่าเริ่มต้น 0x27 หรือ 0x3F หากคุณเชื่อมต่อแผ่นที่อยู่เข้าด้วยกัน (1 = ไม่ได้เชื่อมต่อ 0 = เชื่อมต่อแล้ว):
A0 |
A1 |
A2 |
ที่อยู่ HEX |
1 |
1 |
1 |
0x27 |
0 |
1 |
1 |
0x26 |
1 |
0 |
1 |
0x25 |
0 |
0 |
1 |
0x24 |
1 |
1 |
0 |
0x23 |
0 |
1 |
0 |
0x22 |
1 |
0 |
0 |
0x21 |
0 |
0 |
0 |
0x20 |
รหัสสำหรับ ESP32
อันดับแรกเราต้องมีไลบรารีLiquidCrystal_I2Cสำหรับโมดูล I2C LCD ไลบรารี Liquidcrsytal ธรรมดาจะไม่ทำงานเนื่องจากเราใช้ I2C ที่นี่
ดาวน์โหลดไลบรารีจาก
รหัสถูกเขียนในลักษณะที่สิ่งที่พิมพ์บนจอภาพอนุกรมจะแสดงบน LCD Arduino IDE ถูกใช้เพื่อเขียนและอัพโหลดโค้ดของเรา
ก่อนอื่นเราต้องรวมไลบรารี ลวด สำหรับการสื่อสาร I2C ซึ่งมาพร้อมกับArduino IDE
# รวม
จากนั้นสำหรับ I2C LCD ให้รวมLiquidCrystal_I2C.hที่ดาวน์โหลดมาก่อนหน้านี้
# รวม
จากนั้นตั้งค่าที่อยู่LCD I2C เป็น 0x27หรือที่อยู่ที่คุณได้รับโดยการเรียกใช้รหัสสแกนเนอร์ที่ระบุไว้ด้านบนสำหรับการแสดงผล 16 ตัวอักษร 2 บรรทัด
LiquidCrystal_I2C LCD (0x27, 16,2);
ในฟังก์ชัน การตั้งค่า เริ่มต้นการสื่อสารแบบอนุกรมและ LCD สำหรับ 16 ตัวอักษร 2 บรรทัดและเปิดไฟแบ็คไลท์ หากคุณต้องการปิดไฟแบ็คไลท์ให้ใช้lcd .noBacklight ()และเปลี่ยนฟังก์ชัน setCursor ()ตามความต้องการของคุณ
การตั้งค่าเป็นโมฆะ () { Serial.begin (9600); lcd.init (); LCD.backlight (); lcd.setCursor (0,0); lcd.print ("สวัสดีชาวโลก!"); ล่าช้า (1,000); lcd.setCursor (0,1); lcd.print ("circuitdigest.com"); ล่าช้า (3000);
LCD จะแสดงคำแนะนำในการใช้ Serial Monitor ก่อนและพิมพ์ตัวอักษรที่จะแสดง
ตั้งค่าตัวเลือก Serial Monitor เป็น "No Line Ending"
lcd.clear (); lcd.setCursor (0,0); lcd.print ("ใช้ Ser. Monitor"); lcd.setCursor (0,1); lcd.print ("พิมพ์เพื่อแสดง"); }
ห่วง ฟังก์ชั่นจะตรวจสอบอย่างต่อเนื่องสำหรับข้อมูลแบบอนุกรมใด ๆ เข้ามาจากพอร์ตอนุกรมใช้Serial.available ()ฟังก์ชั่น หากมีข้อความก็รอที่สองและพิมพ์ข้อความบนหน้าจอ LCD โดยใช้จอแอลซีดี.write ()และSerial.read ()ฟังก์ชั่น
void loop () {{// เมื่ออักขระมาถึงพอร์ตอนุกรม… if (Serial.available ()) {delay (100); // รอสักครู่เพื่อให้ข้อความทั้งหมดมาถึง lcd.clear (); // ล้างหน้าจอในขณะที่ (Serial.available ()> 0) {// อ่านอักขระที่มีทั้งหมด lcd.write (Serial.read ()); // แสดงอักขระแต่ละตัวบน LCD}}}}
รหัสการแข่งขันได้รับด้านล่างดังนั้นอัปโหลดรหัสและเปิดจอภาพอนุกรม จากนั้นพิมพ์ข้อความและกด Enter ข้อความของคุณจะแสดงบน LCD
หากคุณไม่ได้รับการตอบสนองที่เหมาะสมหรือไม่มีการตอบสนองบน LCD ให้ตรวจสอบที่อยู่คอนโทรลเลอร์ I2C ของคุณหรือสแกนอีกครั้งด้วยรหัสที่กำหนดด้านบนเพื่อรับที่อยู่ที่ถูกต้อง