0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在Arduino上使用八个大型红色LED而不需要放弃8个输出引脚

454398 来源:网络整理 作者:网络整理 2019-11-27 16:21 次阅读

概述

在本课程中,您将学习如何在Arduino上使用八个大型红色LED而不需要放弃8个输出引脚!

如何在Arduino上使用八个大型红色LED而不需要放弃8个输出引脚

尽管您可以将八个LED分别连接一个Arduino引脚上的电阻(就像我们在第2课中对RGB LED所做的那样),您很快就会开始用尽Arduino上的引脚。如果您没有与duino连接的东西很多,则可以这样做-但通常我们需要按钮,传感器,伺服器等,在您不知道它的情况下,您就没有管脚了。因此,您将使用名为 74HC595串行到并行转换器芯片,而不是这样做。该芯片具有八个输出(完美)和三个输入,可用于一次将数据馈入其中。

该芯片使驱动LED的速度稍慢一些(您每秒只能将LED更换大约500,000次,而不是每秒8,000,000次),但它的确非常快,比人类可以检测到的速度还要快,所以值得!

零件

要构建本课中描述的项目,您将需要以下零件。

零件 数量

5mm红色LED 8

270电阻(红色,紫色,棕色条纹) 8

74HC595移位寄存器

1

半面包板 1

Arduino Uno R3 1

跳线束 1

面包板布局

由于我们要连接八个LED和八个电阻,因此实际上需要进行很多连接。

将74HC595芯片放在第一位可能是最容易的,因为几乎所有其他东西都可以连接对此。如此放置,以使小U形槽口朝向面包板的顶部。芯片的引脚1位于该凹口的左侧。

arduino的数字4进入移位寄存器的引脚14

arduino的数字5进入移位寄存器的引脚12

来自arduino的数字6进入移位寄存器的#11引脚

除了‘595的所有输出之一,所有输出都位于芯片的左侧,因此,为了便于连接,

在芯片之后,将电阻器放置到位。您需要小心,不要使电阻的引线相互接触。在将电源连接到Arduino之前,应该再次检查这一点。如果发现很难在不接触引线的情况下布置电阻器,则有助于缩短引线,使其更靠近面包板的表面。然后,将LED放在面包板上。

更长的正极LED引线必须全部朝向芯片,无论面包板位于面包板的哪一侧。

现在仅需连接跳线,如上所示。不要忘了从IC的引脚8到面包板GND列的引脚。

稍后加载列出的草图并尝试一下。每个LED都应依次点亮,直到所有LED都点亮,然后它们都熄灭并重复该循环。

74HC595移位寄存器

在阅读代码之前,让我们快速看一下芯片的功能,以便我们可以理解代码的功能。

该芯片属于一种移位寄存器。

移位寄存器可保存八个存储单元,每个存储单元可以是1或0。

设置每个存储单元这些值的开或关,我们使用芯片的“数据”和“时钟”引脚输入数据。

时钟引脚需要接收八个脉冲。在每个脉冲时,如果数据引脚为高电平,则将1压入移位寄存器。否则,它为0。当接收到所有八个脉冲时,然后启用“锁存”引脚会将这八个值复制到锁存寄存器。这是必要的,否则当将数据加载到移位寄存器中时,错误的LED会闪烁。该芯片还具有OE(输出使能)引脚,该引脚用于一次启用或禁用所有输出。您可以将其连接到具有PWM功能的Arduino引脚,并使用“ analogWrite”控制LED的亮度。该引脚为低电平有效,因此我们将其连接至GND。

Arduino代码

Arduino包含一个名为“ shiftOut”的特殊功能,该功能专门用于将数据发送到移位寄存器。

这是完整的草图,

下载:文件

复制代码

/*

Adafruit Arduino - Lesson 4. 8 LEDs and a Shift Register

*/

int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

byte leds = 0;

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

}

void loop()

{

leds = 0;

updateShiftRegister();

delay(500);

for (int i = 0; i 《 8; i++)

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

}

void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

} /*

Adafruit Arduino - Lesson 4. 8 LEDs and a Shift Register

*/

int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

byte leds = 0;

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

}

void loop()

{

leds = 0;

updateShiftRegister();

delay(500);

for (int i = 0; i 《 8; i++)

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

}

void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

}

我们要做的第一件事是定义将要使用的三个引脚。这些是Arduino数字输出,将连接到74HC595的锁存器,时钟和数据引脚。

下载:file

复制代码

int latchPin = 5;

int clockPin = 6;

int dataPin = 4; int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

接下来,定义了一个名为“ leds”的变量。这将用于保持当前打开或关闭LED的模式。 “字节”类型的数据表示使用八位数字。每个位都可以打开或关闭,因此非常适合跟踪我们八个LED中的哪个打开或关闭。

