Menú Project HOME Control Parte 3

En la tercera parte creamos un menú que se muestra en la pantalla TFT. Con el encoder giratorio del kit de sensor es de 35in1, podemos seleccionar una entrada en el menú. Si hay más entradas de menú que líneas de visualización, la pantalla se desplaza automáticamente hacia arriba o hacia abajo para que la entrada seleccionada siempre esté visible.

Cableado:

Programa:

 

#include <adafruit_gfx.h>        Biblioteca de gráficos principal
#include <adafruit_st7735.h> Biblioteca específica de hardware
Integración de bibliotecas de fuentes
#include <Fonts/FreeSans9pt7b.h> Fuente para el logotipo
#include <Fonts/FreeSansBold9pt7b.h> Fuente para el logotipo

#include <spi.h>
#include <sd.h>

Definición de pines utilizados
#define TFT_CS 5    Línea de selección de chip para la pantalla TFT
#define TFT_RST 22    Línea de reinicio para TFT
#define TFT_DC 21    Línea de datos/comandos para TFT

#define SD_CS 16    Línea de selección de chip para tarjeta SD


tft instancia
Adafruit_ST7735 tft - Adafruit_ST7735 (TFT_CS, TFT_DC, TFT_RST);

char *menu[] á "Entrada 1", "Entrada 2", "Entrada 3", "Entrada 4",
"Entrada 5", "Entrada 6", "Entrada 7", "Entrada 8", "Entrada 9",
"Entrada 10", "Entrada 11", "Entrada 12", "Entrada 13", "Entrada 14";
               
uint8_t menu_lines 14; Número de entradas de menú

Botón de byte const 15;
pulso de byte const a 14;
const byte pulseDirection n.o 4 ;

portMUX_TYPE mux - portMUX_INITIALIZER_UNLOCKED;
volatile int menuUp á 0;
volatile int menuDown - 0;
volatile int menuBtn á 0;

variables globales para el menú
uint8_t line_len 127; Número de píxeles por línea
uint8_t start_menu 32; Línea en la que se inicia el menú
uint8_t menu_size 12; Número de filas de menú de 10 píxeles
uint16_t fnt_color ST7735_WHITE; Color
uint16_t bg_color ST7735_BLACK; Fondo del menú
uint16_t sel_fnt_color ST7735_BLACK; Color de fuente para la selección
uint16_t sel_bg_color- ST7735_GREEN; Antecedentes para la selección
uint8_t line_selected 0; Línea de menú seleccionada
uint8_t top_line 0; primera línea de menú mostrada

Función para escribir una línea seleccionada
void menuSelLine(línea uint8_t, char *txt)
uint8_t y1 línea * 10 + start_menu; Borde superior de la línea
tft.setCursor(4,y1);
tft.setTextColor(sel_fnt_color.sel_bg_color);
tft.print(txt);
}

Función para escribir una línea
void menuLine(uint8_t line, char *txt)
uint8_t y1 línea * 10 + start_menu; Borde superior de la línea
tft.setCursor(4,y1);
tft.setTextColor(fnt_color.bg_color);
tft.print(txt);
}

Función para mostrar el menú
void showMenu()
   primero eliminar el fondo
tft.fillRect(0,(start_menu),line_len,(menu_size * 10),bg_color);
uint8_t mlin a top_line;
mientras ((mlin < menu_lines) && ((mlin - top_line) < menu_size)
si (mlin line_selected)
menuSelLine(mlin-top_line,menu[mlin]);
• de lo contrario
menuLine(mlin-top_line,menu[mlin]);
       }
mlin++;
   }
   
}

Función para mover la selección hacia abajo
void selectionDown()
line_selected++;
si (line_selected menu_lines > menu_lines) line_selected - menu_lines-1;
si ((line_selected - top_line) > menu_size) top_line++;
showMenu();
}


Función para subir la selección
void selectionUp()
si (line_selected > 0) line_selected--;
(line_selected < top_line) top_line--;
showMenu();
}

Función para mostrar texto en la pantalla en un color específico
void displayText(char *text , uint16_t color)
tft.setTextColor(color);
tft.setTextWrap(true); se activa el salto de línea automático

   tft.print(texto);
}

