Menu Project HOME Control partie 3

Dans la troisième partie, nous produisons un menu au display TFT est indiqué. Avec Rotary-Encoder de Sensor-Kit 35in1, nous pouvons choisir une inscription dans le menu. Si plus d'inscriptions de menu que des lignes de display scrollt l'annonce sont automatiquement en haut ou en bas si bien que l'inscription choisie soit toujours à voir.

Le Verdrahtung :

Programme :

 

#include <adafruit_gfx.h> //Core graphics library
#include <adafruit_st7735.h> //Hardware-specific library
//Intégration de Font des bibliothèques
#include <Fonts/FreeSans9pt7b.h> //Font pour le logo
#include <Fonts/FreeSansBold9pt7b.h> //Font pour le logo

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

//Définition de Pins utilisés
#define LE TFT_CS 5//Puce select line for le display TFT
#define LE TFT_RST 22//Reset line for TFT
#define LE TFT_DC 21//Data/command line for TFT

#define LE SD_CS 16//Puce select line for SD card


//tft instance
Adafruit_ST7735 tft = Adafruit_ST7735 (TFT_CS, TFT_DC, TFT_RST);

char *menu [] = {"l'inscription 1", "inscription 2", "inscription 3", "inscription 4",
"L'inscription 5 "," inscription 6 "," l'inscription 7 "," l'inscription 8 "," l'inscription 9",
"L'inscription 10 "," inscription 11 "," l'inscription 12 "," l'inscription 13 "," l'inscription 14"};
               
uint8_t menu_lines = 14; //Nombre des inscriptions de menu

const l'octet de badge = 15;
const l'octet pulse = 14;
const l'octet pulseDirection = 4;

portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;
volatile int menuUp = 0;
volatile int menuDown = 0;
volatile int menuBtn = 0;

//variables globaux pour le menu
uint8_t line_len = 127; //Nombre du pixel par ligne
uint8_t start_menu = 32; //La ligne commence le menu dans elle
uint8_t menu_size = 12; //Nombre de menu Lignes a 10 pixels
uint16_t fnt_color = ST7735_WHITE; //Couleur écrite
uint16_t bg_color = ST7735_BLACK; //Fond de menu
uint16_t sel_fnt_color = ST7735_BLACK; //Couleur écrite pour le choix
uint16_t sel_bg_color = ST7735_GREEN; //Fond pour le choix
uint8_t line_selected = 0; //Ligne de menu choisie
uint8_t top_line = 0; //la première ligne de menu présentée

//Fonction à la lettre d'une ligne sélectionnée
void menuSelLine (uint8_t line, char *txt) {
uint8_t y1 = line * 10 start_menu; //Un supérieur bord de la ligne
tft.setCursor (4, y1);
tft.setTextColor (sel_fnt_color, sel_bg_color);
tft.print (txt);
}

//Fonction à la lettre d'une ligne
void menuLine (uint8_t line, char *txt) {
uint8_t y1 = line * 10 start_menu; //Un supérieur bord de la ligne
tft.setCursor (4, y1);
tft.setTextColor (fnt_color, bg_color);
tft.print (txt);
}

//Fonction à l'annonce du menu
void showMenu () {
   //effacent d'abord le fond
tft.fillRect (0, (start_menu), line_len, (menu_size * 10), bg_color);
uint8_t mlin = top_line;
while ((mlin < menu_lines) && ((mlin - top_line) < menu_size)) {
if (mlin == line_selected) {
menuSelLine (mlin-top_line, menu [mlin]);
} else {
menuLine (mlin-top_line, menu [mlin]);
       }
mlin;
   }
   
}

//Déplacer la fonction du choix en bas
void selectionDown () {
line_selected;
if (line_selected >= menu_lines) line_selected = menu_lines-1;
if ((line_selected - top_line) >= menu_size) top_line;
showMenu ();
}


//Déplacer la fonction du choix en haut
void selectionUp () {
if (line_selected > 0) line_selected-;
if (line_selected < top_line) top_line-;
showMenu ();
}

//Fonction à l'annonce d'un texte au display dans une couleur certaine
void le texte de display (char *text, uint16_t color) {
tft.setTextColor (color);
tft.setTextWrap (true); //le bouleversement de lignes automatique est activé

tft.print (le texte);
}

