รู้เบื้องต้นเกี่ยวกับโมดูลอะแดปเตอร์ LCD I2C

ลองใช้เครื่องมือของเราเพื่อกำจัดปัญหา





ในโพสต์นี้เราจะมาดูโมดูลอะแดปเตอร์ LCD ที่ใช้“ I2C” หรือ“ IIC” หรือ“ I square C” ซึ่งจะช่วยลดการเชื่อมต่อสายไฟระหว่าง Arduino และจอแสดงผล LCD เหลือเพียง 2 สายและยังช่วยประหยัดพิน GPIO จำนวนมากสำหรับ เซ็นเซอร์ / ไดรฟ์อื่น ๆ ฯลฯ

ก่อนที่เราจะพูดคุยเกี่ยวกับโมดูลอะแดปเตอร์ LCD I2C สิ่งสำคัญคือต้องเข้าใจว่า I2C บัสคืออะไรและทำงานอย่างไร



แต่อย่างไรก็ตามคุณไม่จำเป็นต้องเป็นผู้เชี่ยวชาญกับโปรโตคอล I2C เพื่อทำงานกับอะแดปเตอร์ LCD ที่กล่าวถึงนี้

ภาพประกอบการเชื่อมต่อ I2C:

ภาพประกอบการเชื่อมต่อ I2C:

I2C หรือ IIC ย่อมาจาก“ Inter-Integrated Circuit” คือบัสคอมพิวเตอร์แบบอนุกรมที่คิดค้นโดยเซมิคอนดักเตอร์ของ Philips ซึ่งปัจจุบันเรียกว่าเซมิคอนดักเตอร์ NXP ระบบบัสนี้ถูกประดิษฐ์ขึ้นในปีพ. ศ. 2525



รถบัสคืออะไร?

บัสคือกลุ่มของสายเคเบิล / สายไฟที่นำข้อมูลจากชิปหนึ่งไปยังชิปอื่น / แผงวงจรหนึ่งไปยังแผงวงจรอื่น

ข้อได้เปรียบหลักของโปรโตคอลบัส I2C คือไมโครคอนโทรลเลอร์หรือเซ็นเซอร์หรือชิปที่รองรับสามารถเชื่อมต่อกันได้ด้วยสายไฟเพียงสองเส้น ข้อดีของโปรโตคอลนี้คือเราสามารถเชื่อมต่อชิปหรือเซ็นเซอร์ / ไดรเวอร์ที่แตกต่างกัน 127 ตัวเข้ากับอุปกรณ์หลักหนึ่งตัวซึ่งโดยปกติจะเป็นไมโครคอนโทรลเลอร์ที่มีสายไฟเพียง 2 สาย

สาย I2C สองเส้นคืออะไร?

สายไฟสองเส้นคือ SDA และ SCL ซึ่งเป็น Serial Data และ Serial clock ตามลำดับ

นาฬิกาอนุกรมหรือ SCL ใช้เพื่อซิงค์การสื่อสารข้อมูลผ่านบัส I2C SDA หรือ Serial Data คือสายข้อมูลที่มีการถ่ายทอดข้อมูลจริงจากต้นแบบไปยังทาสและในทางกลับกัน อุปกรณ์หลักจะควบคุมนาฬิกาอนุกรมและตัดสินใจว่าจะใช้อุปกรณ์ทาสใดในการสื่อสาร ไม่มีอุปกรณ์ทาสสามารถเริ่มการสื่อสารได้ก่อนมีเพียงอุปกรณ์หลักเท่านั้นที่ทำได้

สายข้อมูลอนุกรมเป็นแบบสองทิศทางและมีประสิทธิภาพหลังจากส่งข้อมูล 8 บิตทุกชุดอุปกรณ์รับจะส่งบิตตอบรับกลับมา

โปรโตคอล I2C เร็วแค่ไหน?

โปรโตคอล I2C เวอร์ชันดั้งเดิมที่พัฒนาขึ้นในปี 1982 รองรับ 100 Kbps เวอร์ชันถัดไปเป็นมาตรฐานในปี 1992 ซึ่งรองรับ 400Kbps (โหมดเร็ว) และรองรับอุปกรณ์ได้สูงสุด 1008 เครื่อง เวอร์ชันถัดไปได้รับการพัฒนาในปี 1998 ด้วยความเร็ว 3.4 Mbps (โหมดความเร็วสูง)

I2C เวอร์ชันอื่น ๆ ได้รับการพัฒนาในปี 2000, 2007, 2012 (พร้อมโหมด Ultra-Fast 5Mbps) และเวอร์ชันล่าสุดของ I2C ได้รับการพัฒนาในปี 2014

