Pouknouki

Sous verre version 1.3

Jan 13th, 2014
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.39 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.  
  23.  
  24. #include "SPI.h"
  25. #include "Adafruit_GFX.h"
  26. #include "Adafruit_ILI9340.h"
  27. #include <EEPROM.h>
  28.  
  29. #if defined(__SAM3X8E__)
  30.     #undef __FlashStringHelper::F(string_literal)
  31.     #define F(string_literal) string_literal
  32. #endif
  33.  
  34. // These are the pins used for the UNO
  35. // for Due/Mega/Leonardo use the hardware SPI pins (which are different)
  36. #define _sclk 3
  37. #define _miso 1
  38. #define _mosi 4
  39. #define _cs 10
  40. #define _rst 5
  41. #define _dc 2
  42.  
  43. // Using software SPI is really not suggested, its incredibly slow
  44. //Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _mosi, _sclk, _rst, _miso);
  45. // Use hardware SPI
  46. Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _rst);
  47.  
  48. int poids = 0;
  49. int sexe = 0;
  50. String tableauMenuPrincipal[3] = { "Demarrer", "Choisir boisson", "Parametres" };
  51. String tableauMenu1[3][3] = { "Retour", "menu 1.1", "menu 1.2", "Retour", "menu 2.1", "menu 2.2", "Retour", "menu 3.1", "menu 3.2" };
  52. String tableauParametres[4] = { "Retour", "Poids", "Sexe", "Couleur" };
  53.  
  54. void setup() {
  55.   Serial.begin(9600);
  56.   pinMode(8, INPUT);  //Lecture temporaire des interrupteurs pour les tests
  57.   pinMode(6, INPUT);    
  58.   tft.begin(); //Initialisation de l'écran
  59.   tft.fillScreen(ILI9340_BLACK); //Vidage de l'écran //REMARQUE : je sais pas à quoi ça sert dans ce cas là :o
  60. }
  61.  
  62. void DessinerMenu(String menus[], int longueur, int selected) { //Dessiner un menu à l'écran
  63.   tft.fillScreen(ILI9340_BLACK); //On efface l'écran
  64.   for(int i = 0; i < longueur; i++) { //Pour chaque élément de menu du tableau passé en paramètre
  65.     if (selected - 1 == i) { //Si l'élément actuel du tableau est sélectionné
  66.       tft.setTextColor(ILI9340_BLUE); //On le met en bleu
  67.     } else {
  68.       tft.setTextColor(ILI9340_WHITE); //Sinon on le met en blanc
  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 DessinerSelecteurNombre(String introduction, String unite, int storage, int valeurActuelle, int* variable, boolean drawAll) {
  77.   if (drawAll) {
  78.     tft.fillScreen(ILI9340_BLACK); //Dans le cas où on vient d'un menu on doit tout effacer
  79.   } else {
  80.     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 :)
  81.     delay(50); //Permet d'éviter les désagréments et bugs dus ) la fréquence d'actualisation trop rapide
  82.   }
  83.  
  84.   int centrageIntro = (tft.width() - (introduction.length() + 1) * 3 * 5) / 2;
  85.   tft.setTextSize(3);
  86.   tft.setCursor(centrageIntro, 60);
  87.   tft.println(introduction);
  88.   int centrageNombre;
  89.   if (valeurActuelle < 10) {
  90.     centrageNombre = (tft.width() - 1 * 5 * 5) / 2;
  91.   } else if (valeurActuelle > 10 && valeurActuelle < 100) {
  92.     centrageNombre = (tft.width() - 2 * 5 * 5) / 2;    
  93.   } else if (valeurActuelle > 100 && valeurActuelle < 200) {
  94.     centrageNombre = (tft.width() - 3 * 5 * 5) / 2;    
  95.   } else {
  96.     valeurActuelle = 50; //Quelqu'un qui fait 200kg ne mérite pas de boire de l'alcool s'il veut survivre
  97.     centrageNombre = (tft.width() - 25) / 2; //Comme on revient pas au début et qu'on sait qu'il n'y a qu'un chiffre
  98.   }
  99.   tft.setTextSize(5);
  100.   tft.setCursor(centrageNombre, 90);
  101.   tft.println(valeurActuelle);
  102.   int centrageUnite = (tft.width() - (unite.length() + 1) * 3 * 5) / 2;
  103.   tft.setTextSize(3);
  104.   tft.setCursor(centrageUnite, 135);
  105.   tft.println(unite);
  106.  
  107.   while (digitalRead(6) == 0 && digitalRead(8) == 0) {
  108.     //On evite de redessiner le menu
  109.   }
  110.   if (digitalRead(6) == 1) {
  111.       *variable = valeurActuelle;
  112.       EEPROM.write(0, valeurActuelle);
  113.       DessinerMenu(tableauParametres, 4, 2);
  114.   } else if (digitalRead(8) == 1) {
  115.       valeurActuelle++;
  116.       DessinerSelecteurNombre("Je pese", "kg", storage, valeurActuelle, variable, false);
  117.   }
  118. }
  119.  
  120.  
  121. void loop(void) {
  122.   int mode = 0;
  123.   int i = 1;
  124.   uint8_t rotation = 3; //On met l'écran dans le sens que l'on veut
  125.   tft.setRotation(rotation); //Suite de la ligne précédente
  126.  
  127.   int tableauLongueurs[4] = { 3, 3, 3, 3 };
  128.   //On stocke les menus dans des tableaux, un tableau pour chaque "niveau de menu, on peut en ajouter autant qu'on veut
  129.  
  130.   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
  131.   int selectionne = 1; //On sélectionne le premier élément
  132.   int ancienneValeurDefilement = digitalRead(8); //On lit la valeur actuelle du bouton de défilement
  133.   DessinerMenu(tableauMenuPrincipal, tableauLongueurs[0], selectionne); //On dessine le menu
  134.   while (1) { //boucle infinie, on n'utilise pas loop car nos premières variables seraient réintialisées
  135.     while (digitalRead(8) == 0 && digitalRead(6) == 0) {
  136.        //Evite de recharger le menu tout le temps
  137.     }  
  138.     if (digitalRead(6) == 1) { //Ca veut dire que l'utilisateur a validé
  139.       if (mode == 0) {
  140.         if (selectionne == 1) {
  141.          
  142.         } else if (selectionne == 2) {
  143.           mode == 2;
  144.           //DessinerSelectionBoisson();
  145.         } else if (selectionne == 3) {
  146.           mode = 1;
  147.           selectionne = 1;
  148.           DessinerMenu(tableauParametres, 4, 1);
  149.         }
  150.       } else if (mode == 1) {
  151.         if(selectionne == 1) {
  152.           mode == 0;
  153.           DessinerMenu(tableauMenuPrincipal, 3, 3); //On dessine le menu        
  154.         } else if (selectionne == 2) {
  155.           mode == 12;
  156.           DessinerSelecteurNombre("Je pese", "kg", 0, EEPROM.read(0), &poids, true);
  157.           mode == 1;
  158.         }
  159.       }
  160.       //DessinerMenu(tableauMenu1[selectionne - 1], 3, NewSelectionne); //On dessine notre nouveau menu avec l'indice selectionne dans le tableau de niveau 2 des menus
  161.     } else {
  162.       ancienneValeurDefilement = digitalRead(8); //Dans le cas ou l'utilisateur a tourné la molette
  163.       selectionne++; //On change la sélection
  164.       if (mode == 0) {
  165.         if (selectionne > 3) { //Si on est arrivé à la fin on repasse au début
  166.           selectionne = 1;
  167.         }
  168.         DessinerMenu(tableauMenuPrincipal, 3, selectionne); //Puisqu'on a changé de sélection on actualise le menu      
  169.       } else if(mode == 1) {
  170.         if (selectionne > 4) { //Si on est arrivé à la fin on repasse au début
  171.           selectionne = 1;
  172.         }
  173.         DessinerMenu(tableauParametres, 4, selectionne); //Puisqu'on a changé de sélection on actualise le menu        
  174.       }
  175.     }
  176.     delay(10); //On attend un peu (c'est temporaire)
  177.   }
  178. }
Advertisement
Add Comment
Please, Sign In to add comment