Autor Tema: Ayuda, realizar menu en CCS  (Leído 21382 veces)

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

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Ayuda, realizar menu en CCS
« en: 12 de Septiembre de 2010, 22:26:18 »
Saludos cordiales.

Tengo dudas de cómo hacer menu en CCS. Bueno, estoy haciendo un pequeño proyecto sobre control de temepratura y humedad de suelo en un invernadero, inicialmente solo trabaja con plantacion de claveles, en temperaturas de 20 a 28 ºC, y humedad de suelo de 75 a 77 %, pero, ahora me pidieron que el sistema permita la selección del tipo de plantación que esta manejando el invernadero y obviamente el rango de temperatura y humedad cambiaria para cada plantación. Por ejemplo, se puede seleccionar la plantacion de rábanos, o de espárragos, u otro y el sistema controlaria los rangos de temperatura y humedad.

El menu tiene que mostrarse en el LCD 4x20 obviamente, debe ser algo asi:

primera vista en la pantalla LCD:
    Seleccione
  la plantacion
  que maneja
segunda vista en la pantalla LCD:
1. Rabanos
2. Pepinos
3. Lechugas
    Opcion: ____
eso se mostraria en las 4 lineas del LCD, pero mediante dos teclas me tiene que permitir subir y bajar entre las opciones del menu el cual es más largo
4. Esparragos
5. Tomate
6. Lechuga
7. ..................

Dependiendo de lo que se seleccione, los rangos seran distintos para diferentes plantaciones.

Bueno, pongo el código de control para una sola plantacion.
Código: [Seleccionar]
#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
//#use fast_io(C)
//#use fast_io(D)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#include <LCD4x20.C>
#bit Fin_carrera = 7.4
void sube(void);
void baja(void);
void para(void);
void main()
{
   short control, control1, controlh; // VARIABLES DE CONTROL
   int16 hum1, hum2, hum3, temp1, temp2;
   float tempt1, tempt2, humt1, humt2, humt3, humS, tempS, RH;
   
   set_tris_c(0xB0);
   set_tris_d(0xC0);   
   setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
   setup_adc(ADC_CLOCK_INTERNAL);
   lcd_init();
   
   control = 0;
   control1 = 0;
   controlh = 0;

   while(true)
   {
      set_adc_channel(0);  //CANAL 0
      delay_us(20);
      temp1 = (read_adc() * 100);
      set_adc_channel(1);  //CANAL 1
      delay_us(20);
      temp2 = (read_adc() *100);
      tempt1 = temp1 * 0.0049;
      tempt2 = temp2 * 0.0049;
      tempS = (tempt1 + tempt2) / 2.0;   //TEMPERATURA A MANEJAR
      //*********** RUTINA DE CONTROL DE TEMPERATURA ****************
      if (tempS >= 28.0)
      {
         if (control == 0)  //AQUI TESTEAR EL RC3
         {
            output_high(PIN_C1);
            // ir a sube y luego regresar
            sube();
            delay_ms(3000);
            // ir a paraA y luego regresar
            para();
            output_low(PIN_C1);
            control = 1;  //aqui ver el RC3
         }
      }
      if (tempS <= 20.0)
      {
         if (control == 1)
         {
            output_high(PIN_C3);
            //ir a baja y regresar
            baja();
            delay_ms(3000);
            //ir a paraB y regresar
            para();
            output_low(PIN_C3);
            control = 0;
         }
         output_high(PIN_C2); //AIRE CALIENTE
         control1 = 1;
      }
      if (control1 == 1)
      {
         if (tempS <= 25.0)
         {
            output_high(PIN_C2);  //AIRE CALIENTE
         } else
           {
              output_low(PIN_C2);  //APAGA AIRE CALIENTE
              control1 = 0;
           }
      }
      //************ FIN RUTINA CONTROL TEMPERATURA *****************
      set_adc_channel(2);  //CANAL 2
      delay_us(20);
      hum1 = read_adc();
      set_adc_channel(3);  //CANAL 3
      delay_us(20);
      hum2 = read_adc();
      set_adc_channel(4);  //CANAL 4
      delay_us(20);
      hum3 = read_adc();
      //hum1t = (5.0 * hum1) / 1024.0;
      humt1 = hum1 * 0.0049;
      humt2 = hum2 * 0.0049;
      humt3 = hum3 * 0.0049;
      humS = (humt1 + humt2 + humt3) / 3;
      RH = (humS - 0.958) / 0.0307;   // HUMEDAD HA MANEJAR
      //******* RUTINA CONTROL DE HUMEDAD ****************
      if (RH >= 80.0)
      {
         output_low(PIN_C0);
      }
      if (RH <= 75.0)
      {
         output_high(PIN_C0);
         controlh = 1;
      }
      if (controlh == 1)
      {
         if (RH <= 77.0)
         {
            output_high(PIN_C0);
         }else
         {
            output_low(PIN_C0);
            controlh = 0;
         }
      }
      //*********** FIN RUTINA CONTROL HUMEDAD **************
      //printf(lcd_putc, "\fADC = %4ld", q);
      //printf(lcd_putc, "\nVoltage = %01.2fV", p);
      printf(lcd_putc, "\f   TEMPERATURA    ");
      printf(lcd_putc, "\n     %01.2f C", tempS);
      printf(lcd_putc, "\n HUMEDAD   ");
      printf(lcd_putc, "\n%01.2f PHS", RH);
      //TRANSMISION SERIAL
      printf("ADC = %4ld", tempt1);
      printf(" Temperatura = %01.2f C\r", tempS);  // El \r permite cambiar de línea
      printf("ADC = %4ld", hum3);
      printf(" humedad = %01.2f RH\r", RH);
      delay_ms(100);
   }
}
void sube(void)
{
   output_high(PIN_D4);  // EN1
   output_high(PIN_D5);  // EN2
   output_low(PIN_D0);   // IN1
   output_low(PIN_D2);   // IN3
   output_high(PIN_D1);  // IN2
   output_high(PIN_D3);  // IN4
}
void baja(void)
{
   output_high(PIN_D4);   // EN1
   output_high(PIN_D5);   // EN2
   output_high(PIN_D0);   // IN1
   output_high(PIN_D2);   // IN3
   output_low(PIN_D1);    // IN2
   output_low(PIN_D3);    // IN4
}
void para(void)
{
   output_high(PIN_D4);   // EN1
   output_high(PIN_D5);   // EN2
   output_low(PIN_D0);    // IN1
   output_low(PIN_D2);    // IN3
   output_low(PIN_D1);    // IN2
   output_low(PIN_D3);    // IN4
}

