InicioTarjetas de DesarrolloArduino¿Cómo hacer un HID con Arduino GIGA Display Shield?

¿Cómo hacer un HID con Arduino GIGA Display Shield?

Un HID(siglas en inglés) es un Dispositivos de interfaz Humana que permite a los usuarios interactuar y controlar otros dispositivos electrónicos. En este caso utilizaremos al Arduino GIGA Display Shield como nuestro HID para enviar y recibir datos, mostrando en pantalla la lectura de sensores y controlar dos leds.

Introducción

El Arduino GIGA Display Shield tiene una pantalla táctil RGB de 480×800 de 3.97″, un micrófono digital, una IMU de 6 ejes y un led RGB, además cuenta con un conector para montar una cámara y mostrar la transmisión directamente en la pantalla, este Shield se puede montar fácilmente en la placa Arduino GIGA R1 WiFi.

Retomaremos algunas cosas del tutorial Sistema de control básico con Arduino GIGA R1 te sugerimos verlo antes.

Desarrollo

Realizaremos una práctica de un HID realizando una interfaz para mostrar la obtención de la lectura de un sensor y el control de dos leds, uno de forma manual y utilizando el RTC de Arduino GIGA R1 para controlar el otro led con una hora de encendido y una hora de apagado.

Materiales

Conexiones

A continuación, se detallan las conexiones del sensor y los LEDs que se conectarán a la placa Arduino GIGA R1.

Para montar el Arduino GIGA Display Shield al Arduino GIGA R1 se debe alinear los pines correspondientes en la parte posterior del Arduino GIGA R1 dejando los pines libres para su uso.

Software

Para la implementación de esta práctica debemos tener instalada la librería Arduino_GIGA Display_GFX.h. En el gestor de bibliotecas busca “GFX” e instala.

Otra librería que debemos tener instalada es Arduino_GIGA DisplayTouch.h. Esta la encontrarás también en el gestor de bibliotecas, busca “Touch” e instala.

Código

/*
 *******************************************************************************
    EN0091  BLOG  UNIT   ¿Cómo hacer un HID con Arduino GIGA Display Shield?
El código de un HID con Arduino Display Shield desplegara los valores del sensor de temperatura y humedad SHT40 en pantalla, así como una interfaz de dos botones, uno mostrara el estado de un led que estará controlado de forma automática y el otro led cambiara de estado cada vez que el usuario realice un toque dentro del área del botón, de esta forma realizamos una interfaz que facilita el despliegue de resultados y una manipulación más sencilla y dinámica en nuestros proyectos. 
 *******************************************************************************
*/
#include "mbed.h"                       //Librería para RTC
#include <mbed_mktime.h>                //Librería para RTC
#include <SHT40AD1BSensor.h>
#include "Arduino_GigaDisplay_GFX.h"
#include "Arduino_GigaDisplayTouch.h"
#include "Arduino_GigaDisplay.h"

Arduino_GigaDisplayTouch touchDetector;
GigaDisplay_GFX display;

#define WHITE 0xFFFF
#define BLACK 0x0000
#define Color_UNIT 0xFD20    // NARANJA
#define Color_ON 0x0400      // VERDE 
#define Color_OFF 0xF800     // ROJO

int touch_x;
int touch_y;

//Incrementa o Decrementa la sensibilidad del touch.
int trigger_sensitivity = 5;
bool switch_1;
int counter;

//**********
SHT40AD1BSensor sensor(&Wire1);
float tmp,hum;// Variables de Sensor de Temperatura y humedad en en el entorno 

constexpr unsigned long printInterval { 1000 };
unsigned long printNow {};
int encendido=1431;
int apagado=1432;
int hora=0;

int estado_boton1=0;
int estado_boton2=0;
void setup() {
  Serial.begin(9600);
  display.begin();

  if (touchDetector.begin()) {
    Serial.print("Arduino GIGA Display Shield - OK");
  } else {
    Serial.print("Arduino GIGA Display Shield  - Fallo");
    while (1)
      ;
  }
  Wire1.begin();
  Serial.println("SHT40AD1B - OK");  
  RTC_manual();
  pinMode(2, OUTPUT);    // configura pin 13 como salida
  pinMode(7, OUTPUT);    // configura pin 13 como salida
  digitalWrite(2, LOW); // pone desde un inicio en bajo el pin 2
  digitalWrite(7, LOW); // pone desde un inicio en bajo el pin 7
  touchDetector.onDetect(gigaTouchHandler);  // Interrupción al momento de un toque en la pantalla
}

void loop() {
  display.fillScreen(Color_UNIT);
  display.setTextColor(WHITE);
  display.setCursor(50, 180);
  display.setTextSize(3);
  display.print("Lectura de sensores ");
  imprimir_texto(70,520, "Alarma      Manual" , 3);
  Sensores();
}
//Funcion que integra las funciones del Sensor de Tem, Hum y el control de los leds 
void Sensores()
{
  if (millis() > printNow) 
    {  
    control_led();
    printNow = millis() + printInterval;
    }
  
  tem_hum();
  //Hum_suelo();
  delay(5000);
}
// Funcion para imprimir un texto en Display
void imprimir_texto(int pos_x, int pos_y ,String texto, int tamano)
{
  display.setCursor(pos_x, pos_y);
  display.setTextSize(tamano);
  display.print(texto);
}
// Funcion de lectura del Sensor Tem y Hum 
void tem_hum()
{
  //Serial.print("Temperatura : ");  
  sensor.GetTemperature(&tmp);
  //Serial.print(tmp);
  //Serial.print("   Humedad : ");  
  sensor.GetHumidity(&hum);
  //Serial.print(hum);
  //Serial.println(" %");  
  imprimir_texto(50,220, "Temperatura : " , 3);
  imprimir_texto(50,260, String(tmp) , 5);
  imprimir_texto(50,320, "Humedad : " , 3);
  imprimir_texto(50,360, String(hum) , 5);
}
// Funacion que sirve para modificar el inicio de reloj RTC
void RTC_manual()  
{    
  tm t;
  t.tm_sec = (0);         // 0-59
  t.tm_min = (30);        // 0-59
  t.tm_hour = (14);       // 0-23
  t.tm_mday = (11);       // 1-31
  t.tm_mon = (9);         // 0-11  "0" = Enero, Número_de_Mes-1 
  t.tm_year = ((23)+100);   
  set_time(mktime(&t));   // Guardo los valor en RTC                                 
}

