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

En esta sección aprenderás a programar una interfaz gráfica en una pantalla touch HMI NEXTION, para enviar datos al microcontrolador PIC por una comunicación UART. El objetivo es colocar dos botones y un Slider en la pantalla táctil para incrementar o decrementar una variable y así controlar dos señales PWM que encienden y apagan dos LEDs.

¿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)

Se habilita la interrupción para la recepción de datos por el puerto rs232.


   enable_interrupts(global);
   enable_interrupts(int_rda);

Cuando se reciben datos por el puerto rs232 se habilita la interrupción «#int_rda» donde se reciben los datos y se guardan en la variable de caracteres «recibido[]», cuando se recibe el carácter «\n» se termina la recepción de datos, después se borran los caracteres especiales «\r y \n» para conservar solo el comando recibido, finalmente el programa se dirige a la subrutina «datos()».


#int_rda
void recibe()
{
   memset(recibido, 0, sizeof(recibido)); //limpia los registros de la varible
   int8 i=0;
   while(true)
   {
      recibido[i]=getc();//RECIBE EL CARACTER

      if (recibido[i] == 255 ){return;} //inicio de pantalla nextion

      if(recibido[i] == '\n')//busca el salto de linea \r
      {
         recibido[i-1] = '\0';  //  \r = \0 (caracter nulo)
         recibido[i] = '\0';   //  \n = \0 (caracter nulo)

         datos();
         return;
      }
      i++;
   }
}

Nota: Cuando se enciende la pantalla Nextion, envía diferentes caracteres por TX (\x00\x00\x00ÿÿÿ   ˆÿÿÿ), donde ÿ = 255, por lo que, al inicio el primer comando no se enviara correctamente, para evitar esto se puede colocar lo siguiente; 


   while(true)
   {
      recibido[i] = getc();//RECIBE EL CARACTER

       if (recibido[i] == 255){return;} //inicio de pantalla nextion
      .
      .
      .

En la subrutina «datos()»,  inicialmente se declara los comandos que se recibirán. 


void datos()
{
   signed int8 result;

   char ID_val[6];
   char num[4];

   char val01[6] = "val01";
   char val02[6] = "val02";
   .
   .
   .

Con un bucle «for()» se divide la cadena de caracteres recibida para separar el comando correspondiente a la variable y el numero, inicialmente los primeros 5 caracteres corresponden la variable y los 3 caracteres siguientes corresponden al numero.


      for (int i=0; i<=4; ++i)
      {
         ID_val[i] = recibido[i]; //identifica el slider
      }

      for (int i=0; i<=2; ++i)
      {
         num[i] = recibido[i+5]; //guarda el valor del slider
      }
      .
      .
      .

Con la función «strcmp()» se compara el comando recibido «ID_val» con los diferentes comandos que se pueden recibir «val01, val02», si resultan igual, se convierte el numero de caracteres «num» a una variable entera de 8 bits y lo asigna a la variable.


      result = strcmp(ID_val, val01);//compara, si son iguales (0), no (+-1)

      if(result==0)
      {
         val01_num = (int8)atoi(num);  //convierte la cadena en un numero de 8bits
         return;
      }

      result = strcmp(ID_val, val02);

      if(result==0)
      {
         val02_num = (int8)atoi(num); //convierte la cadena en un numero de 8bits
         return;
      }

Finalmente se utilizara el numero recibido para controlar el ancho de pulso de dos salidas PWM, CCP1 y CCP2 habilitando el timer2.


 
setup_timer_2(T2_DIV_BY_16,24,1);// señal de 12.5kHz o 80 us
   
   setup_ccp1(CCP_PWM);//habilita el pin ccp1
   setup_ccp2(CCP_PWM);//habilita el pin ccp2

   while(TRUE)
   {
      set_pwm1_duty((int16)val01_num);// 100% duty clicle = numero 100
      set_pwm2_duty((int16)val02_num);
   }

}

Código completo


#include "stdlib.h"

#FUSES NOMCLR

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

char recibido[15];

int8 val01_num = 0;
int8 val02_num = 0;

void datos();

#int_rda
void recibe()
{
   memset(recibido, 0, sizeof(recibido)); //limpia los registros de la varible
   int8 i=0;
   while(true)
   {
      recibido[i]=getc();//RECIBE EL CARACTER

      if (recibido[i] == 255 ){return;} //inicio de pantalla nextion

      if(recibido[i] == '\n')//busca el salto de linea \r
      {
         recibido[i-1] = '\0';  //  \r = \0 (caracter nulo)
         recibido[i] = '\0';   //  \n = \0 (caracter nulo)

         datos();
         return;
      }
      i++;
   }
}

void datos()
{
   signed int8 result;

   char ID_val[6];
   char num[4];

   char val01[6] = "val01";
   char val02[6] = "val02";

   memset(ID_val, 0, sizeof(ID_val)); //limpia los registros de la varible ID_val
   memset(num, 0, sizeof(num)); //limpia los registros de la varible num

       for (int i=0; i<=4; ++i)
      {
         ID_val[i] = recibido[i]; //identifica la variable
      }

      for (int i=0; i<=2; ++i)
      {
         num[i] = recibido[i+5]; //guarda el valor de la variable
      }

      result = strcmp(ID_val, val01);//compara, si son iguales (0), no (+-1)

      if(result==0)
      {
         val01_num = (int8)atoi(num);  //convierte la cadena en un numero de 8bits
         return;
      }

      result = strcmp(ID_val, val02);

      if(result==0)
      {
         val02_num = (int8)atoi(num); //convierte la cadena en un numero de 8bits
         return;
      }
}

void main()
{

   enable_interrupts(int_rda);
   enable_interrupts(global);
   
   setup_timer_2(T2_DIV_BY_16,24,1);// señal de 12.5kHz o 80 us
   
   setup_ccp1(CCP_PWM);//habilita el pin ccp1
   setup_ccp2(CCP_PWM);//habilita el pin ccp2

   while(TRUE)
   {
      set_pwm1_duty((int16)val01_num);// 100% duty clicle = numero 100
      set_pwm2_duty((int16)val02_num);
      //TODO: User Code
   }
}

Programación NEXTION

Procedimiento

Inicialmente se colocan los botones, el número y la variable.

Código: Touch Press Event


if(n0.val<100)
{
  n0.val+=1
  cov n0.val,var0.txt,3
  print "val01"
  print var0.txt
  print "\r"
}

Código: Touch Press Event


if(n0.val>0)
{
  n0.val-=1
  cov n0.val,var0.txt,3
  print "val01"
  print var0.txt
  print "\r"
}

Attribute:

vscope: global

Codigo: Touch Release Event


page 1

Attribute:

vscope: global

mode: vertical

val: 0

Código: Touch Press Event


n0.val=h0.val

Código: Touch Release Event


n0.val=h0.val
cov h0.val,var1.txt,3
print "val02"
print var1.txt
print "\r"

Código: Touch Move


n0.val=h0.val

Attribute:

vscope: global

Codigo: Touch Release Event


page 0

Funciones

Attribute:

sta: string

Attribute:

sta: string

La función «cov» convierte un número a cadena de caracteres, también se especifica la cantidad de caracteres que se colocaran en la variable.


cov numero,string,N°caracteres

Ejemplo:


cov n0.val,var0.txt,3

cov 1,var0.txt,3

var0.txt="001";

print: envía los datos por el pin de TX de la pantalla.


  print "val01"
  print var0.txt
Scroll al inicio