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
#include
<Servo.h>#include<SoftwareSerial.h>///////////////////////////////////////ENTRADAS SALIDAS DIGITALES ///////// 0 ocupado por el puerto serie ordenador-arduino// 1 ocupado por el puerto serie ordenador-arduinoconstintPULSADORTIMBRE=2;//sensor tactilconstintTIMBRE=3;//buzzer activoconstintPUERTA=4;//servo puertaconstintAZUL=5;//led RGBconstintROJO=6;//led RGBconstintVERDE=7;//led RGBconstintLED=13;////////////////////////////////////// ENTRADAS ANALÓGICAS /////////////constintJOYSTICKAZUL=1;constintJOYSTICKROJO=2;constintJOYSTICKSW=3;////////////////////////////////////// OBJETOSServomyservo;//objeto servo///////////////////////////////////////VARIABLESconstintABIERTO=0;//ángulo abierto puertaconstintCERRADO=75;//ángulo cerrado puerta, se ha modificado con respecto a 90 que es cierre total pues tropezaba con la paredboolPUERTAABIERTA;//guardará si está abierto o noconstintQUITAREBOTES=1000;//el tiempo para eliminar rebotesStringcommand="";// guardará la respuesta desde el BTboolENCENDIDO;//guardará que debe de dejar la luz encendida/////////////////////////////////////FUNCIONESvoidCerrarPuerta();///////////////////////////////////////////////////////////////////////////////////////////////////////////////////INICIO ////////////////////////////////////////////////////////////////////////////////////////////////////voidsetup(){Serial.begin(9600);//inicializar el puerto serie del ordenador////////////////////////////////fijar input/outputpinMode(PULSADORTIMBRE,INPUT);pinMode(TIMBRE,OUTPUT);pinMode(PUERTA,OUTPUT);pinMode(AZUL,OUTPUT);pinMode(ROJO,OUTPUT);pinMode(VERDE,OUTPUT);pinMode(LED,OUTPUT);///////////////////////////////fijar situación inicialdigitalWrite(TIMBRE,HIGH);// timbre apagadomyservo.attach(PUERTA);//servo en el pin correspondientemyservo.write(CERRADO);//puerta cerradaPUERTAABIERTA=false;digitalWrite(AZUL,LOW);//luz rgb apagadadigitalWrite(ROJO,LOW);//luz rgb apagadadigitalWrite(VERDE,LOW);//luz verde apagada}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////BUCLE /////////////////////////////////////////////////////////////////////////////////////////////////////voidloop(){//////////////////////////// timbre ////////////////////////////////////////if(digitalRead(PULSADORTIMBRE)){Serial.println("Abriendo puerta .... ");PUERTAABIERTA=true;myservo.write(ABIERTO);delay(3000);CerrarPuerta();}////////// pulsadorjoystick abrir y cerrar la puerta //////////////////////intvalor=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 //////////////////////////////////////////intvalorAz=analogRead(JOYSTICKAZUL);valorAz=(valorAz-500)/2.5;if(valorAz<5)valorAz=0;if(!ENCENDIDO)analogWrite(AZUL,valorAz);intvalorRo=analogRead(JOYSTICKROJO);valorRo=(valorRo-550)/2.5;if(valorRo<5)valorRo=0;if(!ENCENDIDO)analogWrite(ROJO,valorRo);}////////////////////////////////////////////////////////////////////////////////////////////////////////////FUNCION CERRAR PUERTA//////////////////////////////////////////////////////////////////////////////////////////////voidCerrarPuerta(){if(PUERTAABIERTA){for(inti=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");}}