este código es solo para la platacion de claveles, lo que no se es cómo voy a hacer el menu, en que lugar del codigo lo pondria, parece uqe tengo que utilizar interrupciones???

Muchas gracias.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda, realizar menu en CCS
« Respuesta #1 en: 12 de Septiembre de 2010, 22:37:00 »
Una de las opciones es realizar una función que reciba una variable como parámetro, y dependiendo de esa variable mediante un switch dibujar en la pantalla. Ésta variable indica que submenú se necesita visualizar.
En otra función, o en el main, dependiendo de las teclas que se pulsen y el valor actual de la variable que controla el menú, cambiar el valor y llamar a la función que dibuja el menú.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Ayuda, realizar menu en CCS
« Respuesta #2 en: 12 de Septiembre de 2010, 22:54:46 »
eso!, asi como dice suky es muy sencillo de hacerlo
Código: [Seleccionar]
switch(menu){
case 1: ....
           break;
case 2: ...
           break;
}         

ya tu segun lo que necesite haces el control de la variable menu
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #3 en: 12 de Septiembre de 2010, 23:13:11 »
Muchas gracias por sus respuestas.

Bueno, lo que entendi, es que por ejemplo si tengo 7 opciones en mi plantación, voy a tener algo asi:

Código: [Seleccionar]
switch(menu){
case 1: ....
           break;
case 2: ...
           break;
case 3: ..

.
.
.
case 7:...
           break;
}

pues....., tiene sentido, perooo...., no se cómo hacer rotar el menu, osea, queme muestre las 3 primeras opciones, luego las otras 3 y luego la ultima, segun cuantas veces se precione el boton "abajo" y que baya subiendo, con un boton "arriba". Y segun las opciones que salgan seleccionadas con las teclas "arriba" y "abajo", un tercer boton de "enter" me permita hacer efectiva la seleccion y que el sistema empiece a funcionar.

