Go Down

Topic: Manejar teclado, LCD, sensor LM35, y reles con arduino MEGA. (Read 4005 times) previous topic - next topic

IRRA

Hola, hace un tiempito que vengo con esto y no encuentro soluciones a mis problemas.

Con esos materiales quiero hacer un termometro de ambientes automatico.

-Con el teclado le ingreso valores numericos max y min como rangos de temperatura a respetar.
-Con el LCD muestro 5 pantallas a mostrarse segun se controle con el teclado (teclas A, B, C y D).
-Con el sensor LM35 mido todo el tiempo la temperatura y la muestro en el LCD variando esta cada 500ms.
-Y con esa temperatura ambiente y los rangos max y min controlar unos reles segun se alcanzen.

Mi proyecto lo pense a funcionar asi:

1-Se enciende todo el proyecto y se muestra en LCD pantalla de "BIENVENIDA..." por 10seg.
2-Luego aparece 2° pantalla "SIN VALORES LIMITES", que señala que no existen los rangos max y min a respetar. En esa misma pantalla mostrar la temperatura ambiente actual, variando cada 500ms. La pantalla queda fija hasta accionar el teclado.
3-Al pulsar del teclado tecla A, mostrar nueva pantalla "NUEVO VALOR MAX...", teclear valor numerico, mostrarlo tambien y con tecla D ingresarlo, guardarlo en una variable y luego mostrarlo en otra pantalla "EN FUNCIONAMIENTO..." junto al valor min y la temperatura ambiente actual.
4-Al pulsar del teclado tecla B, mostrar nueva pantalla "NUEVO VALOR MIN...", teclear valor numerico, mostrarlo tambien y con tecla D ingresarlo, guardarlo en una variable y luego mostrarlo en otra pantalla "EN FUNCIONAMIENTO..." junto al valor max y la temperatura ambiente actual.
5-Con la tecla C poder borrar los numeros equivocados al marcar los rangos max y min. (2 espacios del LCD por solo ser unidad y decena).
6-Una vez hecho los 5 pasos, si la temperatura ambiente llega a un valor max accionar un rele y si se llega a un valor min accionar el otro rele.

Todo esto acompañado de transistores NPN para los reles y para el backlight del LCD, LEDS de valor max, valor min y funcionamiento normal, y tambien un buzzer a sonar en encendido y tecleo de teclado.


Mis problemas de funcionamiento son:
-Cuando paso de pantalla "SIN VALORES LIMITES..." a pantalla de "NUEVO VALOR MAX O MIN..." se mezclan las 2 pantallas, pareciendo una pavada pero que no puedo resolver.
-Al pulsar los numeros no me aparecen los que presiono si no otros que no se de donde salen si hice bien la conversion ASCII a numeros.
-Al ingresar el valor min por ejemplo y darle enter con tecla D el valor me aparece en el lugar del valor max en la pantalla "EN FUNCIONAMIENTO...".
-Al borrar los numeros equivocados en pantallas de valor max y min con la tecla C, se me borran los mismos espacios en la pantalla "EN FUNCIONAMIENTO...".
-Y por ultimo no se logran accionar los reles a traves de la activacion de los transistores NPN que andan bien. Al igual que todos los demas componentes porque los probe a todos y ademas hasta llegar a este paso habia experimentado el funcionamiento de cada componente.

Tengo fe que con algun problema me van a ayudar, asi que les doy las gracias por adelantado. Espero haber sido claro.

Les dejo para descargar el codigo porque era un poco largo y necesitaba explicar mucho por aca, pido disculpas. Pero lo coloco en una respuesta tambien.

IRRA

Primero les dejo hasta el VOID SETUP

Code: [Select]
#include <Keypad.h>          //libreria para controlar el teclado matricial
#include <LiquidCrystal.h>   //libreria para controlar el LCD

//Configuración del teclado matricial

