Dependencies: PixelArray WS2812 mbed
[OLD - NOT FINISHED CODE]
Final code for the Pong Table Code can be found here: https://developer.mbed.org/teams/ASE/code/frdm_pong_table_controller/
main.cpp
- Committer:
- benswindell
- Date:
- 2017-02-22
- Revision:
- 1:58c735e369b1
- Parent:
- 0:e610b1d38e80
File content as of revision 1:58c735e369b1:
#include "mbed.h" #include "WS2812.h" #include "PixelArray.h" Serial pc(USBTX, USBRX); DigitalOut led_green(LED_GREEN, 1); AnalogIn sensor1(PTB2); AnalogIn sensor2(A0); #define WS2812_BUF 112 #define NUM_COLORS 6 #define NUM_LEDS_PER_COLOR 1 //-------- Colours ----------- #define RED 0x2f0000 #define YELLOW 0x2f2f00 #define GREEN 0x002f00 // Player has conceded a goal #define LIGHTBLUE 0x002f2f #define DARKBLUE 0x00002f // Player scored a goal #define PINK 0x2f002f #define OFF 0x000000 #define WHITE 0xffffff #define ARMBLUE 0x128BAB // Parameters const int READ_FREQUENCY = 20; const int BUFFER_SIZE = 2*READ_FREQUENCY; // in seconds const float VOLTAGE_REF = 5.000f; // V const int DEVIATION = 100; // mV const int DEFAULT_DATA = -1; bool seg1A, seg1B, seg1C, seg1D, seg1E, seg1F, seg1G; int seg1Array[112]; int MainArray[11][122]; //void write_8Seg(int num); PixelArray px(WS2812_BUF); // See the program page for information on the timing numbers // The given numbers are for the K64F WS2812 ws(D9, WS2812_BUF, 0, 5, 5, 0); WS2812 ws2(D8,WS2812_BUF, 0, 5, 5, 0); WS2812 ws3(D7,WS2812_BUF, 0, 5, 5, 0); WS2812 ws4(D6,WS2812_BUF, 0, 5, 5, 0); // Score counters int p1Score; int p2Score; int ScoreLimit = 5; bool FinishedGame = false; int EndFlashes = 0; int NumFlashes; // Create timers Ticker pollTicker1; Ticker pollTicker2; Timer t; int readings[BUFFER_SIZE]; // array of readings int reading = 0; // index into above int min = DEFAULT_DATA; int max = DEFAULT_DATA; int average = DEFAULT_DATA; void readSensor(); void handleGoal(); void reset(); void setup() { // Turn on green LED led_green = 1; // Fills 2D array with data for(int i=0; i<10; i++) { write_7Seg(i); } p1Score = 0; p2Score = 0; NumFlashes = 0; // Set LEDS to start values write_pbbuf(p1Score); write_pbbuf2(p2Score); write_goal1(WHITE); write_goal2(WHITE); wait_ms(1000); write_goal1(OFF); write_goal2(OFF); // Fill buffer with default data for (int i=0; i<BUFFER_SIZE; i++) { readings[i] = DEFAULT_DATA; } pollTicker1.attach(&readSensor1,(float)1/READ_FREQUENCY); pollTicker2.attach(&readSensor2,(float)1/READ_FREQUENCY); // Turn off green LED led_green = 0; } // Set segment variables void write_7Seg(int num) { switch (num) { case 0 : // Off seg1A = 1; seg1B = 1; seg1C = 1; seg1D = 1; seg1E = 1; seg1F = 1; seg1G = 0; setLEDArray(0); break; case 1 : // 1 seg1A = 0; seg1B = 1; seg1C = 1; seg1D = 0; seg1E = 0; seg1F = 0; seg1G = 0; setLEDArray(1); break; case 2 : // 2 seg1A = 1; seg1B = 1; seg1C = 0; seg1D = 1; seg1E = 1; seg1F = 0; seg1G = 1; setLEDArray(2); break; case 3 : // 3 seg1A = 1; seg1B = 1; seg1C = 1; seg1D = 1; seg1E = 0; seg1F = 0; seg1G = 1; setLEDArray(3); break; case 4: // 4 seg1A = 0; seg1B = 1; seg1C = 1; seg1D = 0; seg1E = 0; seg1F = 1; seg1G = 1; setLEDArray(4); break; case 5: // 5 seg1A = 1; seg1B = 0; seg1C = 1; seg1D = 1; seg1E = 0; seg1F = 1; seg1G = 1; setLEDArray(5); break; case 6: // 6 seg1A = 1; seg1B = 0; seg1C = 1; seg1D = 1; seg1E = 1; seg1F = 1; seg1G = 1; setLEDArray(6); break; case 7: // 7 seg1A = 1; seg1B = 1; seg1C = 1; seg1D = 0; seg1E = 0; seg1F = 0; seg1G = 0; setLEDArray(7); break; case 8: // 8 seg1A = 1; seg1B = 1; seg1C = 1; seg1D = 1; seg1E = 1; seg1F = 1; seg1G = 1; setLEDArray(8); break; case 9: // 9 seg1A = 1; seg1B = 1; seg1C = 1; seg1D = 0; seg1E = 0; seg1F = 1; seg1G = 1; setLEDArray(9); break; case 10: // OFF seg1A = 0; seg1B = 0; seg1C = 0; seg1D = 0; seg1E = 0; seg1F = 0; seg1G = 0; setLEDArray(10); break; default : break; } } // Write segment config to main array void setLEDArray(int x) { for (int i = 0; i < WS2812_BUF; i++) { if (i < 16) { MainArray[x][i] = seg1A; } if ( i >= 16 && i < 32) { MainArray[x][i] = seg1B; } if (i >= 32 && i < 48) { MainArray[x][i] = seg1C; } if (i >= 48 && i < 64) { MainArray[x][i]= seg1D; } if ( i >= 64 && i < 80) { MainArray[x][i] = seg1E; } if (i >= 80 && i < 96) { MainArray[x][i] = seg1F; } if ( i >= 96 && i < 112) { MainArray[x][i] = seg1G; } }// FOR LOOP } // Write to player 1 LED (ROBOT) void write_pbbuf(int line_num) { write_px(line_num); ws.write(px.getBuf()); } // Write to player 2 LED (HUMAN) void write_pbbuf2(int line_num) { write_px(line_num); ws2.write(px2.getBuf()); } // Write pixel array void write_px(int line_num) { for (int i = 0; i < WS2812_BUF; i++) { if (MainArray[line_num][i] == 0) { px.Set(i,OFF); } if (MainArray[line_num][i] == 1) { px.Set(i,LIGHTBLUE); } } } // Read goal sensor 1 (ROBOT) void readSensor1() { // Convert readings to mV readings[reading] = (int)(sensor1.read() * 1000 * VOLTAGE_REF); analyseReadings(0); } // Read goal sensor 2 (HUMAN) void readSensor2() { // Convert readings to mV readings[reading] = (int)(sensor2.read() * 1000 * VOLTAGE_REF); analyseReadings(1); } // Analyse sensor readings void analyseReadings(bool player) { min = DEFAULT_DATA; max = DEFAULT_DATA; int sum = 0; int count = 0; for (int i=0; i<BUFFER_SIZE; i++) { if (readings[i] == DEFAULT_DATA) { // ignore default values break; } if ((min == DEFAULT_DATA) || (readings[i] < min)) { min = readings[i]; } if ((max == DEFAULT_DATA) || (readings[i] > max)) { max = readings[i]; } sum += readings[i]; count++; } if (count == 0) { // No data yet return; } average = sum/count; // Goal detected if current reading deviates from average by more than 'deviation' if ((readings[reading] < (average - DEVIATION)) || (readings[reading] > (average + DEVIATION))) { incrementScore(!player); // Increase player score opposite the player whose goal's sensor reported a goal } reading = (reading + 1) % BUFFER_SIZE; } // Increment score void incrementScore(bool isPlayer1) { // Player 1 sensor reported goal, increase player 2 score if(isPlayer1 == 1) { if(p2Score < ScoreLimit) { p2Score++; write_goal(GREEN, isPlayer1); write_goal(DARKBLUE, !isPlayer1); t.start(); } else if(Score == ScoreLimit) { FinishedGame = true; } write_pbbuf2(p2Score); } // Player 2 sensor reported goal, increase player 1 score if(isPlayer1 == 0) { if(p1Score < ScoreLimit) { p1Score++; write_goal(DARKBLUE,isPlayer1); write_goal(GREEN,!isPlayer1); t.start(); } else if(p1Score == ScoreLimit) { FinishedGame = true; } write_pbbuf(p1Score); } t.start(); } // Write goal LED void write_goal(unsigned int Colour, bool player1Goal) { for (int i = 0; i < WS2812_BUF; i++) { px.Set(i,Colour); } if(player1Goal == 1) { ws4.write(px.getBuf()); } else if (player1Goal == 0) { ws3.write(px.getBuf()); } } // Turn off goal LEDS void turn_off_goal(unsigned int Colour) { for (int i = 0; i < WS2812_BUF; i++) { px.Set(i,Colour); } ws4.write(px.getBuf()); for (int i = 0; i < WS2812_BUF; i++) { px.Set(i,Colour); } ws4.write(px.getBuf()); } int main() { // Set brightness of the 4 LED strips ws.setII(0xFF); ws.useII(WS2812::GLOBAL); ws2.setII(0xFF); ws2.useII(WS2812::GLOBAL); ws3.setII(0xFF); ws3.useII(WS2812::GLOBAL); ws4.setII(0xFF); ws4.useII(WS2812::GLOBAL); setup(); while(1) { wait(1.0f); // Check timer to see if 3s or 5s has elapsed if(t.read() >= 3.0f && FinishedGame == false) { turn_off_goal(OFF); t.stop(); t.reset(); } else if(t.read() >= 5.0f && FinishedGame == true) { /* Some finished game code here */ t.stop(); t.reset(); } } }