Autor Tema: Ingresar temperatura por teclado matricial  (Leído 5273 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado kikecon

  • PIC10
  • *
  • Mensajes: 35
Ingresar temperatura por teclado matricial
« en: 25 de Octubre de 2010, 01:38:37 »
hola amigos del foro estoy implementando un proyecto en el que puedo monitorear la temperatura tanto desde una lcd como desde la pc (comunicacion serial), pero ahora quiero ingresar mi set_point (o temperatura limite) desde el teclado matricial pero no tengo idea de como hacerlo bueno he leido que para usar un teclado hay que agregar una libreria, pero yo he pensado una logica de esta forma usando cualkier puerto, para esto uso el 16f877a y he pensado implementar mi teclado en el puerto c, pero mi inquietud no va por ahi sino que quisiera hacer que si por teclado ingreso 80 ese numero se escriba en la variable que sera e set point, ojala me entiendan en conclusion quiero hacer una especie de concatenado me imagino que puede ser que utilic arreglos o no se espero me apoyen gracias
Enrique Contreras R.

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: Ingresar temperatura por teclado matricial
« Respuesta #1 en: 25 de Octubre de 2010, 05:43:11 »
Buenas, no se si será lo que te comento, pero yo creo que lo que puedes hacer, es que quando pulses qualquier tecla de tu teclado, el programa entre en un "bucle" que vaya almacenando lo que has pulsado, y quando le des a una tecla "enter" te salga de este bucle y el numero que tu has tecleado ya lo puedes guardar en tu variable set point, yo creo que es una buena forma peor no se si te servira. Esperemos que si  ;-)

Saludos

F-traxx

Desconectado MarkKnopfler81

  • PIC12
  • **
  • Mensajes: 64
    • PICs, Electrónica y Robótica
Re: Ingresar temperatura por teclado matricial
« Respuesta #2 en: 25 de Octubre de 2010, 11:47:49 »
Hola, creo que F-traxx se refiere a algo parecido a esto http://picrobot.blogspot.com/2010/08/antirrebote.html pero si quieres usar un teclado matricial, solo debes almacenar el número de tecla (0-9) y a la siguiente pulsación multiplicarlo por 10 y volver a sumar el numero de la nueva pulsación.
Cuando pulses un enter hacer lo que sea necesario y pulsando clear borrar la variable.

saludos.

Desconectado MarkKnopfler81

  • PIC12
  • **
  • Mensajes: 64
    • PICs, Electrónica y Robótica
Re: Ingresar temperatura por teclado matricial
« Respuesta #3 en: 25 de Octubre de 2010, 15:30:20 »
Mira este es el código que me has pasado por privado, con las modificaciones que le hice para el teclado, lo cuelgo asi todos pueden comentar, o por lo menos verlo, corregirlo o aprender algo ;)

No se si funciona bien, en teoría si, ya que lo hice un poco a las apuradas y no tuve tiempo de probarlo. Pero esto es lo bueno del foro si alguien le encuentra algun error o una forma mejor de hacerlo seguro dirá algo

Código: [Seleccionar]
#include <16f877a.h>
#device adc=10
#FUSES xt,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT //funcionamiento
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_e0, rcv=pin_e1, bits=8, parity=N)
#include "lcd.c"
#bit RB1=0x6.1
#bit RB7=0x06.7

void com_ser();      //funcion para comunicacion serial
float valor_real,temperatura,set_point,valor1;   // variables

int i=0;


///////////////////////////////////////////////////// Esto es lo que agregue
float tmpSetPoint;
int Tecla;
int AnTecla;
int1 fModo;

#define Tecla3 PIN_B3
#define Tecla2 PIN_B2
#define Tecla1 PIN_B1
#define Tecla0 PIN_B0
#define Editar 1

int LeerTeclado();
///////////////////////////////////////////////////////////////////////////////