下载:文件

复制代码

byte leds = 0; byte leds = 0;

“设置”功能仅设置了我们正在使用的三个引脚

下载:文件

复制代码

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

} void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

}

“循环”功能最初通过将变量“ leds”的值设置为0来关闭所有LED。然后调用“ updateShiftRegister”发送“ leds” ’模式到移位寄存器,以便所有LED熄灭。稍后我们将处理‘updateShiftRegister’的工作方式。

循环功能暂停半秒钟,然后使用‘for’循环和变量‘i’从0到7开始计数。每次,它使用Arduino函数‘bitSet’来设置控制变量‘leds’中的LED的位。然后它还会调用‘updateShiftRegister’,以便leds更新以反映变量‘leds’中的内容。

然后,在‘i’递增之前,有半秒的延迟,下一个LED点亮。

下载:文件

复制代码

void loop()

{

leds = 0;

updateShiftRegister();

delay(500);

for (int i = 0; i 《 8; i++)

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

} void loop()

{

leds = 0;

updateShiftRegister();

delay(500);

for (int i = 0; i 《 8; i++)

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

}

函数‘updateShiftRegister’首先将LatchPin设置为低电平,然后在再次将‘latchPin’置于高电平之前调用Arduino函数‘shiftOut’。它有四个参数,前两个是分别用于数据和时钟的引脚。

第三个参数指定要从哪个数据端开始。我们将从最右边的位开始,这就是所谓的“最低有效位”(LSB)。

最后一个参数是要移入移位寄存器的实际数据。

下载:文件

复制代码

void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

} void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

}

如果要关闭而不是打开LED之一,则可以在“ leds”变量上调用类似的Arduino函数(bitClear) 。这会将“ leds”的位设置为0,然后您只需跟随它调用“ updateShiftRegister”即可更新实际的LED。

亮度控制

我未提到的74HC595的一个引脚是称为“输出使能”的引脚。这是针脚13,在面包板上,它永久接地。该引脚用作开关,可以启用或禁用输出-唯一需要注意的是它是“低电平有效”(接地以启用)。因此,如果将其连接到5V,则所有输出均关闭。而如果将其接地,则应该打开的那些输出打开,应该关闭的那些输出关闭。

我们可以将此引脚与“ analogWrite”功能一起使用,我们在第3课中使用了该功能。 ,以使用PWM控制LED的亮度(另请参阅第3课)。

要做的是,更改与74HC595引脚13的连接,以代替将其接地,将其连接到Arduino的引脚3。

下面的草图将在所有LED点亮后逐渐将它们逐渐熄灭。

下载:文件

复制代码

/*

Adafruit Arduino - Lesson 4. 8 LEDs and a Shift Register - Brightness

*/

int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

int outputEnablePin = 3;

byte leds = 0;

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

pinMode(outputEnablePin, OUTPUT);

}

void loop()

{

setBrightness(255);

leds = 0;

updateShiftRegister();

delay(500);

for (int i = 0; i 《 8; i++)

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

for (byte b = 255; b 》 0; b--)

{

setBrightness(b);

delay(50);

}

}

void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

}

void setBrightness(byte brightness) // 0 to 255

{

analogWrite(outputEnablePin, 255-brightness);

}

/*

Adafruit Arduino - Lesson 4. 8 LEDs and a Shift Register - Brightness

*/

int latchPin = 5;

int clockPin = 6;

int dataPin = 4;

int outputEnablePin = 3;

byte leds = 0;

void setup()

{

pinMode(latchPin, OUTPUT);

pinMode(dataPin, OUTPUT);

pinMode(clockPin, OUTPUT);

pinMode(outputEnablePin, OUTPUT);

}

void loop()

{

setBrightness(255);

leds = 0;

updateShiftRegister();

delay(500);

for (int i = 0; i 《 8; i++)

{

bitSet(leds, i);

updateShiftRegister();

delay(500);

}

for (byte b = 255; b 》 0; b--)

{

setBrightness(b);

delay(50);

}

}

void updateShiftRegister()

{

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, LSBFIRST, leds);

digitalWrite(latchPin, HIGH);

}

void setBrightness(byte brightness) // 0 to 255

{

analogWrite(outputEnablePin, 255-brightness);

}

其他要做的事情

一旦您知道如何使用74HC595,那么使用许多LED可以做很多事情。您可以尝试以下操作:

制作“ Larson Scanner”扫描灯,就像在电视连续剧《骑士骑士》中KITT的前部以及在《 Battle Start Galactica》系列中的Cylons上那样。 li》

制作电子骰子。将6个LED排列为两列,每列三个LED,中间一个LED。提示–看一下称为“随机”的Arduino函数。

