JOYSTICK
Reto
Ahora vamos a utilizar el Joystick para dos intenciones:
- Aprovechando el SWITCH central:
- Si se hace una pulsación larga:
- la puerta se abre (si estaba cerrada)
- o se cierra (si estaba abierta)
- El mando del Joystick nos regulará una luz ambiental
- El eje X en azul
- El eje y el rojo
- Un valor intermedio es un valor de los dos
Solución maqueta
Vamos ampliando nuestra casa domótica con la luz RGB y el Joystick:
- Joystick fijado en la pared
- Led RGB fijado en la pared
- Conexiones Joystick en entradas analógicas
- Conexiones de RGB a las salidas digitales
Solución esquema eléctrico
Es igual que cuando vimos Joystick:
- Terminales GND del led RGB y del Joystick
- Terminal +5V del Joystick
- Otra opción de conectar el terminal GND
- Otra opción de conectar +5V
y las demás conexiones igual que antes:
- D5 PWM al Rojo del RGB (tiene que ser PWM)
- D6 PWM al Azul del RGB (tiene que ser PWM)
- D7 al Verde del RGB (luego lo utilizaremos)
- A1 al EJEX JOYSTICK
- A2 al EJEY JOYSTICK
- A3 al SWITCH JOYSTICK
Nota: El microruptor del Joystick es digital luego lo apropiado es conectarlo en una entrada salida digital, pero como vamos escasos de entradas y salidas digitales (ya verés como esto se complica), lo trataremos como analógico.
Solución vídeo
Solución código
///////////////////////////////////////LIBRERIAS #include <Servo.h> #include <SoftwareSerial.h> ///////////////////////////////////////ENTRADAS SALIDAS DIGITALES /////// // 0 ocupado por el puerto serie ordenador-arduino // 1 ocupado por el puerto serie ordenador-arduino const int PULSADORTIMBRE =2; //sensor tactil const int TIMBRE =3; //buzzer activo const int PUERTA = 4; //servo puerta const int AZUL = 5; //led RGB const int ROJO = 6; //led RGB const int VERDE = 7; //led RGB const int LED = 13; ////////////////////////////////////// ENTRADAS ANALÓGICAS ///////////// const int JOYSTICKAZUL = 1; const int JOYSTICKROJO = 2; const int JOYSTICKSW = 3; ////////////////////////////////////// OBJETOS Servo myservo; //objeto servo ///////////////////////////////////////VARIABLES const int ABIERTO =0; //ángulo abierto puerta const int CERRADO =75; //ángulo cerrado puerta, se ha modificado con respecto a 90 que es cierre total pues tropezaba con la pared bool PUERTAABIERTA; //guardará si está abierto o no const int QUITAREBOTES = 1000; //el tiempo para eliminar rebotes String command = ""; // guardará la respuesta desde el BT bool ENCENDIDO; //guardará que debe de dejar la luz encendida /////////////////////////////////////FUNCIONES void CerrarPuerta(); ////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////INICIO ////////////////////////// ////////////////////////////////////////////////////////////////////////// void setup() { Serial.begin(9600); //inicializar el puerto serie del ordenador ////////////////////////////////fijar input/output pinMode(PULSADORTIMBRE, INPUT); pinMode(TIMBRE, OUTPUT); pinMode(PUERTA, OUTPUT); pinMode(AZUL, OUTPUT); pinMode(ROJO, OUTPUT); pinMode(VERDE, OUTPUT); pinMode(LED,OUTPUT); ///////////////////////////////fijar situación inicial digitalWrite(TIMBRE,HIGH); // timbre apagado myservo.attach(PUERTA); //servo en el pin correspondiente myservo.write(CERRADO); //puerta cerrada PUERTAABIERTA = false; digitalWrite(AZUL,LOW); //luz rgb apagada digitalWrite(ROJO,LOW); //luz rgb apagada digitalWrite(VERDE,LOW); //luz verde apagada } ////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////BUCLE /////////////////////////// ////////////////////////////////////////////////////////////////////////// void loop() { //////////////////////////// timbre //////////////////////////////////////// if (digitalRead(PULSADORTIMBRE)){ Serial.println("Abriendo puerta .... "); PUERTAABIERTA=true; myservo.write(ABIERTO); delay(3000); CerrarPuerta(); } ////////// pulsadorjoystick abrir y cerrar la puerta ////////////////////// int valor=analogRead(JOYSTICKSW); //Serial.println(valor); if (valor==0){ delay(QUITAREBOTES); valor=analogRead(JOYSTICKSW); if (valor==0){ Serial.println("//////////////HAS PULSADO EL BOTÓN DEL JOYSTICK"); command="boton"; } } if (command=="boton"){ if (!PUERTAABIERTA){ Serial.println("Abriendo puerta .... "); PUERTAABIERTA=true; myservo.write(ABIERTO); }else{ CerrarPuerta(); } } command = ""; //////////// juego luces joystick ////////////////////////////////////////// int valorAz = analogRead(JOYSTICKAZUL); valorAz = (valorAz-500)/2.5; if (valorAz<5) valorAz =0; if (!ENCENDIDO)analogWrite(AZUL,valorAz); int valorRo = analogRead(JOYSTICKROJO); valorRo = (valorRo-550)/2.5; if (valorRo<5) valorRo =0; if (!ENCENDIDO) analogWrite(ROJO,valorRo); } ////////////////////////////////////////////////////////////////////////// //////////////////////////////////FUNCION CERRAR PUERTA//////////////////// ////////////////////////////////////////////////////////////////////////// void CerrarPuerta(){ if (PUERTAABIERTA){ for (int i=1;i<=3;i++){ Serial.println("CERRANDO PUERTA !!!"); digitalWrite(LED,HIGH); digitalWrite(TIMBRE,LOW); delay(1000); digitalWrite(TIMBRE,HIGH); digitalWrite(LED,LOW); delay(1000); } myservo.write(CERRADO); PUERTAABIERTA=false; Serial.println("Puerta cerrada"); } }