Control de presion e ilunminacion protegido por contraseña (Terminado)

Muy buenas a todos, aun estoy metido en este proyecto pero salvo un motor y algo de programacion esta llegando a su fin.

Se trata de un controlador de presion e iluminacion para una mesa de trabajo donde realizo maquetas, que es mi principal hobby.

Anteriormente tenia este, que no esta mal pero es todo manual.

En navidad me regalaron un arduino, y bueno, todo lo que se necesita es una idea para aplicarlo, asi que rebuscando di con eso y quise mejorarlo.

El codigo inicial (solo el array de la contraseña) es de un tal suso de una pagina de estas que venden cosas para el arduino y tal, le he cambiado bastantes cosas de lo basico y he añadido las funciones al teclado de encender contactores, mostrar valores en pantalla de los transductores de presion, asi como el estado de los fexos y el compresor,....

Decir que no tenia ni idea de programar hasta hace un mes mas o menos, pero la verdad es que es bastante sencillo (se que muchas partes de mi codigo se pueden resumir en una linea, pero preferi dejarlo asi para que resulte mas instrucctivo para los que no sepan y recordarme como funciona, que aun no estoy muy puesto en esto) no obstante, leerse el manual y rebuscar en los foros ayuda.

El funcionamiento viene a ser el siguiente, nada mas encender nos pide contraseña, tras introducirla nos salen los parametros para el funcionamiento y pulsando las teclas A,B o C activara los reles para iluminacion y compresor, hasta aqui sin problemas. El boton D lo he puesto para el control de un servo que acciona un resorte y vacia la presion del cirtuito (aun no se si me servira porque no lo he probado con presion) el resorte esta hecho en evergree, simple y efectivo, teoricamente. Luego en pantalla aparecera la presion total mediante un transductor de 150psi y la actual medida con otro transductor, esta vez de 100psi ya que la presion que utilizo para pintar a aerografo no supera los 2,5 bares y no menos de 0,8 bares.

Con un potenciometro se marca la presion objetivo, y es por aqui por donde voy. si la presion que tenemos es menor que la objetivo el motor hara girar el embolo superior del manoreductor aumentando la presion y parando cuando llegue a dicha presion. Para bajarla ya es algo mas complejo, porque aparte de girar, como el circuito es estanco, debe de ir liberando presion con el servo para tener una lectura real. Pero creo que lo solucionare si me atasco, con vuestra ayuda.

El arduino que uso es un mega de esos que vienen en un pack de inicio de elegoo, y las piezas que disponia las de ahi, el servo sin presion funciona perfectamente pero el motor,.... no hay forma de que pueda con el embolo. Habia pensado en un nema 17, pero ando super perdido en este mundo aun, y no quiero gastar dinero tontamente en algo que quizas no me sirva.

Para la alimentacion, tengo un transformador de 12v 5 amp, grande, pero lo tengo por aqui, y basicamente es para alimentar el futuro motor y el arduino via VIN, y con un cargador de movil alimentar la pantalla, los reles y el servo.Como lo veis????

Os dejo unas fotillos de la composicion del proyecto. Las medidas son 15cmx15cmx15cm y el transformador ira fuera, tambien lleva un interruptor de palanca para dejar sin corriente los transformadores cuando no este en uso.

Os agradezco cualquier sugerencia o duda o fallo que veais sobre el proyecto. Recordaros que la ultima parte no esta programada aun pero estoy en ello.

Saludos!

Mmmm, no se muestran las fotos, quizas porque este alojadas en otro servidor, buscare la forma y lo edito.

El codigo lo quite de arriba porque tambien excede los 9000 caracteres, asi que lo subire por trozos.

Ahi va la primera parte.

/*  ----------------------------------------------------------------
    Proyecto introduccion clave
    por teclado matricial con LCD I2C
    
    Funciones de teclas:
    * Borra clave introducida y resetea
    # enciende o apaga la pantalla
    
    por Suso
    22/11/2015
    
    Modificado por ArroyitoDeluxe, 
    añadiendo funciones para activacion
    de los reles A,B,C con mostrado de 
    clave erronea, saludo, e informacion en pantalla,
    controles de presion mediante motor y servo con potenciometro
    --------------------------------------------------------------------  
*/
  #include <LiquidCrystal_I2C.h>
  #include <Wire.h>
  #include <Servo.h>
  /* Funcion de configuracion
    de pines del modulo LCD/I2C (Direccion,en,rw,rs,d4,d5,d6,d7,backlight,polaridad)*/
  LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 
 
