I used a board with ATMEGA328P. On this chip I used ADXL345 for input sensors and serial communication with processing. ADXL345 detects X and Y values. So I want to use it making Memory Exploring game.
Processing is a flexible software sketchbook and a language for learning how to code within the context of the visual arts. Also Processing is open source, free software. So I used processing to create the interface of this game.
First, download the gifAnimation library form this website. Second, download the google map and streetview from google. And make some checkpoint where is your memory place.
Used ADXL345 to control google map direction. So when you turn ADXL345 left, you will see the map of left hand. Turn ADXL345 right, you will see the map of right hand. You can enter to streetview when you keep about five second on the ckeckpoint. Also, if you keep one point for five to seven second in the streetview you will go back to map view. I called it a memory exploring game.
Some explanation with code:
To set which com port with your board.
String portName = "COM14";
Read value from serial input.
myString = myPort.readStringUntil(lf);
Programming in processing:
// FlashBack Test v1.1
import processing.serial.*;
import gifAnimation.*;
//Serial myPort; // Create object from Serial class
int val; // = new float; // Value Array [z, x, y]
int lf = 10; // Linefeed in ASCII
String myString = null;
Serial myPort; // Serial port you are using
float num, valZ, valX, valY;
// averaging
float valZ1, valZ2, valZ3, valZ4, valZ5;
float startZ, startX, startY;
float differenceZ, oldFrameX, oldFrameY, tempX, tempY, differenceX, differenceY, enterPoint;
float frameZ, frameX, frameY;
float[] dimensions;
int sizeX, sizeY, maxSizeX, maxSizeY, minSizeX, minSizeY, bSizeX, bSizeY, minBSizeY, minBSizeX, maxBSizeX, maxBSizeY;
int sensativity;
int golbalCount, YvalueCount, timeout, timeforEnter;
PImage bgImage, svImage, svImage1, svImage2, svImage3, svImage4;
PImage imgMask;
PImage logoFlash;
PImage mapImage;
float zoom = 1;
int delay = 600;
int delay2 = 100;
int mapCheck;
int state = 0;
/*
public void init() {
frame.removeNotify();
frame.setUndecorated(true);
frame.addNotify();
super.init();
}
*/
void setup()
{
// Setup Screen
smooth();
noStroke();
background(255);
frameRate(60);
size(1280, 720);
//size(displayWidth, displayHeight, P3D); //1656, 1364);
frame.setLocation(0, 0);
timeout = 0;
timeforEnter = 0;
mapCheck = 1; // map
enterPoint = 0;
// Check Serial Port
//String portName = Serial.list()[0];
String portName = "COM14";
myPort = new Serial(this, portName, 9600); //9600
println(portName);
// Define images
mapImage = loadImage("map2.jpg");
bgImage = loadImage("map.jpg");
svImage = loadImage("streetview.jpg");
svImage1 = loadImage("streetview1.jpg");
svImage2 = loadImage("streetview2.jpg");
svImage3 = loadImage("streetview3.jpg");
imgMask = loadImage ("cutout.png");
imageMode(CENTER);
// image
sizeX = 4792;
sizeY = 786;
maxSizeX = sizeX + 300;
maxSizeY = sizeY + 300;
minSizeX = sizeX - 300;
minSizeY = sizeY - 300;
// mask
bSizeX = 2244;
bSizeY = 768;
maxBSizeX = bSizeX + 200;
maxBSizeY = bSizeY + 200;
minBSizeX = bSizeX - 200;
minBSizeY = bSizeY - 200;
oldFrameX = 0;
oldFrameY = 0;
// Define values
golbalCount = 0;
tempX = 0;
tempY = 0;
// Check & Read Serial Input
if (myPort.available() > 0) {
myString = myPort.readStringUntil(lf);
if (myString != null) {
//print(myString); // Prints String
num = float(myString); // Converts and prints float
// println(num);
golbalCount++;
if (golbalCount % 3 == 1) {
startZ = num;
//println("startZ = " + num);
} else if (golbalCount % 3 == 2) {
startX = num;
//println("startX = " + num);
} else if (golbalCount % 3 == 0) {
startY = num;
//println("startY = " + num);
}
}
}
// Images
//frameX = width / 2;
//frameY = height / 2;
//println("start position: " + startZ + ", " + startY);
// if (mapCheck == 1) {// Background Image ->map
// image(bgImage, width/2, height/2, 4792, 786); // frameX, frameY); //( width * startZ ) / 360
// } else {// StreetView Image
// image(svImage, width/2, height/2, 4792, 786);
// }
// Mask Image
//image(imgMask, width/2, height/2);
}
void draw()
{
if(frameCount < 300) {
background(0);
return;
}
scale(zoom);
sensativity = 2;
// Check & Read Serial Input
if (myPort.available() > 0) {
myString = myPort.readStringUntil(lf);
if (myString != null) {
//print(myString); // Prints String
num = float(myString); // Converts and prints float
// println(num);startY * 180
golbalCount++;
// Check Serial Input
if (golbalCount % 3 == 1) {
// Z Value
valZ5 = valZ4;
valZ4 = valZ3;
valZ3 = valZ2;
valZ2 = valZ1;
valZ1 = num;
valZ = (valZ1 + valZ2 + valZ3 + valZ4 + valZ5) / 5.0;
frameX = -1 * Math.abs((valZ /360) * sizeX);
differenceX = Math.abs(valZ - tempX);
println("frameX:" + valZ);
tempX = valZ;
//println(((valZ * sizeX) / 360));
//println("Z = " + num);
} else if (golbalCount%3 == 2) {
// X Value
valX = num;
//println("X = " + num);
} else if (golbalCount%3 == 0) {
// Y Value
valY = num;
if(valY > -5 ) {
valY = -5;
}
if(valY < -30 ) {
valY = -30;
}
// println("y: " + valY);
frameY = (-(valY * height/2) / 90) + height/2 - 100;
// Limit Y Frame Value between 35 ~ 50;
differenceY = Math.abs(valY - tempY);
//println("DIFFY:"+differenceY);
//println("Y = " + num);
tempY = valY;
}
}
}
//println(val);
noStroke();
background(255);
switch(state)
{
case 0: // Menu
// Loader
fill(176, 190, 197, 50); // grey
ellipse(width / 2, height / 2 + 80, 25, 25);
fill(64, 196, 255, 100); // blue
ellipse(width / 2, height / 2 + 80, timeout/10, timeout/10);
showStartScreen();
timeout++;
// println(timeout);
if(timeout > 250) {
state = 1;
timeout = 0;
}
break;
case 1: // Introduction
// Background Image
float xPosTest = frameX; // ((-1* valZ * sizeX) / 360) % 4792;
// Map
image(mapImage, xPosTest, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
image(mapImage, xPosTest - 4792, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
image(mapImage, xPosTest + 4792, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
showIntro();
// Loader
fill(176, 190, 197, 50);
ellipse(width / 2, height / 2 + 120, 25, 25);
fill(64, 196, 255, 100);
ellipse(width / 2, height / 2 + 120, timeout/16, timeout/16);
timeout++;
//println(timeout);
if(timeout > 400) {
state = 2;
timeout = 0;
}
break;
case 2: // Results
// Background Image
if (mapCheck == 1) {
// Background Image
if(enterPoint != 0){
timeforEnter++;
valZ = ((valZ - valZ) + enterPoint);
frameX = -1 * Math.abs((valZ /360) * sizeX);
float xPosMap = frameX; // ((-1* valZ * sizeX) / 360) % 4792;
// Map
image(bgImage, xPosMap, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
image(bgImage, xPosMap - 4792, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
image(bgImage, xPosMap + 4792, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
println("TIMEEEEEEEEE:"+timeforEnter);
if(timeforEnter>120){
enterPoint = 0;
timeforEnter = 0;
}
}
else{
float xPosMap = frameX; // ((-1* valZ * sizeX) / 360) % 4792;
// Map
image(bgImage, xPosMap, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
image(bgImage, xPosMap - 4792, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
image(bgImage, xPosMap + 4792, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
}
}
else if (mapCheck == 2) { // Street View
// StreetView Image
float xPosStreet = ((valZ * sizeX) / 360) % 4792;
// println(timeout);
// println("X street: " + xPosStreet);
// Street
image(svImage, xPosStreet, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
image(svImage, xPosStreet - 4792, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
image(svImage, xPosStreet + 4792, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
if (differenceX < sensativity && differenceY < sensativity){
timeout++;
showLoaderReturn();
println("kekekekekekeke");
if(timeout > delay){
frameX = enterPoint;
mapCheck =1;
timeout = 0;
}
}
}
else if (mapCheck == 3) { // London
// StreetView Image
float xPosStreet = ((valZ * sizeX) / 360) % 4792;
// println(timeout);
// Street
image(svImage1, xPosStreet, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
image(svImage1, xPosStreet - 4792, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
image(svImage1, xPosStreet + 4792, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
if (differenceX < sensativity && differenceY < sensativity){
timeout++;
showLoaderReturn();
if(timeout > delay){
frameX = enterPoint;
mapCheck =1;
timeout = 0;
}
}
}
else if (mapCheck == 4) { // Night
// StreetView Image
float xPosStreet = ((valZ * sizeX) / 360) % 4792;
// println("X street: " + xPosStreet);
// println(timeout);
// Street
image(svImage2, xPosStreet, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
image(svImage2, xPosStreet - 4792, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
image(svImage2, xPosStreet + 4792, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
if (differenceX < sensativity && differenceY < sensativity){
timeout++;
showLoaderReturn();
if(timeout > delay){
frameX = enterPoint;
println("ENTER:"+enterPoint);
mapCheck = 1;
timeout = 0;
}
}
}
else if (mapCheck == 5) { // Shop
// StreetView Image
float xPosStreet = ((valZ * sizeX) / 360) % 4792;
// println("X street: " + xPosStreet);
// println(timeout);
// Street
image(svImage3, xPosStreet, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
image(svImage3, xPosStreet - 4792, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
image(svImage3, xPosStreet + 4792, frameY, sizeX, sizeY ); //(valZ * width) / 360 //-(sizeX/2)+width
if (differenceX < sensativity && differenceY < sensativity){
timeout++;
showLoaderReturn();
if(timeout > delay){
frameX = enterPoint;
mapCheck =1;
timeout = 0;
}
}
}
// Check Points & Change scene
if(mapCheck == 1) {
// Check values
if(valZ > 15 && valZ < 21 && differenceX < sensativity && differenceY < sensativity){
timeout++;
showLoaderMap();
// println(timeout);
if(timeout > delay2) {
enterPoint = valZ;
mapCheck = 4;
timeout = 0;
}
}
else if(valZ > 49 && valZ < 53 && differenceX < sensativity && differenceY < sensativity){
timeout++;
showLoaderMap();
// println(timeout);
if(timeout > delay2) {
enterPoint = valZ;
mapCheck = 3;
timeout = 0;
}
}
else if(valZ > 85 && valZ < 89 && differenceX < sensativity && differenceY < sensativity){
timeout++;
showLoaderMap();
// println(timeout);
if(timeout > delay2) {
enterPoint = valZ;
mapCheck = 4;
timeout = 0;
}
}
else if(valZ > 99 && valZ < 100 && differenceX < sensativity && differenceY < sensativity){
timeout++;
showLoaderMap();
// println(timeout);
if(timeout > delay2) {
enterPoint = valZ;
mapCheck = 5;
timeout = 0;
}
}
else if(valZ > 150 && valZ < 156 && differenceX < sensativity && differenceY < sensativity){
timeout++;
showLoaderMap();
// println(timeout);
if(timeout > delay2) {
enterPoint = valZ;
mapCheck = 3;
timeout = 0;
}
}
else if(valZ > 205 && valZ < 209 && differenceX < sensativity && differenceY < sensativity){
timeout++;
showLoaderMap();
// println(timeout);
if(timeout > delay2) {
enterPoint = valZ;
mapCheck = 3;
timeout = 0;
}
}
else if(valZ > 226 && valZ < 230 && differenceX < sensativity && differenceY < sensativity){
timeout++;
showLoaderMap();
// println(timeout);
if(timeout > delay2) {
enterPoint = valZ;
mapCheck = 4;
timeout = 0;
}
}
else if(valZ > 257 && valZ < 263 && differenceX < sensativity && differenceY < sensativity){
timeout++;
showLoaderMap();
// println(timeout);
if(timeout > delay2) {
enterPoint = valZ;
mapCheck = 5;
timeout = 0;
}
}
else if(valZ > 269 && valZ < 275 && differenceX < sensativity && differenceY < sensativity){
timeout++;
showLoaderMap();
// println(timeout);
if(timeout > delay2) {
enterPoint = valZ;
mapCheck = 4;
timeout = 0;
}
}
else if(valZ > 301 && valZ < 305 && differenceX < sensativity && differenceY < sensativity){
timeout++;
showLoaderMap();
// println(timeout);
if(timeout > delay2) {
enterPoint = valZ;
mapCheck = 3;
timeout = 0;
}
}
else if(valZ > 338 && valZ < 344 && differenceX < sensativity && differenceY < sensativity){
timeout++;
showLoaderMap();
// println(timeout);
if(timeout > delay2) {
enterPoint = valZ;
mapCheck = 5;
timeout = 0;
}
}
else {
timeout = 0;
}
}
// println("img: "+( ((valZ * sizeX) / 360)));
// Mask Image
image(imgMask, width/2, height/2); // (valZ * width) / 360, height/2); //(valY * height) / 180);
break;
// End of Case
}
}
// Loader
void showLoaderReturn() {
// Loader Street View
fill(176, 190, 197, 50);
ellipse(width / 2, height / 2 + 120, 25, 25);
fill(64, 196, 255, 100);
ellipse(width / 2, height / 2 + 120, timeout/12, timeout/12);
}
// Loader
void showLoaderMap() {
// Loader Map
fill(176, 190, 197, 50);
ellipse(width / 2, height / 2 + 120, 25, 25);
fill(64, 196, 255, 100);
ellipse(width / 2, height / 2 + 120, timeout/4, timeout/4);
}
// Start Screen
void showStartScreen() {
// Text
textAlign(LEFT);
fill(160);
textSize(16);
text("Exercising Memories", width / 2 - 70, height / 2 + 50);
textSize(10);
image(imgMask, width/2, height/2);
}
void showIntro() {
fill(255);
ellipse(width/2, height/2, 400, 400);
// Txt
fill(0);
textAlign(CENTER);
textSize(18);
text("Welcome to", width/2, height / 2 - 50);
textSize(38);
text("Memory Exploring", width/2, height / 2);
textSize(16);
fill(160);
textSize(16);
text("Try to find these memories on the map.", width/2, height / 2 + 70);
image(imgMask, width/2, height/2);
}
// Controls
void keyPressed() {
if (key == CODED) {
if (key == 'a' || keyCode == UP) {
if (sizeX < maxSizeX && sizeY < maxSizeY) {
// sizeX += 5;
// sizeY += 5;
// bSizeX += 5;
// bSizeY += 5;
zoom = 1.5;
}
} else if (key == 'a' || keyCode == DOWN) {
if (sizeX > minSizeX && sizeY > minSizeY) {
// sizeX -= 5;
// sizeY -= 5;
// bSizeX -= 5;
// bSizeY -= 5;
zoom = 0.5;
}
} else if (key == 'a' || keyCode == LEFT) {
mapCheck = 2;
} else if (key == 'a' || keyCode == RIGHT) {
mapCheck = 1;
}
}
}
ShowIntroduction word to welcome you.
There is a small blue circle to countdown enter streetview.
ADXL345 Sensor(input devices) with processing(interface).
Keep five second enter to streetview and keep seven second bake to map view.