Skip to content

Instantly share code, notes, and snippets.

@arduinoboard
Created July 28, 2011 18:29
Show Gist options
  • Save arduinoboard/1112179 to your computer and use it in GitHub Desktop.
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
#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