ทำไมตัวต้านทานแบบดึงขึ้นในบัส I2C

SDA และ SCL เป็น 'ท่อระบายน้ำแบบเปิด' ซึ่งหมายความว่าทั้งสองเส้นสามารถไปได้ต่ำ แต่ไม่สามารถขับเส้นสูงได้ดังนั้นตัวต้านทานแบบดึงขึ้นจึงเชื่อมต่อกับแต่ละเส้น

แต่ด้วยโมดูล I2C ส่วนใหญ่เช่น LCD หรือ RTC ได้สร้างตัวต้านทานแบบดึงขึ้นดังนั้นเราจึงไม่จำเป็นต้องเชื่อมต่อตัวต้านทานเว้นแต่จะระบุไว้

ตัวต้านทานแบบดึงขึ้น / แบบดึงลง: ตัวต้านทานแบบดึงขึ้นเป็นตัวต้านทานที่เชื่อมต่อกับสาย + Ve ของแหล่งจ่ายเพื่อรักษาระดับลอจิกของสายให้สูงหากสายไม่สูงหรือต่ำ

ตัวต้านทานแบบดึงลงคือตัวต้านทานที่เชื่อมต่อกับ –Ve line ของแหล่งจ่ายเพื่อรักษาระดับลอจิกของเส้นให้เป็น LOW ถ้าเส้นนั้นไม่สูงหรือต่ำ

นอกจากนี้ยังป้องกันเสียงรบกวนเข้าสู่สาย

เราหวังว่าเราจะขัดพื้นผิวของโปรโตคอล I2C หากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับโปรโตคอล I2C โปรดเปิดอ่าน

YouTube และ Google

ตอนนี้เรามาดูโมดูล LCD I2C:

Pinouts โมดูล LCD I2C

มีขาออก 16 ขาสำหรับจอแสดงผล LCD ซึ่งสามารถบัดกรีโดยตรงที่ด้านหลังของโมดูล LCD 16 X 2

พินอินพุตคือ + 5V, GND, SDA และ SCL หมุด SDA และ SCL บน Arduino Uno คือพิน A4 และ A5 ตามลำดับ สำหรับ Arduino mega SDA คือพิน # 20 และ SCL คือพิน # 21

ให้เราเปรียบเทียบว่ามันเป็นอย่างไรเมื่อเราต่อสาย LCD เข้ากับ Arduino โดยไม่ใช้อะแดปเตอร์ I2C และอะแดปเตอร์

ไม่มีอะแดปเตอร์ I2C:

Arduino ไม่มีอะแดปเตอร์ I2C

ด้วยอะแดปเตอร์ I2C:

Arduino โดยใช้อะแดปเตอร์ I2C

อะแดปเตอร์ถูกบัดกรีที่ด้านหลังของจอแสดงผล LCD และอย่างที่เราเห็นว่าเราบันทึกพิน GPIO ไว้สำหรับงานอื่น ๆ และเรายังสามารถเพิ่มอุปกรณ์ I2C อีก 126 ชิ้นต่อไปเพื่อพิน A4 และ A5

โปรดทราบว่าไลบรารี Liquid Crystal มาตรฐานใช้กับอะแดปเตอร์ LCD I2C นี้ไม่ได้มีไลบรารีพิเศษสำหรับสิ่งนี้ซึ่งจะครอบคลุมในเร็ว ๆ นี้และเราจะแสดงวิธีใช้โมดูลนี้พร้อมตัวอย่างการเข้ารหัส

วิธีเชื่อมต่ออะแดปเตอร์ I2C กับจอแสดงผล 16 x 2

ในส่วนข้างต้นของบทความเราได้เรียนรู้พื้นฐานของโปรโตคอล I2C และนำภาพรวมพื้นฐานเกี่ยวกับโมดูลอะแดปเตอร์ LCD I2C ในโพสต์นี้เราจะเรียนรู้วิธีการเชื่อมต่อโมดูลอะแดปเตอร์ LCD I2C กับจอ LCD 16 x 2 และเราจะดูว่าโปรแกรมพร้อมตัวอย่างอย่างไร

ข้อได้เปรียบที่สำคัญของโปรโตคอล I2C คือเราสามารถเชื่อมต่อเซ็นเซอร์ / อุปกรณ์อินพุต / เอาท์พุตที่รองรับได้เพียงสองบรรทัดและเป็นประโยชน์กับ Arduino เนื่องจากมีพิน GPIO ที่ จำกัด

ตอนนี้เรามาดูวิธีเชื่อมต่อโมดูลกับ LCD