//Funcion de control del led automatico 
void control_led()
{
  tm t;
  _rtc_localtime(time(NULL), &t, RTC_4_YEAR_LEAP_YEAR_SUPPORT);
  hora=(t.tm_hour*100)+t.tm_min ;
  Serial.print("La hora es   ");   
  Serial.print(t.tm_hour); 
   Serial.print(" : ");  
   Serial.println(t.tm_min);   
   imprimir_texto(50,30, "UNIT " , 5);
   imprimir_texto(50,90, "Electronics" , 5);
   imprimir_texto(50,150, "Hora " , 3);
   imprimir_texto(130,150, String(t.tm_hour)+" : "+String(t.tm_min), 3);
  estado_boton(estado_boton1,estado_boton2); 
  if(hora>=encendido &&  hora<apagado)
  {
    digitalWrite(7, HIGH); // pone en alto el pin 7
    Serial.println("Estado LED 1 : [ON]");
    estado_boton1=1;
    estado_boton(estado_boton1,estado_boton2);
  }
  else
  {
    digitalWrite(7, LOW); // pone en alto el pin 2
    Serial.println("Estado LED 1 : [OFF]");
    estado_boton1=0;
    estado_boton(estado_boton1,estado_boton2);
  }
  
}
//Funcion detecta la posicion del toque en pantalla y realiza el encedido o apagado de forma manual del boton 2 
void gigaTouchHandler(uint8_t contacts, GDTpoint_t* points)
{
Serial.print("Contacto: ");
Serial.print(contacts);
Serial.print("  Punto :  ");
  if (contacts > 0) 
    {
    Serial.print(points[0].x);
    Serial.print("  ");
    Serial.println(points[0].y);
      // Esto es por si se quiere habilitar la manipulacion del boton 1
      // if (points[0].y >= 600 && points[0].y <= 700 && points[0].x >= 50 && points[0].x <= 215 ) 
      //   {
      //     estado_boton1=!estado_boton1;
      //     Serial.print("Estado del boton 1  : ");
      //     Serial.print(estado_boton1);
      //     Serial.print("Estado del boton 2  : ");
      //     Serial.print(estado_boton2);
      //     estado_boton(estado_boton1,estado_boton2);
      //     delay(250);
      //   }
      if (points[0].y >= 600 && points[0].y <= 700 && points[0].x >= 265 && points[0].x <= 430 ) 
        {
          estado_boton2=!estado_boton2;
          Serial.print("Estado del boton 1  : ");
          Serial.print(estado_boton1);
          Serial.print("Estado del boton 2  : ");
          Serial.print(estado_boton2);
          estado_boton(estado_boton1,estado_boton2);
          delay(250);         
        }              
    }
}
//Funcion que dibuja los botones en pantalla 
void estado_boton(int estado_boton1, int estado_boton2)
{
  if (estado_boton1==0){
  display.fillRoundRect(50, 600, 165, 100, 5, Color_OFF);
  display.drawRoundRect(50, 600, 165, 100, 5, BLACK);
  imprimir_texto(100,640, "OFF" , 3);
  }
  else {
  display.fillRoundRect(50, 600, 165, 100, 5, Color_ON);
  display.drawRoundRect(50, 600, 165, 100, 5, BLACK);
  imprimir_texto(100,640, "ON" , 3);
  }
  if (estado_boton2==0) {
  display.fillRoundRect(265, 600, 165, 100, 5, Color_OFF);
  display.drawRoundRect(265, 600, 165, 100, 5, BLACK);
  imprimir_texto(320,640, "OFF" , 3);
  Serial.println("Estado LED 2 : [OFF]");
  digitalWrite(2, LOW); // pone en alto el pin 2
  }else {
  display.fillRoundRect(265, 600, 165, 100, 5, Color_ON);
  display.drawRoundRect(265, 600, 165, 100, 5, BLACK);
  imprimir_texto(320,640, "ON" , 3);
  Serial.println("Estado LED 2 : [ON]");
  digitalWrite(2, HIGH); // pone en alto el pin 2 
  }
}

NOTA: Si al subir tu sketch te llega a salir el error: exit status 74, se puede corregir pulsando el botón de reset dos veces seguidas. Revisar en Arduino IDE que esté seleccionado el puerto asignado para el Arduino GIGA R1.

Conclusiones

El Arduino GIGA Display Shiel es fácil de instalar y usar, ampliando las capacidades del Arduino GIGA R1. Se pueden crear interfaces de usuarios más complejas y detalladas como uno requiera.

Encontrarás variedad de librerías que se pueden utilizar con este Display, mejorando las experiencias del usuario y la calidad de la presentación visual de los proyectos.

Otra ventaja en la instalación del Display con Arduino GIGA R1 es que deja todos sus pines libres para usar y conectar muchos más dispositivos, sensores o elementos electrónicos.

La experiencia de usar el Arduino GIGA Display Shield puede ofrecerte ideas valiosas sobre sus capacidades, sus limitaciones y su potencial para mejorar tus proyectos de Arduino y electrónica en general.

TUTORIALES RELACIONADOS