From d0d8c2ac7aaa754cc1bc32bef0bf4f502fc09328 Mon Sep 17 00:00:00 2001 From: Robin Cerny Date: Sat, 22 Feb 2025 20:45:28 +0100 Subject: [PATCH] initial commit --- ROFLS_Arena_Controller/Input_Handler.ino | 38 +++ .../LED_Driving_functions.ino | 133 +++++++++++ ROFLS_Arena_Controller/Output_Handler.ino | 31 +++ .../ROFLS_Arena_Controller.ino | 217 ++++++++++++++++++ ROFLS_Arena_Controller/Self_test.ino | 0 .../LED_Driving_functions.ino | 114 +++++++++ .../ROFLS_Arena_LED_Strip_Clock.ino | 71 ++++++ ROFLS_Arena_Remote/Input_Handler.ino | 22 ++ ROFLS_Arena_Remote/ROFLS_Arena_Remote.ino | 143 ++++++++++++ Test/LED_Strip_test/LED_Strip_test.ino | 35 +++ 10 files changed, 804 insertions(+) create mode 100644 ROFLS_Arena_Controller/Input_Handler.ino create mode 100644 ROFLS_Arena_Controller/LED_Driving_functions.ino create mode 100644 ROFLS_Arena_Controller/Output_Handler.ino create mode 100644 ROFLS_Arena_Controller/ROFLS_Arena_Controller.ino create mode 100644 ROFLS_Arena_Controller/Self_test.ino create mode 100644 ROFLS_Arena_LED_Strip_Clock/LED_Driving_functions.ino create mode 100644 ROFLS_Arena_LED_Strip_Clock/ROFLS_Arena_LED_Strip_Clock.ino create mode 100644 ROFLS_Arena_Remote/Input_Handler.ino create mode 100644 ROFLS_Arena_Remote/ROFLS_Arena_Remote.ino create mode 100644 Test/LED_Strip_test/LED_Strip_test.ino diff --git a/ROFLS_Arena_Controller/Input_Handler.ino b/ROFLS_Arena_Controller/Input_Handler.ino new file mode 100644 index 0000000..2abf8f5 --- /dev/null +++ b/ROFLS_Arena_Controller/Input_Handler.ino @@ -0,0 +1,38 @@ +// handle all the inputs, set vars, etc. + +void pollInput (){ + // poll all the switch/button inputs + buttonSTART.poll(); + buttonPAUSE.poll(); + buttonPIT.poll(); + buttonRESET.poll(); + switchRUMBLE.poll(); + switchPIT.poll(); + buttonREDTEAM.poll(); + buttonBLUETEAM.poll(); + + if (buttonSTART.pushed()) { + buttonSTARTvar = true; + } + if (buttonPAUSE.pushed()) { + buttonPAUSEvar = true; + } + if (buttonPIT.pushed()) { + buttonPITvar = true; + } + if (buttonRESET.pushed()) { + buttonRESETvar = true; + } + if (buttonREDTEAM.pushed()) { + buttonREDTEAMvar = true; + if (ARENA_READY && !REDTEAM_READY) { + BLINK_COUNTER_REDTEAM = 5; + } + } + if (buttonBLUETEAM.pushed()) { + buttonBLUETEAMvar = true; + if (ARENA_READY && !BLUETEAM_READY) { + BLINK_COUNTER_BLUETEAM = 5; + } + } +} \ No newline at end of file diff --git a/ROFLS_Arena_Controller/LED_Driving_functions.ino b/ROFLS_Arena_Controller/LED_Driving_functions.ino new file mode 100644 index 0000000..b34c15f --- /dev/null +++ b/ROFLS_Arena_Controller/LED_Driving_functions.ino @@ -0,0 +1,133 @@ +// contains all the functions to drive the LEDs + +// 0 +const int LitArray0 [] = {8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55}; +// 1 +const int LitArray1 [] = {8,9,10,11,12,13,14,15,48,49,50,51,52,53,54,55}; +// 2 +const int LitArray2 [] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47}; +// 3 +const int LitArray3 [] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55}; +// 4 +const int LitArray4 [] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31,48,49,50,51,52,53,54,55}; +// 5 +const int LitArray5 [] = {0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55}; +// 6 +const int LitArray6 [] = {0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55}; +// 7 +const int LitArray7 [] = {8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,48,49,50,51,52,53,54,55}; +// 8 +const int LitArray8 [] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55}; +// 9 +const int LitArray9 [] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55}; +// colon +const int COLONArray [] = {224,225,226,227,228,229,230,231}; + +// set digits of the timer/clock, use: setDIGIT(, , , , ) + +void setDIGIT(int DIGIT_ID, int DIGIT, int RED, int GREEN, int BLUE) { + DIGIT_ID = map(DIGIT_ID, 1, 4, 0, 3); // swap index/ID number from 1-4 to 0-3 + switch (DIGIT) { + case 0: + // set 0 + for (int i : LitArray0) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 1: + // set 1 + for (int i : LitArray1) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 2: + // set 2 + for (int i : LitArray2) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 3: + // set 3 + for (int i : LitArray3) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 4: + // set 4 + for (int i : LitArray4) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 5: + // set 5 + for (int i : LitArray5) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 6: + // set 6 + for (int i : LitArray6) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 7: + // set 7 + for (int i : LitArray7) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 8: + // set 8 + for (int i : LitArray8) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 9: + // set 9 + for (int i : LitArray9) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + } +} + +// set colon +void setCOLON(int RED, int GREEN, int BLUE) { + for (int i : COLONArray) { + leds_TIMER[(i)].setRGB(RED,GREEN,BLUE); + } +} + +// set all digits +void setTimeDisplay(int MINUTES, int SECONDS, int RED, int GREEN, int BLUE) { + setDIGIT(1, ((MINUTES/10)%10), RED, GREEN, BLUE); + setDIGIT(2, (MINUTES%10), RED, GREEN, BLUE); + setDIGIT(3, ((SECONDS/10)%10), RED, GREEN, BLUE); + setDIGIT(4, (SECONDS%10), RED, GREEN, BLUE); + setCOLON(RED, GREEN, BLUE); + +} + +void showTimeDisplay(int MINUTES, int SECONDS, int RED, int GREEN, int BLUE) { + EVERY_N_MILLISECONDS(5) { + // toggle between reading ADC data and refreshing LED strings (dunno, some artefacts appear if you do both really quickly after each other). + // leave this in here, if needed, expand the delay between executions + if (toggle) { + toggle = false; + if (prevMINUTES != MINUTES || prevSECONDS != SECONDS || prevCLOCKRED != RED || prevCLOCKGREEN != GREEN || prevCLOCKBLUE != BLUE) { + setTimeDisplay(MINUTES, SECONDS, RED, GREEN, BLUE); + FastLED.show(CLOCK_LED_BRIGHTNESS); + FastLED.clearData(); + prevMINUTES = MINUTES; + prevSECONDS = SECONDS; + prevCLOCKRED = RED; + prevCLOCKGREEN = GREEN; + prevCLOCKBLUE = BLUE; + } + } + else { + toggle = true; + } + } +} + diff --git a/ROFLS_Arena_Controller/Output_Handler.ino b/ROFLS_Arena_Controller/Output_Handler.ino new file mode 100644 index 0000000..3f534cb --- /dev/null +++ b/ROFLS_Arena_Controller/Output_Handler.ino @@ -0,0 +1,31 @@ +void checkPIT() { + if ((digitalRead(PIT_RELEASE_PIN)) && (millis() - PITopenTimestamp >= PITopenTime)) { + digitalWrite(PIT_RELEASE_PIN, LOW); + } +} + +void openPIT() { + if (!PITreleased) { + PITreleased = true; + PITopenTimestamp = millis(); + digitalWrite(PIT_RELEASE_PIN, HIGH); + } +} + +// usage: blink_LED_BlueTeam(); +void blink_LED_BlueTeam(int BLINK_INTERVAL) { + EVERY_N_MILLISECONDS(BLINK_INTERVAL) { + if (BLINK_COUNTER_BLUETEAM-- > 0) { + digitalWrite(BLUE_TEAM_LED_PIN, !digitalRead(BLUE_TEAM_LED_PIN)); + } + } +} + +// usage: blink_LED_RedTeam(); +void blink_LED_RedTeam(int BLINK_INTERVAL) { + EVERY_N_MILLISECONDS(BLINK_INTERVAL) { + if (BLINK_COUNTER_REDTEAM-- > 0) { + digitalWrite(RED_TEAM_LED_PIN, !digitalRead(RED_TEAM_LED_PIN)); + } + } +} \ No newline at end of file diff --git a/ROFLS_Arena_Controller/ROFLS_Arena_Controller.ino b/ROFLS_Arena_Controller/ROFLS_Arena_Controller.ino new file mode 100644 index 0000000..106975b --- /dev/null +++ b/ROFLS_Arena_Controller/ROFLS_Arena_Controller.ino @@ -0,0 +1,217 @@ +// ROFLS+ Arena Controller + +#include +#include // automatically installed for ESP32 boards, I think? +#include // automatically installed for ESP32 boards +#include // https://fastled.io/ +#include // https://github.com/avdwebLibraries/avdweb_Switch +#include // https://github.com/RobTillaart/CountDown +#include // https://github.com/RobTillaart/StopWatch_RT + +// Hardware connections +#define START_BTN_PIN 1 +#define PAUSE_BTN_PIN 2 +#define PIT_BTN_PIN 3 +#define RESET_BTN_PIN 4 +#define RUMBLE_SWITCH_PIN 5 +#define PIT_ENABLE_SWITCH_PIN 6 +#define RED_TEAM_BTN_PIN 7 +#define RED_TEAM_LED_PIN 39 +#define BLUE_TEAM_BTN_PIN 6 +#define BLUE_TEAM_LED_PIN 40 +#define PIT_RELEASE_PIN 35 + +// LED Strip setup +#define NUM_LEDS_PER_DIGIT 56 +#define NUM_OF_DIGITS 4 +#define NUM_LEDS_COLON 8 +#define NUM_LEDS_TIMER (NUM_LEDS_PER_DIGIT * NUM_OF_DIGITS + NUM_LEDS_COLON) // + 1 because of the makeshift Levelshifter +#define LED_DATA_PIN_TIMER 16 +// This is an array of leds. One item for each led in your strip. +CRGB leds_TIMER[NUM_LEDS_TIMER]; + +// define buttons and switches +Switch buttonSTART = Switch(START_BTN_PIN); +Switch buttonPAUSE = Switch(PAUSE_BTN_PIN); +Switch buttonPIT = Switch(PIT_BTN_PIN); +Switch buttonRESET = Switch(RESET_BTN_PIN); +Switch switchRUMBLE = Switch(RUMBLE_SWITCH_PIN); +Switch switchPIT = Switch(PIT_ENABLE_SWITCH_PIN); +Switch buttonREDTEAM = Switch(RED_TEAM_BTN_PIN); +Switch buttonBLUETEAM = Switch(BLUE_TEAM_BTN_PIN); + +bool buttonSTARTvar = false; +bool buttonPAUSEvar = false; +bool buttonPITvar = false; +bool buttonRESETvar = false; +bool buttonREDTEAMvar = false; +bool buttonBLUETEAMvar = false; +unsigned long PITopenTimestamp = 0; +const long PITopenTime = 1000; // activate solenoid for 1000ms +bool PITreleased = false; + +const int countdownTIME = 3; // countdown timer length in minutes +const int countdownToFight = 3; // countdown timer length in seconds +const int PITreleaseTime = 90; // automatic pit release time in seconds until end of countdown +bool countdownPAUSED = false; +CountDown FightCountDown[1]; + +// Rumble stopwatch +StopWatch rumbleTIME; + +int prevMINUTES = 0; +int prevSECONDS = 0; +int prevCLOCKRED = 0; +int prevCLOCKGREEN = 0; +int prevCLOCKBLUE = 0; + +int CLOCK_LED_BRIGHTNESS = 16; // 64 is okay + +int BLINK_COUNTER_REDTEAM = 0; +int BLINK_COUNTER_BLUETEAM = 0; + +bool ARENA_READY = true; +bool REDTEAM_READY = false; +bool BLUETEAM_READY = false; + +// ESP-NOW config + +// Structure example to send data +// Must match the receiver structure +typedef struct struct_message { + bool buttonSTARTremote; + bool buttonPAUSEremote; + bool buttonPITremote; + bool buttonRESETremote; + bool buttonREDTEAMremote; + bool buttonBLUETEAMremote; +} struct_message; + +// Create a struct_message called remoteDATA +struct_message remoteDATA; + +// callback function that will be executed when data is received +void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) { + memcpy(&remoteDATA, incomingData, sizeof(remoteDATA)); + if (remoteDATA.buttonSTARTremote) { + buttonSTARTvar = true; + } + if (remoteDATA.buttonPAUSEremote) { + buttonPAUSEvar = true; + } + if (remoteDATA.buttonPITremote) { + buttonPITvar = true; + } + if (remoteDATA.buttonRESETremote) { + buttonRESETvar = true; + } +} + +void setup() { + // set outputs + pinMode(RED_TEAM_LED_PIN, OUTPUT); + pinMode(BLUE_TEAM_LED_PIN, OUTPUT); + pinMode(PIT_RELEASE_PIN, OUTPUT); + + digitalWrite(BLUE_TEAM_LED_PIN, LOW); + digitalWrite(RED_TEAM_LED_PIN, LOW); + digitalWrite(PIT_RELEASE_PIN, LOW); + + Serial.begin(115200); + + // Set device as a Wi-Fi Station + WiFi.mode(WIFI_STA); + + // Init ESP-NOW + if (esp_now_init() != ESP_OK) { + Serial.println("Error initializing ESP-NOW"); + return; + } + // Once ESPNow is successfully Init, we will register for recv CB to + // get recv packer info + esp_now_register_recv_cb(esp_now_recv_cb_t(OnDataRecv)); + + + // set rumble stopwatch resolution to seconds + + // sanity check delay - allows reprogramming if accidently blowing power w/leds + delay(2000); + // This function sets up the leds and tells the controller about them + FastLED.addLeds(leds_TIMER, NUM_LEDS_TIMER); // GRB ordering is typical + //FastLED.setMaxRefreshRate(10, true); + FastLED.setMaxPowerInVoltsAndMilliamps(5,2000); // Limit to 10W of output power +} + +int XDAS = 255; +bool toggle = false; +void loop() { + // poll all the switch/button inputs + pollInput(); + // deactivate solenoids if needed + checkPIT(); + + // Normal fight routine + while (!switchRUMBLE.on()) { + // poll all the switch/button inputs + pollInput(); + // deactivate solenoids if needed + checkPIT(); + // start button logic + if (buttonSTARTvar) { + buttonSTARTvar = false; + if (!FightCountDown[0].isRunning() && countdownPAUSED == false) { + if (buttonREDTEAMvar && buttonBLUETEAMvar) { + buttonREDTEAMvar = false; + buttonBLUETEAMvar = false; + FightCountDown[0].start(0,0,countdownTIME,0); + } + } + else { + if (buttonREDTEAMvar && buttonBLUETEAMvar) { + buttonREDTEAMvar = false; + buttonBLUETEAMvar = false; + countdownPAUSED = false; + FightCountDown[0].cont(); + } + } + } + // pause button logic + if (buttonPAUSEvar) { + buttonPAUSEvar = false; + if (FightCountDown[0].isRunning()) { + countdownPAUSED = true; + FightCountDown[0].stop(); + } + } + // pit button logic + if (buttonPITvar) { + buttonPITvar = false; + openPIT(); + } + // automatic pit release + if (FightCountDown[0].remaining() <= PITreleaseTime && FightCountDown[0].remaining() > 0 && switchPIT.on()) { + openPIT(); + } + // reset button logic + if (buttonRESETvar) { + buttonRESETvar = false; + PITreleased = false; + ESP.restart(); + } + blink_LED_RedTeam(200); + blink_LED_BlueTeam(200); + // update the LED Display + showTimeDisplay((FightCountDown[0].remaining()/60%10), (FightCountDown[0].remaining()%60), 0, XDAS, 0); + } + + + // Rumble fightroutine + while (switchRUMBLE.on()) { + // poll all the switch/button inputs + pollInput(); + // deactivate solenoids if needed + checkPIT(); + // update the LED Display + showTimeDisplay(12, 34, XDAS, 0, XDAS); + } +} diff --git a/ROFLS_Arena_Controller/Self_test.ino b/ROFLS_Arena_Controller/Self_test.ino new file mode 100644 index 0000000..e69de29 diff --git a/ROFLS_Arena_LED_Strip_Clock/LED_Driving_functions.ino b/ROFLS_Arena_LED_Strip_Clock/LED_Driving_functions.ino new file mode 100644 index 0000000..3720b32 --- /dev/null +++ b/ROFLS_Arena_LED_Strip_Clock/LED_Driving_functions.ino @@ -0,0 +1,114 @@ +// contains all the functions to drive the LEDs + +// 0 +const int LitArray0 [] = {8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55}; +// 1 +const int LitArray1 [] = {8,9,10,11,12,13,14,15,48,49,50,51,52,53,54,55}; +// 2 +const int LitArray2 [] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47}; +// 3 +const int LitArray3 [] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55}; +// 4 +const int LitArray4 [] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31,48,49,50,51,52,53,54,55}; +// 5 +const int LitArray5 [] = {0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55}; +// 6 +const int LitArray6 [] = {0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55}; +// 7 +const int LitArray7 [] = {8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,48,49,50,51,52,53,54,55}; +// 8 +const int LitArray8 [] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55}; +// 9 +const int LitArray9 [] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55}; +// colon +const int COLONArray [] = {224,225,226,227,228,229,230,231}; + +// set digits of the timer/clock, use: setDIGIT(, , , , ) + +void setDIGIT(int DIGIT_ID, int DIGIT, int RED, int GREEN, int BLUE) { + DIGIT_ID = map(DIGIT_ID, 1, 4, 0, 3); // swap index/ID number from 1-4 to 0-3 + switch (DIGIT) { + case 0: + // set 0 + for (int i : LitArray0) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 1: + // set 1 + for (int i : LitArray1) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 2: + // set 2 + for (int i : LitArray2) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 3: + // set 3 + for (int i : LitArray3) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 4: + // set 4 + for (int i : LitArray4) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 5: + // set 5 + for (int i : LitArray5) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 6: + // set 6 + for (int i : LitArray6) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 7: + // set 7 + for (int i : LitArray7) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 8: + // set 8 + for (int i : LitArray8) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + case 9: + // set 9 + for (int i : LitArray9) { + leds_TIMER[i + (NUM_LEDS_PER_DIGIT * DIGIT_ID )].setRGB(RED,GREEN,BLUE); + } + break; + } +} + +// set colon +void setCOLON(int RED, int GREEN, int BLUE) { + for (int i : COLONArray) { + leds_TIMER[(i)].setRGB(RED,GREEN,BLUE); + } +} + + +void showTimeDisplay(int MINUTES, int SECONDS, int RED, int GREEN, int BLUE, int BRIGHTNESS) { + // set all digits + setDIGIT(1, ((MINUTES/10)%10), RED, GREEN, BLUE); + setDIGIT(2, (MINUTES%10), RED, GREEN, BLUE); + setDIGIT(3, ((SECONDS/10)%10), RED, GREEN, BLUE); + setDIGIT(4, (SECONDS%10), RED, GREEN, BLUE); + setCOLON(RED, GREEN, BLUE); + // actually display the digits + FastLED.show(BRIGHTNESS); + // clear the arrays + FastLED.clearData(); +} + diff --git a/ROFLS_Arena_LED_Strip_Clock/ROFLS_Arena_LED_Strip_Clock.ino b/ROFLS_Arena_LED_Strip_Clock/ROFLS_Arena_LED_Strip_Clock.ino new file mode 100644 index 0000000..b7d7f4d --- /dev/null +++ b/ROFLS_Arena_LED_Strip_Clock/ROFLS_Arena_LED_Strip_Clock.ino @@ -0,0 +1,71 @@ +// ROFLS+ Arena Controller + +#include +#include // automatically installed for ESP32 boards, I think? +#include // automatically installed for ESP32 boards +#include // https://fastled.io/ + +// LED Strip setup +#define NUM_LEDS_PER_DIGIT 56 +#define NUM_OF_DIGITS 4 +#define NUM_LEDS_COLON 8 +#define NUM_LEDS_TIMER (NUM_LEDS_PER_DIGIT * NUM_OF_DIGITS + NUM_LEDS_COLON) // + 1 because of the makeshift Levelshifter +#define LED_DATA_PIN_TIMER 16 +// This is an array of leds. One item for each led in your strip. +CRGB leds_TIMER[NUM_LEDS_TIMER]; + +// ESP-NOW config + +// Structure example to send data +// Must match the receiver structure +typedef struct struct_message { + int receiveMinutes; + int receiveSeconds; + int receiveREDchannel; + int receiveGREENchannel; + int receiveBLUEchannel; + int receiveBrightness; +} struct_message; + +// Create a struct_message called remoteDATA +struct_message receiveDATA; + +// callback function that will be executed when data is received +void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) { + memcpy(&receiveDATA, incomingData, sizeof(receiveDATA)); +} + +void setup() { + // Set device as a Wi-Fi Station + WiFi.mode(WIFI_STA); + + // Init ESP-NOW + if (esp_now_init() != ESP_OK) { + Serial.println("Error initializing ESP-NOW"); + return; + } + // Once ESPNow is successfully Init, we will register for recv CB to + // get recv packer info + esp_now_register_recv_cb(esp_now_recv_cb_t(OnDataRecv)); + + // sanity check delay - allows reprogramming if accidently blowing power w/leds + delay(2000); + // This function sets up the leds and tells the controller about them + FastLED.addLeds(leds_TIMER, NUM_LEDS_TIMER); // GRB ordering is typical + //FastLED.setMaxRefreshRate(10, true); + FastLED.setMaxPowerInVoltsAndMilliamps(5,2000); // Limit to 10W of output power + + // set default values + receiveDATA.receiveMinutes = 12; + receiveDATA.receiveSeconds = 34; + receiveDATA.receiveREDchannel = 128; + receiveDATA.receiveGREENchannel = 128; + receiveDATA.receiveBLUEchannel = 128; + receiveDATA.receiveBrightness = 16; +} + +void loop() { + // update the LED Display + showTimeDisplay(receiveDATA.receiveMinutes, receiveDATA.receiveSeconds, receiveDATA.receiveREDchannel, receiveDATA.receiveGREENchannel, receiveDATA.receiveBLUEchannel, receiveDATA.receiveBrightness); + // showTimeDisplay(12, 34, 150, 0, 150, 16); +} diff --git a/ROFLS_Arena_Remote/Input_Handler.ino b/ROFLS_Arena_Remote/Input_Handler.ino new file mode 100644 index 0000000..51a4fe8 --- /dev/null +++ b/ROFLS_Arena_Remote/Input_Handler.ino @@ -0,0 +1,22 @@ +// handle all the inputs, set vars, etc. + +void pollInput (){ + // poll all the switch/button inputs + buttonSTART.poll(); + buttonPAUSE.poll(); + buttonPIT.poll(); + buttonRESET.poll(); + + if (buttonSTART.pushed()) { + buttonSTARTvar = true; + } + if (buttonPAUSE.pushed()) { + buttonPAUSEvar = true; + } + if (buttonPIT.pushed()) { + buttonPITvar = true; + } + if (buttonRESET.pushed()) { + buttonRESETvar = true; + } +} \ No newline at end of file diff --git a/ROFLS_Arena_Remote/ROFLS_Arena_Remote.ino b/ROFLS_Arena_Remote/ROFLS_Arena_Remote.ino new file mode 100644 index 0000000..882864f --- /dev/null +++ b/ROFLS_Arena_Remote/ROFLS_Arena_Remote.ino @@ -0,0 +1,143 @@ +// ROFLS+ Referee Remote + +#include +#include // automatically installed for ESP32 boards, I think? +#include // automatically installed for ESP32 boards +#include // https://github.com/avdwebLibraries/avdweb_Switch + +// Hardware connections +#define START_BTN_PIN 4 +#define PAUSE_BTN_PIN 3 +#define PIT_BTN_PIN 2 +#define RESET_BTN_PIN 1 + +// define buttons and switches +Switch buttonSTART = Switch(START_BTN_PIN); +Switch buttonPAUSE = Switch(PAUSE_BTN_PIN); +Switch buttonPIT = Switch(PIT_BTN_PIN); +Switch buttonRESET = Switch(RESET_BTN_PIN); + +bool buttonSTARTvar = false; +bool buttonPAUSEvar = false; +bool buttonPITvar = false; +bool buttonRESETvar = false; + +bool sendDATA = false; + +// ESP-NOW config + +// REPLACE WITH YOUR RECEIVER MAC Address +uint8_t broadcastAddress[] = {0x84, 0xFC, 0xE6, 0xC7, 0x1A, 0x8C}; + +// Structure example to send data +// Must match the receiver structure +typedef struct struct_message { + bool buttonSTARTremote; + bool buttonPAUSEremote; + bool buttonPITremote; + bool buttonRESETremote; +} struct_message; + +// Create a struct_message called myData +struct_message remoteDATA; + +esp_now_peer_info_t peerInfo; + +// callback when data is sent +/* +void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) { + Serial.print("\r\nLast Packet Send Status:\t"); + Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail"); +} +*/ + +void setup() { + Serial.begin(115200); + + // Set device as a Wi-Fi Station + WiFi.mode(WIFI_STA); + + // Init ESP-NOW + if (esp_now_init() != ESP_OK) { + Serial.println("Error initializing ESP-NOW"); + return; + } + // Once ESPNow is successfully Init, we will register for Send CB to + // get the status of Trasnmitted packet + //esp_now_register_send_cb(OnDataSent); + + // Register peer + memcpy(peerInfo.peer_addr, broadcastAddress, 6); + peerInfo.channel = 0; + peerInfo.encrypt = false; + // Add peer + if (esp_now_add_peer(&peerInfo) != ESP_OK){ + Serial.println("Failed to add peer"); + return; + } +} + +void loop() { + // poll all the switch/button inputs + pollInput(); + // start button logic + if (buttonSTARTvar) { + buttonSTARTvar = false; + remoteDATA.buttonSTARTremote = true; + sendDATA = true; + } + // pause button logic + if (buttonPAUSEvar) { + buttonPAUSEvar = false; + remoteDATA.buttonPAUSEremote = true; + sendDATA = true; + } + // pit button logic + if (buttonPITvar) { + buttonPITvar = false; + remoteDATA.buttonPITremote = true; + sendDATA = true; + } + // reset button logic + if (buttonRESETvar) { + buttonRESETvar = false; + remoteDATA.buttonRESETremote = true; + sendDATA = true; + } + + // Set values to send + //remoteDATA.buttonSTARTremote = false; + //remoteDATA.buttonPAUSEremote = false; + //remoteDATA.buttonPITremote = false; + //remoteDATA.buttonRESETremote = false; + + // Send message via ESP-NOW + //esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &remoteDATA, sizeof(remoteDATA)); + if (sendDATA == true) { + esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &remoteDATA, sizeof(remoteDATA)); + sendDATA = false; + // clear remoteDATA struct + remoteDATA.buttonSTARTremote = false; + remoteDATA.buttonPAUSEremote = false; + remoteDATA.buttonPITremote = false; + remoteDATA.buttonRESETremote = false; + + if (result == ESP_OK) { + Serial.println("Sent with success"); + } + else { + Serial.println("Error sending the data"); + } + } + + + /* + if (result == ESP_OK) { + Serial.println("Sent with success"); + } + else { + Serial.println("Error sending the data"); + } + */ + //delay(2000); +} diff --git a/Test/LED_Strip_test/LED_Strip_test.ino b/Test/LED_Strip_test/LED_Strip_test.ino new file mode 100644 index 0000000..69d3da2 --- /dev/null +++ b/Test/LED_Strip_test/LED_Strip_test.ino @@ -0,0 +1,35 @@ +/// @file Blink.ino +/// @brief Blink the first LED of an LED strip +/// @example Blink.ino + +#include + +// How many leds in your strip? +#define NUM_LEDS 3 + +// For led chips like WS2812, which have a data line, ground, and power, you just +// need to define DATA_PIN. For led chipsets that are SPI based (four wires - data, clock, +// ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN +// Clock pin only needed for SPI based chipsets when not using hardware SPI +#define DATA_PIN 3 +//#define CLOCK_PIN 13 + +// Define the array of leds +CRGB leds[NUM_LEDS]; + +#define POTI_PIN 2 +int POTI_VALUE = 0; + +void setup() { + FastLED.addLeds(leds, NUM_LEDS); // GRB ordering is typical +} + +void loop() { + leds[0] = CRGB::Red; + leds[1] = CRGB::Blue; + leds[2] = CRGB::Green; + FastLED.setBrightness(map(analogRead(POTI_PIN), 0, 8191, 8, 255)); + FastLED.show(); + delay(1); + //POTI_VALUE = map(analogRead(POTI_PIN), 0, 8191, 0, 255); +}