Pantalla Touch NEXTION HMI «Transmisión», Pic C Compiler

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.

  • baud = Velocidad de transmisión.
  • stop = Bit de paro.
  • parity = Bit de paridad. 
  • xmit = Pin de transmisión.
  • rcv = Pin de recepción. 
  • bits = Datos de transmisión.
  • stream = identificación de transmisión.

#use rs232(baud=9600, stop=1, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8)

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. 


void main()
{
   setup_adc(ADC_CLOCK_INTERNAL);
   
   while(TRUE)
   {   
      numero();
      delay_ms(20);
      barra();
      delay_ms(20);
      linea();
      delay_ms(20);  
   }
}

Código completo


#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);  
   }
}

Procedimiento

Attribute:

vscope: global

Código:

Touch Release Envent:


page 1

Attribute:

vscope: global

dez: vertical

Código:

Touch Release Envent:


page 0

Código:

Touch Release Envent:


page 2

Attribute:

vscope: global

Código:

Touch Release Envent:


page 1
Scroll al inicio