#include <Keypad.h>

const byte Filas = 4;     //Cuatro filas
const byte Cols = 4;    //Cuatro columnas
byte Pins_Filas[] = {22,23,24,25};   //Pines Arduino a los que contamos las filas.
byte Pins_Cols[] = {26,27,28,29};   // Pines Arduino a los que contamos las columnas.
//no utilizar los pines 1 y 0 para no interferir en Rx y Tx

char Teclas [ Filas ][ Cols ] = 
{
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
char codigoSecreto[4] = {'2','2','5','5'}; // Aqui va el codigo secreto
// Para cambiar el tamaño de la clave, solo hay que cambiar el tamaño del array

int posicion=0; // necesaria para la clave
int cursor=7; // posicion inicial de la clave en el LCD
int clave=0; // para el LCD
int luz=0;  // para el LCD
int tiempo=0;  // para el LCD
int ledVerde=32; // pin para el LED verde
int ledRojo=33;  // pin para el LED rojo
int buzzer=30;  // pin altavoz

int rele1=39; // pin rele 1
int rele2=40; // pin rele 2
int rele3=41; // pin rele 3
int flexo1=0; //para el rele1
int flexo2=0; //para rele2
int compresor=0; // para rele3

int objetivo; //lectura potenciometro
int actual; //lectura transductor 100psi
int total; //lectura transductor 150psi

float lactual; // para transductor de presion actual 100psi 
int lobjetivo; // para potenciometro de presion objetivo
float ltotal; // para transductor de presion total 150psi

float practual; //variable presion actual
float probjetivo; //variable presion objetivo
float prtotal; //variable presion total

int psiactual; //para equivalencia de unidades
float baractual; //para equivalencia de unidades
int psitotal; //para equivalencia de unidades
float bartotal; //para equivalencia de unidades

Servo servo1;  //nombre del servo de bajada de presion
int servopos=0; //poscion del servo 

Keypad Teclado1 = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);

