#include <Servo.h> // Librería para usar el servomotor
//Configurando los pines para el joystick
int pinJoyX = A0;
int pinJoyY = A1;
int pinJoyButton = 9;
int LED_1 = 13; //Este es el pin del LED que indicará que el usuario puede seleccionar el paciente
int LED_INTENSIDAD = 3; //Este es el pin del LED que determinará la intensidad
int motor = 8; //Este es el pin del motor
Servo servoMotor; //Configuramos la librería del servomotor para poderlo configurar más adelante
int readyBtn= 2;//Este es el pin del botón de seguridad
//A continuacion se configuran en varios array los pacientes y sus respectivos datos
String nombres[4] = {"SARA","ISMAEL","FERNANDO","MARY"};
int angulo[4] = {100,10,90,170};
String apertura[4] = {"MINIMA","MEDIA","MAXIMA","MINIMA"};
String intensidad[4] = {"MAXIMA","MEDIA","MEDIA","MAXIMA"};
int exposicion[4] = {10,20,15,5};
/////////////////////////////////
int parametro = -1;//Este es el valor que determinará en qué posición del array se debe posicionar para seleccionar la informacion correspondiente de cada paciente
int paso = 1; //Paso en el que se encuentra la maquina
int continuarPaso = 0;
void setup() {
//aquí se determina el tipo de modo para cada pin
pinMode(pinJoyButton , INPUT_PULLUP); //activar resistencia pull up (funciona al reves, si el boton está presionado indica HIGH y si está sin presionar indicará LOW)
pinMode(readyBtn , INPUT_PULLUP);
pinMode(LED_1 , OUTPUT);
pinMode(motor , OUTPUT);
pinMode(LED_INTENSIDAD , OUTPUT);
///////////////////////////////////
Serial.begin(9600);//iniciamos el puerto COM con velocidad de 9600 baudios por segundo
servoMotor.attach(11);//Asignamos el pin 11 para el servomotor
servoMotor.write(0);//Configuramos el servomotor en 0 grados
}
void loop() {
int Xvalue = 0;//Creamos una variable para detectar el valor horizontal del joystick
int Yvalue = 0;//Creamos una variable para detectar el valor Vertical del joystick
bool buttonValue = false;//Creamos una variable para el botón del joystick
bool readyState = false;//Creamos una variable para el boton de seguridad
//leer valores del joystick
Xvalue = analogRead(pinJoyX);
delay(100); //es necesaria una pequeña pausa entre lecturas analógicas
Yvalue = analogRead(pinJoyY);
buttonValue = digitalRead(pinJoyButton);
if(digitalRead(readyBtn) == false){//Si el botón de seguridad está siendo presionado entonces tira señal de false
digitalWrite(LED_1, HIGH);
if(Xvalue > 512 && (Yvalue < 1020 && Yvalue > 0)){// IZQUIERDA con esta validacion evitamos un punto ambiguo en caso de direccionar el joystick en diagonal
if(paso == 1 ){
parametro = 0;//Asignamos un valor para el parametro para poder usarlo de index en los arrays previamente creados
Serial.println(nombres[parametro] + " || " + angulo[parametro] + " || " + apertura[parametro] + " || " + intensidad[parametro] + " || " + exposicion[parametro]); //Imprimimos los valores del paciente
delay(1000);//Realizamos una pausa de 1 segundo (mil milisegundos)
}else{
Serial.println("Primero hay que reanudar el proceso con el paciente actual");
}
}else if(Xvalue < 512 && (Yvalue < 1020 && Yvalue > 0)){// DERECHA
if(paso == 1 ){
parametro = 1;//Asignamos un valor para el parametro para poder usarlo de index en los arrays previamente creados
Serial.println(nombres[parametro] + " || " + angulo[parametro] + " || " + apertura[parametro] + " || " + intensidad[parametro] + " || " + exposicion[parametro]); //Imprimimos los valores del paciente
delay(1000);//Realizamos una pausa de 1 segundo (mil milisegundos)
}else{
Serial.println("Primero hay que reanudar el proceso con el paciente actual");
}
}else if(Yvalue > 512 && (Xvalue < 1020 && Xvalue > 0)){ //ARRIBA
if(paso == 1 ){
parametro = 2;//Asignamos un valor para el parametro para poder usarlo de index en los arrays previamente creados
Serial.println(nombres[parametro] + " || " + angulo[parametro] + " || " + apertura[parametro] + " || " + intensidad[parametro] + " || " + exposicion[parametro]); //Imprimimos los valores del paciente
delay(1000);//Realizamos una pausa de 1 segundo (mil milisegundos)
}else{
Serial.println("Primero hay que reanudar el proceso con el paciente actual");
}
}else if(Yvalue < 512 && (Xvalue < 1020 && Xvalue > 0)){ //ABAJO
if(paso == 1 ){
parametro = 3;//Asignamos un valor para el parametro para poder usarlo de index en los arrays previamente creados
Serial.println(nombres[parametro] + " || " + angulo[parametro] + " || " + apertura[parametro] + " || " + intensidad[parametro] + " || " + exposicion[parametro]); //Imprimimos los valores del paciente
delay(1000);//Realizamos una pausa de 1 segundo (mil milisegundos)
}else{
Serial.println("Primero hay que reanudar el proceso con el paciente actual");
}
}
if(buttonValue == false){//Si se presiona el boton del joystick comienza a funcionar la maquina
//begin(nombres[parametro],angulo[parametro],apertura[parametro],intensidad[parametro],exposicion[parametro]); // ejecutamos una funcion que se crea mas adelante, para poder ejecutar las funciones de la maquina
if(paso == 1){
paso1(angulo[parametro],apertura[parametro],intensidad[parametro],exposicion[parametro]);
}else if(paso == 2){
paso2(apertura[parametro],intensidad[parametro],exposicion[parametro],continuarPaso);
}else if(paso == 3){
paso3(intensidad[parametro],continuarPaso);
}
}
}else{
digitalWrite(LED_1, LOW);
}
//mostrar valores por serial
/*Serial.print("Y:" );
Serial.print(Xvalue);
Serial.print(" | X: ");
Serial.print(Yvalue);
Serial.print(" | Pulsador: ");
Serial.println(buttonValue);
delay(1000);*/
}
int begin(String nombre, int angulo, String apertura, String intensidad, int exposicion){ // creamos la funcion que recibirá siempre parametros, el nombre, angulo de ataque, apertura, intensidad y el tiempo de exposicion multiplicado por 1000
delay(1000);
}
int tiempomaquina(int tiempo){// creamos la funcion tiempo maquina con un parametro que recibirá siempre que equivale al tiempo que debe esperarse.
for (int i = 0; i <= tiempo; i++) {//configuramos un for por cada milisegundo y detectar si el boton de seguridad está siendo presionado, y en caso contrario, se sale de la función
if(digitalRead(readyBtn) == false){
delay(1);
}else{
Serial.print("Pausando, ");
Serial.print((tiempo-i)/1000);
Serial.println(" segundos restantes");
delay(1000);
continuarPaso = tiempo-i;
return 1;//devolvemos el valor de la funcion a 1, mismo que se detecta más arriba y se determina si el boton se ha dejado de presionar en caso de que sea 1
}
}
}
int paso1(int angulo, String apertura, String intensidad, int exposicion){
if(digitalRead(readyBtn) == false){//Identificamos si el boton de seguridad sigue siendo presionado
paso = 1;
Serial.print("Preparando angulo: ");
Serial.println(angulo);// está bugeado, no me deja poner el angulo en la linea anterior
servoMotor.write(angulo);//Configuramos el angulo con el del paciente
delay(1000);
Serial.println("Angulo OK...");
}else{
//El return sirve para "cancelar" la funcion
return;//En caso de que el boton de seguridad no esté siendo presionado, entonces se cancela esta funcion (begin)
}
paso2(apertura, intensidad, exposicion, 0);
}
int paso2(String apertura, String intensidad, int exposicion, int continuarTiempo){
if(digitalRead(readyBtn) == false){//Identificamos si el boton de seguridad sigue siendo presionado
paso = 2;
Serial.println("Preparando apertura: "+apertura);
if(apertura == "MAXIMA"){//si la apertura del cliente está configurada como MAXIMA entonces ejecuta lo siguiente
digitalWrite(motor, HIGH);//Encendemos el motor
if(continuarPaso != 0){
if(tiempomaquina(continuarTiempo) == 1){//Llamamos otra funcion creada más adelante que sirve para pausar con el tiempo determinado, y si la funcion regresa un 1 entonces se cancela la funcion
digitalWrite(motor, LOW);
return;
}
}else{
if(tiempomaquina(15000) == 1){//Llamamos otra funcion creada más adelante que sirve para pausar con el tiempo determinado, y si la funcion regresa un 1 entonces se cancela la funcion
digitalWrite(motor, LOW);
return;
}
}
}else if(apertura == "MEDIA"){//si la apertura es MEDIA
digitalWrite(motor, HIGH);
if(continuarPaso != 0){
if(tiempomaquina(continuarTiempo) == 1){//Llamamos otra funcion creada más adelante que sirve para pausar con el tiempo determinado, y si la funcion regresa un 1 entonces se cancela la funcion
digitalWrite(motor, LOW);
return;
}
}else{
if(tiempomaquina(10000) == 1){//Llamamos otra funcion creada más adelante que sirve para pausar con el tiempo determinado, y si la funcion regresa un 1 entonces se cancela la funcion
digitalWrite(motor, LOW);
return;
}
}
}else if(apertura == "MINIMA"){//Si la apertura es MINIMA
digitalWrite(motor, HIGH);
if(continuarPaso != 0){
if(tiempomaquina(continuarTiempo) == 1){//Llamamos otra funcion creada más adelante que sirve para pausar con el tiempo determinado, y si la funcion regresa un 1 entonces se cancela la funcion
digitalWrite(motor, LOW);
return;
}
}else{
if(tiempomaquina(5000) == 1){//Llamamos otra funcion creada más adelante que sirve para pausar con el tiempo determinado, y si la funcion regresa un 1 entonces se cancela la funcion
digitalWrite(motor, LOW);
return;
}
}
}else{// en caso de que la apertura no sea ninguna de las anteriores entonces tira un error y se sale de la funcion
Serial.println("Apertura incorrecta");
return;
}
digitalWrite(motor, LOW);//Apagamos el motor
delay(1000);
Serial.println("Apertura OK...");
}else{
Serial.println("Cancelando...");
delay(1000);
return;
}
continuarPaso = 0;
paso3(intensidad, exposicion);
}
int paso3(String intensidad, int exposicion){
if(digitalRead(readyBtn) == false){//Identificamos si el boton de seguridad sigue siendo presionado
paso = 3;
Serial.println("Preparando intensidad: "+intensidad);
if(intensidad == "MAXIMA"){//Si la intensidad es MAXIMA
analogWrite(LED_INTENSIDAD,100);//Encendemos el led de intensidad con máxima potencia 100%
}else if(intensidad == "MEDIA"){//Encendemos el led de intensidad con Media potencia 50%
analogWrite(LED_INTENSIDAD,50);
}else{// en caso de que la Intensidad no sea ninguna de las anteriores entonces tira un error y se sale de la funcion
Serial.println("Intensidad incorrecta");
return;
}
Serial.print("Intensidad OK, esperando ");
if(continuarPaso != 0){
Serial.print(exposicion/1000);
Serial.println(" segundos...");
if(tiempomaquina(exposicion) == 1){//Llamamos otra funcion creada más adelante que sirve para pausar con el tiempo determinado, y si la funcion regresa un 1 entonces se cancela la funcion
analogWrite(LED_INTENSIDAD,0);
return;
}
}else{
Serial.print(exposicion);
Serial.println(" segundos...");
if(tiempomaquina(exposicion*1000) == 1){//Llamamos otra funcion creada más adelante que sirve para pausar con el tiempo determinado, y si la funcion regresa un 1 entonces se cancela la funcion
analogWrite(LED_INTENSIDAD,0);
return;
}
}
analogWrite(LED_INTENSIDAD,0);//Apagamos el LED
delay(1000);
Serial.println("Exposicion OK...");
}else{
return;
}
delay(500);
Serial.println("Apagando maquina...");
delay(1000);
continuarPaso = 0;
servoMotor.write(0);//reconfiguramos el Servomotor en caso de que el boton de seguridad no esté siendo presionado
paso = 1;
}