74HC595的一大优点是,您可以通过菊花链式连接它们以增加数量。您可以控制的LED。有关74HC595的更高级用法的其他指导,请查看使用‘shiftOut’的Arduino官方文档http://arduino.cc/zh/Tutorial/ShiftOut

责任编辑:wv

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

    关注

    237

    文章

    22420

    浏览量

    645782
  • Arduino
    +关注

    关注

    184

    文章

    6425

    浏览量

    184769
收藏 人收藏

    评论

    相关推荐

    L6235Q VREF引脚要是不需要tacho测速功能需要怎么接?

    这个L6235Q VREF引脚要是不需要tacho测速功能需要怎么接,看数据手册好像是说PWM电流控制器参考电压,最小值为-0.1V,最大值为5V,设计时应该怎
    发表于 03-28 08:17

    CY8C4146内部集成了WCO模块,这种情况下是不是不需要再去接一外部晶振?

    CY8C4146内部集成了WCO模块,这种情况下是不是不需要再去接一外部晶振?
    发表于 02-21 06:44

    求助,关于高速ADC-AD9239多通道同步的问题

    每次电后结果都不一样,有时可以完全对齐,有时八个通道之间有很大差别。 当八个通道各自都对齐到测试模版时(不管八个通道之间的SKEW),按照手册
    发表于 12-13 09:17

    使用AD2428不需要对总线供电,剩下的VSSN和SWP和sense引脚如何处理?

    你好, 我现在使用AD2428,不需要对总线供电,剩下的VSSN和 SWP和sense引脚如何处理? 下面示意图中的采用了本地供电后,master应该就应该没有总线电源过来了,红色框中直流通路代表的是什么?
    发表于 11-28 08:01

    求助,有没有不需要单片机直接在外部引脚加高低电平就能输出预定信号的锁相环芯片?

    有没有不需要单片机直接在外部引脚加高低电平就能输出预定信号的锁相环芯片?
    发表于 11-16 08:23

    dc2042a这是一不需要电源的设备吗?

    你好: 我想咨询一下,dc2042a 这是一不需要电源的设备吗?可以将较小的电压(20mv) (20mv)的电压提升至5V?其中原理是什么呢,对于输入电流有要求吗?因为按照能量守恒,如果没有电源输入,功率应该不变。
    发表于 11-16 07:48

    为什么51的P0口是8引脚

    为什么51的P0口是8引脚,P1口也是8引脚,为什么都是
    发表于 11-01 07:51

    完全不需要电解电容的LED驱动方案资料详情

    电子发烧友网站提供《完全不需要电解电容的LED驱动方案资料详情.rar》资料免费下载
    发表于 10-31 10:22 0次下载
    完全<b class='flag-5'>不需要</b>电解电容的<b class='flag-5'>LED</b>驱动方案资料详情

    芯片的od门与oc门输出管脚不需要上拉电阻吗?

    芯片的od门与oc门输出管脚不需要上拉电阻吗?  介绍od门与oc门的工作原理以及是否需要上拉电阻。 OD门和OC门是数字逻辑电路中经常使用的两种逻辑门电路。它们都是用来控制输出状态的
    的头像 发表于 09-12 11:18 1903次阅读

    何在8x8 LED点矩阵屏幕滚动文本

    。 在这种情况下, LED 屏幕需要能够滚动到文本中 。 此样本代码主要用于演示如何在 8x8 LED 点矩阵屏幕
    发表于 09-01 06:15

    如何使用WeMos D1 Mini控制12个大型共阴极7段显示器?

    我正在使用 WeMos D1 Mini 控制 12 个大型共阴极 7 段显示器(实际是 6 红色和绿色显示器)。我买的人说他们可以用 5v 或 12v 和 100-330ohm 电
    发表于 06-07 06:03

    为什么NodeMCU不需要外部电源来闪烁裸机ESP***-E需要它?

    为什么 NodeMCU 不需要外部电源来闪烁裸机 ESP***-E 需要它? 是因为USB转串口转换器吗?
    发表于 05-31 06:57

    何在Arduino和ESP构建按钮输入的提示?

    好的,伙计们,这只是关于我如何在 Arduino 和 ESP 构建按钮输入的提示。 如果你看一下大多数键盘,它们就像矩阵一样构建: keypad_pin_diagram.png 12
    发表于 05-25 08:15

    arduino何在python中执行特定的引脚和通道?

    设备:ESP8266 板,CD74HC4067 16 通道多路复用器 代码平台:micropython 在 RPi 使用 Thonny 通过 USB 电缆传输。 项目目标:16 单独的光敏电阻来
    发表于 05-11 08:39

    为什么正激变换器必需要滤波电感,反激式变换器不需要

    为什么正激变换器必需要滤波电感,反激式变换器不需要
    发表于 04-25 09:55