Secfest2026BadgeCode/rp2040_badge_test/rp2040_badge_test.ino

233 lines
5.6 KiB
C++

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_IS31FL3731.h>
#define I2C_LED_MATRIX_SDA 2
#define I2C_LED_MATRIX_SCL 3
#define BTN_A 9
#define BTN_B 10
#define BTN_UP 11
#define BTN_DWN 12
#define BTN_LFT 13
#define BTN_RGT 14
#define LED_FLASHLIGHT 15
#define LED_FRONT_1 23
#define LED_FRONT_2 24
#define LED_FRONT_3 25
#define LED_FRONT_4 26
Adafruit_IS31FL3731 ledmatrix = Adafruit_IS31FL3731();
int ledPattern[9][9] = {0};
int frameBuffer = 0;
unsigned long lastFrame = 0;
struct Point { int x; int y; };
Point playerPos = {4, 4};
void drawPlayer() {
for (int y = 0; y < 9; y++) {
for (int x = 0; x < 9; x++) {
ledmatrix.enable(x, y, false);
}
}
if (playerPos.x >= 0 && playerPos.x < 9 && playerPos.y >= 0 && playerPos.y < 9) {
ledmatrix.enable(playerPos.x, playerPos.y, true);
}
}
void drawSplash() {
ledmatrix.clear();
for (int i = 0; i < 9; i++) {
ledmatrix.enable(i, i, true);
ledmatrix.enable(8 - i, i, true);
}
}
void drawCircle() {
ledmatrix.clear();
for (int angle = 0; angle < 360; angle += 10) {
int x = 4 + (int)(3.5 * cos(angle * PI / 180));
int y = 4 + (int)(3.5 * sin(angle * PI / 180));
if (x >= 0 && x < 9 && y >= 0 && y < 9) {
ledmatrix.enable(x, y, true);
}
}
}
void drawHeart() {
ledmatrix.clear();
int heart[9][9] = {
{0,1,1,0,0,0,1,1,0},
{1,1,1,1,0,1,1,1,1},
{1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1},
{0,1,1,1,1,1,1,1,0},
{0,0,1,1,1,1,1,0,0},
{0,0,0,1,1,1,0,0,0},
{0,0,0,0,1,0,0,0,0},
{0,0,0,0,0,0,0,0,0}
};
for (int y = 0; y < 9; y++) {
for (int x = 0; x < 9; x++) {
ledmatrix.enable(x, y, heart[y][x]);
}
}
}
void drawFrame1() {
ledmatrix.clear();
for (int i = 0; i < 9; i++) {
ledmatrix.enable(i, 0, true);
ledmatrix.enable(i, 8, true);
ledmatrix.enable(0, i, true);
ledmatrix.enable(8, i, true);
}
}
void drawFrame2() {
ledmatrix.clear();
for (int i = 1; i < 8; i++) {
ledmatrix.enable(i, 1, true);
ledmatrix.enable(i, 7, true);
ledmatrix.enable(1, i, true);
ledmatrix.enable(7, i, true);
}
}
void drawX() {
ledmatrix.clear();
for (int i = 0; i < 9; i++) {
ledmatrix.enable(i, i, true);
ledmatrix.enable(i, 8 - i, true);
}
}
void cycleGraphics() {
unsigned long now = millis();
if (now - lastFrame > 500) {
lastFrame = now;
frameBuffer = (frameBuffer + 1) % 6;
switch (frameBuffer) {
case 0: drawSplash(); break;
case 1: drawHeart(); break;
case 2: drawCircle(); break;
case 3: drawFrame1(); break;
case 4: drawFrame2(); break;
case 5: drawX(); break;
}
}
}
bool isButtonPressed(int btn) {
return digitalRead(btn) == LOW;
}
void handleButtons() {
if (isButtonPressed(BTN_A)) {
digitalWrite(LED_FRONT_1, HIGH);
playerPos.x = min(8, playerPos.x + 1);
} else {
digitalWrite(LED_FRONT_1, LOW);
}
if (isButtonPressed(BTN_B)) {
digitalWrite(LED_FRONT_2, HIGH);
playerPos.x = max(0, playerPos.x - 1);
} else {
digitalWrite(LED_FRONT_2, LOW);
}
if (isButtonPressed(BTN_UP)) {
digitalWrite(LED_FRONT_3, HIGH);
playerPos.y = max(0, playerPos.y - 1);
} else {
digitalWrite(LED_FRONT_3, LOW);
}
if (isButtonPressed(BTN_DWN)) {
digitalWrite(LED_FRONT_4, HIGH);
playerPos.y = min(8, playerPos.y + 1);
} else {
digitalWrite(LED_FRONT_4, LOW);
}
if (isButtonPressed(BTN_LFT)) {
digitalWrite(LED_FLASHLIGHT, HIGH);
} else {
digitalWrite(LED_FLASHLIGHT, LOW);
}
if (isButtonPressed(BTN_RGT)) {
cycleGraphics();
}
}
void blinkLEDs() {
static unsigned long lastBlink = 0;
static bool blinkState = false;
unsigned long now = millis();
if (now - lastBlink > 1000) {
lastBlink = now;
blinkState = !blinkState;
digitalWrite(LED_FRONT_1, blinkState ? HIGH : LOW);
digitalWrite(LED_FRONT_2, blinkState ? HIGH : LOW);
digitalWrite(LED_FRONT_3, blinkState ? HIGH : LOW);
digitalWrite(LED_FRONT_4, blinkState ? HIGH : LOW);
}
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("RP2040 Badge TestStarting...");
Wire.setSDA(I2C_LED_MATRIX_SDA);
Wire.setSCL(I2C_LED_MATRIX_SCL);
pinMode(BTN_A, INPUT_PULLUP);
pinMode(BTN_B, INPUT_PULLUP);
pinMode(BTN_UP, INPUT_PULLUP);
pinMode(BTN_DWN, INPUT_PULLUP);
pinMode(BTN_LFT, INPUT_PULLUP);
pinMode(BTN_RGT, INPUT_PULLUP);
pinMode(LED_FLASHLIGHT, OUTPUT);
pinMode(LED_FRONT_1, OUTPUT);
pinMode(LED_FRONT_2, OUTPUT);
pinMode(LED_FRONT_3, OUTPUT);
pinMode(LED_FRONT_4, OUTPUT);
Serial.println("Initializing LED Matrix...");
if (!ledmatrix.begin(0x74, &Wire)) {
Serial.println("IS31FL3731 not found!");
while (1) delay(1);
}
Serial.println("LED Matrix initialized!");
ledmatrix.setRotation(0);
ledmatrix.clear();
drawSplash();
delay(1000);
Serial.println("Setup complete!");
}
void loop() {
handleButtons();
if (isButtonPressed(BTN_RGT)) {
drawPlayer();
}
if (!isButtonPressed(BTN_A) && !isButtonPressed(BTN_B) &&
!isButtonPressed(BTN_UP) && !isButtonPressed(BTN_DWN) &&
!isButtonPressed(BTN_LFT) && !isButtonPressed(BTN_RGT)) {
blinkLEDs();
}
}