Eso me tiene muy confudido, ahora, voy a hacer lo que me indican, haber que tal me va.

Muchas gracias.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda, realizar menu en CCS
« Respuesta #4 en: 12 de Septiembre de 2010, 23:51:16 »
Todo lo controlas con tu variable, o sea, si el Menu Principal es 0x01, al pulsar entrar cargas otro valor, cuando pulsas abajo lo incrementas, cuando pulsas arriba lo decrementas, y cuando llegaste al final mediante if restableces el valor que necesites a esa variable.

Se entiende?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #5 en: 13 de Septiembre de 2010, 07:36:09 »
Saludos Suky, muchas gracias por tu respuesta.

No comprendo a que te refieres con eso de que el menu principal tenga que tener algun valor, o es que se refiere a esto:

Código: [Seleccionar]
switch(menu){
case 0x01: ....
           break;
case 0x02: ...
           break;
case 0x03: ..

.
.
.
case 0x07:...
           break;
}

pues bueno, si fuese asi, entonces lo del if para reestablecer el valor quedaria flotando    :roll: :roll: :roll: :roll:

Muchas gracias.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Ayuda, realizar menu en CCS
« Respuesta #6 en: 13 de Septiembre de 2010, 08:15:48 »
por ejemplo, en el ultimo case debe saber hacia donde dirigir de nuevo el menú, lo q se trata es que debes identificar si aumentas o decrementas tu variable de menú
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #7 en: 13 de Septiembre de 2010, 20:54:30 »
Saludos.

lo del switch() si lo entiendo, el codigo queda algo asi:
Código: [Seleccionar]
switch(menu){
case 1: tempA = 20.0;
           tempB = 28.0;
           hum1 = 75.0;
           hum2 = 77.0;
           funcion_control(float tempA, float tempB, float hum1, float hum2);
           break;
case 2: tempA = 22.0;
           tempB = 26.0;
           hum1 = 73.0;
           hum2 = 76.0;
           funcion_control(float tempA, float tempB, float hum1, float hum2);
           break;
           break;
case 3:tempA = 19.0;
           tempB = 25.0;
           hum1 = 72.0;
           hum2 = 78.0;
           funcion_control(float tempA, float tempB, float hum1, float hum2);
           break;
case 4:tempA = 18.0;
           tempB = 24.0;
           hum1 = 75.0;
           hum2 = 78.0;
           funcion_control(float tempA, float tempB, float hum1, float hum2);
           break;
case 5:tempA = 26.0;
           tempB = 30.0;
           hum1 = 75.0;
           hum2 = 78.0;
           funcion_control(float tempA, float tempB, float hum1, float hum2);
           break;
case 6:tempA = 19.0;
           tempB = 25.0;
           hum1 = 72.0;
           hum2 = 78.0;
           funcion_control(float tempA, float tempB, float hum1, float hum2);
           break;
case 7:tempA = 22.0;
           tempB = 27.0;
           hum1 = 75.0;
           hum2 = 78.0;
           funcion_control(float tempA, float tempB, float hum1, float hum2);
           break;
}

y eso va a ser manejado por la variable "menu", esa variable va a tomar el valor que los botones "sube", "baja" y "ok" le van a dar??? y cómo va a tomar ese valor??

Cómo le hago para hacer rotar el menu, ya que primero se va a mostrar las primeras tres opciones, luego tendra que mostrarse las opciones 4 a la 6, luego la ultima.

Me estoy liando mucho con esto.

Muchas gracias.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Ayuda, realizar menu en CCS
« Respuesta #8 en: 13 de Septiembre de 2010, 21:25:04 »
mira, algo muy por encima por ejemplo, por polling puedes preguntar el estado de arriba,abajo, ok, obviamente acomodas su correspondiente antirrebotes, dentro del if incrementas o decrementas menu.Para este ejemplo entonces fijate que menú viene inicialmente con 1, entonces entra a su case correspondiente. De esta forma tu programa basicamente estara siempre en algun case (y sus correspondientes rutinas) y preguntando por los estados arriba,abajo, ok. Tambien hay que asegurarse de hacer control de la variable menu para que no sobrepase los case.
Código: [Seleccionar]
int menu=1;
if(arriba==1)
  {
  }
if(abajo==1)
  {
  }
