Agitador de laboratorio basado en Arduino

 Materiales para la elaboración

Los materiales a emplear son los siguientes:

-Arduino uno/nano/micro

-mosfet nuevo o reciclado

-potenciometro de 10k en delante de preferencia

-cables puente (similares)

Pantalla lcd

Fuente de 5 volts, 12, -12

Teclado matricial 4x4

Diodo rectificador (IN4007)

Motor de 12 -24 volts o el actuador que deseemos para el proyecto.




Catálogo de funcionamiento



El potenciómetro se emplea para variar la velocidad del motor

La configuración del menú esta diseñada de tal forma que aparezca la tecla a presionar al lado de cada opción mostrada en pantalla cuando se requiere realizar dicha acción

El primer menú que se parecía luego de “BIENVENIDO CONFIGURACION” PERMITE llevar al usuario a otros menús como:

INGESAR AL MODO PERILLA

En este modo el usuario podrá variar la velocidad del equipo con la variación de movimiento del potenciómetro.

Forma de acceder:
Si presiona OFF (en el menú de la pantalla)

Se ingresa automáticamente al modo perilla y luego de 1s se muestra las rpm del motor según la variación del potenciómetro.

Para salir de este modo se presiona la tecla “#”, de tal forma que retornamos al menú principal.

Recomendaciones:

Se recomienda dejar el potenciómetro o perilla en el bajo nivel antes de haber presionado la tecla.

La variación de velocidad va desde 0 a 205.

INGRESAR AL MODO DIGITAL

El modo digital esta automáticamente inicializado por lo que bastara con introducir la velocidad en rpm que varia d 0 a 255

INGRESAR PARA INTRODUCIR LAS RPM

Se presiona la tecla “C”

Pasamos al siguiente menú que mostrara la pantalla para que introduzcamos las rpm .

Introducimos los rpm mediante el teclado numérico.

Para retornar al menú principal debemos presionar la tecla “#”

El valor colocado se guardará automáticamente en el sistema.

Si se desea introducir un nuevo valor se debe reiniciar el sistema presionando el botón de reinicio para borrar los datos colocados anteriormente.

Se presiona la tecla “D”

Pasamos al siguiente menú que mostrara la pantalla para que introduzcamos el tiempo en horas (presionando la tecla “A”), minutos (presionando la tecla “B”) y (presionando la tecla “C”).

Puede ingresar de manera independiente a cada una y retornando al menú anterior con la tecla “*”

 

O si prefiere puede ingresar a horas con la tecla “A” y presionando “#” podrá ingresar a minutos y segundos posteriormente de forma automática.

Recordar que se puede colocar solamente 2 datos por horas, minutos o segundos , si intenta colocar mas el sistema no lo mostrara en pantalla y tendrá que reiniciar el sistema.

Una vez ingresados los datos de be validar los datos que se mostraran en pantalla ,el mensaje mostrado en pantalla le preguntara si son correctos los datos que introduzco, es decir se mostrara la velocidad en RPM introducidas(0 a 255) luego las horas , minutos y segundos introducidos.

 Para aceptar e iniciar el contador y encender el motor se presiona la tecla “#”

Se mostrará en pantalla el tiempo que falta y la velocidad en RPM.

Al terminar automáticamente retornara al menú de inicio, si desea introducir nuevos valores bastara con reiniciar el sistema y borrara los valores anteriormente introducidos.

 


CODIGO DEL PROYECTO



//valores para motor

int Motor = 9;                          

int entrada_analogica= A5;

float valorRPM;

int valor_entrada_analogica =0 ;       

int valor_salida_pwm =0;


#define TONO_ERROR 600

#define TIME_INTERVAL 3000

#include <LiquidCrystal.h> // Librería para el control del LCD

#include <Keypad.h> // Librería para keypad


////////////////////////////////////

//PARA TIEMPO

int buzzer = 13;           //Alarma

int ahoras = 0;            //Variable a mostrar por LCD de las horas

