在这篇文章中,我们将看一看基于“I2C”或“IIC”或“I square C”的LCD适配器模块,它将把Arduino和LCD显示器之间的接线减少到只有两条线,还可以为其他传感器/驱动器等节省成吨的GPIO引脚。
在讨论I2C LCD适配器模块之前,了解I2C总线是什么以及它如何工作是很重要的。
但无论如何,您不需要是I2C协议专家,就可以使用上述液晶适配器。
I2C连接示意图:
I2C或IIC代表“内部集成电路”,是由飞利浦半导体(今天称为NXP半导体)发明的串行计算机总线。这个公交系统是1982年发明的。
公共汽车是什么?
总线是一组将数据从一个芯片传输到另一个芯片/电路板到另一个电路板的电缆/电线。
I2C总线协议的主要优点是,受支持的微控制器或传感器或芯片可以仅通过两根导线互连。该协议的惊人优势在于,我们可以将127个不同的芯片或传感器/驱动器互连到一个主设备上,而主设备通常是一个微控制器,只需2根导线。
两条I2C导线是什么?
这两条线是SDA和SCL,分别是串行数据和串行时钟。
串行时钟或SCL用于通过I2C总线同步数据通信。SDA或串行数据是实际数据从主设备传输到从设备的数据线,反之亦然。主设备控制串行时钟,并决定需要与哪个从设备通信。没有从设备可以首先启动通信,只有主设备可以。
串行数据线是双向和健壮的,每发送一组8位数据后,接收设备发送回一个确认位。
I2C协议有多快?
1982年开发的I2C协议的原始版本支持100kbps。下一个版本于1992年标准化,支持400Kbps(快速模式),最多支持1008个设备。下一个版本是1998年开发的,速度为3.4 Mbps(高速模式)。
其他几个I2C版本在2000年、2007年和2012年开发(5Mbps Ultra-Fast模式),最新版本的I2C是在2014年开发的。
为什么在I2C总线上使用上拉电阻?
SDA和SCL为“开漏”,这意味着两条线路都可以变低,但不能驱动线路变高,因此每条线路上都连接了一个上拉电阻器。
但对于大多数I2C模块,如LCD或RTC,都内置了上拉电阻器,所以除非另有规定,否则我们不需要连接上拉电阻器。
上拉/下拉电阻:上拉电阻是一个连接到电源的+Ve线的电阻,如果线不高也不低,则保持线的逻辑电平高。
下拉电阻器是连接到电源–Ve线的电阻器,用于在线路既不高也不低的情况下将线路的逻辑电平保持在低电平。
这也可以防止噪音进入管路。
我们希望我们触及了I2C协议的表面,如果您需要有关I2C协议的更多信息,请登录
YouTube和谷歌。
现在让我们看一下I2C LCD模块:
LCD显示有16个输出引脚,可以直接焊接到16 × 2 LCD模块的背面。
输入引脚为+5V、GND、SDA和SCL。Arduino Uno上的SDA和SCL引脚分别为引脚A4和A5。对于Arduino mega,SDA为插脚20,SCL为插脚21。
让我们比较一下在没有I2C适配器和有适配器的情况下将LCD连接到Arduino时的外观。
没有I2C适配器:
I2C适配器:
适配器是焊接在LCD显示屏的背面,我们可以看到,我们为其他任务节省了GPIO引脚的负载,而且我们还可以继续添加126个更多的I2C设备到引脚A4和A5。
请注意,标准液晶库不能与此I2C LCD适配器配合使用,有一个专门用于此的库,稍后将介绍,我们将通过编码示例向您展示如何使用此模块。
如何将I2C适配器连接到16 x 2显示器
在文章的上述部分中,我们学习了I2C协议的基础知识,并对I2C LCD适配器模块进行了基本概述。在这篇文章中,我们将学习如何将I2C LCD适配器模块连接到16 x 2 LCD显示器,我们将通过一个示例来了解如何编程。
I2C协议的主要优点是我们可以用两条线连接所支持的传感器/输入/输出设备,而且Arduino有有限的GPIO引脚,这对它很有帮助。
现在让我们看看如何连接模块到LCD。
该模块有16个输出引脚和4个输入引脚。我们只需将适配器焊接到16 x 2 LCD显示屏的背面即可。在4个输入引脚中,两个为+5V和GND,其余两个为SDA和SCL。
我们可以看到,我们在Arduino上为其他输入/输出任务保存了很多引脚。
我们可以通过使用小螺丝刀(红色框中突出显示)调整电位计来调整显示器的对比度。
背光现在可以在程序代码本身控制:
lcd.backlight ();
这将打开LCD显示屏上的背光。
noBacklight();
这将关闭LCD显示屏上的背光。
我们可以看到有一个跳线连接,它在红色框中突出显示,如果跳线被移除,无论程序命令如何,背光都保持关闭。
现在硬件设置完成了,现在让我们看看如何编码。请记住,I2C LCD模块需要特殊的
库和预安装的“liquidcrystal”库无法工作。
您可以从此处下载I2C LCD库并添加到Arduino IDE:
github.com/marcoschwartz/liquidcystal_I2C
从上一篇文章中,我们了解到I2C设备具有主控器或微控制器可以识别设备并进行通信的地址。
在大多数情况下,对于I2C LCD模块,地址将是“0x27”。但是不同的厂家可能有不同的地址。我们必须在程序中输入正确的地址,你的液晶显示器才会正常工作。
地址只需将Arduino的5V连接到Vcc, GND连接到GND, I2C模块的SCL引脚连接到A5, SDA连接到A4,并上传以下代码即可。
这将扫描连接的I2C设备并显示其地址。
// -------------------------------- //
#包括
无效设置()
{
Wire.begin();
Serial.begin (9600);
而(!串行);
以 ("-----------------------");
Serial.println(“I2C设备扫描仪”);
以 ("-----------------------");
}
无效循环()
{
字节错误;
字节地址;
int设备;
Serial.println(“扫描…”);
设备= 0;
For (address = 1;地址< 127;地址+ +)
{
Wire.beginTransmission(地址);
错误=Wire.endTransmission();
如果(错误==0)
{
串行打印(“在地址0x处找到I2C设备”);
If (address < 16)
{
并同时(“0”);
}
串行打印(地址,十六进制);
系列。println(“!”);
设备++;
}
else if(错误==4)
{
串行打印(“地址0x处的未知错误”);
If (address < 16)
并同时(“0”);
Serial.println(地址,十六进制);
}
}
if(设备== 0)
{
系列。println("没有找到I2C设备\n");
}
其他的
{
Serial.println(“--------------完成----------------”);
以(" ");
}
延迟(5000);
}
// -------------------------------- //
上传代码并打开串行监视器。
如我们所见,检测到了两个设备,并显示了它们的地址,但是如果您只想找到I2C LCD模块的地址,则在扫描时不应连接任何其他I2C设备。
最后我们得到了地址“0x27”。
现在我们将制作一个数字手表作为例子,因为有两个I2C设备,LCD模块和RTC或实时时钟模块。两个模块将通过两根电线连接。
下载以下库:
RTC库:github.com/PaulStoffregen/DS1307RTC
TimeLib.h:github.com/PaulStoffregen/Time
如何设置RTC的时间
•打开Arduino IDE,导航到文件> Example > DS1307RTC > set time。
•上传完整硬件的代码,打开串行监视器,即可完成。
电路图:
计划:
//------------ 项目由R.Girish——/ /
#包括
#包括
# include < TimeLib.h >
# include < DS1307RTC.h >
液晶I2C液晶显示器(0x27,16,2);
无效设置()
{
lcd.init();
lcd.backlight ();
}
无效循环()
{
TMU\t tm;
lcd.clear();
如果(实时读取(tm))
{
如果(tm.Hour>=12)
{
液晶显示器。setCursor (0);
lcd.打印(“PM”);
}
如果(tm)。小时< 12)
{
液晶显示器。setCursor (0);
lcd.打印(“AM”);
}
lcd.setCursor(0,0);
lcd.print(“时间:”);
如果(标准小时>12)
{
如果(tm.Hour==13)lcd.print(“01”);
如果(tm)。小时== 14)lcd.print("02");
如果(tm)。小时== 15)lcd.print("03");
如果(tm.Hour==16)lcd.print(“04”);
如果(tm)。小时== 17)lcd.print("05");
如果(tm)。小时== 18)lcd.print("06");
如果(tm)。小时== 19)lcd.print("07");
如果(tm.Hour==20)lcd.打印(“08”);
如果(tm.Hour==21)lcd.print(“09”);
如果(tm.Hour==22)lcd.print(“10”);
如果(tm)。小时== 23)lcd.print("11");
}
其他的
{
lcd.打印(tm.小时);
}
lcd.print(“:”);
lcd.print (tm.Minute);
lcd.print(“:”);
lcd.print (tm.Second);
lcd.setCursor(0,1);
lcd.打印(“日期:”);
lcd.打印(tm.日);
lcd.print(“/”);
lcd.打印(tm.月);
lcd.print(“/”);
lcd.print(tmYearToCalendar(tm.Year));
其他}{
if(RTC.chipresent())
{
lcd.setCursor(0,0);
液晶显示器。打印(“RTC停止! !”);
lcd.setCursor(0,1);
液晶显示器。打印(“运行设置系统时间代码”);
其他}{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“读取错误!”);
lcd.setCursor(0,1);
lcd.打印(“检查电路!”);
}
}
延迟(1000);
}
//------------ 项目由R.Girish——/ /
注意:
液晶I2C液晶显示器(0x27,16,2);
“0x27”是我们通过扫描找到的地址,16和2是LCD显示屏上的行数和列数。
对于RTC,我们不需要找到地址,但我们在扫描“0x68”时找到了,但无论如何,RTC库将处理它。
现在,让我们看看我们在Arduino上减少了多少导线阻塞并节省了多少GPIO引脚。
只有4根电线连接到LCD显示屏,红色框中突出显示。
此外,Arduino仅连接了4根导线,RTC模块共享相同的线路。
至此,您已经掌握了I2C的基本知识,以及如何使用I2C LCD适配器模块。
你喜欢这个帖子吗?你有什么问题吗?请在评论部分表达,您可能会得到快速回复。
嗨,斯威格,
我需要一个关于arduino多任务程序的大帮助。
瞬间,我有一个超声波传感器,可以立即测量并运行,在特定距离内保持一个5v继电器,并有一定的时间延迟,同时我想测量温度和湿度,它从一开始就报告lcd显示,led立即闪烁。
请告诉我这是怎么可能的。阿杜伊诺
嗨阿卜杜勒,
很抱歉,Arduino的定制代码是一个优质报价,目前我们每行定制代码的报价为10卢比。
如果您感兴趣,请告诉我们,我们将安排相关手续。
很好的解释。非常感谢。
很高兴你喜欢它!!