Autor Tema: Como actualizar la temperatura  (Leído 1418 veces)

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

Desconectado Roycast

  • PIC10
  • *
  • Mensajes: 2
Como actualizar la temperatura
« en: 22 de Enero de 2014, 00:52:15 »
Hola, soy algo nuevo en esto de los pic´s y me dejaron una practica que aun no logro terminar.
Ocupo un pic 16f887 una lcd 16x2 un teclado matricial de 4x4 y el sensor Lm35.
Lo que tiene que hacer es ingresar una temperatura máxima cuando sobre pase esa temperatura se enciende un ventilado y cuando baje de
temperatura se enciende un foco. Pero al incio cuando me da la temperatura no me cambia tengo que presionar algún botón del teclado para que cambie.

Dejo mi programa para ver si pueden decirme que falta.

espero haberme explicado bien

Código: [Seleccionar]
unsigned short kp, kpb, dg, eepr, a , b, oldstate,cnt, inc, clok = 0;     //declaracion de variables
int val=0;
unsigned int Radc, TemI;
   //unsigned short c;
    //unsigned short b;
float Tem;
char Text[5];
void menu(){

   switch(a){

    case 49: a = 1;break; //"1"
    case 50: a = 2;break; //"2"
    case 51: a = 3;break; //"3"
   // case 65: b = ;break; //"A"
    case 52: a = 4;break; //4"
    case 53: a = 5;break; //"5"
    case 54: a = 6;break; //"6"
    //case 8: b = 66;break; //"B"
    case 55: a = 7;break; // "7"
    case 56: a = 8;break; //"8"
    case 57: a = 9;break; //"9"
    //case 12: b = 67;break; //"C"
    //case 42: b = 42;break; //"*"
    case 48: a = 0;break; // "0"
    //case 15: b = 35;break; //"#"
    //case 16: b = 68;break; //"D"
}
  switch(b){

    case 49: b = 1;break; //"1"
    case 50: b = 2;break; //"2"
    case 51: b = 3;break; //"3"
   // case 65: b = ;break; //"A"
    case 52: b = 4;break; //4"
    case 53: b = 5;break; //"5"
    case 54: b = 6;break; //"6"
    //case 8: b = 66;break; //"B"
    case 55: b = 7;break; // "7"
    case 56: b = 8;break; //"8"
    case 57: b = 9;break; //"9"
    //case 12: b = 67;break; //"C"
    //case 42: b = 42;break; //"*"
    case 48: b = 0;break; // "0"
    //case 15: b = 35;break; //"#"
    //case 16: b = 68;break; //"D"
}


  val=(a*10)+b;
Lcd_Cmd(_LCD_CLEAR);                         //limpia lcd
   Lcd_Cmd(_LCD_CURSOR_OFF);                 // Cursor off
   Lcd_Out(1, 1, "T:");              //write message Texton lcd
 //  Lcd_Out( 1, 12, Text);
   Lcd_Out(2, 1, "Presiona 1");
          //Lectura del canal 0 del ADC.
Radc = ADC_Read(0);
//Uso de la ecuación (13.5).
Tem = (0.244*Radc)*2;
//Se convierte el resultado a un número entero.
TemI = Tem;
//Se convierte el número entero a una cadena de caracteres.
IntToStr( TemI, Text );
if(Tem>val){
PORTB = 0b00000001;
 }
else  {
PORTB = 0b00000010;  }
   Lcd_Out(1, 10, Text);

      }
 
void maindos(){
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);
     Lcd_Out(1, 1, "Nueva Temperatura");
     return;
     }