int aminutos = 0;          //Variable a mostrar por LCD de los minutos

int asegundos = 0;         //Variable a mostrar por LCD de los segundos

int segundostotal = 0;     //Tiempo total


int empieza = 1024;        // Variable para almacenaje del pulsador de arranque

int varbuth = 0;           //Variable para almacenar el valor del pulsador de horas

int varbutm = 0;           //Variable para almacenar el valor del pulsador de minutos

int varbuts = 0;           //Variable para almacenar el valor del pulsador de segundos


char key ;


////////////////////////////////VELOCIDAD MOTOR///////////////////////////////////

String leeCadena1,leeCadena2,leeCadena3,leeCadena4;//SE GUARDA CADENA DE CARACTERES EN STRING

byte cuenta=0;

long dato1,dato2,dato3,dato4;// 

int cuadro =0;

int fila =1;

int abajo = 1;//para limpiar el valor del menu anterior

/////////////////////////////////////////////////////////////////////////////////


LiquidCrystal lcd(A0, A1, A2, A3, A4, 10); // varible LCD y pines

char pulsacion;       // almacena la tecla pulsada

int  contador = 1;    // cuenta el nivel del menu en el que se esta

const byte ROWS = 4;  //Cuatro Filas

const byte COLS = 4;  //Cuatro Columnas

char keys[ROWS][COLS] = {

  {'1', '2', '3', 'A'},

  {'4', '5', '6', 'B'},

  {'7', '8', '9', 'C'},

  {'*', '0', '#', 'D'}

};

byte rowPins[ROWS] = {7, 6, 5, 4}; //Puntos de conexion del teclado al arduino FILAS

byte colPins[COLS] = {3, 2, 1, 0}; //Puntos de conexion del teclado al arduino COLUMNAS

Keypad Teclado1 = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //Configura el teclado


void setup () {


  ////////////Configuracion de tono //////////////////////////

  pinMode(buzzer, OUTPUT);  //Pin de alarma

  empieza = 1024;           //Barrera

  ///////////////////////////para motor///////////////////////

  pinMode (Motor, OUTPUT); //Salida para controlar pin de mosfet

  //////////////////inicializar LCD/////////////////////////////

  lcd.begin(16, 2);

  lcd.setCursor(0, 0);

  pinMode(12, OUTPUT);

  intro_0();  //llama a la funcion que  muestra el intro de  bienvenida

}

////////////////////////// Void loop() ///////////////////////

void loop() {

  pulsacion = Teclado1.getKey() ;  // Lee la tecla pulsada

  if (pulsacion != 0) {

    delay(100);


  }

    // CON CONTADOR ME MUEVO A TRAVES DE MENUS,CADA MENU TIENE SU CONTADOR

  if (contador == 9) {

    menu_9();  //MENU 

    accion_9();

  }

  // CON CONTADOR ME MUEVO A TRAVES DE MENUS,CADA MENU TIENE SU CONTADOR

  if (contador == 8) {

    menu_8();  //MENU 

    accion_8();

  }

if (contador == 7) {

    menu_7();  //MENU 

    accion_7();

  }

  if (contador == 6) {

    menu_6();  //MENU 

    accion_6();

  }

  if (contador == 5) {

    menu_5();  //MENU PARA MINUTOS

    accion_5();

  }

  if (contador == 4) {

    menu_4();  //MENU PARA HORAS

    accion_4();

  }

  if (contador == 3) {

    menu_3();  //MENU PARA TIEMPO

    accion_3();

  }

  if (contador == 2) {

    menu_2();  //MENU PARA VELOCIDAD

    accion_2();

  }

  if (contador == 1) {

    menu_1();  //MENU PRINCIPAL

    accion_1();

  }



}  ///////// Fin del void loop(), inician las Funciones/////////////////


/////////////////////Intro_0 ///////////////////////////////////////////

