Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /********************************************************************************************
- Sous Verre écrit par Thomas Kowalski
- Dernière mise à jour : 13/01/2013
- Fonctions :
- 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)
- 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).
- Entrées :
- DigitalRead(6) : validation
- DigitalRead(8) : navigation dans les menus
- Les pins de l'écran sont définis ci-dessous
- Chaque écran a un numéro unique qui lui est associé - par exemple le menu principal est 0 -.
- 0 Menu Principal
- 1 Paramètres
- 12 Sélection de poids
- 13 Sélection de sexe
- 14 Sélection de couleur de l'interface
- 2 Sélection de boissons
- 3 Démarrage de la beuverie (je vois pas comment dire ça autrement ^^)
- Ces modes permettent de tout traiter dans void loop() en fonction des informations reçues.
- *******************************************************************************************/
- #include "SPI.h"
- #include "Adafruit_GFX.h"
- #include "Adafruit_ILI9340.h"
- #include <EEPROM.h>
- #if defined(__SAM3X8E__)
- #undef __FlashStringHelper::F(string_literal)
- #define F(string_literal) string_literal
- #endif
- // These are the pins used for the UNO
- // for Due/Mega/Leonardo use the hardware SPI pins (which are different)
- #define _sclk 3
- #define _miso 1
- #define _mosi 4
- #define _cs 10
- #define _rst 5
- #define _dc 3
- // Using software SPI is really not suggested, its incredibly slow
- //Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _mosi, _sclk, _rst, _miso);
- // Use hardware SPI
- Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _rst);
- int poids = 0;
- int sexe = 0;
- float alcoolemie = 0;
- #define nombreBoissons 7
- String tableauMenuPrincipal[3] = { "Demarrer", "Choisir boisson", "Parametres" };
- String tableauParametres[4] = { "Retour", "Poids", "Sexe", "Couleur" };
- String tableauBoissons[nombreBoissons] = { "Biere", "Vin", "Cidre", "Rhum", "Ricard", "Champagne", "Vodka" };
- 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" };
- int tableauAlcoolemie[nombreBoissons] = { 10, 15, 3.5, 40, 20 };
- void setup() {
- Serial.begin(9600);
- pinMode(8, INPUT); //Lecture temporaire des interrupteurs pour les tests
- pinMode(6, INPUT);
- tft.begin(); //Initialisation de l'écran
- tft.fillScreen(ILI9340_BLACK); //Vidage de l'écran //REMARQUE : je sais pas à quoi ça sert dans ce cas là :o
- }
- void DessinerMenu(String menus[], int longueur, int selected) { //Dessiner un menu à l'écran
- tft.fillScreen(ILI9340_BLACK); //On efface l'écran
- for(int i = 0; i < longueur; i++) { //Pour chaque élément de menu du tableau passé en paramètre
- if (selected - 1 == i) { //Si l'élément actuel du tableau est sélectionné
- tft.setTextColor(ILI9340_BLUE); //On le met en bleu
- } else {
- }
- 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)
- tft.setTextSize(3); //On définit la taille de la police
- tft.println(menus[i]); //On écrit la ligne
- }
- }
- void SelectionnerBoisson(boolean drawAll, int lettre, int boisson, boolean lettreSelectionne) {
- ///home
- int lettreActuelle = lettre - 1; //ATTENTION : A correspond à 1 et pas à 0 !
- int indiceActuel = 0;
- String tableauBoissonsLettre [50];
- for (int i = 0; i < nombreBoissons; i++) {
- if(String(tableauBoissons[i].charAt(0)) == tableauLettres[lettreActuelle]) {
- tableauBoissonsLettre[indiceActuel] = tableauBoissons[i];
- indiceActuel++;
- }
- }
- tft.fillScreen(ILI9340_BLACK); //On efface l'écran
- tft.setTextSize(7);
- if (lettreActuelle > 1) {
- tft.setCursor((tft.width() - 7 * 5 - 25) / 3, 10);
- tft.setTextColor(ILI9340_WHITE);
- tft.println(tableauLettres[lettreActuelle - 1]);
- }
- tft.setCursor((tft.width() - 7 * 5) / 2, 10);
- tft.setTextColor(ILI9340_BLUE);
- tft.println(tableauLettres[lettreActuelle]);
- if (lettreActuelle < 25) {
- tft.setCursor(((tft.width() - 7 * 5 + 25) / 3) * 2, 10);
- tft.setTextColor(ILI9340_WHITE);
- tft.println(tableauLettres[lettreActuelle + 1]);
- }
- while (1) { }
- tft.setTextSize(3);
- for (int i = 0; i < 5; i++) {
- if (i == boisson) {
- tft.setTextColor(ILI9340_BLUE);
- }
- tft.setCursor((tft.width() - 3 * 5 * tableauBoissonsLettre[i].length()) / 2, 90);
- tft.println(tableauBoissonsLettre[i]);
- }
- tft.println("coucoucocuouc");
- while (digitalRead(6) == 0 && digitalRead(8) == 0) {
- //On evite de redessiner le menu
- }
- if (digitalRead(6) == 1) {
- if(lettreSelectionne == true) {
- int indexAlcoolemie = 0;
- for (int i = 0; i < nombreBoissons; i++) {
- if (tableauBoissons[i] == tableauBoissonsLettre[boisson]) {
- alcoolemie = tableauAlcoolemie[i];
- break;
- }
- }
- //*variable = valeurActuelle;
- //EEPROM.write(1, valeurActuelle);
- //DessinerMenu(tableauParametres, 4, 3);
- } else if (lettreSelectionne == false) {
- SelectionnerBoisson(true, lettreActuelle, 0, true);
- }
- } else if (digitalRead(8) == 1) {
- if (lettreSelectionne == true) {
- SelectionnerBoisson(true, lettreActuelle, indiceActuel + 1, true);
- } else {
- SelectionnerBoisson(true, lettreActuelle + 1, indiceActuel, false);
- }
- }
- }
- void selectionnerSexe(int *variable, boolean drawAll, boolean valeurActuelle) {
- if (drawAll) {
- tft.fillScreen(ILI9340_BLACK); //Dans le cas où on vient d'un menu on doit tout effacer
- } else {
- 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 :)
- delay(50); //Permet d'éviter les désagréments et bugs dus ) la fréquence d'actualisation trop rapide
- }
- tft.setTextSize(3);
- tft.setCursor((tft.width() - (7 * 3 * 5) - 15) / 2, 60);
- tft.println("Je suis");
- if (valeurActuelle == 0) {
- //C'est un homme
- tft.setTextSize(5);
- tft.setCursor((tft.width() - (8 * 5 * 5) - 25) / 2, 90);
- tft.println("Un homme");
- } else {
- tft.setTextSize(5);
- tft.setCursor((tft.width() - (9 * 5 * 5) - 25) / 2, 90);
- tft.println("Une femme");
- }
- while (digitalRead(6) == 0 && digitalRead(8) == 0) {
- //On evite de redessiner le menu
- }
- if (digitalRead(6) == 1) {
- *variable = valeurActuelle;
- EEPROM.write(1, valeurActuelle);
- DessinerMenu(tableauParametres, 4, 3);
- } else if (digitalRead(8) == 1) {
- if (valeurActuelle == 1) {
- valeurActuelle = 0;
- } else {
- valeurActuelle = 1;
- }
- selectionnerSexe(variable, false, valeurActuelle);
- }
- }
- void DessinerSelecteurNombre(String introduction, String unite, int storage, int valeurActuelle, int* variable, boolean drawAll) {
- if (drawAll) {
- tft.fillScreen(ILI9340_BLACK); //Dans le cas où on vient d'un menu on doit tout effacer
- } else {
- 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 :)
- delay(50); //Permet d'éviter les désagréments et bugs dus ) la fréquence d'actualisation trop rapide
- }
- int centrageIntro = (tft.width() - (introduction.length() + 1) * 3 * 5) / 2;
- tft.setTextSize(3);
- tft.setCursor(centrageIntro, 60);
- tft.println(introduction);
- int centrageNombre;
- if (valeurActuelle < 10) {
- centrageNombre = (tft.width() - 1 * 5 * 5) / 2;
- } else if (valeurActuelle > 10 && valeurActuelle < 100) {
- centrageNombre = (tft.width() - 2 * 5 * 5) / 2;
- } else if (valeurActuelle > 100 && valeurActuelle < 200) {
- centrageNombre = (tft.width() - 3 * 5 * 5) / 2;
- } else {
- valeurActuelle = 50; //Quelqu'un qui fait 200kg ne mérite pas de boire de l'alcool s'il veut survivre
- centrageNombre = (tft.width() - 25) / 2; //Comme on revient pas au début et qu'on sait qu'il n'y a qu'un chiffre
- }
- tft.setTextSize(5);
- tft.setCursor(centrageNombre, 90);
- tft.println(valeurActuelle);
- int centrageUnite = (tft.width() - (unite.length() + 1) * 3 * 5) / 2;
- tft.setTextSize(3);
- tft.setCursor(centrageUnite, 135);
- tft.println(unite);
- while (digitalRead(6) == 0 && digitalRead(8) == 0) {
- //On evite de redessiner le menu
- }
- if (digitalRead(6) == 1) {
- *variable = valeurActuelle;
- EEPROM.write(0, valeurActuelle);
- DessinerMenu(tableauParametres, 4, 2);
- } else if (digitalRead(8) == 1) {
- valeurActuelle++;
- DessinerSelecteurNombre("Je pese", "kg", storage, valeurActuelle, variable, false);
- }
- }
- void loop(void) {
- int mode = 0;
- int i = 1;
- uint8_t rotation = 3; //On met l'écran dans le sens que l'on veut
- tft.setRotation(rotation); //Suite de la ligne précédente
- int tableauLongueurs[4] = { 3, 3, 3, 3 };
- //On stocke les menus dans des tableaux, un tableau pour chaque "niveau de menu, on peut en ajouter autant qu'on veut
- 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
- int selectionne = 1; //On sélectionne le premier élément
- int ancienneValeurDefilement = digitalRead(8); //On lit la valeur actuelle du bouton de défilement
- DessinerMenu(tableauMenuPrincipal, tableauLongueurs[0], selectionne); //On dessine le menu
- while (1) { //boucle infinie, on n'utilise pas loop car nos premières variables seraient réintialisées
- while (digitalRead(8) == 0 && digitalRead(6) == 0) {
- //Evite de recharger le menu tout le temps
- }
- if (digitalRead(6) == 1) { //Ca veut dire que l'utilisateur a validé
- if (mode == 0) {
- if (selectionne == 1) {
- //Dessiner boire
- } else if (selectionne == 2) {
- mode = 2;
- SelectionnerBoisson(true, 1, 0, false);
- } else if (selectionne == 3) {
- mode = 1;
- selectionne = 1;
- DessinerMenu(tableauParametres, 4, selectionne);
- }
- } else if (mode == 1) {
- if(selectionne == 1) {
- mode = 0;
- selectionne = 3;
- DessinerMenu(tableauMenuPrincipal, 3, 3); //On dessine le menu
- } else if (selectionne == 3) {
- mode = 13;
- selectionnerSexe(&sexe, true, EEPROM.read(1));
- mode = 1;
- } else if (selectionne == 2) {
- mode = 12;
- DessinerSelecteurNombre("Je pese", "kg", 0, EEPROM.read(0), &poids, true);
- mode = 1;
- }
- }
- //DessinerMenu(tableauMenu1[selectionne - 1], 3, NewSelectionne); //On dessine notre nouveau menu avec l'indice selectionne dans le tableau de niveau 2 des menus
- } else {
- ancienneValeurDefilement = digitalRead(8); //Dans le cas ou l'utilisateur a tourné la molette
- selectionne++; //On change la sélection
- if (mode == 0) {
- if (selectionne > 3) { //Si on est arrivé à la fin on repasse au début
- selectionne = 1;
- }
- DessinerMenu(tableauMenuPrincipal, 3, selectionne); //Puisqu'on a changé de sélection on actualise le menu
- } else if(mode == 1) {
- if (selectionne > 4) { //Si on est arrivé à la fin on repasse au début
- selectionne = 1;
- }
- DessinerMenu(tableauParametres, 4, selectionne); //Puisqu'on a changé de sélection on actualise le menu
- }
- }
- delay(10); //On attend un peu (c'est temporaire)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment