Matriu LED amb joystick
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
- Placa Arduino Uno
- Matriu de LEDs
- Protoboard
- Joystick
- 19 cables
Esquema connexions
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); } }