/*
Programa que utiliza el modulo joystick KY-023 para encender LEDs mediante PWM
y obtener una indicacion visual del movimiento de la palanca y cierre del
interruptor incorporado.
*/
int X; // variable para almacenar valor leido del eje X
int Y; // variable para almacenar valor leido del eje y
int LED_IZQUIERDO = 3; // LED izquierdo a pin digital 3
int LED_DERECHO = 5; // LED derecho a pin digital 5
int LED_ABAJO = 6; // LED de abajo a pin digital 6
int LED_ARRIBA = 9; // LED de arriba a pin digital 9
int PULSADOR = 10; // pulsador incorporado pin digital 10
int LED_SW = 11; // LED de pulsador a pin digital 11
int SW; // variable para almacenar valor leido del pulsador
void setup(){
pinMode(LED_IZQUIERDO, OUTPUT); // LED como salida
pinMode(LED_DERECHO, OUTPUT); // LED como salida
pinMode(LED_ABAJO, OUTPUT); // LED como salida
pinMode(LED_ARRIBA, OUTPUT); // LED como salida
pinMode(LED_SW, OUTPUT); // LED como salida
pinMode(PULSADOR, INPUT); // pulsador como entrada
// entradas analogicas no requieren inicializacion
}
void loop(){
// Determinar los Valores que vamos a necesitar
X = analogRead(A0); // lectura de valor de eje x
Y = analogRead(A1); // lectura de valor de eje y
SW = digitalRead(PULSADOR); // lectura de valor de pulsador
/*ahora que ya tenemos los valores simplemente deberemos usar una serie de condicionales
y para consultar si el valor leído está comprendido dentro de determinado rango y si es
así encender con un brillo proporcional el led que corresponda*/
//
if (X >= 0 && X < 480){ /* si X esta en la zona izquierda. && significa que ambas
condiciones deben ser ciertas.
es decir que x debe ser mayor o igual a 0 y menor a 480 con lo cual estamos en la
parte izquierda del eje x entonces debemos encender el lado izquierdo con un brillo
proporcional
segundo parámetro debe ser un valor entre 0 y 255 donde 0 es brillo 0 o apagado y 255 es brillo
máximo como los valores que nos devuelve la entrada analógica no está en este rango
debemos utilizar la función map
map: toma cinco parámetros, el primero es la variables x, el segundo parámetro es el
valor mínimo que puede asumir, como tercer parámetro el valor máximo, los últimos
dos parámetros son los valores a los cuales debe convertir, en nuestro caso como usamos
wm debe ser entre 0 y 255 pero lo pondremos invertido primero el 255 y luego 0 ya
que lo que queremos es que cuando x tenga un valor de cero (que estamos en el extremo
derecho) el brillo sea máximo es decir 255 y cuándo x tenga un valor de 480, el brillo
debe ser 0 por eso pondremos 0 */
analogWrite(LED_IZQUIERDO, map(X, 0, 480, 255, 0)); // brillo LED proporcional
} else {
analogWrite(LED_IZQUIERDO, 0); // X en zona de reposo, apaga LED
}
if (X > 520 && X <= 1023){ // si X esta en la zona derecha
analogWrite(LED_DERECHO, map(X, 520, 1023, 0, 255)); // brillo LED proporcional
} else {
analogWrite(LED_DERECHO, 0); // X en zona de reposo, apaga LED
}
if (Y >= 0 && Y < 480){ // si Y esta en la zona de abajo
analogWrite(LED_ABAJO, map(Y, 0, 480, 255, 0)); // brillo LED proporcional
} else {
analogWrite(LED_ABAJO, 0); // Y en zona de reposo, apaga LED
}
if (Y > 520 && Y <= 1023){ // si Y esta en la zona de arriba
analogWrite(LED_ARRIBA, map(Y, 520, 1023, 0, 255)); // brillo LED proporcional
} else {
analogWrite(LED_ARRIBA, 0); // Y en zona de reposo, apaga LED
}
/* Para el pulsador rabajamos en modo digital ya que sólo queremos encender o apagar
el led en la variable sw, al principio del programa almacenamos el valor leído como
tenemos la
entrada del pin 10 con una resistencia de pull up entonces tendremos un nivel lógico
alto todo el tiempo hasta que se cierra el interruptor y pasa a un nivel bajo.
Escribiendo en el led el valor opuesto al leído es suficiente. Colocar ! antes de la
variable hace que invierta su valor, por lo que se encendera el led cuando la variable
sea 0 */
digitalWrite(LED_SW, !SW); // escribe en LED valor opuesto al leido del pulsador
}
//VERT = VRY LORZ = VRX SEL = SW PULSADOR