โมดูลมีขาออก 16 ขาและขาอินพุต 4 ขา เราสามารถบัดกรีอะแดปเตอร์เข้ากับด้านหลังของจอ LCD 16 x 2 จากพินอินพุต 4 พินทั้งสองคือ + 5V และ GND ส่วนที่เหลือคือ SDA และ SCL

เราจะเห็นว่าเราบันทึกพินจำนวนมากที่ Arduino สำหรับงานอินพุต / เอาท์พุตอื่น ๆ

เราสามารถปรับความคมชัดของจอแสดงผลได้โดยปรับโพเทนชิออมิเตอร์ด้วยไขควงขนาดเล็ก (เน้นในกล่องสีแดง)

ตอนนี้ไฟแบ็คไลท์สามารถควบคุมได้ในโค้ดโปรแกรมเอง:

LCD.backlight ()

จะเป็นการเปิดไฟแบ็คไลท์บนจอ LCD

lcd.noBacklight ()

จะเป็นการปิดไฟแบ็คไลท์บนจอ LCD

เราจะเห็นว่ามีจัมเปอร์เชื่อมต่ออยู่ซึ่งไฮไลต์ในกล่องสีแดงหากจัมเปอร์ถูกลบไฟแบ็คไลท์จะยังคงปิดอยู่โดยไม่คำนึงถึงคำสั่งของโปรแกรม

ตอนนี้การตั้งค่าฮาร์ดแวร์เสร็จสิ้นแล้วมาดูวิธีการเขียนโค้ดกัน โปรดจำไว้ว่าโมดูล LCD I2C จำเป็นต้องมีความพิเศษ

ไลบรารีและไลบรารี 'liquidcrystal' ที่ติดตั้งไว้ล่วงหน้าจะไม่ทำงาน

คุณสามารถดาวน์โหลดไลบรารี I2C LCD ได้จากที่นี่และเพิ่มลงใน Arduino IDE:

github.com/marcoschwartz/LiquidCrystal_I2C

จากโพสต์ก่อนหน้านี้เราได้เรียนรู้ว่าอุปกรณ์ I2C มีที่อยู่ที่ต้นแบบหรือไมโครคอนโทรลเลอร์สามารถระบุอุปกรณ์และสื่อสารได้

ในกรณีส่วนใหญ่สำหรับโมดูล I2C LCD แอดเดรสจะเป็น“ 0x27” แต่การผลิตที่แตกต่างกันอาจมีที่อยู่ที่แตกต่างกัน เราต้องป้อนที่อยู่ที่ถูกต้องในโปรแกรมเท่านั้นจากนั้นจอ LCD ของคุณจะทำงาน

หากต้องการค้นหาที่อยู่เพียงแค่เชื่อมต่อ 5V กับ Vcc และ GND กับ GND ของ Arduino และขา SCL ของโมดูล I2C ไปที่ A5 และ SDA เป็น A4 แล้วอัปโหลดรหัสด้านล่าง

การดำเนินการนี้จะสแกนอุปกรณ์ I2C ที่เชื่อมต่อและแสดงที่อยู่

// -------------------------------- //
#include
void setup()
{
Wire.begin()
Serial.begin(9600)
while (!Serial)
Serial.println('-----------------------')
Serial.println('I2C Device Scanner')
Serial.println('-----------------------')
}
void loop()
{
byte error
byte address
int Devices
Serial.println('Scanning...')
Devices = 0
for (address = 1 address <127 address++ )
{
Wire.beginTransmission(address)
error = Wire.endTransmission()
if (error == 0)
{
Serial.print('I2C device found at address 0x')
if (address <16)
{
Serial.print('0')
}
Serial.print(address, HEX)
Serial.println(' !')
Devices++
}
else if (error == 4)
{
Serial.print('Unknown error at address 0x')
if (address <16)
Serial.print('0')
Serial.println(address, HEX)
}
}
if (Devices == 0)
{
Serial.println('No I2C devices found ')
}
else
{
Serial.println('-------------- done -------------')
Serial.println('')
}
delay(5000)
}
// -------------------------------- //

อัปโหลดรหัสและเปิดจอภาพแบบอนุกรม

ดังที่เราเห็นอุปกรณ์สองเครื่องถูกตรวจพบและแสดงที่อยู่ แต่ถ้าคุณต้องการค้นหาเฉพาะที่อยู่ของโมดูล I2C LCD คุณไม่ควรเชื่อมต่ออุปกรณ์ I2C อื่น ๆ ขณะทำการสแกน
สรุปได้ว่าเราได้ที่อยู่“ 0x27”

