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
Publicar un comentario