//Fonction à l'annonce d'un texte à n'importe quel point (x, y) sur
//au display. La couleur peut être choisie
void le texte de display (uint16_t x, uint16_t y, char *text, uint16_t color) {
tft.setCursor (x, y);
texte de display (le texte, color);
}

//Fonction à l'annonce du logo entièrement en haut au display
void le logo de display () {
   //Remplissent le fond
tft.fillRect (0,0,127,30, ST7735_YELLOW);
   //Encadrent dessinent
tft.drawRect (1,1,125,28, ST7735_BLUE);
   //Font pour le mot HOME gras
tft.setFont (&FreeSansBold9pt7b);
    //Positionnent le curseur
tft.setCursor (7,20);
    //Distribuent le texte dans noir
tft.setTextColor (ST7735_BLACK);
tft.print ("HOME");
    //Font pour le mot Control non gras
tft.setFont (&FreeSans9pt7b);
    //Distribuent le texte dans rouge
tft.setTextColor (ST7735_RED);
tft.print ("Control");
    //Font sur default font marche arrière
tft.setFont (ZERO);
}

//interrupt le service for switch
//change current color
void IRAM_ATTR btnClick () {
portENTER_CRITICAL_ISR (&mux);
menuBtn = 1;
portEXIT_CRITICAL_ISR (&mux);
}

//interrupt for rotary pulse
void IRAM_ATTR rotaryPulse () {
octet à toi = digitalRead (pulseDirection);
if ((menuUp == 0) && (menuDown == 0)) {
portENTER_CRITICAL_ISR (&mux);
if (tu == 0) {
menuUp = 1;
} else {
menuDown = 1;
       }
portEXIT_CRITICAL_ISR (&mux);
   }
}

   
void setup () {
Serial.begin (115200);
   //tft initialisent et le fond noir
tft.initR (INITR_BLACKTAB);
tft.fillScreen (ST7735_BLACK);
   //Indiquent le logo
logo de display ();
   //Initialisent la carte SD et indiquent le résultat
if (! SD.begin (SD_CS)) {
texte de display (25,40, "Keine SD-Card", ST7735_YELLOW);
} else {
texte de display (34,40, "SD-Card de l'O.K.", ST7735_GREEN);
   }
delay (1000);
showMenu ();
   //entrée define pins
pinMode (le badge, INPUT_PULLUP);
pinMode (pulse, INPUT_PULLUP);
pinMode (pulseDirection, INPUT_PULLUP);
   //define interrupts
attachInterrupt (digitalPinToInterrupt (pulse), rotaryPulse, FALLING);
attachInterrupt (digitalPinToInterrupt (le badge), btnClick, FALLING);
}

void loop () {
if (menuUp) {
delay (100); //A entprellen
portENTER_CRITICAL (&mux);
menuUp = 0;
menuDown=0;
portEXIT_CRITICAL (&mux);
selectionUp ();
Serial.println ("Up");
   }
if (menuDown) {
delay (100); //A entprellen
portENTER_CRITICAL (&mux);
menuUp=0;
menuDown = 0;
portEXIT_CRITICAL (&mux);
selectionDown ();
Serial.println ("Down!");
   }


}

 

Description des paramètres :

  • line_len = 127 Largeur d'une ligne de display dans le pixel
  • start_menu = 32 Position d'un supérieur bord de la première ligne de Manüs
  • menu_size = 12 Le nombre des lignes sont utilisés pour le menu
  • fnt_color = ST7735_WHITE Couleur de l'écriture pour une inscription
  • bg_color = ST7735_BLACK Couleur du fond pour une inscription
  • sel_fnt_color = ST7735_BLACK Couleur de l'écriture pour une inscription ausgewälten
  • sel_bg_color = ST7735_GREEN Couleur du fond pour une inscription ausgewälten
  • line_selected = 0 Numéro de la ligne dans le menu qui est justement choisie
  • top_line = 0 Le numéro de la ligne dans le menu au colonel dans le display apparaît. Une valeur plus grandement 0 provoque Scrollen du menu

 

Le programme peut aussi être chargé comme le fichier par GIT-Hub. Fichier zentrale.ino dans le paquet ZIP

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

AfficheEsp-32Projets pour avancéMaison intelligente

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Messages de blogs recommandés

  1. Installez maintenant ESP32 via l'administrateur de la carte
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA-Over the Air-ESP Programmation par WiFi