该项目主要是为带有移位寄存器的发光二极管立方体(4*4)编写代码,为立方体创造不同的模式。
硬件组件:
arduino nano r3
移位寄存器75hc595
瞬时按钮开关
发光二极管
4*4立方体:
该立方体有16条腿和4排的立方体。les s把这些行叫做层。如何将这16条支路连接到arduino而不占用其所有引脚的最简单方法是使用移位寄存器75hc595。
(移位寄存器75hc595)
将立方体的前8个引脚(1-8)连接到第一个移位寄存器(引脚q0-q7),并将其他8个引脚(9-16)连接到另一个引脚,如俯视图中的表格所示:
(俯视立方体的腿)
下一步是用arduino连接移位寄存器的引脚,如下所示:
引脚8(两个移位寄存器/ gnd)至阿尔杜伊诺的接地引脚
第一移位寄存器的引脚9 (q7)至第二移位寄存器的引脚14(数据)
引脚10(两个移位寄存器/复位)至arduino的引脚8
引脚11(两个移位寄存器/时钟)至arduino的引脚9
引脚12(两个移位寄存器/锁存器)至arduino的引脚10
引脚14(第一个移位寄存器/数据)至arduino的引脚11
引脚16(两个移位寄存器/ vcc)至arduino的5v引脚
最后一步是用arduino连接立方体的层:
引脚4 -第0层(通过100欧姆电阻)
引脚5 -第1层(通过100欧姆电阻)
引脚6 -第2层(通过100欧姆电阻)
引脚7 -第3层(通过100欧姆电阻)
(立方体的底部)
控制led:
一层中的每个led都由一个数字表示,如下表所示:
(打开指示灯的值)
所以要打开图层第二行的第二个led,就会设置layer = 32。要打开前两个led,layer = 1 + 2 = 3。要打开第一行led,layer = 1 + 2 + 4 + 8 = 15。
如果想将循环中的光穿过层中的所有led,在第一步中,设置layer=b000000000000001=1,然后在循环中,将通过设置layer=layer《《1来移动该位。或者可以设置layer=(1《《count)并在循环中增加“count”。
主回路:
当知道如何在一层中设置led时,想要控制4层。虽然只能向我们的2个移位寄存器发送关于1层的信息,但使用arduino的主循环来非常快速地打开和关闭循环中的层,它们将在同一时刻全部改变。显示图层值的代码非常简单:
setshiftreg(layer[k]); //将层数据发送到移位寄存器
bitclear(portd, 4 + k); //启用“层k”
delay(1); //对led亮度很重要
portd |= b11110000; //关闭图层
k++; if (k 》 3) k = 0; //在循环中再增加一层
在该项目中,使用按钮(与接地和arduino的引脚2连接)来改变创建的模式。按下按钮设置“开始”。这个开始采用并初始化下一个模式。
然后,循环在“速度时间”值中设置的每一个时间(以毫秒为单位)后启动选定的模式。
关于主循环和按钮的标签:
#define buttonpin 2
unsigned int layer[4] = {0, 0, 0, 0}; //65535填充层
byte k = 0;
bool start = true;
unsigned long delaytime;
int speedtime = 0;
int count;
void setup() {
initializeshiftreg();
initializemyledcube();
}
void initializemyledcube() {
ddrd = b11110000; //引脚d0-d3作为输入,d4-d7作为输出
portd |= b11110000; //关闭图层
pinmode(buttonpin, input_pullup);
attachinterrupt(digitalpintointerrupt(buttonpin), pushbutton, falling);
delaytime = millis();
}
byte patternnum = 28;
byte pattern = patternnum - 1;
void loop() {
if (start) {
detachinterrupt(digitalpintointerrupt(buttonpin));
delay(500); //等待释放按钮
pattern++;
if (pattern 》 patternnum) pattern = 1;
attachinterrupt(digitalpintointerrupt(buttonpin), pushbutton, falling);
count = 0;
}
if (((millis() - delaytime) 》 speedtime) || start) {
switch (pattern) {
case 1: layersupdown(); break;
case 2: fallingdot(); break;
case 3: rain(); break;
case 4: allcube(); break;
case 5: cut(); break;
case 6: cube(); break;
case 7: diagonal(); break;
case 8: mixer(); break;
case 9: random(); break;
case 10: fallinglayer(); break;
case 11: layercut(); break;
case 12: circle(); break;
case 13: randomway(); break;
case 14: smallcube(); break;
case 15: randomwaycube(); break;
case 16: growingcube(); break;
case 17: fallinglayers(); break;
case 18: growingline(); break;
case 19: circleedges(); break;
case 20: circleside(); break;
case 21: randomwayline(); break;
case 22: randomwayside(); break;
case 23: djcube(); break;
case 24: fillingcube(); break;
case 25: nanobuilding(); break;
case 26: curve(); break;
case 27: snake(); break;
case 28: julka(); break;
default: break;
}
delaytime = millis();
}
//此部分显示在函数中设置的图层
setshiftreg(layer[k]); //将层数据发送到移位寄存器
bitclear(portd, 4 + k); //启用“层k”
delay(1); //对led亮度很重要
portd |= b11110000; //关闭图层
k++; if (k 》 3) k = 0; //在循环中再增加一层
}
void pushbutton() {
start = true;
}
“移位寄存器”标签:
#define latchpin 10 //端口 b2
#define clockpin 9 //端口 b1
#define datapin 11 //端口b3
#define resetpin 8 //端口 b0
void initializeshiftreg() {
ddrb |= b1111; //引脚d8-d11作为输出
portb |= b0001; //将引脚重置为高
}
void setshiftreg(unsigned int value) {
bitclear(portb, 2); //数字写入(latchpin, low);
shiftout(datapin, clockpin, msbfirst, value 》》 8);
shiftout(datapin, clockpin, msbfirst, value);
bitset(portb, 2); //数字写入(latchpin, high);
}
创建模式:
每次在“速度时间”值中设置模式的开始后,arduino的主循环都会启动选定的模式。换句话说,一个模式的函数总是只改变一次层,但是主循环会重复多次。
以rain()模式为例:
void rain() {
if (start) {
start = false; speedtime = 200;
clearlayers();
}
layer[0] = layer[1];
layer[1] = layer[2];
layer[2] = layer[3];
layer[3] = 1 《《 random(16);
}
只有当打开模式时,“开始”部分才会启动一次。它设置速度时间并关闭所有led。然后,总是随机打开顶层16个led中的一个,在这个循环中,把它移到底层。
浅谈无线温湿度监测系统及当前使用领域
敏芯股份:MEMS芯片的制造工艺和集成电路芯片完全不同
未来自动驾驶汽车产业市场将最终成为谁的主场?
深入探讨车市现状及未来发展方向
如何选购选择好高档LED液晶电视
基于移位寄存器的发光二极管立方体(4*4)编写代码
中航光电新型片式大电流连接器特性
怎么样才能挑选到何时的笔记本处理器?首先要弄清楚参数
区块链将会怎样影响我们生活的方方面面
高通骁龙LTE调制解调器层级现支持的芯片组介绍
FIR及IIR滤波器的FPGA设计实现方案
5G应用于轨道交通领域目前最主要问题在于功耗
博通并购高通,高通苹果的官司有望提前解决
Q-FOG循环腐蚀盐雾箱需要满足哪些测试要求
Intel量产32nm工艺技术的回顾
迈动互联中标浪潮元宇宙项目
iphone8什么时候上市?iphone8最新消息:iphone8最新功能曝光,3D扫描人脸识别+OLED全面屏,你期待吗?
首款数控DC-DC转换器SC493,可满足电源管理需求
十大超酷产品登场 CES大展开幕 让你大开眼界 (图)
2009年5月照明级LED规格探讨