Pantalla Touch NEXTION HMI «Transmisión», Pic C Compiler
Por
/
Programar una interfaz gráfica en una pantalla touch HMI NEXTION, para recibir datos del microcontrolador PIC por una comunicación UART. El objetivo es controlar el valor de diferentes objetos de la pantalla «progress bar», «gauge» y «number».
¿Qué es Nextion?
Nextion es una solución de interfaz hombre-máquina (HMI) que combina un procesador integrado y una pantalla táctil con memoria con el software Nextion Editor para el desarrollo de proyectos de GUI HMI.
Con el software Nextion Editor, puede desarrollar rápidamente la GUI de HMI arrastrando y soltando componentes (gráficos, texto, botón, control deslizante, etc.) e instrucciones basadas en texto ASCII para codificar cómo interactúan los componentes en el lado de la pantalla.
La pantalla HMI de Nextion se conecta a la MCU periférica a través de TTL Serial (5V, TX, RX, GND) para proporcionar notificaciones de eventos en las que la MCU periférica puede actuar, la MCU periférica puede actualizar fácilmente el progreso y el estado de regreso a la pantalla Nextion utilizando un simple ASCII basado en texto. instrucciones.
Circuito completo
Procedimiento
Inicialmente se establecen los parámetros de la comunicación RS232.
Para enviar datos a la pantalla nextion, en este caso se envía el valor del ADC del pin «AN0»
Para enviar un dato al objeto «number», «progress bar» y «gauge», se utiliza la función «printf», donde se debe colocar:
printf("objname.val=valor",variable);
Después de enviar el comando y el valor, se deben de enviar 3 números (0xFF) para que la pantalla Nextion identifique el fin del envió de datos.
putc(0xFF); //fin de recepcion de datos en pantalla nextion
putc(0xFF); //
putc(0xFF); //
Para el objeto «number» se envía el valor int16 del pin AN0, el valor máximo que se pude enviar es de 32 bits.
void numero()
{
int16 num;
set_adc_channel (0);//Lectura Vout del potenciometro en PIN AN0
delay_us(10);
num = read_adc();
printf("num.val=%lu",num); //objname.val=valor
putc(0xFF); //fin de recepcion de datos en pantalla nextion
putc(0xFF); //
putc(0xFF); //
}
Para el objeto «progress bar» solo se puede enviar un valor de 0 a 100, por lo que se realiza una regla de 3 con el valor del pin AN0 que esta configurado a 10bits = 1023.
void barra()
{
int16 pot;
int8 bar;
set_adc_channel (0);//Lectura Vout del potenciometro en PIN AN0
delay_us(10);
pot = read_adc();// lectura del valor
bar = ((int32)pot*100)/1023; // 0 a 1023 por 0 a 100
printf("bar.val=%u",bar); //objname.val=valor
putc(0xFF); //datos para recepcion en pantalla nextion
putc(0xFF); //
putc(0xFF); //
}
Para el objeto «gauge» solo se puede enviar un valor de 0 a 360, por lo que se realiza una regla de 3 con el valor del pin AN0 que esta configurado a 10bits = 1023.
void linea ()
{
int16 lin;
set_adc_channel (0);//Lectura Vout del potenciometro en PIN AN0
delay_us(10);
lin = read_adc();// lectura del valor
lin = ((int32)lin*360)/1023; // 0 a 1023 por 0 a 360
printf("lin.val=%lu",lin); //objname.val=valor
putc(0xFF); //datos para recepcion en pantalla nextion
putc(0xFF); //
putc(0xFF); //
}
Finalmente en la función «main()» se envían los datos de cada objeto dejando un delay de 20ms.
#FUSES NOMCLR
#use rs232(baud=9600, stop=1, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8)
void numero()
{
int16 num;
set_adc_channel (0);//Lectura Vout del potenciometro en PIN AN0
delay_us(10);
num = read_adc();
printf("num.val=%lu",num); //objname.val=valor
putc(0xFF); //fin de recepcion de datos en pantalla nextion
putc(0xFF); //
putc(0xFF); //
}
void barra()
{
int16 pot;
int8 bar;
set_adc_channel (0);//Lectura Vout del potenciometro en PIN AN0
delay_us(10);
pot = read_adc();// lectura del valor
bar = ((int32)pot*100)/1023; // 0 a 1023 por 0 a 100
printf("bar.val=%u",bar); //objname.val=valor
putc(0xFF); //datos para recepcion en pantalla nextion
putc(0xFF); //
putc(0xFF); //
}
void linea ()
{
int16 lin;
set_adc_channel (0);//Lectura Vout del potenciometro en PIN AN0
delay_us(10);
lin = read_adc();// lectura del valor
lin = ((int32)lin*360)/1023; // 0 a 1023 por 0 a 360
printf("lin.val=%lu",lin); //objname.val=valor
putc(0xFF); //datos para recepcion en pantalla nextion
putc(0xFF); //
putc(0xFF); //
}
void main()
{
setup_adc(ADC_CLOCK_INTERNAL);
while(TRUE)
{
numero();
delay_ms(20);
barra();
delay_ms(20);
linea();
delay_ms(20);
}
}