Matriu LED amb joystick

De Wiket
Salta a la navegació Salta a la cerca

El programa que hem fet realitza el moviment d'un sol LED per tota la matriu sense poder sortir-se'n d'aquesta. El control del LED es duu a terme amb un joystick incorporat també a la placa Arduino. Amb aquests dos complements es pot aconseguir que puguis moure el LED com si fos un objecte.

Components

Esquema connexions

MATRIZLED8X8.png

Codi Arduino

// Fem servir la variable temps amb la funció "millis" per contar-ne els milisegons:
unsigned long time = millis();

//Iniciatlitzem els pins per files:
const int row[8] = {
  2, 7, 19, 5, 13, 18, 12, 16
};
//Iniciatlitzem els pins per columnes:
const int col[8] = {
  6, 11, 10, 3, 17, 4, 8, 9
};

//Creem un vector bidimensional pels pixels:
int pixels[8][8];

//Inicialitzem al centre la posició del cursor:
 int x = 5;
 int y = 5;

//Creem 2 funcions; goingUp per moure el cursor i stopped per saber si està o no en moviment
boolean goingUp=true;
boolean stopped=true;

void setup() {
  Serial.begin(9600);
  
  // Inicialitza i itinera entre els pins:
  
  for (int thisPin = 0; thisPin < 8; thisPin++) {
    
    pinMode(col[thisPin], OUTPUT);
    pinMode(row[thisPin], OUTPUT);
    
    // Initialitzem els pins de columna a HIGH per assegurar-nos que estan apagats:
    digitalWrite(col[thisPin], HIGH);
  }

  // Inicialitzem la matriu de pixels:
  
  for (int x = 0; x < 8; x++) {
    for (int y = 0; y < 8; y++) {
      pixels[x][y] = HIGH;
    }
  }
 }

void loop() {
  
  // Crida a la funcio per moure el cursor:
  movePlayer();

  // Refresca la pantalla cridant a la funció:
  refreshScreen();
}


void  movePlayer(){

  // Inicialitza a HIGH la posició:
   pixels[x][y] = HIGH;

  // Fem que llegeixi el moviment del joystick, aquest enregistra moviments en forma de
  // números de l'1 al 1024. Fem que si el valor que registra és més gran que 800 i està
  // parat, augmenti una posició en l'eix de les X, si és més petit que 300 en disminueixi 
  // una posició al mateix eix i que si es troba entre 300 i 800 (al centre) no mogui la
  // posició del cursor.
 
  int readX = analogRead(A0);
  if(readX>800 && stopped && x < 7){
    x++;
    stopped= false;
  }
  else if (readX<300 && stopped && x > 0){
      x--;
      stopped= false; 
  }
  else if(readX>300 && readX<800) {
    stopped = true;
  }

// Jugant amb el temps, fem que els moviments es refresquin cada 0,3 segons per fer-ho 
// fluït però a la vegada fàcil de seguir amb la vista:
  if(millis()-time>300){
    if(y==7){
    goingUp=true;
  }
  if(y==0){
    goingUp=false;
  }
  if(goingUp){
    y--;
  }
  else{
    y++;
  }
    time=millis();
  }
    pixels[x][y] = LOW;
}

// Funció de refrescar la pantalla, el que fa és apagar tots els pins;
void refreshScreen() {
  for (int thisRow = 0; thisRow < 8; thisRow++) {
    digitalWrite(row[thisRow], HIGH);
    for (int thisCol = 0; thisCol < 8; thisCol++) {
      int thisPixel = pixels[thisRow][thisCol];
      digitalWrite(col[thisCol], thisPixel);
      if (thisPixel == LOW) {
        digitalWrite(col[thisCol], HIGH);
      }
    }
    digitalWrite(row[thisRow], LOW);
  }
}

Vídeo