MỤC LỤC
LỜI NHẬN XÉT CỦA GIẢNG VIÊN......................................................................i
LỜI NÓI ĐẦU..........................................................................................................................ii
LỜI CÁM ƠN ..........................................................................................................................iii
CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI .........................................................................1
1.1 Lí do chọn đề tài ............................................................................................................1
1.2 Giới thiệu sơ lược các linh kiện chính .............................................................................2
1.2.1 Board mạch Arduino Uno R3 ................................................................................2
a. Thơng số kỹ thuật của Arduino Uno R3...............................................................2
b. Vi điều khiển của Arduino Uno R3......................................................................3
c. Các chân năng lượng của Arduino Uno R3..........................................................3
d. Cổng vào/ ra của Arduino Uno R3 ......................................................................5
e. Giới thiệu phần mềm Arduino IDE .....................................................................6
1.2.2 IC 74HC595 ..........................................................................................................7
1.2.3 Transistor 2N2222 .................................................................................................8
CHƯƠNG 2: THIẾT KẾ, LẬP TRÌNH VÀ LẮP ĐẶT ...............................9
2.1 Linh kiện khối LED Cube ................................................................................................9
2.2 Sơ đồ nguyên lý và mạch in ...........................................................................................10
2.2.1 Sơ đồ nguyên lý....................................................................................................10
2.2.2 Mạch in ................................................................................................................11
2.4 Hình ảnh thi cơng mạch ................................................................................................12
2.3 Lập trình cho mạch........................................................................................................16
KẾT LUẬN, TÀI LIỆU THAM KHẢO................................................................33
LỜI NHẬN XÉT CỦA GIẢNG VIÊN
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
LỜI NÓI ĐẦU
---Ngày nay, trong lĩnh vực chiếu sáng và quảng cáo, đèn LED đã và đang đóng vai
trị quan trọng, đáp ứng được nhu cầu cho các công ty, doanh nghiệp, của hàng,.. LED đã
và đang được dùng để chế tạo các bảng quảng cáo, vì sự đơn giản, hiện đại và bắt mắt của
nó. Những bảng thơng tin, bảng chào hay những bảng quảng cáo với màu sắc rực rở, gây
nhiều chú ý chắc hẳn đã khơng cịn xa lạ đối với mọi người nữa, nhất là đối với thành phố
chúng ta. Hơn hẳn các bảng quảng cáo LED đơn 2D thông thường, 3D là công nghệ tiên
tiến hơn. Thể hiện được các hiệu ứng phức tạp, phong phú và vô cùng đẹp mắt. Là cả một
thử thách thật sự đối với những ai muốn làm nó. Khơng chỉ vì sự phức tạp ở những hiệu
ứng, mà cịn ở sự linh động của nó, có thể thây đổi hiệu ứng một cách linh hoạt sao cho
phù hợp với nhu cầu của khách hàng.
Mơ hình LED cube 8x8x8 mơ tả được đầy đủ những tính năng trên. Qua những con
LED đơn thuần mà ta có thể phát triển thành một khối LED với không gian 3 chiều. Được
tạo bởi 512 con LED, tùy thuộc vào ý thích và khả năng sáng tạo của mỗi người mà chọn
màu sắc của LED khác nhau.
Trong khuôn khổ đồ án môn học lần này, em đã tập trung nghiên cứu tiến hành thiết
kế và thi cơng mạch, để hồn thành mơ hình LED CUBE 3D.
LỜI CÁM ƠN
---Đầu tiên, em xin gữi lời cám ơn chân thành đến Ban Giám Hiệu trường AAAAAA đã cho
em một mơi trường học tập rất tốt, để em có thể phát huy hết những khả năng của mình. Em xin
chân thành cám ơn các Thầy/Cô thuộc khoa Điện - Điện Tử đã tận tình chỉ dạy và truyền đạt
những kiến thức qúy báu của mình để em có thể ứng dụng vào trong q trình hồn thành đồ án
này.
Em xin bầy tỏ lòng biết ơn sâu sắc đến thầy AAAAAAAA là người đã tận tình hướng dẫn
và chỉ bảo em trong suất quá trình làm đồ án. Khi em gặp khó khăn thì thầy đã nhiệt tình phân tích
và chỉ dẫn hướng giải quyết cho em. Em xin trọng cám ơn thầy. Để hoàn thành đồ án này cũng có
sự đống góp khơng nhỏ của các bạn. Tơi xin được gởi lời cảm ơn chân thành đến tất cả các bạn.
Cuối cùng không thể không nhắc đến công lao của những người thân xung quanh đã giúp đỡ về vật
chất và tinh thần để em có thể hồn thành đồ án một cách thuận lợi.
CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI
1.1 Lý Do Chọn Đề Tài
- Thiết thực, có tính ứng dụng cao, áp dụng được kiến thức đã học. Trong thời đại hiện nay, các
ứng dụng vi điều khiển ngày càng nhiều và phổ biến, rộng rãi trong nhiều nghành, lĩnh vực khác
nhau như công nghiệp, nông nghiệp, y học… Một trong những ứng dụng mà ta có thể dễ dàng bắt
gặp hằng ngày là hình thức thơng tin quảng cáo bằng bảng led điện tử, quang báo. Với thiết kế độc
đáo và mới lạ, sản phẩm khối LED 3D chắc chắn sẽ làm bạn thích thú. LED 3D có cấu trúc dạng
khối 3 chiều với nhiều kích thước khác nhau sẽ giúp bạn truyền tải được những nội dung vô cùng
phong phú mà bạn khó có thể nói được bằng lời.
- Hiển thị các hiệu ứng từ đơn giản đến phức tạp với nhiều kiểu phong phú, đẹp mắt
- Có khả năng hiển thị chữ, hình ảnh theo dạng 2 chiều và 3 chiều sinh động và khác biệt so với
cách thông thường.
- Có phần mềm mơ phỏng hỗ trợ tối đa người dùng thiết kế ra những ý tưởng cho riêng mình.
- Có khả năng thay đổi nội dung theo yêu cầu. Với những ưu điểm như trên, khối LED 3D được
thiết kế ra để làm quà tặng, lưu niệm, trang trí, quảng cáo. Thích hợp đặt tại các cửa hàng trang trí
nội thất, quán Cafe, Karaoke tạo cảm giác mới lạ và đẹp mắt... Trong khuôn khổ đồ án này, em xin
trình bày thiết kế mạch LED 3D kích thước 8x8x8 sử dụng vi điều khiển Arduino Uno.
1.2 Giới Thiệu Sơ Lược Các Linh Kiện Chính
1.2.1 Board mạch Arduino Uno R3
a. Thông số kỹ thuật của Arduino Uno R3
Vi điều khiển
Điện áp hoạt động
ATmega328 họ 8bit
5V DC (chỉ được cấp qua cổng
USB)
Tần số hoạt động
16 MHz
Dòng tiêu thụ
khoảng 30mA
Điện áp vào khuyên dùng
7-12V DC
Điện áp vào giới hạn
6-20V DC
Số chân Digital I/O
14 (6 chân hardware PWM)
Số chân Analog
Dòng tối đa trên mỗi chân
I/O
6 (độ phân giải 10bit)
Dòng ra tối đa (5V)
500 mA
Dòng ra tối đa (3.3V)
50 mA
32 KB (ATmega328) với 0.5KB
dùng bởi bootloader
Bộ nhớ flash
30 mA
SRAM
2 KB (ATmega328)
EEPROM
1 KB (ATmega328)
b. Vi điều khiển của Arduino Uno R3
Arduino UNO có thể sử dụng 3 vi điều khiển họ 8bit AVR là Atmega8,
Atmega168, Atmega328. Chip này có thể xử lí những tác vụ đơn giản như điều khiển
đèn LED nhấp nháy, xử lí tín hiệu cho xe điều khiển từ xa, làm một trạm đo nhiệt độ độ ẩm và hiển thị lên màn hình LCD,…
Nguồn Arduino UNO có thể được cấp nguồn qua: Thông qua cổng USB với mức
điện áp 5v, nguồn ngoài với điện áp khuyên dùng là 7-12V DC và giới hạn là 6-20V.
Thơng thường bạn có thể sử dụng pin 9v để cấp nguồn cho Arduino.
c. Các chân năng lượng của Arduino Uno R3
GND (Ground): Cực âm của nguồn điện cấp cho Arduino UNO. Khi bạn dùng
các thiết bị sử dụng những nguồn điện riêng biệt thì những chân này phải được nối với
nhau.
5V: Cấp điện áp 5V đầu ra. Dòng tối đa cho phép ở chân này là 500mA.
3.3V: Cấp điện áp 3.3V đầu ra. Dòng tối đa cho phép ở chân này là 50mA.
Vin (Voltage Input): Để cấp nguồn ngoài cho Arduino UNO, bạn nối cực dương
của
nguồn
với
chân
này
và
cực
âm
của
nguồn
với
chân
GND.
IO-REF: Điện áp hoạt động của vi điều khiển trên Arduino UNO có thể được đo
ở chân này. Và dĩ nhiên nó ln là 5V. Mặc dù vậy bạn không được lấy nguồn 5V từ
chân này để sử dụng bởi chức năng của nó khơng phải là cấp nguồn.
RESET: Việc nhấn nút Reset trên board để reset vi điều khiển tương đương với
việc chân RESET được nối với GND qua 1 điện trở 10KΩ.
Lưu ý:
• Arduino UNO khơng có bảo vệ khi cắm ngược nguồn vào: Do đó bạn
phải hết sức cẩn thận, kiểm tra các cực âm – dương của nguồn trước khi cấp
cho Arduino UNO. Việc làm chập mạch nguồn vào sẽ làm Arduino không sử
dụng được nữa. Trong thời gian đầu tìm hiểu tốt nhất hãy sử dụng nguồn cấp
qua cổng USB
• Các chân 3.3V và 5V trên Arduino: Là các chân dùng để cấp nguồn ra
cho các thiết bị khác, không phải là các chân cấp nguồn vào. Việc cấp nguồn
sai vị trí có thể làm hỏng board.
• Cấp nguồn: Khi cấp nguồn ngồi khơng qua cổng USB cho Arduino UNO với điện
áp dưới 6V có thể làm hỏng board.
• Cấp điện áp: Khi cấp trên 13V vào chân RESET trên board có thể làm hỏng vi điều
khiển ATmega328.
• Cường độ dòng điện vào/ra: Ở tất cả các chân Digital và Analog của Arduino UNO
nếu vượt quá 200mA sẽ làm hỏng vi điều khiển.
• Cấp điệp áp : Trên 5.5V vào các chân Digital hoặc Analog của Arduino UNO sẽ làm
hỏng vi điều khiển.
• Cường độ dịng điện: Qua một chân Digital hoặc Analog bất kì của Arduino UNO
vượt quá 40mA sẽ làm hỏng vi điều khiển. Do đó nếu không dùng để truyền nhận dữ
liệu, bạn phải mắc một điện trở hạn dịng.
Vi
điều
khiển
Atmega328
tiêu
chuẩn
cung
cấp
cho
người
dùng:
• 32KB bộ nhớ Flash: Những đoạn lệnh bạn lập trình sẽ được lưu trữ trong
bộ nhớ Flash của vi điều khiển. Sẽ có khoảng vài KB trong số này sẽ được
dùng cho bootloader nhưng thường thì ít khi nào phải sử dụng quá 20kb bộ nhớ này.
• 2KB cho SRAM (Static Random Access Memory): Giá trị các biến bạn
khai báo khi lập trình sẽ lưu ở đây. Bạn khai báo càng nhiều biến thì càng cần
nhiều bộ nhớ RAM. Tuy vậy, thực sự thì cũng hiếm khi nào bộ nhớ RAM lại
trở thành thứ mà bạn phải bận tâm. Chú ý: khi mất điện, dữ liệu trên SRAM sẽ bị mất.
• 1KB cho EEPROM (Electrically Eraseble Programmable Read Only Memory):
Tương tự như một chiếc ổ cứng mini – nơi có thể đọc và ghi dữ liệu
vào đây mà không phải lo bị mất khi mất điện giống như dữ liệu trên SRAM.
d. Cổng vào/ra của Arduino Uno R3
Arduino UNO có 14 chân digital dùng để đọc hoặc xuất tín hiệu. Chúng chỉ có 2 mức
điện áp là 0V và 5V với dòng vào/ra tối đa trên mỗi chân là 40mA. Ở mỗi chân đều có
các điện trở pull-up từ được cài đặt ngay trong vi điều khiển ATmega328 (mặc định thì
các điện trở này khơng được kết nối).
Một số chân digital có các chức năng đặc biệt như sau:
• 2 chân Serial: 0 (RX) và 1 (TX) dùng để gửi (transmit – TX) và nhận
(receive – RX) dữ liệu TTL Serial. Arduino Uno có thể giao tiếp với thiết bị
khác thông qua 2 chân này. Kết nối bluetooth thường thấy chính là kết nối
Serial không dây. Nếu không cần giao tiếp Serial, bạn không nên sử dụng 2 Chân này
nếu khơng cần thiết.
• Chân PWM (~): 3, 5, 6, 9, 10, và 11 cho phép bạn xuất ra xung PWM với
độphân giải 8bit (giá trị từ 0 → 28-1 tương ứng với 0V → 5V) bằng hàm
analogWrite(). Nói một cách đơn giản, bạn có thể điều chỉnh được điện áp
ra ở chân này từ mức 0V đến 5V thay vì chỉ cố định ở mức 0V và 5V nhưnhững chân
khác.
• Chân giao tiếp SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Ngoài
các chức năng thơng thường, 4 chân này cịn dùng để truyền phát dữ liệu
bằng giao thức SPI với các thiết bị khác.
• LED 13: Trên Arduino UNO có 1 đèn led màu cam (kí hiệu chữ L). Khi
bấm nút Reset, bạn sẽ thấy đèn này nhấp nháy để báo hiệu. Nó được nối với
chân số 13. Khi chân này được người dùng sử dụng, LED sẽ sáng.
• 6 chân analog (A0 → A5): Cung cấp độ phân giải tín hiệu 10bit (0 → 2101) để đọc giá trị điện áp trong khoảng 0V → 5V.
• Chân AREF: Để đưa vào điện áp tham chiếu khi sử dụng các chân analog.
Tức là nếu bạn cấp điện áp 2.5V vào chân này thì bạn có thể dùng các chân
analog để đo điện áp trong khoảng từ 0V → 2.5V với độ phân giải vẫn là
10bit
• 2 chân A4 (SDA) và A5 (SCL): Hỗ trợ giao tiếp I2C/TWI với các thiết bị
khác.
e. Giới thiệu phần mềm Arduino IDE
Arduino Uno R3 được lập trình dựa trên ngơn ngữ Wiring (đây là một biến thể của
C/C++). Do vậy có thể nói ngơn ngữ lập trình Arduino bắt nguồn từ C/C++ phổ biến
hiện nay do đó rất dễ học, dễ hiểu. Để lập trình cũng như gửi lệnh và nhận tín hiệu từ
mạch Arduino, nhóm phát triển dự án này đã cũng cấp đến cho người dùng một mơi
trường lập trình Arduino được gọi là Arduino IDE (Intergra ted Development
Environment). Gồm các thành phần chính:
• Giao diện
1.2.2 IC GHI DỊCH 74HC595
IC 74HC595 là thanh ghi dịch 8bit kết hợp chốt dữ liệu, đầu vào nối tiếp đầu ra
song song. Chức năng: Thường dùng trong các mạch quét led 7, led matrix…để tiết kiệm
số chân vi điều khiển tối đa (3 chân) . Có thể mở rộng số chân vi điều khiển bao nhiêu
tùy thích mà khơng IC nào làm được bằng việc nối tiếp đầu vào dữ liệu các IC với nhau.
Cấu tạo IC 74HC595
+ Chân 14 (Data pin): Đầu vào dữ liệu nối tiếp. Tại 1 thời điểm xung clock chỉ đưa vào
được 1 bit.
+ Các chân ngõ ra nối ra (QA=>QH): 15, 1, 2, 3, 4, 5, 6, 7
+ Chân 13: Chân cho phép tích cực ở mức thấp. Khi ở mức cao, tất cả các đầu ra của IC
74HC595 trở về trạng thái cao trở, khơng có đầu ra nào được cho phép.
+ Chân 12 (Latch pin): Xung clock chốt dữ liệu. Khi có 1 xung clock tích cực ở sườn
dương thì cho phép xuất dữ liệu trên các chân output. Lưu ý có thể xuất dữ liệu bất cứ lúc
nào.
+ Chân 11 (Shift clock pin): Chân vào xung clock. Khi có 1 xung clock tích cực ở sườn
dương (từ 0 lên 1) thì 1 bit được dịch vào IC.
+ Chân 10: khi chân này ở mức thấp (mức 0) thì dữ liệu bị xóa trên chip.
+ Chân 9 (QH’): chân dữ liệu nối tiếp. Nếu dùng nhiều IC 74HC595 mắc nối tiếp nhau
thì chân này đưa vào đầu vào của con tiếp theo khi đã dịch đủ 8 bit.
+ Chân 8: Chân nối đất GND.
+ Chân 16: Nối nguồn VCC
1.2.3 Transistor 2N2222
Transistor 2N2222 có cấu tạo gồm 3 lớp bán dẫn ghép với nhau thành 2 mối nối P-N,
thuộc loại transistor nghịch NPN. Transistor 2N2222 được sản xuất theo chuẩn TO92, thứ tự
các chân từ trái qua phải: E B C.
Transistor 2N2222 có điện áp giới hạn lên tới Uce = 30V, dòng điện giới hạn
của Transistor 2N2222 Ic = 800mA. Hệ số khuếch đại hFE của Transistor 2N2222 lên đến
75.
Transistor 2N2222 có thể hoạt động ở dải nhiệt độ từ -55 oC ~ 150oC. Transistor 2N2222
là một transistor công suất 500mW, tuy nhiên tần số làm việc cao. Transistor 2N2222 được
sử dụng rỗng rãi trong việc thiết kế mạch khuếch đại cơ bản.
Thông số kỹ thuật:
Model: NPN – TO92
Điện áp cực đại:
VCBO = 60V
VCEO = 30V
VEBO = 5V
Dòng điện cực đại: IC = 800mA
Nhiệt độ làm việc: -55oC ~ 150oC
CHƯƠNG 2: THIẾT KẾ, LẬP TRÌNH VÀ
LẮP ĐẶT
2.1 Linh kiện khối LED Cube
Các linh kiện cần chuẩn bị:
- Boar Arduino Uno R3
- 09 IC 74HC595
- 16 Transistor 2N2222
- 512 bóng LED 5li màu tùy thích (đỏ,xanh lá,xanh dương…)
- 02 bóng LED 5li : 01 xanh, 01 đỏ
- 64 con điện trở 220 Ohm
- 02 Bảng mạch đồng (01 bảng mạch kích thước 15cm x 15cm dùng để làm board điều khiển,
01 bảng mạch kích thước 20cm x 20cm dùng để hàn 64 chân anot và 8 tầng catot của LED)
- 01 nguồn 5V - 5A
- 18 header loại 8pin XH2.54
- 09 dây bus 8
- 01 khuôn hàn LED đục sẵn 64 lỗ gồm 8 hàng, 8 cột: Lỗ cách lỗ 2.5cm (Dùng để cố định và
hàn LED)
- 05 tấm nhựa mica trắng trong, kích thước size A4 (Dùng để làm hộp đựng khối LED cube và
board điều khiển)
- VOM, mỏ hàn, chì,…
2.2 Sơ đồ nguyên lý và mạch in PCB
2.2.1 Sơ đồ nguyên lý
2.2.2 Mạch in
Mạch in board điều khiển
Mạch in board hàn LED
2.3 Hình ảnh thi cơng mạch
Khn hàn LED cube : Đục sẵn 64 lỗ, gồm 8 hàng, 8 cột, lỗ cách nhau 2.5cm
Sau khi đã hàn được một khối LED
Mạch in dùng để gắn các khối LED sau khi đã ủi và ngâm mạch
Sau khi đã hàn 8 khối LED và gắn cố định lên mạch in
Mạch in board điều khiển sau khi đã hàn các linh kiện
Hồn thành sản phẩm
Lập trình cho mạch
Để lập trình cho mạch ta có 2 ngơn ngữ chính đó là ASM và ngơn
ngữ C. Hiện
nay ngơn ngữ C được sử dụng rộng rãi hơn do dễ lập trình hơn và
các dịng lệnh
ngắn hơn so với ASM tiết kiệm bộ nhớ cho vi điều khiển đáng kể.
Có 8 hiệu ứng cho mạch LED cube 8x8x8:
1.
RAIN – Hiệu ứng mưa
2.
PLANE_BOING – Hiệu ứng máy bay
3.
SEND_VOXELS – Hiệu ứng hồ cá
4.
WOOP_WOOP – Hiệu ứng phá vỡ
5.
CUBE_JUMP – Hiệu ứng nhảy
6.
GLOW – Hiệu ứng phát sáng
7.
TEXT – Hiệu ứng đếm số từ 0-9
8.
LIT – Hiệu ứng phát sáng tất cả LED
Sau đây là code của trương trình:
#include <SPI.h>
#define XAXIS 0
#define YAXIS 1
#define ZAXIS 2
#define POS_X 0
#define NEG_X 1
#define POS_Z 2
#define NEG_Z 3
#define POS_Y 4
#define NEG_Y 5
#define BUTTON_PIN 8
#define RED_LED 5
#define GREEN_LED 7
#define TOTAL_EFFECTS 8
#define RAIN 0
#define PLANE_BOING 1
#define SEND_VOXELS 2
#define WOOP_WOOP 3
#define CUBE_JUMP 4
#define GLOW 5
#define TEXT 6
#define LIT 7
#define RAIN_TIME 260
#define PLANE_BOING_TIME 220
#define SEND_VOXELS_TIME 140
#define WOOP_WOOP_TIME 350
#define CUBE_JUMP_TIME 200
#define GLOW_TIME 8
#define TEXT_TIME 300
#define CLOCK_TIME 500
uint8_t characters[10][8] = {
{0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C}, //0
{0x10, 0x18, 0x14, 0x10, 0x10, 0x10, 0x10, 0x3C}, //1
{0x3C, 0x42, 0x40, 0x40, 0x3C, 0x02, 0x02, 0x7E}, //2
{0x3C, 0x40, 0x40, 0x3C, 0x40, 0x40, 0x42, 0x3C}, //3
{0x22, 0x22, 0x22, 0x22, 0x7E, 0x20, 0x20, 0x20}, //4
{0x7E, 0x02, 0x02, 0x3E, 0x40, 0x40, 0x42, 0x3C}, //5
{0x3C, 0x02, 0x02, 0x3E, 0x42, 0x42, 0x42, 0x3C}, //6
{0x3C, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40}, //7
{0x3C, 0x42, 0x42, 0x3C, 0x42, 0x42, 0x42, 0x3C}, //8
{0x3C, 0x42, 0x42, 0x42, 0x3C, 0x40, 0x40, 0x3C}, //9
};
uint8_t cube[8][8];
uint8_t currentEffect;
uint16_t timer;
uint64_t randomTimer;
bool loading;
void setup() {
loading = true;
randomTimer = 0;
currentEffect = RAIN;
SPI.begin();
SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
randomSeed(analogRead(0));
digitalWrite(GREEN_LED, HIGH);
}
void loop() {
randomTimer++;
if (digitalRead(BUTTON_PIN) == LOW) {
clearCube();
loading = true;
timer = 0;
currentEffect++;
if (currentEffect == TOTAL_EFFECTS) {
currentEffect = 0;
}
randomSeed(randomTimer);
randomTimer = 0;
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
delay(500);
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
}
switch (currentEffect) {
case RAIN: rain(); break;
case PLANE_BOING: planeBoing(); break;
case SEND_VOXELS: sendVoxels(); break;
case WOOP_WOOP: woopWoop(); break;
case CUBE_JUMP: cubeJump(); break;
case GLOW: glow(); break;
case TEXT: text("0123456789", 10); break;
case LIT: lit(); break;
default: rain();
}
renderCube();
}
void renderCube() {
for (uint8_t i = 0; i < 8; i++) {
digitalWrite(SS, LOW);
SPI.transfer(0x01 << i);
for (uint8_t j = 0; j < 8; j++) {
SPI.transfer(cube[i][j]);
}
digitalWrite(SS, HIGH);
}
}
void rain() {
if (loading) {
clearCube();
loading = false;
}
timer++;
if (timer > RAIN_TIME) {
timer = 0;
shift(NEG_Y);
uint8_t numDrops = random(0, 5);
for (uint8_t i = 0; i < numDrops; i++) {
setVoxel(random(0, 8), 7, random(0, 8));
}
}
}
uint8_t planePosition = 0;
uint8_t planeDirection = 0;
bool looped = false;
void planeBoing() {
if (loading) {
clearCube();
uint8_t axis = random(0, 3);
planePosition = random(0, 2) * 7;
setPlane(axis, planePosition);
if (axis == XAXIS) {
if (planePosition == 0) {
planeDirection = POS_X;
} else {
planeDirection = NEG_X;
}
} else if (axis == YAXIS) {
if (planePosition == 0) {
planeDirection = POS_Y;
} else {
planeDirection = NEG_Y;
}
} else if (axis == ZAXIS) {
if (planePosition == 0) {
planeDirection = POS_Z;
} else {
planeDirection = NEG_Z;
}
}
timer = 0;
looped = false;
loading = false;
}
timer++;
if (timer > PLANE_BOING_TIME) {
timer = 0;
shift(planeDirection);
if (planeDirection % 2 == 0) {
planePosition++;
if (planePosition == 7) {
if (looped) {
loading = true;
} else {
planeDirection++;
looped = true;