Pantalla Touch NEXTION HMI, 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 botones en la pantalla táctil para encender y apagar diferentes 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 definen los pines de salida para encender y apagar los LEDs.


#define LED1   PIN_D0
#define LED2   PIN_D1
#define LED3   PIN_D2

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 «leds()».


#int_rda
void rda_isr()
{
   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] == '\n')//busca el salto de linea \r\n
      {        
         recibido[i-1] = '\0';  //  \r = \0 (caracter nulo)
         recibido[i] = '\0';   //  \n = \0 (caracter nulo)
         
         leds();
         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 «leds()» inicialmente se declaran los comandos que se recibirán. 


void leds()
{
   signed int8 result;

   char LED1_ON[8] = "LED1_ON";
   char LED1_OFF[9] = "LED1_OFF";

   char LED2_ON[8] = "LED2_ON";
   char LED2_OFF[9] = "LED2_OFF";

   while (true)
   {

La función «strcmp(,)» compara la variable «recibido» que contiene el comando recibido por el puerto rs232 con los comandos declarados anteriormente, si la comparación resulta igual, la función devuelve «0» a la variable «result». Si la variable «result» es igual a «0» entra en la sentencia «if()» siguiente y enciende o apaga el LED correspondiente, si la variable «result» no es «0» salta a la siguiente comparación de comandos.


 while (true)
   {

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

      if(result==0)
      {
         OUTPUT_BIT(LED1,1);
         return;
      }//enciende el led1

      result = strcmp(recibido, LED1_OFF);

      if(result==0)
      {
         OUTPUT_BIT(LED1,0);
         return;
      }
      .
      .
      . 

Finalmente se retorna a la función «main()» para esperar a recibir un nuevo comando por el puerto rs232.

Código completo


#include "string.h"

#FUSES NOMCLR

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

#define LED1   PIN_D0
#define LED2   PIN_D1
#define LED3   PIN_D2

char recibido[15];

void leds();

#int_rda
void rda_isr()
{
   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] == '\n')//busca el salto de linea \r\n
      {        
         recibido[i-1] = '\0';  //  \r = \0 (caracter nulo)
         recibido[i] = '\0';   //  \n = \0 (caracter nulo)
         
         leds();
         return;
      }
      i++;
   }
}

void leds()
{
   signed int8 result;

   char LED1_ON[8] = "LED1_ON";
   char LED1_OFF[9] = "LED1_OFF";

   char LED2_ON[8] = "LED2_ON";
   char LED2_OFF[9] = "LED2_OFF";

   char LED3_ON[8] = "LED3_ON";
   char LED3_OFF[9] = "LED3_OFF";

   while (true)
   {

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

      if(result==0)
      {
         OUTPUT_BIT(LED1,1);
         return;
      }//enciende el led1

      result = strcmp(recibido, LED1_OFF);

      if(result==0)
      {
         OUTPUT_BIT(LED1,0);
         return;
      }

      result = strcmp(recibido, LED2_ON);

      if(result==0)
      {
         OUTPUT_BIT(LED2,1);
         return;
      }

      result = strcmp(recibido, LED2_OFF);

      if(result==0)
      {
         OUTPUT_BIT(LED2,0);
         return;
      }

      result = strcmp(recibido, LED3_ON);

      if(result==0)
      {
         OUTPUT_BIT(LED3,1);
         return;
      }

      result = strcmp(recibido, LED3_OFF);

      if(result==0)
      {
         OUTPUT_BIT(LED3,0);
         return;
      }
      return;
   }

}

void main()
{
   enable_interrupts(global);
   enable_interrupts(int_rda);
   
   while(TRUE)
   {


      //TODO: User Code
   }

}

Programación NEXTION

Procedimiento

Inicialmente se colocan los botones necesarios para apagar y encender los LEDs.

Cuando se selecciona un botón se habilita el recuadro de eventos (event)  donde se colocará el código correspondiente. 

Touch Press Event (1) : Cuando se pulsa el botón

Touch Press Event (0) : Cuando se deja de pulsar el botón.

En  la opción «Touch Press Event (1)» se coloca el código para enviar un comando por el pin de transmisión «TX» de la pantalla, cuando se pulsa el botón.

Se utiliza la función «print» para enviar una cadena de caracteres por el pin «TX» al PIC, la cadena de caracteres corresponde a los comandos para encender o apagar los LEDs, al final de cada comando se coloca el caracter «\r» para que el PIC identifique el final de la cadena de caracteres o del comando.

Nota: Cuando se utiliza \r automáticamente el programa agrega el carácter \n por lo que el final de cada comando sera \r\n.


print "LED1_ON\r"

print "LED1_OFF\r"

print "LED2_ON\r"

print "LED2_OFF\r"

print "LED3_ON\r"

print "LED3_OFF\r"
Scroll al inicio