if(ok==1)
  {
  }

switch(menu)
{
case 1: printf(.....);
           printf(......);
           break;
case 2: printf(....);
           printf(....);
           break;
case 3: printf(....);
           printf(....);
           break;
}
« Última modificación: 13 de Septiembre de 2010, 21:28:41 por jhozate »
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Ayuda, realizar menu en CCS
« Respuesta #9 en: 14 de Septiembre de 2010, 09:57:26 »
y eso va a ser manejado por la variable "menu", esa variable va a tomar el valor que los botones "sube", "baja" y "ok" le van a dar??? y cómo va a tomar ese valor??

Cómo le hago para hacer rotar el menu, ya que primero se va a mostrar las primeras tres opciones, luego tendra que mostrarse las opciones 4 a la 6, luego la ultima.
Supongo que tendrás un teclado matricial, o al menos algunos pulsadores para poder desplazarse dentro de todas las opciones de tu menú e ingreso de datos. Esos pulsadores o teclado matricial, te va ayudar a subir y bajar los valores de tu variable menú, pongo el caso de pulsadores:

if(input(pin_a0)){  //suponiendo que mi pulsador está en el pin A0
  menu++;
  if(menu>3)
     menu=1;
}
if(input(pin_a1)){  //suponiendo que se tiene otro pulsador en A1
   menu--;
      if(menu<1)
         menu=3;
}// en este mi ejemplo solo tengo 3 opciones en el menú, como puedes ver se puede tener para muchas opciones más.

y después vendría el switch:
switch(menu){
   case 1:...
      break;
   case 2:...
      break;
   case 3:...
      break;
}

Ahora, entendí que pretendes mostrar primero el case 1 y seguidamente (sin que se presione ninguna tecla) se muestre el case 2 y después el 3, o me equivoco?

Veo dos formas, que te olvides de esa idea, y bien juntes todo para un solo case y utilices retardos para poder ver las tres opciones:

case 1:opción 1;
     delay_ms(4000);
     opción 2;
     delay_ms(4000);
     opción 3;
     delay_ms(4000);
   break;

u otra forma, cambiando en el case el valor de menú:

case 1: opción 1;
      menu++;
case 2: opción 2;
      menu++;
case 3: opción3;
      menu=1;
      break;

y si es necesario le agregas el delay, pero como ves no hay break en el case 1 y 2, por tanto de hacer el case 1 se pasaría al case 2, y después al 3, y recién saldría de los cases. Y en con tus pulsadores tendrías que incrementar la variable menú de 3 en 3

if(input(pin_a0)){  //suponiendo que mi pulsador está en el pin A0
  menu+=3;
  ...
}

Espero te sirva

saludos!
.

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #10 en: 14 de Septiembre de 2010, 16:22:28 »
Saludos Cryn, muchas gracias por tu respuesta.
Citar
Ahora, entendí que pretendes mostrar primero el case 1 y seguidamente (sin que se presione ninguna tecla) se muestre el case 2 y después el 3, o me equivoco?

en cuanto a eso, pues, lo que quiero es que pulsando uno de los botones (en total son 3), por ejemplo boton "abajo", en la ultima linea del LCD de 4x20 aparesca:

  Opcion: 1  (eso para el primer pulso)
  opcion: 2   (eso pulsado por segunda vez el mismo boton)
  opcion: 3  (eso pulsando por tercera vez)
  .
  .
  .
  opcion: 7  (pulsado por septima vez)

el boton "ok" servira para confirmar la selección y haga lo que tiene que hacer

en caso que se presione el boton "arriba", pues.... obviamente subira, y en la linea 4 del LCD se mostrara

 Opcion: 3   (para la primera vez de presionar el boton "arriba", suponiendo que antes estava en la opcion 4)
 opcion: 2   (para la segunda ves que se haya presionado el boton "arriba")

Bueno, eso es lo que quiero hacr el menu, haber que tal meva, estoy con código, pero aun no entiendo como hacerle rotar.

Muchas gracias.

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #11 en: 14 de Septiembre de 2010, 16:59:05 »
Bueno Cryn.

Aqui algunos ejemplo que encontre en youtube, más valedero es el segundo, ya que esta como quiero además de que tiene rotación

Este va rotando por todo el menu