void intro_0() {

  lcd.clear();  // Borra el  LCD

  lcd.setCursor(3, 0); // Se posiciona en la Columna 3, Fila 0

  lcd.print("BIENVENIDO ");

  lcd.setCursor(1, 1);

  lcd.print("CONFIGURACION");

  delay(800);                // espera 800ms mostrando el intro

  lcd.clear();

}

///////Menu_1 ESTE MENU CONTIENE ON OFF VELOCIDAD Y TIEMPO /////////////

void menu_1() {

  lcd.setCursor(0, 0);

  lcd.print("0N >A ");

  lcd.setCursor(6, 0);

  lcd.print(" RAPIDEZ>C");

  lcd.setCursor(0, 1);

  lcd.print("OFF>B  ");

  lcd.setCursor(7, 1);

  lcd.print("TIEMPO >D");

}

/////////////////////Accion 1 //////////////////////////////

void accion_1() {

  if (pulsacion == 'A') {

  }

  if (pulsacion == 'C') {

      lcd.clear();

    contador = 2; 

    cuadro =0;

  }

  if (pulsacion == 'B'){

    lcd.clear();

    lcd.setCursor(0, 0);

    lcd.print("  MODO PERILLA  ");

    delay(1000);

    lcd.clear();

    contador = 9;

    

  }

  if (pulsacion == 'D') {

    contador = 3;

    lcd.clear();

    cuadro =0;

  }

}

/////////////////////Menu_2 velocidad en rpm //////////////////////////////////

void menu_2() {


  lcd.setCursor(0, 0);

  lcd.print("INGRESE  RAPIDEZ  ");

  lcd.setCursor(0, 1);//setear cursor para escribir con teclado matricical

   char key = Teclado1.getKey();//SE GUARDA LA TECLA PRESIONADA

  lcd. display(); 

  //función que permite detectar que fue pulsada una tecla 


  if (key=='0'||key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9'){

  

  lcd.setCursor(cuadro,fila);//Ubicación del cursor y la línea cuadro=0 y fila=0

  lcd.print(key);//imprimo en la Icd el valor de la tecla pulsada 

  cuadro++;//incremento el cursor de la lcd


  if (cuadro>7)//detecto el cambio de línea de la Icd evitando escribir fuera de la pantalla 

{

  cuadro=0; //ubicar cursor en el primer cuadro 

  fila=1; //ubicar en la segunda línea

  lcd.clear();

}

        leeCadena1+=key;

        dato1=leeCadena1.toInt();//CONVERTIR A DATO ENTERO Y SE CONVIERTE EN DATO 1

     }

   


  lcd.setCursor(7, 1);     

  lcd.print("RPM  ");

  lcd.setCursor(12, 1);

  lcd.print("0K># ");


}

/////////////////////accion_2  //////////////////////////////////

void accion_2() {


  if (pulsacion == '#'){

    contador = 1;

    lcd.clear();

    cuadro =0;

  }

  //si estoy en el dos y quero volver al menu de inicio

     if (pulsacion == '*') {

    contador = 1;

    lcd.clear();

    cuadro =1;

  }

}

/////////////////////Menu_3 configurar valor de tiempo //////////////////////////////////

void menu_3() {

  lcd.setCursor(0, 0);

  lcd.print("HORAS>A ");

  lcd.setCursor(8, 0);

  lcd.print("   SEG>C ");

  lcd.setCursor(0, 1);

  lcd.print("MIN>B");

  lcd.setCursor(8, 1);

  lcd.print("    OK>#");

}

/////////////////////accion_3  //////////////////////////////////

void accion_3() {

  if (pulsacion == '#') {

    contador = 1;

    lcd.clear();

    cuadro =1;

  }

  if (pulsacion == 'A'){ 

    contador = 4;

    lcd.clear();

    cuadro =1;

  }

  if (pulsacion == 'C'){

    contador = 6;

    lcd.clear();

    cuadro =1;

  }

  if (pulsacion == 'B'){

    contador = 5;

    lcd.clear();

    cuadro =1;

  }

   if (pulsacion == '*') {

    contador = 1;

    lcd.clear();

    cuadro =1;

  }

}