const byte filas = 4;                            // numero de filas a usar
const byte columnas = 4;                          // numero de columnas a usar
byte pinsFilas[filas] = {22, 23, 24, 25};          // orden de conexion de filas: Fila 1, Fila 2, Fila 3 y Fila 4
byte pinsColumnas[columnas] = {26, 27, 28, 29};    // orden de conexion de columnas: Columna 1, Columna 2, Columna 3 y Columna 4

char teclas[filas][columnas] = {  //matriz teclas para definir orden de caracteres tal cual en el teclado
  {'7', '8', '9', 'A'},
  {'4', '5', '6', 'B'},
  {'1', '2', '3', 'C'},
  {'0', 'F', 'E', 'D'},
};
Keypad keypad = Keypad(makeKeymap(teclas), pinsFilas, pinsColumnas, filas, columnas);  //se mapean teclas


// Configuración para el LCD

// Puertos LCD -> RS  E   D4  D5  D6  D7
LiquidCrystal lcd(32, 33, 34, 35, 36, 37);

const int sensor = 0; // entrada del sensor LM35
const int backlight = 38;   // pin digital LED del LCD
const int ledAzul = 42;     // pin digital LED azul
const int ledVerde = 43;    // pin digital LED verde
const int ledRojo = 44;     // pin digital LED rojo
const int buzzer = 45;      // pin digital buzzer
const int transistor1 = 52; // pin digital transistor 1
const int transistor2 = 53; // pin digital transistor 2


char numero;             //variable "char numero" de tipo caracteres
int  valorA;             //variables para mostrar numeros en LCD
int  valorB;

int contador;            //variables "contador" para separar procesos
int contador2 = 0;
int contador3;

int decenaA;     //variables "decena" para definir decenas
int decenaB;
int unidadA;     //variables "unidad" para definir unidades
int unidadB;

int cicloA;      //variables "ciclo" que comienzan procesos
int cicloB;


float centigrados()                    //se calcula como variable decimal "coma flotante"
{
  int sensor;                          //de acuerdo a la variable del sensor
  float celsius;                        //se crea una variable resultado decimal
  sensor = analogRead(A0);              //se lee el estado de la entrada analogica A0 donde esta el sensor
  celsius = (500.0 * sensor) / 1023;    //se realiza el calculo
  return (celsius);                    //se devuelve el resultado a la variable decimal "celsius"
}