void guardatem(){       //lee una clave de 2 digitos desde teclado y la guarda en la eeprom
   int i;
   //  unsigned short c;
   // unsigned short b;
   for (i = 0; i < 1; i++){
   do {
   a=0;

   do
   a=Keypad_Key_Click();

   while (!a);

   switch(a){

    case 1: a = 49;break; //"1"
    case 2: a = 50;break; //"2"
    case 3: a = 51;break; //"3"
   // case 4: a = 65;break; //"A"
    case 5: a = 52;break; //4"
    case 6: a = 53;break; //"5"
    case 7: a = 54;break; //"6"
   // case 8: a = 66;break; //"B"
    case 9: a = 55;break; // "7"
    case 10: a = 56;break; //"8"
    case 11: a = 57;break; //"9"
   // case 12: a = 67;break; //"C"
   // case 13: a = 42;break; //"*"
    case 14: a = 48;break; // "0"
   // case 15: a = 35;break; //"#"
   // case 16: a = 68;break; //"D"
}

       if (a !=oldstate)
       {
       oldstate=a;
       }

       Lcd_Chr(2, 5, a);
       delay_ms(500);

   EEPROM_Write(0x80, a);

          }while(0);

          do {
   b=0;

   do
   b=Keypad_Key_Click();

   while (!b);

   switch(b){

    case 1: b = 49;break; //"1"
    case 2: b = 50;break; //"2"
    case 3: b = 51;break; //"3"
    case 4: b = 65;break; //"A"
    case 5: b = 52;break; //4"
    case 6: b = 53;break; //"5"
    case 7: b = 54;break; //"6"
    case 8: b = 66;break; //"B"
    case 9: b = 55;break; // "7"
    case 10: b = 56;break; //"8"
    case 11: b = 57;break; //"9"
    case 12: b = 67;break; //"C"
    case 13: b = 42;break; //"*"
    case 14: b = 48;break; // "0"
    case 15: b = 35;break; //"#"
    case 16: b = 68;break; //"D"
}

       if (b !=oldstate)
       {
       oldstate=b;
       }
 Lcd_Chr(2, 6, b);

      EEPROM_Write(0x81, b);

  }while(0);
  }
  }
     char convert(unsigned short kp){
  switch (kp) {                   //pasa a ascii la tecla pulsada
      case  1: kp = '1'; break; // 1
      case  2: kp = '2'; break; // 2
      case  3: kp = '3'; break; // 3
      case  4: kp = 'A'; break; // A
      case  5: kp = '4'; break; // 4
      case  6: kp = '5'; break; // 5
      case  7: kp = '6'; break; // 6
      case  8: kp = 'B'; break; // B
      case  9: kp = '7'; break; // 7
      case 10: kp = '8'; break; // 8
      case 11: kp = '9'; break; // 9
      case 12: kp = 'C'; break; // C
      case 13: kp = '*'; break; // *
      case 14: kp = '0'; break; // 0
      case 15: kp = '#'; break; // #
      case 16: kp = 'D'; break; // D
    }
    return kp;
  }

void maintres(){
 Lcd_Cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);
     Lcd_Out(1, 1, "Guardo con exito");
     return;
     }

// Keypad module connections
char  keypadPort at PORTC;                          //declaracion del puerto C
// End Keypad module connections

// LCD module connections
sbit LCD_RS at RA4_bit;                             //declaracion de los puertos del lcd
sbit LCD_EN at RA5_bit;
sbit LCD_D4 at RD0_bit;
sbit LCD_D5 at RD1_bit;
sbit LCD_D6 at RD2_bit;
sbit LCD_D7 at RD3_bit;

sbit LCD_RS_Direction at TRISA4_bit;
sbit LCD_EN_Direction at TRISA5_bit;
sbit LCD_D4_Direction at TRISD0_bit;
sbit LCD_D5_Direction at TRISD1_bit;
sbit LCD_D6_Direction at TRISD2_bit;
sbit LCD_D7_Direction at TRISD3_bit;

void main() {
/*unsigned int Radc, TemI;
float Tem;
char Text[16];  */
TRISB = 0;
PORTB = 0;
ADCON1 = 0b11000001;
//val=(c*10)+d;
   Lcd_Init();
   Keypad_Init();
   Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"Iniciando");
Lcd_Out(2,1,"Cargando ...");
delay_ms(800);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"TESJo");
Lcd_Out(2,1,"Mecatronica");
delay_ms(800);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Sensor de");
Lcd_Out(2,1,"Temperatura");
delay_ms(800);
Lcd_Cmd(_LCD_CLEAR);
   eepr = EEPROM_Read(0x80);             // lee eeprom para ver si esta vacia

  if (eepr == 255){
  maindos();
  }
 do
  {
    inc = 0;
     menu();

  do{
       inc = Keypad_Key_Click();         //en inc el numero de tecla pulsada
      }
    while (!inc);
    if (inc == 1){
        maindos();
        guardatem();
         delay_ms(700);
        maintres();
        delay_ms(700);
   }
  }while(1);

 }

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Como actualizar la temperatura
« Respuesta #1 en: 22 de Enero de 2014, 10:07:00 »
  ¿Qué compilador estás utilizando?

  Por lo poco que logro entender, al parecer te quedas esperando a presionar alguna tecla y por lo tanto nunca avanzará el programa si es que no presionas tecla alguna.

  cito la parte del código dentro de main a la que me refiero
Código: C
  1. do
  2. {
  3.   inc = keypad_key_click();
  4. }
  5. while (!inc);
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Roycast

  • PIC10
  • *
  • Mensajes: 2
Re: Como actualizar la temperatura
« Respuesta #2 en: 22 de Enero de 2014, 21:48:37 »
  ¿Qué compilador estás utilizando?

  Por lo poco que logro entender, al parecer te quedas esperando a presionar alguna tecla y por lo tanto nunca avanzará el programa si es que no presionas tecla alguna.

  cito la parte del código dentro de main a la que me refiero
Código: C
  1. do
  2. {
  3.   inc = keypad_key_click();
  4. }
  5. while (!inc);

Muy bien gracias...


 

anything