/////////////////////Menu_4 HORASSSS//////////////////////////////////

void menu_4() {

  lcd.setCursor(0, 0);

  lcd.print(" INGRESE  HORAS  ");

  lcd.setCursor(1, 1);

   char key = Teclado1.getKey();//SE GUARDA LA TECLA PRESIONADA

lcd. display(); 

  //función que permite detectar que fue pulsada una tecla 


if (key=='0'||key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9'){

  

lcd.setCursor(cuadro,fila);//Ubicación del cursor y la línea cuadro=0 y fila=O

lcd.print(key);//imprimo en la Icd el valor de la tecla pulsada 

cuadro++;//incremento el cursor de la lcd


if (cuadro>3)//detecto el cambio de línea de la Icd evitando escribir fuera de la pantalla 

{

cuadro=1; //ubicar cursor en el primer cuadro

fila=1; //ubicar en la segunda línea

lcd.clear();

}

        leeCadena2+=key;

        dato2=leeCadena2.toInt();//CONVERTIR A DATO ENTERO Y SE CONVIERTE EN DATO 2

     }

  


  lcd.setCursor(4, 1);//COLOCAR HORAS ENLA POSICION 6 DE LA FILA 1 QUE EN RELIDAD ES LA SEGUNDA,SOLO QUE SE LE DICE 1 POREU LA ANTERIOR ERA 0

  lcd.print("HORAS ");

  lcd.setCursor(11, 1);//COLCAR ICONO DE OK AL LADO INFERIOR DERECHO

  lcd.print("0K># ");

}

/////////////////////accion_4  //////////////////////////////////

void accion_4() {

  if (pulsacion == '#') {

    contador = 5;

    lcd.clear();

    cuadro =1;

    leeCadena2+=key;

    dato2=leeCadena2.toInt();//CONVERTIR A DATO ENTERO Y SE CONVIERTE EN DATO 2

    

  }

     if (pulsacion == '*') {

    contador = 3;

    lcd.clear();

    cuadro =1;

  }

}

/////////////////////Menu_5 MINUTOS//////////////////////////////////

void menu_5() {


  lcd.setCursor(0, 0);

  lcd.print(" INGRESE MINUTOS");

  lcd.setCursor(1, 1);

   char key = Teclado1.getKey();//SE GUARDA LA TECLA PRESIONADA

lcd. display(); 

  //función que permite detectar que fue pulsada una tecla 


if (key=='0'||key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9'){

  

lcd.setCursor(cuadro,fila);//Ubicación del cursor y la línea cuadro=0 y fila=O

lcd.print(key);//imprimo en la Icd el valor de la tecla pulsada 

cuadro++;//incremento el cursor de la lcd


if (cuadro>3)//detecto el cambio de línea de la Icd evitando escribir fuera de la pantalla 

{

cuadro=1; //ubicar cursor en el primer cuadro

fila=1; //ubicar en la segunda línea

lcd.clear();

}

        leeCadena3+=key;

        dato3=leeCadena3.toInt();//CONVERTIR A DATO ENTERO Y SE CONVIERTE EN DATO 1

     }

  


  lcd.setCursor(4, 1);//COLOCAR HORAS ENLA POSICION 6 DE LA FILA 1 QUE EN RELIDAD ES LA SEGUNDA,SOLO QUE SE LE DICE 1 POREU LA ANTERIOR ERA 0

  lcd.print("MIN ");

  lcd.setCursor(11, 1);//COLCAR ICONO DE OK AL LADO INFERIOR DERECHO

  lcd.print("0K># ");

}

/////////////////////accion_5  //////////////////////////////////

void accion_5() {

  if (pulsacion == '#'){

    contador = 6;

    lcd.clear();

    cuadro =1;

     leeCadena3+=key;

        dato3=leeCadena3.toInt();//CONVERTIR A DATO ENTERO Y SE CONVIERTE EN DATO 3

    

  }

       if (pulsacion == '*') {

    contador = 4;

    lcd.clear();

    cuadro =1;

  }

}

