×

带Arduino Uno的I2C 16x2 LCD接口(仅4线)

消耗积分:0 | 格式:zip | 大小:0.97 MB | 2022-10-18

李鸿

分享资料个

描述

与 Arduino Uno 接口 I2C 16x2 LCD

在本文中,我将连接 16x2 I2C LCD 与 Arduino Uno。在我之前的文章中讨论了 16x2 LCD 与 Arduino Uno 的接口区别在于电线的数量。我们需要超过 12 根电线。但这里只使用 4 根线。如何 ?!!!!!!在我使用并行通信方法将 LCD 与 Arduino 连接之前。但现在我正在使用 I2C 通信。

这个怎么运作 ?

这里我使用了我之前文章中相同的 16X2 LCD。但另外将 I2C 模块连接到 16x2 LCD。它充当 LCD 和 MCU(此处为 Arduino)之间的中介。

在开始之前,您必须了解 I2C 串行接口适配器(I2C 模块)I2C 通信I2C LCD 的地址

I2C 通信

introduction-to-i2c-data-transmission-diagram-data-frame_0jawVJbo0r.png?auto=compress%2Cformat&w=740&h=555&fit=max
I2C 通信
 

I2C 是 Inter-IC 的缩写。它是一种BUS。这是飞利浦半导体设计的。I2C 是一种同步、多从机、多主机分组交换、单端串行总线。IE。多个芯片可以连接到同一总线。I2C 仅使用两条双向开集或开漏线,串行数据线(SDA)和串行时钟线(SCL),通过电阻上拉。使用的典型电压为 +5 V 或 +3.3 V,但允许使用其他电压的系统。有关 I2C 协议的更多信息,请单击此处

I2C 串行接口适配器

ic2_serial_interface_lcd_module_1_1_1_(1)_T2vWMivPjD.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
I2C 串行接口适配器
 

它也被称为 I2C 模块。它共有 20 个公插针。16 个引脚面向后侧,4 个引脚面向前侧。用于连接 16x2 LCD 的 16 个引脚,4 个引脚中的 2 个引脚是 SDA 和 SCL。SDA 是串行数据引脚,SCL 是时钟引脚。其余 2 个引脚用于电源(Vcc 和接地)。I2C 模块上有一个 POT。我们可以通过旋转这个 POT 来控制 LCD 显示屏的对比度。并且模块上固定有一个跳线。当我们移除跳线时,LCD 显示屏的背光将熄灭。

I2C LCD地址

在开始之前,我们需要了解 I2C 设备的寻址。每个可以连接到 MCU 的设备都有一个地址。我们需要知道这个地址才能与该特定设备进行通信。

您可以在 I2C 模块上看到三个焊盘。标记为 A0、A1 和 A2。这是地址选择器。即,每个焊盘具有一个上部分和一个下部分。如果上药水与下药水之间存在连接,则称为“已连接”,否则称为“未连接”。当 A0、A1、A2 处于“未连接”状态(A0 = 0、A1 = 0、A2 = 0)时,地址将为 0x27。默认情况下,A0、A1、A2 处于“未连接”状态。有时默认地址是0x3F。当我们只使用一个 LCD 时,无需更改 I2C 模块的地址。但是当我们使用多个 LCD 时,需要更改地址。因为两个或多个不同的设备不能与同一个地址通信。

i2c_adress_table_DZwgPNt9oR.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
 

步骤1

如果您已经知道 LCD 的地址,请跳过此步骤 - 1 和步骤 -2

在某些情况下A0、A1、A2处于“未连接”状态,但地址不是0x27。我们无法与此地址通信。所以我们需要找到那个设备的原始地址。为此,我们需要使用“I2C 扫描仪”代码运行 Arduino。

I2C 扫描器代码

I2C Scanner 代码用于查找 I2C 设备的数量和 I2C 设备的地址。首先添加包含“Wire.h”库的头文件。然后在设置部分,通过“Wire.begin()”开始“Wire”库。然后通过“Serial.begin()”以 9600 的波特率启动串行监视器。接下来在循环部分,定义两个数据类型为“byte”的变量,分别命名为“error”和“address”。然后使用名为“Devices”的“Integer (int)”数据类型定义另一个变量。并将初始值设置为 0。接下来开始一个 for 循环,最小值为 1,最大值为 127。“地址”用作循环变量。接下来使用函数“Wire.beginTransmission()”输入要连接的地址。i2c_scanner 使用“Write. 然后仅当地址<16 时才将特定地址打印到串行监视器。这里我们以十六进制打印地址。打印指令为“Serial.print(address, HEX)”。并计算设备。然后仅当地址<16 时才将特定地址打印到串行监视器。这里我们以十六进制打印地址。打印指令为“Serial.print(address, HEX)”。并计算设备。完整的 I2C 扫描仪代码如下所示

