Pouknouki

Sous verre version 1.4

Feb 9th, 2014
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.86 KB | None | 0 0
  1.   /********************************************************************************************
  2.   Sous Verre écrit par Thomas Kowalski
  3.   Dernière mise à jour : 13/01/2013
  4.   Fonctions :
  5.     DessinerMenu permet de dessiner un menu à l'écran, il prend en paramètres un tableau de String contenant les éléments du menu, le nombre d'éléments dans le menu et le numéro de l'élément sélectionné actuellement (attention =/= de l'indice)
  6.     DessinerSelecteurNombre permet de dessiner un sélecteur de nombre à l'écran. Il prend en paramètres la phrase d'introduction (affichée en haut), l'unité (affichée en-dessous du nombre), le numéro de la valeur dans l'EEPROM, la valeur actuelle du sélecteur (celle qui sera affichée lors de l'écriture du menu), la variable à modifier (pointeur vers variable globale dans le programme) quand l'utilisateur aura validé et un booléen définissant s'il faut effacer tout l'écran lors du dessin (cas où l'on vient d'un menu) ou seulement la partie dédiée au nombre (cas où l'utilisateur change de nombre).
  7.   Entrées :
  8.     DigitalRead(6) : validation
  9.     DigitalRead(8) : navigation dans les menus
  10.     Les pins de l'écran sont définis ci-dessous
  11.   Chaque écran a un numéro unique qui lui est associé - par exemple le menu principal est 0 -.
  12.   0 Menu Principal
  13.                    1 Paramètres
  14.                                 12 Sélection de poids
  15.                                 13 Sélection de sexe
  16.                                 14 Sélection de couleur de l'interface
  17.                    2 Sélection de boissons
  18.                    3 Démarrage de la beuverie (je vois pas comment dire ça autrement ^^)
  19.    Ces modes permettent de tout traiter dans void loop() en fonction des informations reçues.
  20.    *******************************************************************************************/
  21.  
  22.   #include "SPI.h"
  23.   #include "Adafruit_GFX.h"
  24.   #include "Adafruit_ILI9340.h"
  25.   #include <EEPROM.h>
  26.  
  27.   #if defined(__SAM3X8E__)
  28.       #undef __FlashStringHelper::F(string_literal)
  29.       #define F(string_literal) string_literal
  30.   #endif
  31.  
  32.   // These are the pins used for the UNO
  33.   // for Due/Mega/Leonardo use the hardware SPI pins (which are different)
  34.   #define _sclk 3
  35.   #define _miso 1
  36.   #define _mosi 4
  37.   #define _cs 10
  38.   #define _rst 5
  39.   #define _dc 3
  40.  
  41.   // Using software SPI is really not suggested, its incredibly slow
  42.   //Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _mosi, _sclk, _rst, _miso);
  43.   // Use hardware SPI
  44.   Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _rst);
  45.  
  46.   int poids = 0;
  47.   int sexe = 0;
  48.   float alcoolemie = 0;
  49.   #define nombreBoissons 7
  50.   String tableauMenuPrincipal[3] = { "Demarrer", "Choisir boisson", "Parametres" };
  51.   String tableauParametres[4] = { "Retour", "Poids", "Sexe", "Couleur" };
  52.   String tableauBoissons[nombreBoissons] = { "Biere", "Vin", "Cidre", "Rhum", "Ricard", "Champagne", "Vodka" };
  53.   String tableauLettres[26] = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "Y", "Z" };
  54.   int tableauAlcoolemie[nombreBoissons] = { 10, 15, 3.5, 40, 20 };
  55.   void setup() {
  56.     Serial.begin(9600);
  57.     pinMode(8, INPUT);  //Lecture temporaire des interrupteurs pour les tests
  58.     pinMode(6, INPUT);    
  59.     tft.begin(); //Initialisation de l'écran
  60.     tft.fillScreen(ILI9340_BLACK); //Vidage de l'écran //REMARQUE : je sais pas à quoi ça sert dans ce cas là :o
  61.   }
  62.  
  63.   void DessinerMenu(String menus[], int longueur, int selected) { //Dessiner un menu à l'écran
  64.     tft.fillScreen(ILI9340_BLACK); //On efface l'écran
  65.     for(int i = 0; i < longueur; i++) { //Pour chaque élément de menu du tableau passé en paramètre
  66.       if (selected - 1 == i) { //Si l'élément actuel du tableau est sélectionné
  67.         tft.setTextColor(ILI9340_BLUE); //On le met en bleu
  68.       } else {
  69.       }
  70.       tft.setCursor(0, i * 25); //On passe à la ligne suivante en ajoutant un espacement (une lettre fait 7 de haut, le texte est en taile trois)
  71.       tft.setTextSize(3); //On définit la taille de la police
  72.       tft.println(menus[i]); //On écrit la ligne
  73.     }
  74.   }
  75.  
  76.   void SelectionnerBoisson(boolean drawAll, int lettre, int boisson, boolean lettreSelectionne) {
  77.     ///home
  78.     int lettreActuelle = lettre - 1; //ATTENTION : A correspond à 1 et pas à 0 !
  79.     int indiceActuel = 0;
  80.     String tableauBoissonsLettre [50];
  81.     for (int i = 0; i < nombreBoissons; i++) {
  82.        if(String(tableauBoissons[i].charAt(0)) == tableauLettres[lettreActuelle]) {
  83.          tableauBoissonsLettre[indiceActuel] = tableauBoissons[i];
  84.          indiceActuel++;
  85.        }
  86.     }
  87.     tft.fillScreen(ILI9340_BLACK); //On efface l'écran
  88.     tft.setTextSize(7);
  89.     if (lettreActuelle > 1) {
  90.       tft.setCursor((tft.width() - 7 * 5 - 25) / 3, 10);
  91.       tft.setTextColor(ILI9340_WHITE);
  92.       tft.println(tableauLettres[lettreActuelle - 1]);
  93.     }
  94.     tft.setCursor((tft.width() - 7 * 5) / 2, 10);
  95.     tft.setTextColor(ILI9340_BLUE);
  96.     tft.println(tableauLettres[lettreActuelle]);
  97.     if (lettreActuelle < 25) {
  98.       tft.setCursor(((tft.width() - 7 * 5 + 25) / 3) * 2, 10);
  99.       tft.setTextColor(ILI9340_WHITE);
  100.       tft.println(tableauLettres[lettreActuelle + 1]);
  101.     }
  102.     while (1) { }
  103.     tft.setTextSize(3);
  104.     for (int i = 0; i < 5; i++) {
  105.      if (i == boisson) {
  106.        tft.setTextColor(ILI9340_BLUE);
  107.      }
  108.      tft.setCursor((tft.width() - 3 * 5 * tableauBoissonsLettre[i].length()) / 2, 90);
  109.      tft.println(tableauBoissonsLettre[i]);
  110.     }
  111.     tft.println("coucoucocuouc");
  112.     while (digitalRead(6) == 0 && digitalRead(8) == 0) {
  113.       //On evite de redessiner le menu
  114.     }
  115.     if (digitalRead(6) == 1) {
  116.       if(lettreSelectionne == true) {
  117.          int indexAlcoolemie = 0;
  118.          for (int i = 0; i < nombreBoissons; i++) {
  119.            if (tableauBoissons[i] == tableauBoissonsLettre[boisson]) {
  120.              alcoolemie = tableauAlcoolemie[i];
  121.              break;
  122.            }
  123.          }
  124.         //*variable = valeurActuelle;
  125.         //EEPROM.write(1, valeurActuelle);
  126.         //DessinerMenu(tableauParametres, 4, 3);
  127.       } else if (lettreSelectionne == false) {
  128.         SelectionnerBoisson(true, lettreActuelle, 0, true);
  129.       }
  130.     } else if (digitalRead(8) == 1) {
  131.       if (lettreSelectionne == true) {
  132.         SelectionnerBoisson(true, lettreActuelle, indiceActuel + 1, true);      
  133.       } else {
  134.         SelectionnerBoisson(true, lettreActuelle + 1, indiceActuel, false);            
  135.       }
  136.     }
  137.   }
  138.   void selectionnerSexe(int *variable, boolean drawAll, boolean valeurActuelle) {
  139.     if (drawAll) {
  140.       tft.fillScreen(ILI9340_BLACK); //Dans le cas où on vient d'un menu on doit tout effacer
  141.     } else {
  142.       tft.fillRect(0, 90, tft.width(), 225, ILI9340_BLACK); //On ne remplit pas tout l'écran mais seulement le nombre et on gagne du temps :)
  143.       delay(50); //Permet d'éviter les désagréments et bugs dus ) la fréquence d'actualisation trop rapide
  144.     }
  145.     tft.setTextSize(3);
  146.     tft.setCursor((tft.width() - (7 * 3 * 5) - 15) / 2, 60);
  147.     tft.println("Je suis");  
  148.     if (valeurActuelle == 0) {
  149.       //C'est un homme
  150.       tft.setTextSize(5);
  151.       tft.setCursor((tft.width() - (8 * 5 * 5) - 25) / 2, 90);
  152.       tft.println("Un homme");    
  153.     } else {
  154.       tft.setTextSize(5);
  155.       tft.setCursor((tft.width() - (9 * 5 * 5) - 25) / 2, 90);
  156.       tft.println("Une femme");    
  157.     }
  158.     while (digitalRead(6) == 0 && digitalRead(8) == 0) {
  159.       //On evite de redessiner le menu
  160.     }
  161.     if (digitalRead(6) == 1) {
  162.         *variable = valeurActuelle;
  163.         EEPROM.write(1, valeurActuelle);
  164.         DessinerMenu(tableauParametres, 4, 3);
  165.     } else if (digitalRead(8) == 1) {
  166.         if (valeurActuelle == 1) {
  167.           valeurActuelle = 0;
  168.         } else {
  169.           valeurActuelle = 1;
  170.         }
  171.       selectionnerSexe(variable, false, valeurActuelle);
  172.     }
  173.   }
  174.  
  175.   void DessinerSelecteurNombre(String introduction, String unite, int storage, int valeurActuelle, int* variable, boolean drawAll) {
  176.     if (drawAll) {
  177.       tft.fillScreen(ILI9340_BLACK); //Dans le cas où on vient d'un menu on doit tout effacer
  178.     } else {
  179.       tft.fillRect(0, 90, tft.width(), 35, ILI9340_BLACK); //On ne remplit pas tout l'écran mais seulement le nombre et on gagne du temps :)
  180.       delay(50); //Permet d'éviter les désagréments et bugs dus ) la fréquence d'actualisation trop rapide
  181.     }
  182.  
  183.     int centrageIntro = (tft.width() - (introduction.length() + 1) * 3 * 5) / 2;
  184.     tft.setTextSize(3);
  185.     tft.setCursor(centrageIntro, 60);
  186.     tft.println(introduction);
  187.     int centrageNombre;
  188.     if (valeurActuelle < 10) {
  189.       centrageNombre = (tft.width() - 1 * 5 * 5) / 2;
  190.     } else if (valeurActuelle > 10 && valeurActuelle < 100) {
  191.       centrageNombre = (tft.width() - 2 * 5 * 5) / 2;    
  192.     } else if (valeurActuelle > 100 && valeurActuelle < 200) {
  193.       centrageNombre = (tft.width() - 3 * 5 * 5) / 2;    
  194.     } else {
  195.       valeurActuelle = 50; //Quelqu'un qui fait 200kg ne mérite pas de boire de l'alcool s'il veut survivre
  196.       centrageNombre = (tft.width() - 25) / 2; //Comme on revient pas au début et qu'on sait qu'il n'y a qu'un chiffre
  197.     }
  198.     tft.setTextSize(5);
  199.     tft.setCursor(centrageNombre, 90);
  200.     tft.println(valeurActuelle);
  201.     int centrageUnite = (tft.width() - (unite.length() + 1) * 3 * 5) / 2;
  202.     tft.setTextSize(3);
  203.     tft.setCursor(centrageUnite, 135);
  204.     tft.println(unite);
  205.    
  206.     while (digitalRead(6) == 0 && digitalRead(8) == 0) {
  207.       //On evite de redessiner le menu
  208.     }
  209.     if (digitalRead(6) == 1) {
  210.         *variable = valeurActuelle;
  211.         EEPROM.write(0, valeurActuelle);
  212.         DessinerMenu(tableauParametres, 4, 2);
  213.     } else if (digitalRead(8) == 1) {
  214.         valeurActuelle++;
  215.         DessinerSelecteurNombre("Je pese", "kg", storage, valeurActuelle, variable, false);
  216.     }
  217.   }
  218.  
  219.  
  220.   void loop(void) {
  221.     int mode = 0;
  222.     int i = 1;
  223.     uint8_t rotation = 3; //On met l'écran dans le sens que l'on veut
  224.     tft.setRotation(rotation); //Suite de la ligne précédente
  225.  
  226.     int tableauLongueurs[4] = { 3, 3, 3, 3 };
  227.     //On stocke les menus dans des tableaux, un tableau pour chaque "niveau de menu, on peut en ajouter autant qu'on veut
  228.    
  229.     int longueurTableau = 3; //On doit stocker les longueurs de chaque menu pour la boucle for, je stockerai les longueurs des tableaux dans un tableau à l'avenur
  230.     int selectionne = 1; //On sélectionne le premier élément
  231.     int ancienneValeurDefilement = digitalRead(8); //On lit la valeur actuelle du bouton de défilement
  232.     DessinerMenu(tableauMenuPrincipal, tableauLongueurs[0], selectionne); //On dessine le menu
  233.     while (1) { //boucle infinie, on n'utilise pas loop car nos premières variables seraient réintialisées
  234.       while (digitalRead(8) == 0 && digitalRead(6) == 0) {
  235.          //Evite de recharger le menu tout le temps
  236.       }  
  237.       if (digitalRead(6) == 1) { //Ca veut dire que l'utilisateur a validé
  238.         if (mode == 0) {
  239.           if (selectionne == 1) {
  240.             //Dessiner boire
  241.           } else if (selectionne == 2) {
  242.             mode = 2;
  243.             SelectionnerBoisson(true, 1, 0, false);
  244.           } else if (selectionne == 3) {
  245.             mode = 1;
  246.             selectionne = 1;
  247.             DessinerMenu(tableauParametres, 4, selectionne);
  248.           }
  249.         } else if (mode == 1) {
  250.           if(selectionne == 1) {
  251.             mode = 0;
  252.             selectionne = 3;
  253.             DessinerMenu(tableauMenuPrincipal, 3, 3); //On dessine le menu
  254.           } else if (selectionne == 3) {
  255.             mode = 13;
  256.             selectionnerSexe(&sexe, true, EEPROM.read(1));          
  257.             mode = 1;
  258.           } else if (selectionne == 2) {
  259.             mode = 12;
  260.             DessinerSelecteurNombre("Je pese", "kg", 0, EEPROM.read(0), &poids, true);
  261.             mode = 1;
  262.           }
  263.         }
  264.         //DessinerMenu(tableauMenu1[selectionne - 1], 3, NewSelectionne); //On dessine notre nouveau menu avec l'indice selectionne dans le tableau de niveau 2 des menus
  265.       } else {
  266.         ancienneValeurDefilement = digitalRead(8); //Dans le cas ou l'utilisateur a tourné la molette
  267.         selectionne++; //On change la sélection
  268.         if (mode == 0) {
  269.           if (selectionne > 3) { //Si on est arrivé à la fin on repasse au début
  270.             selectionne = 1;
  271.           }
  272.           DessinerMenu(tableauMenuPrincipal, 3, selectionne); //Puisqu'on a changé de sélection on actualise le menu      
  273.         } else if(mode == 1) {
  274.           if (selectionne > 4) { //Si on est arrivé à la fin on repasse au début
  275.             selectionne = 1;
  276.           }
  277.           DessinerMenu(tableauParametres, 4, selectionne); //Puisqu'on a changé de sélection on actualise le menu        
  278.         }
  279.       }
  280.       delay(10); //On attend un peu (c'est temporaire)
  281.     }
  282.   }
Advertisement
Add Comment
Please, Sign In to add comment