Slang in de matrix
De basis van dit project is de 8x8 LED Matrix uit project 21.
Stel je je een gevaarlijk slang voor. Een hele gevaarlijke slang. Met grote scherpe tanden waar het gif uit druipt. Of met een groot en krachtig lichaam waarmee het je wil wurgen. Dat is hier niet, het zijn een aantal LEDs achter elkaar. En gelukkig zit de gevaarlijke slang opgesloten op je matrix scherm. Maar hij is als een dolle op zoek naar een weg uit.
De slang bestaat uit een aantal LEDjes achter elkaar. En daar zit ook een lastig ding in.
Stel je voor, we willen de volgende slang op het scherm zetten. In dit figuur zijn dat de rode LED's. Op R3 C2, C3, C4, C5 en C6. Op R4 de C6. In de code geven we dan (in een loop) de opdrachten aan de:
We zien dat al deze LEDs keurig in rood gaan branden. We zien echter ook dat de zwart-rode
GHOST
LEDs ook gaan branden. Deze heb ik in het schema een nummer gegeven.
Toen we de LED op (3,2) aan hebben gezet. Hebben we gezegd, stroom op R3 en C2. Toen we de laatste LED (4,6) hebben aangezet. Hebben we stroom op R4 en R6 gezet. Dus alle LED's op de kruispunten van deze punten gaan branden. Dus ook R4, C2. De GHOST-1 LED. Dat wilden we niet. Maar dat gebeurde wel.
Op dezelfde manier zijn ook de
GHOST
LEDs 2,3 en 4 aangezet. We hebben het zelf gedaan.
We kunnen dus concluderen dat het aanzetten van de slang in een keer, niet lukt. We moeten iets anders verzinnen. Dat hebben we in onderstaande code gedaan.
Breadboard
Zie introductie van de LED matrix in het vorig project.
LED Matrix introductie
Source code
/*
   8x8 segment LED Matrix,, slang
   (C) copyright www.punthooft.nl 2019-2026
*/
#define snakelength 8
// Variables
int snake[snakelength][2];  // Snake array
int headrow = 4;            // Row of the head
int headcol =4;             // Col of the head
int direction = 2;          // Direction for some same movement
int delayCounter = 0;       // Prepares times for moves
int i,j;                    // Counters
// Setup function runs once when powerup the board and on reset
void setup() {
  for(i=0;i<snakelength;i++) {
    for(j=0;j<2;j++) {
      snake[i][j]=0;
    }
  } 
  randomSeed(analogRead(0));   // Set randomizer
}
// Function to lightup the LED at row, col position
void loop() {
  delayCounter++;
  delay(1);
  if (delayCounter>20) {
    delayCounter=0;
    if (random(3)==0) {
      direction = random(1,5); // switch direction
    }
    switch(direction) {
      case 1: // right
        headcol++;
        if(headcol>7) {
          headcol=7;
          direction=2;
        }
        break;
      case 2: // left
        headcol--;
        if(headcol<0) {
          headcol=0;
          direction=1;
        }
        break;
      case 3: // down
        headrow++;
        if(headrow>7) {
          headrow=7;
          direction=4;
        }
        break;
      case 4: // up
        headrow--;
        if(headrow<0) {
          headrow=0;
          direction=3;
        }
        break;
    }
    for(i=snakelength-1;i>0;i--) {
      snake[i][0]=snake[i-1][0];
      snake[i][1]=snake[i-1][1];
    }
    snake[0][0]=headrow;
    snake[0][1]=headcol;
  } // end delaycounter
  // redraw the snake
  for(i=0;i<snakelength;i++) {
    displayAt(snake[i][0],snake[i][1]);
  }
}
// Function to display a LED
void displayAt(int x,int y) {
  pinMode(x+2,OUTPUT);
  pinMode(y+10,OUTPUT);
  digitalWrite(x+2, HIGH);
  digitalWrite(y+10, HIGH);
  delayMicroseconds(25);
  digitalWrite(x+2, LOW);
  digitalWrite(y+10, LOW);
  pinMode(x+2,INPUT);
  pinMode(y+10,INPUT);
}
Opmerkingen
Bovenin de code initialiseren we alle variabelen. We benoemen ze daar en geven ze een waarde. De counters lopen altijd in een loop, waarin ze ook altijd een waarde krijgen. De slang staat in een 2 dimensionele array, waar we, in de setup, alle waarden op nul zetten.
In de loop() functie hebben we een delay counter. Deze telt tot 20. Zolang deze teller onder de 20 is, zal de slang op dezelfde plek blijven liggen. Hij schuift niet op. Het enige wat er gebeurd is dat de slang, stukje voor stukje getekend zal worden. In the loop
redraw the snake
laten we de LEDs branden. Alle onderdelen van de slang, snel achter elkaar. Dat doen we zo 20 keer. De slang is dan duidelijk verlicht.
  • Hebben we de slang zo 20 keer laten branden, dan is het tijd voor beweging. Iedere beweging doen we een aantal stappen achter elkaar, daar is de eerste random(3) voor. Dus in niet alle gevallen zoeken we een nieuwe richting. Als het wel zover is komt in direction een nieuwe kant om op te gaan.
  • Per direction (op / neer / rechts / links) staat er een eigen stukje code. Als we naar rechts gaan, dan hogen we headcol op. Maar als we buiten de matrix gaan (deze loopt van 0 tot en met 7) dan passen we dat meteen aan en zal de richting links worden. Dit ook zo voor de andere richtingen
  • Dan hoeven we enkel nog de slang aan te passen. We vullen vanaf de staart deze met de voorgaande slangonderdelen. En zetten tot slot de kop erop. En dan gaan we weer LEDs aandoen, maar nu op de nieuwe positie.