/////////////////////Menu_6 segundos//////////////////////////////////

void menu_6() {


  lcd.setCursor(0, 0);

  lcd.print("INGRESE SEGUNDOS  ");

  lcd.setCursor(1, 1);

   char key = Teclado1.getKey();//SE GUARDA LA TECLA PRESIONADA

lcd. display(); 

  //función que permite detectar que fue pulsada una tecla 


if (key=='0'||key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9'){

  

lcd.setCursor(cuadro,fila);//Ubicación del cursor y la línea cuadro=0 y fila=O

lcd.print(key);//imprimo en la Icd el valor de la tecla pulsada 

cuadro++;//incremento el cursor de la lcd


if (cuadro>3)//detecto el cambio de línea de la Icd evitando escribir fuera de la pantalla 

{

cuadro=1; //ubicar cursor en el primer cuadro

fila=1; //ubicar en la segunda línea

lcd.clear();

}

        leeCadena4+=key;

        dato4=leeCadena4.toInt();//CONVERTIR A DATO ENTERO Y SE CONVIERTE EN DATO 1

     }

  


  lcd.setCursor(4, 1);//COLOCAR HORAS ENLA POSICION 6 DE LA FILA 1 QUE EN RELIDAD ES LA SEGUNDA,SOLO QUE SE LE DICE 1 POREU LA ANTERIOR ERA 0

  lcd.print("SEG ");

  lcd.setCursor(11, 1);//COLCAR ICONO DE OK AL LADO INFERIOR DERECHO

  lcd.print("0K># ");

}

/////////////////////accion_6  //////////////////////////////////

void accion_6() {

  if (pulsacion == '#'){

    contador = 7;

    lcd.clear();

    cuadro =1;

    leeCadena4+=key;

        dato4=leeCadena4.toInt();//CONVERTIR A DATO ENTERO Y SE CONVIERTE EN DATO 4

  }

     if (pulsacion == '*') {

    contador = 5;

    lcd.clear();

    cuadro =1;

  }

}

/////////////////////intermitente  //////////////////////////////////

/////////////////////Menu_7 //////////////////////////////////

void menu_7() {


  lcd.setCursor(0, 0);

  lcd.print("ES CORRECT?");

  lcd.setCursor(0, 1);

  lcd.print(dato1);

  lcd.setCursor(4, 1);

  lcd.print("RPM");

  lcd.setCursor(8, 1);

  lcd.print(dato2);

  lcd.setCursor(10, 1);

  lcd.print(":");

  lcd.setCursor(11, 1);

  lcd.print(dato3);

  lcd.setCursor(13, 1);

  lcd.print(":");

  lcd.setCursor(14, 1);

  lcd.print(dato4);

  lcd.setCursor(12, 0);

  lcd.print("0K>#");

}

/////////////////////accion_7  //////////////////////////////////

void accion_7() {


  if (pulsacion == '#'){//caso de no haberse introducido valor y continuar con el proceso se 

      if ( dato1 < 1){

  lcd.clear();

  lcd.setCursor(0, 0);

  lcd.print(" NO HAY VALOR DE");

  lcd.setCursor(0, 1);

  lcd.print("      RPM");

  delay(2000);

  contador = 1;

  lcd.clear();

  }

  else{

    contador = 8;

    lcd.clear();

    }

     }

    

    if (pulsacion == '*') {

    contador = 6;

    lcd.clear();

    cuadro =1;

  }

    

  

}

/////////////////////Menu_8 muestra el tiempo que falta y las rpm //////////////////////////////////