void setup(){
Serial.begin(9600) ;
lcd.begin(20,4); // inicializamos el LCD.
lcd.noBacklight(); // apagamos LCD
pinMode (ledVerde,OUTPUT);
pinMode (ledRojo, OUTPUT);
pinMode (buzzer, OUTPUT);
pinMode (rele1, OUTPUT);
pinMode (rele2, OUTPUT);
pinMode (rele3, OUTPUT);
digitalWrite(ledRojo,HIGH);  // encendemos el LED rojo
digitalWrite(ledVerde, LOW);  // apagamos el verde
servo1.attach(9); //salida pwm del servo
lcd.setCursor(5,0); // situamos el cursor el la posición 2 de la linea 0.
lcd.print("Password?"); // escribimos en LCD
lcd.setCursor(cursor,1); // cursor en la posicion de la variable, linea 1


  
void loop(){
  
char pulsacion = Teclado1.getKey() ;  // leemos pulsacion
if (pulsacion != 0){  // Si el valor es 0 es que no se ha pulsado ninguna tecla

if (pulsacion != '#' && pulsacion != '*' && pulsacion != 'A' && pulsacion != 'B' && pulsacion != 'C' && pulsacion != 'D' && clave==0){  // descartamos almohadilla, asterisco, A, B, C y D
  
    lcd.print(pulsacion);  // imprimimos pulsacion
    cursor++;  // incrementamos el cursor
    tone(buzzer,350);  // tono de pulsacion
    delay(200);
    noTone(buzzer);
    
//--- Condicionales para comprobar la clave introducida -----------

if (pulsacion == codigoSecreto[posicion]){ // comparamos entrada con cada uno de los digitos, uno a uno
      posicion ++;  // aumentamos en uno el contador de posicion si es correcto el digito  

      }
      
if (posicion == 4){ // comprobamos que se han introducido los 4 correctamente
        
      lcd.clear();
      lcd.setCursor(0,0); // situamos el cursor el la posición 0 de la linea 0.
      lcd.print("Welcome back!!!"); // escribimos en LCD
      lcd.setCursor(3,2);
      lcd.print ("ArroyitoDeluxe");
            
      delay(200); // tono de clave correcta
      tone(buzzer,500);
      delay(100);
      noTone(buzzer);
      tone(buzzer,600);
      delay(100);
      noTone(buzzer);
      tone(buzzer,800);
      delay(100);
      noTone(buzzer);
      
      clave=1;  // indicamos que se ha introducido la clave
      digitalWrite(ledRojo,LOW);  // apagamos el LED rojo
      digitalWrite(ledVerde, HIGH);  // encendemos el verde 
      delay (1500);
      
      lcd.clear();   // Borranmos y escribimos el menu 
      lcd.setCursor(0,0); 
      lcd.print ("Light1Off");
      lcd.setCursor (11,0);
      lcd.print ("Light2Off");
      lcd.setCursor (0,1);
      lcd.print ("Compressor Off");
      lcd.setCursor(0,2); 
      lcd.print ("Ready");
      lcd.setCursor (10,2);
      lcd.print ("Bar");
      lcd.setCursor (14,2);
      lcd.print ("Total");
      lcd.setCursor(0,3); 
      lcd.print ("Object");
      lcd.setCursor (10,3);
      lcd.print ("Bar");
      lcd.setCursor (17,3);
      lcd.print ("Bar");      
}
}

//--- En el caso de que este incompleta o no hayamos acertado ----------   
if (HIGH==digitalRead(ledRojo) && cursor>10){  // comprobamos que no pase de la cuarta posicion
      cursor=7;  // lo volvemos a colocar al inicio
      posicion=0; // borramos clave introducida
      lcd.setCursor(7,1);
      lcd.print("       ");  // borramos la clave de la pantalla
      lcd.setCursor (2,2);   // decimos que la clave es introducida es incorrecta
      lcd.print ("Wrong password!");
      delay (500);
      lcd.setCursor (2,2);
      lcd.print ("               ");
      delay (500);
      lcd.setCursor (2,2);
      lcd.print ("Wrong password!");
      delay (500);
      lcd.setCursor (2,2);
      lcd.print ("               ");
      lcd.setCursor(7,1);
      
    if(clave==0){           // comprobamos que no hemos acertado
      tone(buzzer,70,500);  // para generar
      delay(250);           // tono de error
      noTone(buzzer);
      }
      }
    
    }
    
//--- Condicionales para encender o apagar el LCD --------------

if (pulsacion == '#' && luz==0){ // comprobamos tecla y encendemos si esta apagado
    lcd.backlight();  // encendemos
    luz=1;  // indicamos que esta encendida
    pulsacion =0; // borramos el valor para poder leer el siguiente condicional
  }
if (pulsacion == '#' && luz==1){  //  comprobamos tecla y estado
    lcd.noBacklight();  // apagamos
    luz=0;  // indicamos que esta apagada
      }
//---------------------------------------------------------------

//--- Condicionales para resetear clave introducida -------------  

if (pulsacion == '*'){ // asterisco para resetear el contador
      lcd.clear();
      posicion = 0;
      cursor = 7;
      clave=0;
      posicion=0;
      lcd.setCursor(5,0); // situamos el cursor el la posición 2 de la linea 0.
      lcd.print("Password?"); // escribimos en LCD
      
      lcd.setCursor(7,1);
      lcd.print("      "); // borramos de la pantalla los numeros
      lcd.setCursor(7,1);
      

      digitalWrite(ledRojo,HIGH);  // encendemos el LED rojo
      digitalWrite(ledVerde, LOW);  // apagamos el verde
      digitalWrite(rele1, LOW); // Apagamos rele1
      digitalWrite(rele2, LOW); // Apagamos rele1
      digitalWrite(rele3, LOW); // Apagamos rele1
}

y aqui la segunda.

//Control rele 1 (flexo 1)
if(HIGH==digitalRead(ledVerde) && pulsacion == 'A' && flexo1==0){ // Lee si la contraseña esta correcta y esta apagado
         digitalWrite(rele1,HIGH);  // encendemos el rele 1
         flexo1=1;
         lcd.setCursor (6,0); //Cambiamos el estado en pantalla a encendido
         lcd.print ("   ");
         lcd.setCursor (6,0);
         lcd.print (" On");
         delay(1000);
         pulsacion =0; 
         
}
if(HIGH==digitalRead(ledVerde) && pulsacion == 'A' && flexo1==1){ // Lee si la contraseña esta correcta y esta encendido
         digitalWrite(rele1, LOW);  // apagamos el rele 1
         flexo1=0;
         lcd.setCursor (6,0); //Cambiamos el estado en pantalla a apagado
         lcd.print ("   ");
         lcd.setCursor (6,0);
         lcd.print ("Off");
}
 
//Control rele 2 (flexo 2)
if(HIGH==digitalRead(ledVerde) && pulsacion == 'B' && flexo2==0){ // Lee si la contraseña esta correctay esta apagado
         digitalWrite(rele2,HIGH);  // encendemos el rele 2
         flexo2=1;
         lcd.setCursor (17,0); //Cambiamos el estado en pantalla a encendido
         lcd.print ("   ");
         lcd.setCursor (17,0);
         lcd.print (" On");
         delay(1000);
         pulsacion =0; 
         
}
if(HIGH==digitalRead(ledVerde) && pulsacion == 'B' && flexo2==1){ // Lee si la contraseña esta correcta y esta encendido
         digitalWrite(rele2, LOW);  // apagamos el rele 2
         flexo1=0;
         lcd.setCursor (17,0); //Cambiamos el estado en pantalla a apagado
         lcd.print ("   ");
         lcd.setCursor (17,0);
         lcd.print ("Off");
}
//Control rele 3 (Compresor)
if(HIGH==digitalRead(ledVerde) && pulsacion == 'C' && compresor==0){ // Lee si la contraseña esta correcta y esta apagado
         digitalWrite(rele3,HIGH);  // encendemos el rele 3
         compresor=1;
         lcd.setCursor (11,1); //Cambiamos el estado en pantalla a encendido
         lcd.print ("   ");
         lcd.setCursor (11,1);
         lcd.print (" On");
         delay(2000);
         pulsacion =0; 
         
}
if(HIGH==digitalRead(ledVerde) && pulsacion == 'C' && compresor==1){// Lee si la contraseña esta correcta y esta encendido
         digitalWrite(rele3, LOW);  // apagamos el rele 3
         compresor=0;
         lcd.setCursor (11,1); //Cambiamos el estado en pantalla a apagado
         lcd.print ("   ");
         lcd.setCursor (11,1);
         lcd.print ("Off");
}

//Manejo del servo mediante pulsacion en D para vaciar presion

if(HIGH==digitalRead(ledVerde) && pulsacion == 'D' && servopos==0){
    servo1.write (8);
    servopos=1;  // indicamos que esta girado el servo
    pulsacion =0; // borramos el valor para poder leer el siguiente condicional
  }
if(HIGH==digitalRead(ledVerde) && pulsacion == 'D' && servopos==1){
    servo1.write (0);
    servopos=0;  // indicamos que esta en poscion inicial
}


// Lectura de potenciometro y transductores 

if(HIGH==digitalRead(ledVerde) && compresor==1)
{
   objetivo = analogRead(A0); // realizar la lectura del potenciometro
   lobjetivo = map(objetivo, 0, 1023, 6, 30); //establece la escala en presion deseada
   probjetivo = lobjetivo/10.0; //pone decimales
   lcd.setCursor (7,3); //coloca el cursor
   lcd.print(probjetivo, 1); //imprime el resultado con un decimal

   total = analogRead(A4); // realizar la lectura del transductor
   ltotal = map(total, 0, 1023, 0, 50); //establece la escala en voltios por 10 para mas resolucion
   prtotal = constrain (ltotal, 5, 45); //acotamos las medidas a 0,5 y 4,5 voltios del transductor
   psitotal = map (prtotal, 5, 45, 0, 150); //mapeamos el voltaje a psi
   bartotal = (psitotal/14.504); //convertimos los psi en bares
   lcd.setCursor (14,3); //coloca el cursor
   lcd.print(bartotal, 1); //imprime el resultado con un decimal

   actual = analogRead(A2); // realizar la lectura del transductor
   lactual = map(actual, 0, 1023, 0, 50); //establece la escala en voltios por 10 para mas resolucion
   practual = constrain (lactual, 5, 45); //acotamos las medidas a 0,5 y 4,5 voltios del transductor
   psiactual = map (practual, 5, 45, 0, 100); //mapeamos el voltaje a psi
   baractual = (psiactual/14.504); //convertimos los psi en bares
   lcd.setCursor (7,2); //coloca el cursor
   lcd.print(baractual, 1); //imprime el resultado con un decimal
   
   }

Solucionado el tema de las fotos!

Hola a todos! Tras unos días debido a mi tiempo disponible que tiende a 0, y con los consejos de algunos compañeros, a los cuales agradezco su esfuerzo. Doy por concluido este proyecto.

Os dejo un vídeo de como funciona, es para una mesa de trabajo de modelismo, por si alguno también tiene esa pequeña afición.

Enlace a video!

Saludos y hasta el proximo proyecto!

Te felicito amigo, te quedo de 10 :slight_smile:

Saludos