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.
#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.