void menu_8() {

  lcd.setCursor(0,0);

 segundostotal = dato4 + (dato3 * 60) + (dato2 * 60 * 60);  //Convierte el tiempo elegido en segundos!!

 

      while (segundostotal > 0)

      {


        delay (1000);          //Descontamos en periodos de 1 segundo

        segundostotal--;    

  

        dato2 = ((segundostotal / 60)/ 60);   //Convertimos los segundos totales en horas

        dato3 = (segundostotal / 60) % 60;  //Convertimos los segundos totales en minutos

        dato4 = segundostotal % 60;        //Convertimos los segundos totales en periodos de 60 segundos


 analogWrite(Motor, dato1);  

 

 

        lcd.setCursor(5,0);

        lcd.print(dato1);        //Mostramos mensaje de tiempo restante

         lcd.setCursor(9,0);

        lcd.print("RPM");        //Mostramos mensaje de tiempo restante


        lcd.setCursor(4,1);

        if (dato2 < 10) lcd.print("0");     // Si las horas son menor que 10, pone un "0" delante.

        lcd.print(dato2);                   // Sin este codigo, se muestra asi: H:M:S  (1:M:S)

        lcd.print(":");



        if (dato3 < 10) lcd.print("0");   // Si los minutos son menor que 10, pone un "0" delante.

        lcd.print(dato3);                 // Sin este codigo, se muestra asi: H:M:S  (H:1:S)



        lcd.print(":");

        if (dato4 < 10) lcd.print("0");  // si el valor de segundo esta por debajo de 9 (unidad) antepone un cero

        lcd.print(dato4);  

        // Sin este codigo, se muestra asi: H:M:S  (H:M:

          if (pulsacion == 'A') {

                  lcd.setCursor(5,0);

                  lcd.print("Tiempo");

                  lcd.setCursor(3,1);

                  lcd.print("Finalizado");

  }

  

        

}


 

          if (segundostotal == 0)            //Si finaliza el tiempo

          {          

             while(1)                        //Bucle infinito mostrando mensaje y haciendo parpadear un led

             {              

                  lcd.clear();

                  lcd.setCursor(5,0);

                  lcd.print("Tiempo");

                  lcd.setCursor(3,1);

                  lcd.print("Finalizado");

                analogWrite(Motor,0);  

                contador = 1;

  cuadro =0;

  dato1 =0;

  dato2 =0;

  dato3 =0;

  dato4 =0;

leeCadena1[5] = '\0';

leeCadena2[5] = '\0';

leeCadena3[5] = '\0';

leeCadena4[5] = '\0';

                 sonarTono(TONO_ERROR,TIME_INTERVAL);

                 break;

             }     

          }

     }


/////////////////////accion_8  //////////////////////////////////

void accion_8() {

  if (pulsacion == '#') {

  contador = 1;

  cuadro =0;


leeCadena1[5] = '\0';

leeCadena2[5] = '\0';

leeCadena3[5] = '\0';

leeCadena4[5] = '\0';

  }

   if (pulsacion == '*') {

                  lcd.setCursor(5,0);

                  lcd.print("Tiempo");

                  lcd.setCursor(3,1);

                  lcd.print("Finalizado");

  }

  

}

void menu_9() {


  valor_entrada_analogica = analogRead(entrada_analogica);  // Guardamos la lectura analogica en la variable (valor_entrada_analógica)

  valor_salida_pwm =map(valor_entrada_analogica,0, 1023,0,255); // guardamos el mapeo en la variable (valor salida)

   

 analogWrite(Motor,valor_salida_pwm);  

  if (valor_entrada_analogica<0){ 


  valorRPM = 0*valor_salida_pwm; 

}

  else{

    valorRPM = 1*valor_salida_pwm; 

    }

  

  lcd.setCursor(0, 0);

  lcd.print("VELOCIDAD EN RPM "); 

  lcd.setCursor(5, 1);

  lcd.print(valorRPM);

  

}

/////////////////////accion_7  //////////////////////////////////

void accion_9() {


if (pulsacion == '#') { 

  contador = 1;

  analogWrite(Motor,0);

 }   

  

}

    

void TIEMPO() {


}

   

    void sonarTono(int tono, int duracion)

    {

      tone(buzzer,tono,duracion);

      delay(duracion);

    }

Comentarios

Entradas populares