#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, 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\n");
else
Serial.println("done\n");
delay(5000);          
}

将 I2C 扫描仪代码上传到 Arduino Uno。

第2步

如果您有 I2C LCD,请跳过此步骤。但如果您有 16x2 LCD 和 I2C 模块,请参阅将此模块连接到 LCD 的步骤。

联系

首先焊接 I2C 模块。I2C 模块上没有用于连接 16x2 LCD 的标签。所以在下面给出的图像的帮助下焊接它

i2clcd_1oCPuO9l9f.png?auto=compress%2Cformat&w=740&h=555&fit=max
16x2 LCD 上的 I2C 模块
 

焊接后将 I2C 模块连接到 Arduino Uno。

Arduino Uno I2C 模块

模拟引脚 4 - SDA

模拟引脚 5 - SCL

5V - Vcc

地 - 地

将 Arduino 连接到计算机。

接下来从 Arduino IDE 右上角的图标打开串行监视器。并将波特率设置为9600。请确保端口正确。然后您可以在串行监视器中看到 LCD 的地址,如下所示

i2c_lcd_(2)_pn4Y4HF7c5.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
 
最后我们找到I2C LCD的地址。那是 0x27

步骤 - 3

接下来我将在我们的 I2C LCD 上显示一个文本。

在此之前需要向 Arduino IDE 添加一个库。转到链接 并下载库 Arduino-LiquidCrystal-I2C-library。然后打开 Arduino IDE 并转到Sketch>Include Library> Add.ZIP Library 接下来选择下载的 ZIP 文件并单击打开。

第4步

接下来创建草图。首先,我包含标题“Wire.h”。该库有助于与 I2C 设备进行通信。然后包括“LiquidCrystal_I2C.h”以更好地与显示器通信。

#include  
#include 

步骤 - 5

接下来使用函数“LiquidCrystal_I2C lcd() 设置地址、列数和行数。地址为 0x27(使用 I2C Scanner Code 发现)。列数为 16,行数为 2。之后,我们可以使用“lcd”调用显示器。您也可以将多个 I2C LCD 与 Arduino Uno 一起使用。但为每个显示器设置不同的地址和变量。

LiquidCrystal_I2C lcd(0x27, 16, 2);

步骤 - 6

接下来对设置部分进行编码。首先使用函数“lcd.begin()”初始化显示。如果你有另一个显示器初始化它们。

lcd.begin();

步骤 - 7

接下来使用函数“lcd.backlight()”打开背光。

lcd.backlight();

步骤 - 8

接下来使用指令“lcd.clear()”清除 lcd。然后将光标设置到位置 (4, 0)。

lcd.clear();
lcd.setCursor(4,0);

步骤 - 9

现在 LCD 已准备好打印。光标位于第 4 列(从 0 开始计数)和第 0 行(从 0 开始计数)。然后通过函数“lcd.print()”打印消息“Hackster”。

lcd.print("Hackster");

然后将循环部分留空。

编程完成。将草图上传到 Arduino 并在 LCD 上查看消息。 完整的代码在本文的代码部分给出

请不要复制粘贴我的代码。尝试逐行理解代码并创建自己的草图。

您可以在这里加入我们的电报群或搜索 INNOVATION。对硬件或编程有任何疑问,请随时在我们的电报群中提问。

跟着我,

Instagram :五伏特玩家

联系方式:akshayjoseph666@gmail.com

在评论框中分享您的经验和建议。

以前的文章:

与 Arduino Uno 接口 16x2 LCD(并行接口)非接触式门铃、与 Arduino Uno接口蓝牙模块 (HC-05)、自动水龙头、自动洗手液、与 Arduino Uno 接口超声波传感器、与 Arduino Uno 和按钮控制伺服电机、带有 Arduino Uno 和 POT 的控制伺服电机,带有 Arduino Uno 的伺服电机接口,具有保存先前状态的红外控制家用电器,非接触式洗手定时器


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'带Arduino Uno的I2C 16x2 LCD接口(仅4线)',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);