From c2bffd7a26f044c036bb9044d53246aa2f9288bc Mon Sep 17 00:00:00 2001 From: Robin Cerny Date: Mon, 24 Feb 2025 06:26:45 +0100 Subject: [PATCH] removed not used code anymore from the controller firmware, added ESP-NOW functions and settings to the controller to control the display --- ROFLS_Arena_Controller/Input_Handler.ino | 26 ++- .../LED_Driving_functions.ino | 133 --------------- ROFLS_Arena_Controller/Output_Handler.ino | 28 ++-- .../ROFLS_Arena_Controller.ino | 158 ++++++++++++------ .../ROFLS_Arena_LED_Strip_Clock.ino | 2 +- 5 files changed, 131 insertions(+), 216 deletions(-) delete mode 100644 ROFLS_Arena_Controller/LED_Driving_functions.ino diff --git a/ROFLS_Arena_Controller/Input_Handler.ino b/ROFLS_Arena_Controller/Input_Handler.ino index 2abf8f5..118abc9 100644 --- a/ROFLS_Arena_Controller/Input_Handler.ino +++ b/ROFLS_Arena_Controller/Input_Handler.ino @@ -8,8 +8,6 @@ void pollInput (){ buttonRESET.poll(); switchRUMBLE.poll(); switchPIT.poll(); - buttonREDTEAM.poll(); - buttonBLUETEAM.poll(); if (buttonSTART.pushed()) { buttonSTARTvar = true; @@ -23,16 +21,16 @@ void pollInput (){ 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; - } - } + // 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 deleted file mode 100644 index b34c15f..0000000 --- a/ROFLS_Arena_Controller/LED_Driving_functions.ino +++ /dev/null @@ -1,133 +0,0 @@ -// 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 index 3f534cb..bf09416 100644 --- a/ROFLS_Arena_Controller/Output_Handler.ino +++ b/ROFLS_Arena_Controller/Output_Handler.ino @@ -13,19 +13,19 @@ void openPIT() { } // 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)); - } - } -} +// 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 +// 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 index 106975b..569621b 100644 --- a/ROFLS_Arena_Controller/ROFLS_Arena_Controller.ino +++ b/ROFLS_Arena_Controller/ROFLS_Arena_Controller.ino @@ -15,20 +15,7 @@ #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 PIT_RELEASE_PIN 39 // define buttons and switches Switch buttonSTART = Switch(START_BTN_PIN); @@ -37,8 +24,6 @@ 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; @@ -59,12 +44,6 @@ 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; @@ -74,51 +53,106 @@ bool ARENA_READY = true; bool REDTEAM_READY = false; bool BLUETEAM_READY = false; +//------------------------------------------------------------------------------------ // ESP-NOW config +// send config, Clock: +uint8_t broadcastAddressClock[] = {0x48, 0x27, 0xE2, 0x5D, 0xB6, 0x84}; +// struct for clock data +typedef struct struct_message_Clock { + int sendMinutes; + int sendSeconds; + int sendREDchannel; + int sendGREENchannel; + int sendBLUEchannel; + int sendBrightness; +} struct_message_Clock; + +struct_message_Clock sendClockDATA; + +// send config, pilot buttons: +uint8_t broadcastAddressREDTEAMbutton[] = {0x48, 0x27, 0xE2, 0x5D, 0xB6, 0x84}; +uint8_t broadcastAddressBLUETEAMbutton[] = {0x48, 0x27, 0xE2, 0x5D, 0xB6, 0x84}; +// struct for pilot button data: +typedef struct struct_message_TEAMButton { + bool REDTEAMButtonLED; + bool BLUETEAMButtonLED; +} struct_message_TEAMButton; + +struct_message_TEAMButton sendTEAMButtonDATA; + +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"); +} +//------------------------------------------------------------------------------------ +// receive 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; +typedef struct struct_message_receive { + bool buttonSTART; + bool buttonPAUSE; + bool buttonPIT; + bool buttonRESET; + bool buttonREDTEAM; + bool buttonBLUETEAM; +} struct_message_receive; -// Create a struct_message called remoteDATA -struct_message remoteDATA; +// Create a struct_message called receiveDATA +struct_message_receive receiveDATA; // 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) { + memcpy(&receiveDATA, incomingData, sizeof(receiveDATA)); + if (receiveDATA.buttonSTART) { buttonSTARTvar = true; } - if (remoteDATA.buttonPAUSEremote) { + if (receiveDATA.buttonPAUSE) { buttonPAUSEvar = true; } - if (remoteDATA.buttonPITremote) { + if (receiveDATA.buttonPIT) { buttonPITvar = true; } - if (remoteDATA.buttonRESETremote) { + if (receiveDATA.buttonRESET) { buttonRESETvar = true; } + if (receiveDATA.buttonREDTEAM) { + buttonREDTEAMvar = true; + } + if (receiveDATA.buttonBLUETEAM) { + buttonBLUETEAMvar = true; + } } +// send data to clock: +void sendTimeDisplay(int MINUTES, int SECONDS, int RED, int GREEN, int BLUE, int BRIGHTNESS) { + // only send data if there was a change + if ((sendClockDATA.sendMinutes != MINUTES) || (sendClockDATA.sendSeconds != SECONDS) || (sendClockDATA.sendREDchannel != RED) || (sendClockDATA.sendGREENchannel != GREEN) || (sendClockDATA.sendBLUEchannel != BLUE) || (sendClockDATA.sendBrightness != BRIGHTNESS)) { + sendClockDATA.sendMinutes = MINUTES; + sendClockDATA.sendSeconds = SECONDS; + sendClockDATA.sendREDchannel = RED; + sendClockDATA.sendGREENchannel = GREEN; + sendClockDATA.sendBLUEchannel = BLUE; + sendClockDATA.sendBrightness = BRIGHTNESS; + + esp_err_t result = esp_now_send(broadcastAddressClock, (uint8_t *) &sendClockDATA, sizeof(sendClockDATA)); + } +} + + +//------------------------------------------------------------------------------------ + void setup() { + Serial.begin(115200); // 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); @@ -127,19 +161,35 @@ void setup() { Serial.println("Error initializing ESP-NOW"); return; } + //------------------------------------------------------------------------------------ + // ESP Now send part: + // 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, broadcastAddressClock, 6); + peerInfo.channel = 0; + peerInfo.encrypt = false; + // Add peer + if (esp_now_add_peer(&peerInfo) != ESP_OK){ + Serial.println("Failed to add peer"); + return; + } + + // set rumble stopwatch resolution to seconds + + esp_err_t result = esp_now_send(broadcastAddressClock, (uint8_t *) &sendClockDATA, sizeof(sendClockDATA)); + + + //------------------------------------------------------------------------------------ + // ESP Now receive part: // 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; @@ -198,10 +248,10 @@ void loop() { PITreleased = false; ESP.restart(); } - blink_LED_RedTeam(200); - blink_LED_BlueTeam(200); + //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); + sendTimeDisplay((FightCountDown[0].remaining()/60%10), (FightCountDown[0].remaining()%60), 0, XDAS, 0, CLOCK_LED_BRIGHTNESS); } @@ -212,6 +262,6 @@ void loop() { // deactivate solenoids if needed checkPIT(); // update the LED Display - showTimeDisplay(12, 34, XDAS, 0, XDAS); + sendTimeDisplay(12, 34, XDAS, 0, XDAS, CLOCK_LED_BRIGHTNESS); } } 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 index 7fbfb1b..3dbaabb 100644 --- a/ROFLS_Arena_LED_Strip_Clock/ROFLS_Arena_LED_Strip_Clock.ino +++ b/ROFLS_Arena_LED_Strip_Clock/ROFLS_Arena_LED_Strip_Clock.ino @@ -30,7 +30,7 @@ typedef struct struct_message { int receiveBrightness; } struct_message; -// Create a struct_message called remoteDATA +// Create a struct_message called receiveDATA struct_message receiveDATA; // callback function that will be executed when data is received