Created
July 28, 2011 18:29
-
-
Save arduinoboard/1112179 to your computer and use it in GitHub Desktop.
The file that is currently on an Arduino Uno with a serial number of 64932343938351E091A0
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <TetrisShapeItSound.h> | |
#include <cScoreSpeaker.h> | |
/* | |
Analog input, analog output, serial output | |
Reads an analog input pin, maps the result to a range from 0 to 255 | |
and uses the result to set the pulsewidth modulation (PWM) of an output pin. | |
Also prints the results to the serial monitor. | |
The circuit: | |
* potentiometer connected to analog pin 0. | |
Center pin of the potentiometer goes to the analog pin. | |
side pins of the potentiometer go to +5V and ground | |
* LED connected from digital pin 9 to ground | |
created 29 Dec. 2008 | |
Modified 4 Sep 2010 | |
by Tom Igoe | |
This example code is in the public domain. | |
*/ | |
#include "WProgram.h" | |
#include <SoftwareSerial.h> | |
//#define DEBUG | |
#define MUSIC_OFF | |
#define txPin 11 | |
#define musicPin 12 | |
SoftwareSerial mySerial = SoftwareSerial(1, txPin); | |
#define LED0 3 | |
#define LED1 7 | |
#define LED2 4 | |
#define LED3 2 | |
#define LED4 9 | |
#define LED5 6 | |
#define LED6 8 | |
#define LED7 5 | |
#define BRIGHTNESS_LED 10 | |
int BRIGHTNESS_VALUE = 10; | |
/* | |
---X----0 | |
--XXX--123 | |
--XXX--456 | |
---X----7 | |
*/ | |
// LED array | |
int mLEDArray[8] = { LED0, LED1, LED2, LED3, LED4, LED5, LED6, LED7 }; | |
//int mLEDArray[8] = { LED7, LED6, LED5, LED4, LED3, LED2, LED1, LED0 }; | |
#define LED_NUM 8 | |
// 15 possible shapes, bottom 4 are harder (advanced mode?) | |
int mShapes[][LED_NUM] = { {1,0,1,1,0,1,0,0}, // T Right | |
{1,1,1,0,0,1,0,0}, // T Left | |
{0,1,1,1,0,1,0,0}, // T Down | |
{0,0,1,0,1,1,1,0}, // T Up | |
{0,0,1,1,0,1,1,0}, // Square Right | |
{0,1,1,0,1,1,0,0}, // Square Left | |
{0,1,1,0,0,1,1,0}, // Step Left | |
{0,0,1,1,1,1,0,0}, // Step Right | |
{0,0,1,1,0,1,0,1}, // Top L Left | |
{0,1,1,0,0,1,0,1}, // Top L Right | |
{1,0,1,0,1,1,0,0}, // Bottom L Left | |
{1,0,1,0,0,1,1,0}, // Bottom L Right | |
{1,0,1,0,0,1,0,1}, // 4x1 Up | |
{0,0,0,1,1,1,1,0}, // Flat L Rightm, ADVANCED SHAPES | |
{0,1,0,0,1,1,1,0}, // Flat L Left | |
{0,1,1,1,1,0,0,0}, // Flat Inverted L Left | |
{0,1,1,1,0,0,1,0}, // Flat Inverted L Right | |
{0,1,0,0,1,1,0,1}, // Stair Up Left | |
{0,0,0,1,0,1,1,1} }; // Stair Up Right | |
//#define SHAPE_NUM 19 | |
#define SHAPE_NUM 13 | |
int mTargetShapeIndex; | |
/* 0 is the center block | |
---3 | |
--214 | |
---0 | |
*/ | |
enum { ANALOG_BAD = -1, ANALOG_0_CONNECT = 0, ANALOG_1_CONNECT, ANALOG_2_LEFT, ANALOG_2_TOP, ANALOG_3_RIGHT }; | |
//const int ANALOG_STATE_VALUES[5] = { 716, 471, 439, 429, 408 }; // These are the analog values representing the different | |
//const int ANALOG_STATE_VALUES[5] = { 1023, 676, 579, 628, 613 }; | |
const int ANALOG_STATE_VALUES[5] = {0, 508, 1024, 1024, 1024 }; | |
#define ANALOG_TOLLERENCE 80 | |
#define ANALOG_AVERAGE 5 | |
/* X is the center block | |
---0 | |
--1X2 | |
--3X4 | |
---5 | |
*/ | |
#define ANALOG_PORTS 6 | |
const int mGameAnalogStates[][ANALOG_PORTS] = { { ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT }, // TR | |
{ ANALOG_1_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT }, // TL | |
{ ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT }, // TD | |
{ ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT }, // TU | |
{ ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT }, // SR | |
{ ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT }, // SL | |
{ ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT }, // StL | |
{ ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT }, // StR | |
{ ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT }, // TLL | |
{ ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT }, // TLR | |
{ ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT }, // BLL | |
{ ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT }, // BLR | |
{ ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT }, // 4x1 | |
{ ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_1_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT }, // Advanced Shapes. NOT right yet | |
{ ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT }, | |
{ ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_1_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_0_CONNECT }, | |
{ ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT }, | |
{ ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT }, | |
{ ANALOG_0_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_0_CONNECT, ANALOG_1_CONNECT, ANALOG_1_CONNECT } }; | |
int mAnalogPortStates[ANALOG_PORTS]; // 1 for each port of the game | |
//const int ANALOG_PIN_MAP[ANALOG_PORTS] = { 5, 4, 3, 2, 1, 0 }; | |
const int ANALOG_PIN_MAP[ANALOG_PORTS] = { 3, 4, 2, 5, 1, 0 }; | |
enum { STATE_STARTUP = 0, STATE_WAIT_TO_START_GAME, STATE_CHOOSE_SHAPE, STATE_WAITING_FOR_PLAYER, STATE_GOT_SHAPE }; | |
enum { GAME_BASIC = 0, GAME_ADVANCED }; | |
int mGameState; | |
int mGameType; | |
int sensorValue = 0; // value read from the pot | |
int outputValue = 0; // value output to the PWM (analog out) | |
int mLEDTestIndex = 0; | |
int mLEDTestShapeIndex = 0; | |
cScoreSpeaker mScoreSpeaker; | |
void fLEDShapesTest(); | |
void fLEDDisplayTest(); | |
void fLEDAndAnalogTest(); | |
void fShapeRecognitionTest(); | |
void fAllLEDs(int newState); | |
void fPrintAllAnalogPorts(); | |
void fPrintTargetShapePorts(); | |
int fGetAnalogState(int pin); | |
void fGetAllAnalogStates(); | |
void fDisplayLEDShape(); | |
void fRunStateMachine(); | |
void fRunStateStartup(); | |
void fRunStateChooseShape(); | |
void fRunStateWaitingForPlayer(); | |
void fRunStateGotShape(); | |
int fCompareShapeToAnalog(); | |
void fAllLEDsBlinkTest(); | |
void fSay(int soundDefine); | |
void setup() | |
{ | |
// initialize serial communications at 9600 bps: | |
mySerial.begin(2400); | |
pinMode(txPin, OUTPUT); | |
pinMode(musicPin, OUTPUT); | |
#ifdef MUSIC_OFF | |
digitalWrite(musicPin, HIGH); | |
#else | |
digitalWrite(musicPin, LOW); | |
#endif | |
#ifdef DEBUG | |
Serial.begin(9600); | |
Serial.println("Started setup()"); | |
#endif | |
pinMode(LED0, OUTPUT); | |
pinMode(LED1, OUTPUT); | |
pinMode(LED2, OUTPUT); | |
pinMode(LED3, OUTPUT); | |
pinMode(LED4, OUTPUT); | |
pinMode(LED5, OUTPUT); | |
pinMode(LED6, OUTPUT); | |
pinMode(LED7, OUTPUT); | |
pinMode(BRIGHTNESS_LED, OUTPUT); | |
digitalWrite(LED0, LOW); | |
digitalWrite(LED1, LOW); | |
digitalWrite(LED2, LOW); | |
digitalWrite(LED3, LOW); | |
digitalWrite(LED4, LOW); | |
digitalWrite(LED5, LOW); | |
digitalWrite(LED6, LOW); | |
digitalWrite(LED7, LOW); | |
analogWrite(BRIGHTNESS_LED, BRIGHTNESS_VALUE); | |
randomSeed(analogRead(7)); | |
mGameState = STATE_STARTUP; | |
mGameType = GAME_BASIC; | |
} | |
void loop() | |
{ | |
fRunStateMachine(); | |
//fShapeRecognitionTest(); | |
//delay(1000); | |
//fLEDDisplayTest(); | |
//delay(500); | |
//fLEDShapesTest(); | |
//delay(1000); | |
//fGetAllAnalogStates(); | |
//fPrintAllAnalogPorts(); | |
//delay(1000); | |
//fLEDAndAnalogTest(); | |
//delay(1000); | |
//fAllLEDsBlinkTest(); | |
} | |
void fRunStateMachine() | |
{ | |
switch(mGameState) | |
{ | |
case(STATE_STARTUP): | |
{ | |
fRunStateStartup(); | |
break; | |
} | |
case(STATE_WAIT_TO_START_GAME): | |
{ | |
fWaitToStartGame(); | |
break; | |
} | |
case(STATE_CHOOSE_SHAPE): | |
{ | |
fRunStateChooseShape(); | |
break; | |
} | |
case(STATE_WAITING_FOR_PLAYER): | |
{ | |
fRunStateWaitingForPlayer(); | |
break; | |
} | |
case(STATE_GOT_SHAPE): | |
{ | |
fRunStateGotShape(); | |
break; | |
} | |
}; | |
} | |
void fSay(int soundDefine) | |
{ | |
mySerial.print(soundDefine, BYTE); | |
} | |
void fRunStateStartup() | |
{ | |
#ifdef DEBUG | |
Serial.println("Game Start"); | |
#endif | |
fSay(SND_TETRIS_SHAPE_IT); | |
mGameState = STATE_CHOOSE_SHAPE; | |
} | |
void fWaitToStartGame() | |
{ | |
} | |
void fRunStateChooseShape() | |
{ | |
#ifdef DEBUG | |
Serial.println("Choosing New Shape"); | |
#endif | |
int oldShape = mTargetShapeIndex; | |
do | |
{ | |
mTargetShapeIndex = random(SHAPE_NUM); | |
} while (mTargetShapeIndex == oldShape); | |
fDisplayLEDShape(mTargetShapeIndex); | |
mGameState = STATE_WAITING_FOR_PLAYER; | |
} | |
void fRunStateWaitingForPlayer() | |
{ | |
fGetAllAnalogStates(); | |
if(fCompareShapeToAnalog()) | |
{ | |
#ifdef DEBUG | |
Serial.println("Shapes Match!"); | |
#endif | |
mySerial.print(2, BYTE); | |
mGameState = STATE_CHOOSE_SHAPE; | |
} | |
fPrintAllAnalogPorts(); | |
} | |
void fRunStateGotShape() | |
{ | |
} | |
int fCompareShapeToAnalog() | |
{ | |
int correctPorts = 0; | |
// Interpret analog ports | |
for(int stater = 0; stater<ANALOG_PORTS; stater++) | |
{ | |
if(mAnalogPortStates[stater] == mGameAnalogStates[mTargetShapeIndex][stater]) | |
correctPorts++; | |
} | |
//fPrintTargetShapePorts(); | |
//fPrintAllAnalogPorts(); | |
if(6 == correctPorts) | |
return 1; | |
else | |
return 0; | |
} | |
void fDisplayLEDShape(int shapeIndex) | |
{ | |
for(int led = 0; led < LED_NUM; led++) | |
digitalWrite(mLEDArray[led], mShapes[shapeIndex][led]); | |
} | |
void fGetAllAnalogStates() | |
{ | |
for(unsigned int i=0; i<ANALOG_PORTS; i++) | |
{ | |
mAnalogPortStates[i] = fGetAnalogState(ANALOG_PIN_MAP[i]); | |
} | |
} | |
int fGetAnalogState(int pin) | |
{ | |
int sensorValue = 0; | |
for(unsigned int avg = 0; avg<ANALOG_AVERAGE; avg++) | |
sensorValue += analogRead(pin); | |
sensorValue /= ANALOG_AVERAGE; | |
#ifdef DEBUG | |
/* | |
Serial.print("Pin: "); | |
Serial.print(pin); | |
Serial.print(", "); | |
Serial.print(sensorValue); | |
Serial.print("\n\r"); | |
*/ | |
#endif | |
for(unsigned int state = 0; state < 5; state++) | |
{ | |
if(sensorValue >= ANALOG_STATE_VALUES[state]-ANALOG_TOLLERENCE && sensorValue <= ANALOG_STATE_VALUES[state]+ANALOG_TOLLERENCE) // If within tollerence | |
{ | |
#ifdef DEBUG | |
/* | |
Serial.print("Returning State: "); | |
Serial.println(state); | |
*/ | |
#endif | |
return state; | |
} | |
} | |
#ifdef DEBUG | |
Serial.print("No valid analog state. Returning -1 on pin "); | |
Serial.println(pin); | |
#endif | |
return ANALOG_BAD; // If none of the states are valid | |
} | |
// UNIT TESTS SECTION ****************************************************************************** | |
void fPrintTargetShapePorts() | |
{ | |
#ifdef DEBUG | |
Serial.print("Expected: "); | |
for(int stater = 0; stater<ANALOG_PORTS; stater++) | |
{ | |
Serial.print(mGameAnalogStates[mTargetShapeIndex][stater]); | |
Serial.print(" "); | |
} | |
Serial.println(""); | |
#endif | |
} | |
void fPrintAllAnalogPorts() | |
{ | |
#ifdef DEBUG | |
/* | |
Serial.print("Analog Ports: "); | |
for(int porter = 0; porter<ANALOG_PORTS; porter++) | |
{ | |
Serial.print(mAnalogPortStates[porter]); | |
Serial.print(" "); | |
} | |
Serial.println(""); | |
*/ | |
#endif | |
} | |
void fShapeRecognitionTest() | |
{ | |
int correctPorts = 0; | |
fAllLEDs(LOW); | |
fGetAllAnalogStates(); | |
fPrintAllAnalogPorts(); | |
// Interpret analog ports | |
for(int shaper = 0; shaper<SHAPE_NUM; shaper++) | |
{ | |
for(int stater = 0; stater<ANALOG_PORTS; stater++) | |
{ | |
if(mAnalogPortStates[stater] == mGameAnalogStates[shaper][stater]) | |
correctPorts++; | |
} | |
if(correctPorts == ANALOG_PORTS) | |
{ | |
#ifdef DEBUG | |
Serial.print("Shape: "); | |
Serial.print(shaper); | |
Serial.print(", "); | |
Serial.print("Correct Ports: "); | |
Serial.println(correctPorts); | |
#endif | |
} | |
correctPorts = 0; | |
} | |
} | |
void fAllLEDs(int newState) | |
{ | |
digitalWrite(LED0, newState); | |
digitalWrite(LED1, newState); | |
digitalWrite(LED2, newState); | |
digitalWrite(LED3, newState); | |
digitalWrite(LED4, newState); | |
digitalWrite(LED5, newState); | |
digitalWrite(LED6, newState); | |
digitalWrite(LED7, newState); | |
} | |
void fLEDAndAnalogTest() | |
{ | |
digitalWrite(LED0, LOW); | |
digitalWrite(LED1, LOW); | |
digitalWrite(LED2, LOW); | |
digitalWrite(LED3, LOW); | |
digitalWrite(LED4, LOW); | |
digitalWrite(LED5, LOW); | |
digitalWrite(LED6, LOW); | |
digitalWrite(LED7, LOW); | |
delay(500); | |
fGetAllAnalogStates(); | |
delay(500); | |
digitalWrite(LED0, HIGH); | |
digitalWrite(LED1, HIGH); | |
digitalWrite(LED2, HIGH); | |
digitalWrite(LED3, HIGH); | |
digitalWrite(LED4, HIGH); | |
digitalWrite(LED5, HIGH); | |
digitalWrite(LED6, HIGH); | |
digitalWrite(LED7, HIGH); | |
delay(500); | |
fGetAllAnalogStates(); | |
delay(500); | |
} | |
void fLEDShapesTest() | |
{ | |
for(mLEDTestShapeIndex = 0; mLEDTestShapeIndex<SHAPE_NUM; mLEDTestShapeIndex++) | |
{ | |
fDisplayLEDShape(mLEDTestShapeIndex); | |
delay(500); | |
} | |
} | |
void fLEDDisplayTest() | |
{ | |
#ifdef DEBUG | |
Serial.print(mLEDTestIndex); | |
Serial.print("\n"); | |
#endif | |
switch(mLEDTestIndex) | |
{ | |
case(0): | |
{ | |
digitalWrite(LED0, HIGH); | |
digitalWrite(LED1, LOW); | |
digitalWrite(LED2, LOW); | |
digitalWrite(LED3, LOW); | |
digitalWrite(LED4, LOW); | |
digitalWrite(LED5, LOW); | |
digitalWrite(LED6, LOW); | |
digitalWrite(LED7, LOW); | |
break; | |
} | |
case(1): | |
{ | |
digitalWrite(LED0, LOW); | |
digitalWrite(LED1, HIGH); | |
digitalWrite(LED2, LOW); | |
digitalWrite(LED3, LOW); | |
digitalWrite(LED4, LOW); | |
digitalWrite(LED5, LOW); | |
digitalWrite(LED6, LOW); | |
digitalWrite(LED7, LOW); | |
break; | |
} | |
case(2): | |
{ | |
digitalWrite(LED0, LOW); | |
digitalWrite(LED1, LOW); | |
digitalWrite(LED2, HIGH); | |
digitalWrite(LED3, LOW); | |
digitalWrite(LED4, LOW); | |
digitalWrite(LED5, LOW); | |
digitalWrite(LED6, LOW); | |
digitalWrite(LED7, LOW); | |
break; | |
} | |
case(3): | |
{ | |
digitalWrite(LED0, LOW); | |
digitalWrite(LED1, LOW); | |
digitalWrite(LED2, LOW); | |
digitalWrite(LED3, HIGH); | |
digitalWrite(LED4, LOW); | |
digitalWrite(LED5, LOW); | |
digitalWrite(LED6, LOW); | |
digitalWrite(LED7, LOW); | |
break; | |
} | |
case(4): | |
{ | |
digitalWrite(LED0, LOW); | |
digitalWrite(LED1, LOW); | |
digitalWrite(LED2, LOW); | |
digitalWrite(LED3, LOW); | |
digitalWrite(LED4, HIGH); | |
digitalWrite(LED5, LOW); | |
digitalWrite(LED6, LOW); | |
digitalWrite(LED7, LOW); | |
break; | |
} | |
case(5): | |
{ | |
digitalWrite(LED0, LOW); | |
digitalWrite(LED1, LOW); | |
digitalWrite(LED2, LOW); | |
digitalWrite(LED3, LOW); | |
digitalWrite(LED4, LOW); | |
digitalWrite(LED5, HIGH); | |
digitalWrite(LED6, LOW); | |
digitalWrite(LED7, LOW); | |
break; | |
} | |
case(6): | |
{ | |
digitalWrite(LED0, LOW); | |
digitalWrite(LED1, LOW); | |
digitalWrite(LED2, LOW); | |
digitalWrite(LED3, LOW); | |
digitalWrite(LED4, LOW); | |
digitalWrite(LED5, LOW); | |
digitalWrite(LED6, HIGH); | |
digitalWrite(LED7, LOW); | |
break; | |
} | |
case(7): | |
{ | |
digitalWrite(LED0, LOW); | |
digitalWrite(LED1, LOW); | |
digitalWrite(LED2, LOW); | |
digitalWrite(LED3, LOW); | |
digitalWrite(LED4, LOW); | |
digitalWrite(LED5, LOW); | |
digitalWrite(LED6, LOW); | |
digitalWrite(LED7, HIGH); | |
break; | |
} | |
case(8): | |
{ | |
digitalWrite(LED0, HIGH); | |
digitalWrite(LED1, HIGH); | |
digitalWrite(LED2, HIGH); | |
digitalWrite(LED3, HIGH); | |
digitalWrite(LED4, HIGH); | |
digitalWrite(LED5, HIGH); | |
digitalWrite(LED6, HIGH); | |
digitalWrite(LED7, HIGH); | |
break; | |
} | |
}; | |
mLEDTestIndex++; | |
if(mLEDTestIndex > 8) | |
{ | |
mLEDTestIndex = 0; | |
delay(1000); | |
} | |
} | |
void fAllLEDsBlinkTest() | |
{ | |
fAllLEDs(LOW); | |
delay(800); | |
fAllLEDs(HIGH); | |
delay(800); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment