# Conway's game of "Life"

It's not terribly interesting on an 8 by 8 grid but I've just implemented Life on the Arduino + an LED matrix. Video on YouTube: http://www.youtube.com/watch?v=tOruWC0Hqqg, source code on pastebin.com when I get home from work. Towards the end of the video it stumbles into quite a good repeating pattern.

[Update] I've put the code up now at http://arduino.pastebin.com/f22bfe94d.

i can hear your arduino saying "i need buttons!"

i can hear your arduino saying "i need buttons!"

Do mean for the reset? Yeah, I've got some buttons, just haven't bothered to wire one up.

And I just got the parts for a 16x16 array.

Hmmm......

did you hook up an 8x8 led matrix with no ic's or chips??

i cant get my 5x7 to work by itself...

Any chance that we could see a schematic of the circuit?

Sorry, the one thing I haven't done yet is to draw out the circuit. It isn't much of a circuit though as yes, the Arduino pins are wired directly to the 16 pins of the LED matrix. The mapping is defined in the source code I posted here: http://arduino.pastebin.com/f22bfe94d as follows:

``````// pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1)
int pins[17]= {-1, 5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};
``````

which is intended to mean that pin 1 on the matrix is connected to Arduino pin 5, matrix pin 2 is connected to Arduino pin 4 and so on. This makes it easy to update for your own particular wiring. The pinout of the matrix with respect to what pin controls what row and column is also in the source code, and is taken from the datasheet here where I bought the matrix: http://www.rapidonline.com/netalogue/specs/57-0695.pdf

I'll try and draw a diagram tomorrow but I'm not promising anything as I don't really have a decent drawing tool available at home.

Andrew

PS I used some of the analog pins as digital output pins 14, 15 and 16.

Lovingly crafted diagram now available on ImageShack...

to go with code here: http://arduino.pastebin.com/f22bfe94d

I hope I got the wires in the right places...

[Update] Now also available in a Wiki near you: http://www.arduino.cc/playground/Main/DirectDriveLEDMatrix

Andrew

Here is a draft code of GoLi wich work with a MAX7219. It should work with 8 of them (work in progress). The code may be easily reuse.
Sorry for the roughly code, with french functions name inside :

``````#include "LedControl.h"

LedControl lc=LedControl(12,11,10,1);

#define Largeur 8
#define Hauteur 8

int analogPin = 0;
unsigned long delaytime=150;

int idx=0;
int t1[8][8]  =  {{0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 1, 0, 1, 0, 0, 0},
{0, 1, 0, 1, 1, 0, 0, 0},
{1, 0, 1, 0, 0, 1, 1, 0},
{0, 1, 1, 0, 0, 1, 0, 1},
{0, 0, 0, 1, 1, 0, 1, 0},
{0, 0, 0, 1, 0, 1, 0, 0},
{0, 0, 0, 0, 1, 0, 0, 0}};
int t2[8][8];
/*******************************************************************************/
/* set all the box to zero*/

void mise_a_0(int t1[8][8],int t2[8][8])
{
int i,j;
for(i=0;i<Largeur;i++)
{
for(j=0;j<Hauteur;j++)
{
t1[i][j]=0;
t2[i][j]=0;
}
}
}

/*******************************************************************************/
/* clear window */

void clear_fenetre()
{
lc.clearDisplay(0);
}

/*******************************************************************************/
/* display cells */

void affiche(int t1[8][8])
{
int i,j;
//lc.clearDisplay(0);
//_setcursortype(_NOCURSOR);
//textcolor(14);
for(i=0;i<Largeur;i++)
{
for(j=0;j<Hauteur;j++)
{
lc.setLed(0,i,j,t1[i][j]);

}
}
}

/*******************************************************************************/
/* compute previous generation*/

void affect_etat_precedent(int t1[8][8],int t2[8][8])
{
int i,j;

for(i=0;i<Largeur;i++)
{
for(j=0;j<Hauteur;j++)
{
t2[i][j]=t1[i][j];
}
}
}

/*******************************************************************************/
/* compute next generation */

void affect_etat_suivant(int t1[8][8],int t2[8][8])
{
int i,j;

for(i=0;i<Largeur;i++)
{
for(j=0;j<Hauteur;j++)
{
t1[i][j]=t2[i][j];
}
}
}

/*******************************************************************************/
/* compute neighborough cells */
#
void calcul_cellule(int t1[8][8],int t2[8][8])
{
int i,j,a;

for(i=0;i<Largeur;i++)
{
for(j=0;j<Hauteur;j++)
{
if((i==0)&&(j==0))
{
a=t1[i][j+1]+t1[i+1][j]+t1[i+1][j+1]+t1[i][69]+t1[i+1][69]+t1[19][j]+t1[19][j+1]+t1[19][69];
}

if((i!=0)&&(j!=0)&&(i!=(Largeur-1))&&(j!=(Hauteur-1)))
{
a=t1[i-1][j-1]+t1[i-1][j]+t1[i-1][j+1]+t1[i][j+1]+t1[i+1][j+1]+t1[i+1][j]+t1[i+1][j-1]+t1[i][j-1];
}

if((i==0)&&(j!=0)&&(j!=(Hauteur-1)))
{
a=t1[i][j-1]+t1[i+1][j-1]+t1[i+1][j]+t1[i+1][j+1]+t1[i][j+1]+t1[19][j-1]+t1[19][j]+t1[19][j+1];
}

if((i==0)&&(j==(Hauteur-1)))
{
a=t1[i][j-1]+t1[i+1][j-1]+t1[i+1][j]+t1[i][0]+t1[i+1][0]+t1[19][0]+t1[19][j]+t1[19][j-1];
}

if((i==(Largeur-1))&&(j==0))
{
a=t1[i-1][j]+t1[i-1][j+1]+t1[i][j+1]+t1[i][69]+t1[i-1][69]+t1[0][j]+t1[0][j+1]+t1[0][69];
}

if((i==(Largeur-1))&&(j!=0)&&(j!=(Hauteur-1)))
{
a=t1[i][j-1]+t1[i][j+1]+t1[i-1][j-1]+t1[i-1][j]+t1[i-1][j+1]+t1[0][j]+t1[0][j-1]+t1[0][j+1];
}

if((i==(Largeur-1))&&(j==(Hauteur-1)))
{
a=t1[i][j-1]+t1[i-1][j-1]+t1[i-1][j]+t1[0][j]+t1[0][j-1]+t1[i][0]+t1[i-1][0]+t1[0][0];
}

if((i!=0)&&(i!=(Largeur-1))&&(j==0))
{
a=t1[i-1][j]+t1[i-1][j+1]+t1[i][j+1]+t1[i+1][j+1]+t1[i+1][j]+t1[i][69]+t1[i-1][69]+t1[i+1][69];
}

if((i!=0)&&(i!=(Largeur-1))&&(j==(Hauteur-1)))
{
a=t1[i-1][j]+t1[i-1][j-1]+t1[i][j-1]+t1[i+1][j-1]+t1[i+1][j]+t1[i][0]+t1[i-1][0]+t1[i+1][0];
}

if((t1[i][j]==0)&&(a==3)){t2[i][j]=1;}
if((t1[i][j]==1)&&((a==2)||(a==3))){t2[i][j]=1;}
if((t1[i][j]==1)&&((a==1)||(a==0)||(a>3))){t2[i][j]=0;}
}
}
}

/*******************************************************************************/
/* randomize */

void alea(int t1[8][8])
{
int i,j;
randomSeed(millis());
for(i=0;i<Largeur;i++)
{
for(j=0;j<Hauteur;j++)
{
t1[i][j]=random(2);
}
}
}

/*******************************************************************************/
/*permutation*/

void permut(int *a,int *b)
{
int aux;
aux=*a;
*a=*b;
*b=aux;
}

void setup() {
lc.shutdown(0,false);
lc.setIntensity(0,15);
lc.clearDisplay(0);
// alea(t1);
}

void loop()
{

if (idx++ > 30)
{
alea(t1);

lc.clearDisplay(0);
delay(300);
idx=0;
}

affect_etat_precedent(t1,t2);
calcul_cellule(t1,t2);
affect_etat_suivant(t1,t2);
affiche(t1);
delay(delaytime);

}
``````