void setup() {                  //se definen como salidas las conexiones a pines digitales
  pinMode(backlight, OUTPUT);
  pinMode(ledAzul, OUTPUT);
  pinMode(ledVerde, OUTPUT);
  pinMode(ledRojo, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(transistor1, OUTPUT);
  pinMode(transistor2, OUTPUT);

  delay(500);                        //pausa antes del encendido
  digitalWrite(backlight, HIGH);    //encender backlight
  delay(500);                       //pausa antes de primera pantalla para que se muestre prolijamente
  digitalWrite(ledVerde, HIGH);
  lcd.begin(20, 4);                 //inicio de uso de LCD de 20x4
  lcd.setCursor(3, 1);              //posicionar cursor en columna 3 y fila 1
  lcd.print("BIENVENIDO/A A");      //escribir texto en LCD
  lcd.setCursor(1, 2);
  lcd.print("TECMATEMP LCDMR 35");
  digitalWrite(buzzer, HIGH);       //encender buzzer
  delay(1000);                      //pausa de 1 seg encendido
  digitalWrite(buzzer, LOW);        //apagar buzzer
  delay(9000);                      //esperar 9 seg antes del void loop
  lcd.clear();                      //limpiar pantalla
  delay(100);                        //pausa para pasar a otra pantalla prolijamente
}

IRRA

Hasta el VOID LOOP quize decir, ahora el resto:
Code: [Select]
void loop() {
  float temperatura = centigrados();      //se iguala variable temperatura a variable centigrados
  lcd.setCursor(0, 0);
  lcd.print("SIN VALORES LIMITES!");
  lcd.setCursor(0, 2);                    //posicionar texto en columna 0 y fila 2
  lcd.print("TEMP.ACT.....     ^C");       //escribir texto en LCD
  lcd.setCursor(13, 2);
  lcd.print(temperatura);                  //mostrar resultado de temperatura mas arriba
  delay(500);

  char teclas = keypad.getKey();  //Guarda en la variable "teclas" el valor pulsado del teclado

  if (teclas != NO_KEY) {             //Si se ha pulsado una tecla
    numero = teclas - 48;            //conversión de caracteres ASCII a valores numericos
    digitalWrite(buzzer, HIGH);
    delay(50);
    digitalWrite(buzzer, LOW);

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    //PROCESO AL PULSAR BOTON A (INSERTAR VALOR MAX) (TECLA F6)
    if (numero == 17) {                      //Si se pulsa la tecla A entonces (valor ascii A es en valor numerico 17)
      lcd.clear();                        //Se limpia la pantalla del LCD
      delay(100);                          //pausa para pasar a otra pantalla
      lcd.setCursor(3, 0);                   //se ajusta el cursor del LCD
      lcd.print("INGRESE NUEVO!");           //se muestra texto en LCD
      lcd.setCursor(4, 1);
      lcd.print("VALOR MAXIMO");
      lcd.setCursor(5, 2);
      lcd.print("(0.....99)");
      lcd.setCursor(8, 3);
      lcd.print("  ^C");
      cicloA = 1;                         //El "cicloA" será igual a 1
      numero = -1;                    //la variable "numero" comienza en -1
      contador = 0;                       //Se iguala la variable "contador" a 0
      digitalWrite(ledAzul, LOW);      //apagar led azul
      digitalWrite(ledVerde, LOW);    //apagar LED verde
      digitalWrite(ledRojo, LOW);      //apagar led rojo
    }

    if (cicloA == 1) {                       //Si el "cicloA = 1", indica que se presiono la tecla A o F6

      if (numero >= 0 && contador == 1) {          //Si se presiona una digito y contador=1 entonces
        unidadA = numero;                       //Se iguala el valor tecleado a la variable "unidadA"
        contador++;                           //Se incrementa al valor del contador a 2
        numero = -1;                          //la variable numero comienza en -1
        delay(500);
      }
      if (numero >= 0 && contador == 0) {       //Si se presiona un boton del teclado y si el "contador = 0" entonces
        decenaA = numero;                   //Se iguala el valor tecleado a la variable "decenaA"
        contador++;                       //Se incrementa el valor del "contador" a 1
        numero = -1;                    //la variable "numero" comienza en -1
        delay(500);

        valorA = (decenaA * 10) + unidadA;
        delay(100);
        lcd.setCursor(8, 3);                  //posicionar cursor del LCD
        lcd.print(valorA);                    //mostrar en LCD valores de temperatura
      }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //PROCESO AL PULSAR BOTON B (INSERTAR VALOR MIN) (TECLA F5)
    if (numero == 18) {             //Si se pulsa la tecla B entonces
      lcd.clear();                  //Se limpia la pantalla
      delay(100);                    //pausa para pasar a otra pantalla
      lcd.setCursor(3, 0);               //se ajusta el cursor
      lcd.print("INGRESE NUEVO!");
      lcd.setCursor(4, 1);            //Se ajusta el cursor a una determinada posición
      lcd.print("VALOR MINIMO");        //mostrar texto en LCD
      lcd.setCursor(5, 2);
      lcd.print("(0.....99)");
      lcd.setCursor(8, 3);                //posicionar cursor del LCD
      lcd.print("  ^C");                   //escribir textos
      cicloB = 1;                       //El cicloB será igual a 1
      numero = -1;                      //variable char numero se iguala a -1
      contador = 0;                   //Se iguala la variable "contador" a cero
      digitalWrite(ledAzul, LOW);      //apagar led azul
      digitalWrite(ledVerde, LOW);    //apagar LED verde
      digitalWrite(ledRojo, LOW);      //apagar led rojo
    }

    if (cicloB == 1) { //Si cicloB = 1, indica que se presiono la tecla B

      if (numero >= 0 && contador == 0) {            //Si se presiona una digito y contador=0 entonces
        decenaB = numero;                           //Se iguala el valor tecleado a la variable "decenaB"
        contador++;                                  //Se incrementa al valor del contador a 1
        numero = -1;                                //variable char numero se iguala a -1
        delay(500);
      }

      if (numero >= 0 && contador == 1) {        //Si se presiona una digito y contador=1 entonces
        unidadB = numero;                       //Se iguala el valor tecleado a la variable "unidadB"
        contador++;                            //Se incrementa al valor del contador a 2
        numero = -1;                            //variable char numero se iguala a -1
        delay(500);

        valorB = (decenaB * 10) + unidadB;
        delay(100);
        lcd.setCursor(8, 3);                          //Se ajusta el cursor a una determinada posición
        lcd.print(valorB);                         //Se imprime en el LCD el numero obtenido en la variable "valorB"
      }
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //PROCESO AL PULSAR BOTON C (BORRAR NUMEROS EQUIVOCADOS) (TECLA F4)
    if (numero == 19) {                       //Si se pulsa la tecla C entonces
      delay(100);                          //pausa antes del borrado de numeros
      lcd.setCursor(8, 3);                      //Se ajusta el cursor del LCD
      lcd.print("");                           //mostrar texto vacio en LCD
      digitalWrite(ledAzul, LOW);                //apagar led azul
      digitalWrite(ledVerde, LOW);              //apagar LED verde
      digitalWrite(ledRojo, LOW);              //apagar led rojo
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //PROCESO AL PULSAR EL BOTON D (ENTER) (F3)
    if (numero == 20) {                           //si se pulsa la tecla D entonces
      digitalWrite(ledVerde, HIGH);                  //encender led verde
      lcd.clear();                                //limpiar pantalla
      delay(100);
      lcd.setCursor(0, 0);                      //posicionar cursor en columna 0 y fila 0
      lcd.print("EN FUNCIONAMIENTO...");        //escribir texto en LCD
      lcd.setCursor(0, 1);                      //posicionar cursor en columna 0 y fila 1
      lcd.print("TEMP.MAX........  ^C");       //escribir texto en LCD
      lcd.setCursor(16, 1);
      lcd.print(valorA);                        //mostrar valorA maximo en LCD
      lcd.setCursor(0, 2);                      //posicionar texto en columna 0 y fila 2
      lcd.print("TEMP.ACT.....     ^C");       //escribir texto en LCD
      lcd.setCursor(0, 3);                    //posicionar texto en columna 0 y fila 3
      lcd.print("TEMP.MIN........  ^C");       //escribir texto en LCD
      lcd.setCursor(16, 3);
      lcd.print(valorB);                        //mostrar valorB maximo en LCD
    }
  }

  if (temperatura >= (valorA)) {                //si el valor de temperatura es mayor o igual al valorA
    digitalWrite(ledAzul, LOW);                //apagar led azul
    digitalWrite(ledRojo, HIGH);                //encender led rojo
    digitalWrite(transistor2, HIGH);              //encender transistor 2
  }
  else {
    digitalWrite(ledRojo, LOW);              //apagar led rojo
    digitalWrite(transistor2, LOW);          //apagar transistor 2
  }

  if (temperatura <= (valorB)) {            //si el valor de temperatura es mayor o igual al valorB
    digitalWrite(ledRojo, LOW);              //apagar led rojo
    digitalWrite(ledAzul, HIGH);            //encender led azul
    digitalWrite(transistor1, HIGH);        //encender transistor 1
  }
  else {
    digitalWrite(ledAzul, LOW);              //apagar led azul
    digitalWrite(transistor1, LOW);           //apagar transistor 1
  }
}


No piensen que quiero que me resuelvan todo, yo mientras voy probando aca en mi casa...fui completo al explicar para que entiendan lo mayor posible. Con alguna pequeña ayudita estare agradecido.

Go Up