summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.h10
-rw-r--r--led_cube.c67
2 files changed, 63 insertions, 14 deletions
diff --git a/config.h b/config.h
index 53d409b..fe639e9 100644
--- a/config.h
+++ b/config.h
@@ -1,7 +1,13 @@
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include <stdint.h>
+
// define the pins used controlling 74HC595
#define DATA_PIN 2
#define CLOCK_PIN 3
#define LATCH_PIN 4
+#define LED_PIN 25
// define the order of 74HC595 chain
#define CHIP_0 0
@@ -13,3 +19,7 @@
#define CHIP_6 6
#define CHIP_7 4
#define CHIP_8 2
+
+extern uint8_t map[9];
+
+#endif
diff --git a/led_cube.c b/led_cube.c
index 5893acc..8573d53 100644
--- a/led_cube.c
+++ b/led_cube.c
@@ -1,8 +1,13 @@
#include "pico/stdlib.h"
+#include "hardware/timer.h"
#include "config.h"
#include <stdio.h>
#include <stdint.h>
#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+
+uint8_t map[9];
void init_pins(void)
{
@@ -12,10 +17,11 @@ void init_pins(void)
gpio_set_dir(DATA_PIN, GPIO_OUT);
gpio_set_dir(CLOCK_PIN, GPIO_OUT);
gpio_set_dir(LATCH_PIN, GPIO_OUT);
- printf("pin initialization successful!\n");
-}
-uint8_t map[9];
+ gpio_init(LED_PIN);
+ gpio_set_dir(LED_PIN, GPIO_OUT);
+ gpio_put(LED_PIN, 1);
+}
void init_map(void)
{
@@ -52,22 +58,35 @@ void send_data(uint8_t floor, uint64_t on_floor)
send_raw_data(data);
}
-void draw(uint64_t data[8])
+int64_t zero_byte(alarm_id_t id, void* user_data)
{
- for (size_t i = 0; i < 8; i++) {
- send_data((1 << i), data[i]);
- }
+ memset(user_data, 0, 1);
+ return 0;
}
+void draw(uint64_t data[8], uint32_t time)
+{
+ volatile uint8_t ind = 1;
+ add_alarm_in_ms(time, (void*)zero_byte, (void*)&ind, false);
-void test(void)
+ while (ind) {
+ for (size_t i = 0; i < 8; i++) {
+ send_data((1 << i), data[i]);
+ }
+ tight_loop_contents();
+ }
+}
+
+void test_every_floor(void)
{
for (size_t i = 0; i < 8; i++) {
send_data((1 << i), 0xFFFFFFFFFFFFFFFF);
- sleep_ms(200);
+ sleep_ms(125);
}
}
+#define PIN(x, y) (1LL << ((y) * 8 + (x)))
+
void test_every_pin(void)
{
uint64_t data[8];
@@ -76,25 +95,45 @@ void test_every_pin(void)
for (size_t x = 0; x < 8; x++) {
for (size_t y = 0; y < 8; y++) {
for (size_t z = 0; z < 8; z++) {
- data[z] = 1LL << (y * 8 + x);
- draw(data);
+ data[z] = PIN(x, y);
+ }
+ draw(data, 125);
+ for (size_t z = 0; z < 8; z++) {
data[z] = 0;
- sleep_ms(20);
}
}
}
}
+void sphere(void)
+{
+ uint64_t data[8];
+
+ for (size_t i = 0; i < 7; i++) {
+ memset(data, 0, 64);
+ for (int8_t x = 0; x < 8; x++) {
+ for (int8_t y = 0; y < 8; y++) {
+ for (int8_t z = 0; z < 8; z++) {
+ if ((3.5-x)*(3.5-x) + (3.5-y)*(3.5-y) + (3.5-z)*(3.5-z) < 1.0*i*i) {
+ data[z] = PIN(x, y);
+ }
+ }
+ }
+ }
+ draw(data, 200 - i * 20);
+ }
+}
int main()
{
stdio_init_all();
init_pins();
init_map();
+ test_every_floor();
+ test_every_pin();
while(1) {
- test();
- test_every_pin();
+ sphere();
}
return 0;