Función para mostrar texto en cualquier punto (x,y) en
Monitor. El color se puede seleccionar
void displayText(uint16_t x, uint16_t y, char *text, uint16_t color)
tft.setCursor(x, y);
displayText(text,color);
}

Función para mostrar el logotipo en la parte superior de la pantalla
void displayLogo()
   Relleno de fondo
tft.fillRect(0.0,127.30.ST7735_YELLOW);
   Marcos de dibujo
tft.drawRect(1,1,125,28,ST7735_BLUE);
   Fuente para la palabra HOME bold
tft.setFont(&FreeSansBold9pt7b);
    Colocación de cursores
tft.setCursor(7,20);
    Texto de salida en negro
tft.setTextColor(ST7735_BLACK);
tft.print("HOME");
    Fuente para la palabra control no negrita
tft.setFont(&FreeSans9pt7b);
    Texto de salida en rojo
tft.setTextColor(ST7735_RED);
tft.print("Control");
    Restablecer la fuente por defecto
tft.setFont(NULL);
}

servicio de interrupción para el interruptor
cambiar el color actual
vacío IRAM_ATTR btnClick()
portENTER_CRITICAL_ISR(&mux);
menuBtn 1;
portEXIT_CRITICAL_ISR(&mux);
}

interrupción para el pulso rotativo
vacío IRAM_ATTR rotaryPulse()
byte dir - digitalRead(pulseDirection);
if ((menuUp ) 0) && (menuDown ? 0))
portENTER_CRITICAL_ISR(&mux);
si (dir-0)
menuUp 1;
• de lo contrario
menuDown 1;
       }
portEXIT_CRITICAL_ISR(&mux);
   }
}

   
configuración del vacío()
Serial.begin(115200);
   tft inicializar y fondo negro
tft.initR(INITR_BLACKTAB);
tft.fillScreen(ST7735_BLACK);
   Mostrar logotipo
displayLogo();
   Inicializar la tarjeta SD y ver el resultado
si (! SD.begin(SD_CS))
displayText(25,40,"No SD-Card",ST7735_YELLOW);
• de lo contrario
displayText(34.40,"SD-Card OK",ST7735_GREEN);
   }
retardo(1000);
showMenu();
   definir pines de entrada
pinMode(botón, INPUT_PULLUP);
pinMode (pulso, INPUT_PULLUP);
pinMode(pulseDirection, INPUT_PULLUP);
   definir interrupciones
attachInterrupt(digitalPinToInterrupt(pulse),rotaryPulse, FALLING);
attachInterrupt(digitalPinToInterrupt(button),btnClick, FALLING);
}

void loop()
si (menúArriba)
retardo(100); A la de-prying
portENTER_CRITICAL(&mux);
menuUp 0;
menuDown-0;
portEXIT_CRITICAL(&mux);
selectionUp();
Serial.println("Up");
   }
si (menuDown)
retardo(100); A la de-prying
portENTER_CRITICAL(&mux);
menuUp-0;
menuDown - 0;
portEXIT_CRITICAL(&mux);
selectionDown();
Serial.println("Down!");
   }


}

 

Descripción de los parámetros:

  • line_len 127 Ancho de una línea de visualización en píxeles
  • start_menu 32 Posición del borde superior de la primera línea del man
  • menu_size 12 Número de filas utilizadas para el menú
  • fnt_color ST7735_WHITE Color de la fuente de una entrada
  • bg_color ST7735_BLACK Color del fondo para una entrada
  • sel_fnt_color ST7735_BLACK Color de la fuente para una entrada seleccionada
  • sel_bg_color ST7735_GREEN Color del fondo para una entrada seleccionada
  • line_selected 0 Número de la línea en el menú que está seleccionada actualmente
  • top_line 0 Número de la línea en el menú que aparece en la parte superior de la pantalla. Un valor mayor que 0 hace que el menú se desplace

 

El programa también se puede cargar como un archivo desde GIT Hub. Archivo central.ino en el paquete ZIP

https://github.com/GerLech/HomeControl/archive/master.zip

DisplaysEsp-32Projekte für fortgeschritteneSmart home

Deja un comentario

Todos los comentarios son moderados antes de ser publicados