Este otro esta en una pantalla de 4 lineas:



Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda, realizar menu en CCS
« Respuesta #12 en: 14 de Septiembre de 2010, 18:33:21 »
Me explico con un ejemplo cortito, el menú sería:

Menú Principal    -> VarMenu=0x00
               |_____  Opción 1 -> VarMenu=0x10
               |_____  Opción 2 -> VarMenu=0x11
               |_____  Opción 3 -> VarMenu=0x12

________________________
|                                        |   [ # ]  Arriba
|_______________________|   [ # ] Abajo
                                              [ # ] Enter


Código: C
  1. char cTestPulsadores(){
  2.    if(Arriba==1){
  3.       delay_ms(20);
  4.       if(Arriba==1){
  5.          return(ARRIBA);
  6.       }
  7.    }
  8.    if(Abajo==1){
  9.       delay_ms(20);
  10.       if(Abajo==1){
  11.          return(ABAJO);
  12.       }
  13.    }
  14.    if(Enter==1){
  15.       delay_ms(20);
  16.       if(Enter==1){
  17.          return(Enter);
  18.       }
  19.    }
  20.    return(NINGUNO);
  21. }
  22.  
  23.  
  24. void vDibujaMenu(char Menu){
  25.  
  26.    switch(Menu){
  27.       case 0x00:
  28.          printf(lcd_putc,"\fPrincipal");
  29.       break;
  30.       case 0x10:
  31.          printf(lcd_putc,"\fOpcion 1  <");
  32.          printf(lcd_putc,"\nOpcion 2");
  33.       break;
  34.       case 0x11:
  35.          printf(lcd_putc,"\fOpcion 2  <");
  36.          printf(lcd_putc,"\nOpcion 3");
  37.       break;
  38.       case 0x12:
  39.          printf(lcd_putc,"\fOpcion 3  <");
  40.          printf(lcd_putc,"\nOpcion 1");
  41.       break;
  42.    }
  43.  
  44.  
  45. }
  46.  
  47. void main(){
  48. char Evento;
  49. char VarMenu=0;
  50.  
  51.    vDibujaMenu(VarMenu);
  52.    while(1){
  53.       Evento=cTestPulsadores();
  54.       if(Evento!=NINGUNO){
  55.          switch(VarMenu){
  56.             case 0:
  57.                VarMenu=0x10;
  58.             break;
  59.             case 0x10:
  60.             case 0x11:
  61.             case 0x12:
  62.                if(Evento==ABAJO){
  63.                   if(++VarMenu==0x13){ // Si quiere ir a un menu no existente..
  64.                      VarMenu=0x10;     // ..comenzamos al principio.-
  65.                   }              
  66.                }
  67.                if(Evento==ARRIBA){
  68.                   if(--VarMenu==0x09){
  69.                      VarMenu=0x12;
  70.                   }
  71.                }
  72.                if(Evento==ENTER){
  73.                   // ejecuto
  74.                   VarMenu=0x00;
  75.                }
  76.             break;
  77.          
  78.          }  
  79.          vDibujaMenu(VarMenu); // Re - dibujo
  80.       }
  81.      
  82.    }
  83. }

Lo hice rápido, pero más o menos es la idea. Utiliza el buscador, seguro hay ejemplos en el foro.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #13 en: 14 de Septiembre de 2010, 18:58:11 »
Muchas gracias Suky.

ya va quedando claro, tons el código que estoy haciendo con switch y case no sirve, jejeje, ya que lo estava haciendo de otra manera.

Citar
Lo hice rápido, pero más o menos es la idea. Utiliza el buscador, seguro hay ejemplos en el foro.
Pues bueno, busque en el foro, y no encontre mucho, solo este ejmplo que pone el maestro J1M, es exactamente lo que quiero lograr a principio, luego le voy dando estética.
http://www.todopic.com.ar/foros/index.php?topic=5459.40

tambien puse un video de lo que hace el ejmplo de J1M, lo puse en mi canal, jejeje

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda, realizar menu en CCS
« Respuesta #14 en: 14 de Septiembre de 2010, 19:11:59 »
Si el menu es muy largo, el 16F877 no va a ser suficiente, porque el printf utiliza bastante memoria  :?


Saludos!
No contesto mensajes privados, las consultas en el foro


 

anything