ตอนนี้เรากำลังจะสร้างนาฬิกาดิจิทัลเป็นตัวอย่างเนื่องจากมีอุปกรณ์ I2C สองตัวโมดูล LCD และโมดูล RTC หรือนาฬิกาแบบเรียลไทม์ โมดูลทั้งสองจะเชื่อมต่อด้วยสายไฟสองเส้น

ดาวน์โหลดไลบรารีต่อไปนี้:
ห้องสมุด RTC: github.com/PaulStoffregen/DS1307RTC
TimeLib.h: github.com/PaulStoffregen/Time

วิธีตั้งเวลาเป็น RTC

•เปิด Arduino IDE และไปที่ไฟล์> ตัวอย่าง> DS1307RTC> ตั้งเวลา
•อัปโหลดรหัสด้วยฮาร์ดแวร์ที่สมบูรณ์และเปิดจอภาพแบบอนุกรมเท่านี้ก็เสร็จเรียบร้อย

แผนภูมิวงจรรวม:

โปรแกรม:

//------------Program Developed by R.Girish-------//
#include
#include
#include
#include
LiquidCrystal_I2C lcd(0x27, 16, 2)
void setup()
{
lcd.init()
lcd.backlight()
}
void loop()
{
tmElements_t tm
lcd.clear()
if (RTC.read(tm))
{
if (tm.Hour >= 12)
{
lcd.setCursor(14, 0)
lcd.print('PM')
}
if (tm.Hour <12)
{
lcd.setCursor(14, 0)
lcd.print('AM')
}
lcd.setCursor(0, 0)
lcd.print('TIME:')
if (tm.Hour > 12)
{
if (tm.Hour == 13) lcd.print('01')
if (tm.Hour == 14) lcd.print('02')
if (tm.Hour == 15) lcd.print('03')
if (tm.Hour == 16) lcd.print('04')
if (tm.Hour == 17) lcd.print('05')
if (tm.Hour == 18) lcd.print('06')
if (tm.Hour == 19) lcd.print('07')
if (tm.Hour == 20) lcd.print('08')
if (tm.Hour == 21) lcd.print('09')
if (tm.Hour == 22) lcd.print('10')
if (tm.Hour == 23) lcd.print('11')
}
else
{
lcd.print(tm.Hour)
}
lcd.print(':')
lcd.print(tm.Minute)
lcd.print(':')
lcd.print(tm.Second)
lcd.setCursor(0, 1)
lcd.print('DATE:')
lcd.print(tm.Day)
lcd.print('/')
lcd.print(tm.Month)
lcd.print('/')
lcd.print(tmYearToCalendar(tm.Year))
} else {
if (RTC.chipPresent())
{
lcd.setCursor(0, 0)
lcd.print('RTC stopped!!!')
lcd.setCursor(0, 1)
lcd.print('Run SetTime code')
} else {
lcd.clear()
lcd.setCursor(0, 0)
lcd.print('Read error!')
lcd.setCursor(0, 1)
lcd.print('Check circuitry!')
}
}
delay(1000)
}
//------------Program Developed by R.Girish-------//

บันทึก:

LiquidCrystal_I2C จอแอลซีดี (0x27, 16, 2)

“ 0x27” คือที่อยู่ที่เราพบจากการสแกนและ 16 และ 2 คือจำนวนแถวและคอลัมน์บนจอ LCD

สำหรับ RTC เราไม่จำเป็นต้องค้นหาที่อยู่ แต่เราพบในขณะที่สแกน“ 0x68” แต่อย่างไรก็ตามห้องสมุด RTC จะจัดการกับมัน

ตอนนี้เรามาดูกันว่าเราลดความแออัดของสายไฟและบันทึกพิน GPIO บน Arduino ได้มากเพียงใด

มีเพียง 4 สายเท่านั้นที่เชื่อมต่อกับจอ LCD โดยเน้นในกล่องสีแดง

นอกจากนี้ยังเชื่อมต่อสายไฟ 4 สายจาก Arduino และโมดูล RTC ใช้สายเดียวกัน

ตอนนี้คุณได้รับความรู้พื้นฐานเกี่ยวกับ I2C และวิธีการใช้โมดูลอะแดปเตอร์ I2C LCD
คุณชอบโพสต์นี้หรือไม่? คุณมีคำถามหรือไม่? โปรดแสดงความคิดเห็นในส่วนความคิดเห็นคุณอาจได้รับคำตอบอย่างรวดเร็ว




คู่ของ: วงจรทดสอบไดโอดทรานซิสเตอร์อย่างง่าย ถัดไป: สร้างวงจรขยายช่วงการควบคุมระยะไกล IR นี้