void main ()
{
      setup_port_a(ALL_ANALOG);                    //todo el puerto a son entradas analogicas
      setup_adc(ADC_CLOCK_INTERNAL);               //activa el reloj interno del adc
      set_tris_b(0b00001111);                      //RB0,RB1 y RB2 son entradas, el resto salidas
     // enable_interrupts(global);                   //interrupciones globales activas
    //  enable_interrupts(INT_EXT);                  //interrupciones externas
      lcd_init();
      output_bit(pin_b4,1);
      delay_ms(10);
      RB7=0;
      lcd_putc("            Bienevenidos a la\n\r");
      lcd_putc("         Feria Tecnologica 2010");
      delay_ms(3000);
      //////proceso////
      for(;;)
      {
         set_adc_channel(0);
         valor_real= read_adc();
         set_adc_channel(1);
         valor1=read_adc();
         delay_us(10);
         temperatura = 500*valor_real /1024;
      //   set_point=500*valor1/1024;
         printf(lcd_putc, "\fTemperatura = %01.2fºC\r\n",temperatura);
         printf(lcd_putc, "Temperatura limite = %01.2fºC",tmpSetPoint);
         
         Tecla=LeerTeclado();                // Lee el teclado
         if(AnTecla!=Tecla){                 // si se pulso una tecla
            if(fModo==Editar){               // y esta en modo edicion
               if(Tecla>0&&Tecla<11){        // si se pulso 0-9
                  tmpSetPoint*=10;           // Multiplica el temporal por 10
                  tmpSetPoint+=Tecla-1;      // y le suma la tecla-1
               }
               if(Tecla==11){                // se pulsó ENTER
                  Set_Point=tmpSetPoint;     // Guardar el SetPoint con el temporal
                  fModo=0;                   // modo no edicion
               }
               if(Tecla==12){                // se pulsó CLEAR
                  fModo=0;                   // modo no edicion
               }
            }
            if(fModo!=Editar){               // si se pulso una tecla y esta en modo no edicion
               tmpSetPoint=Set_Point;        // tmp setpoint con el setpoint
               if(Tecla==11){                // Si se pulso ENTER
                  fModo=Editar;              // entra en modo edicion
                  tmpSetPoint=0;             // temporal a 0
               }
            }           
         }
         AnTecla=Tecla;                      // Guarda la tecla pulsada para la
                                             // proxima iteracion
       
         
         
      }
}
//////datos para el serial
void com_ser()
{
      output_bit(pin_b3,1);
      delay_ms(300);
      printf("Temperatura = %01.2fºC", temperatura);
      printf("         Set Point = %01.2fºC\r\n", set_point);
      delay_ms(100);
      output_bit(pin_b3,0);
      i=0;
}


int LeerTeclado(){
   int tmp1;
   int tmp2;
   int Tec=0;
   tmp2=0x80;   
   for (tmp1=0;tmp1<3;tmp1++){                  // Bucle de 4 pasos
         output_b(tmp2);                        // tmp a puerto B
         tmp2>>=1;                              // rota el tmp que despues pasara al puerto
         delay_ms(1);
         if (input(Tecla0)==1)Tec=(tmp1*4)+1;   //comprueba la tecla pulsada
         if (input(Tecla1)==1)Tec=(tmp1*4)+2;
         if (input(Tecla2)==1)Tec=(tmp1*4)+3;
         if (input(Tecla3)==1)Tec=(tmp1*4)+4;     
   }
   return Tec;                                  // devuelve la tecla pulsada.
}

saludos.

Desconectado sancho25

  • PIC10
  • *
  • Mensajes: 12
Re: Ingresar temperatura por teclado matricial
« Respuesta #4 en: 08 de Febrero de 2012, 13:41:34 »
Hola buenas, yo he realizado el proyecto de un termostato donde la temperatura minima es de 20  y la maxima es de 25, estos parametros los cambio mediante el programa que es el siguiente; pero me gustaria añadirle un teclado matricial, pero no se la programacion, si alguien me puede ayudar...
#include <16f876A.h>
#device ADC=10

#fuses NOPROTECT,NOCPD,NOLVP,NOWDT,XT

#use fast_io (A)
#use fast_io (B)
//#use fast_io (C)
#use delay(clock=4000000)

#include <lcd2.c>
#include <ds1820.h>

float minimo=20;
float maximo=25;

void main()
{
   lcd_init();
   delay_ms(100);
   SETUP_ADC_PORTS(NO_ANALOGS);
   set_tris_a(0x3F);
   set_tris_b(0x00);
   
 
while (1)
{
   DS18S20_Convert_T();               //Obtiene la temperatura del DS18S20

   Temp=make16(DS18S20_Buffer[1],DS18S20_Buffer[0]);//Lee el valor de 16 bits de la temperatura
   if(bit_test(DS18S20_Buffer[1],7))      //Si es negativo...
      {
      Temp=~Temp+1;                  //Complementa a 2
      Temperatura=Temp*-0.5;            //Ajusta la parte fracionaria
      }   
   else
      Temperatura=Temp*0.5;            //Ajusta la parte fraccionaria
     
   lcd_enviar(LCD_COMANDO,LCD_CLEAR);
   lcd_gotoxy(1,1);
   printf(lcd_putc,"TEMP: %3.1f ", temperatura);
   lcd_putc(223);
   lcd_putc("C    ");
   lcd_gotoxy(1,2);
   
   if (temperatura<=minimo)
      {
         printf(lcd_putc,"Frio! Calentando");
         output_high(PIN_C5);
         output_low(PIN_C6);
         output_low(PIN_C7);
      }
   else if (temperatura>=maximo)
      {
         printf(lcd_putc,"Caliente!Enfriar");
         output_low(PIN_C5);
         output_high(PIN_C6);
         output_low(PIN_C7);
         
      }
   else
      {
         printf(lcd_putc,"Temperatura OK  ");
         output_low(PIN_C5);
         output_low(PIN_C6);
         output_high(PIN_C7);
      }
}
}
FIN

Me interesaria poder regular esos parametros desde un teclado, pero es que no tengo ni idea de como hacerlo... necesito ayuda, os lo agradezco mucho