Merci à tous pour vos réponses mais le problème et que j'ai juste un écran I2C, pas de shield avec boutons.
Après je peux ajouter des boutons mais genre je veux juste un MENU avec deux catégories et 3 sous menus par partie, mais genre j'ai aucune idée de comment commander le menu, si on sélectionne une catégorie, ca affiche la catégorie demandée, puis changer la vitesse.
J'ai vu qu'on peut le faire avec des String[], mais j'ai aucune piste...
"je veux juste", elle est bonne celle-là. Pour les idées, tu peux regarder dans les deux exemples qu'on t'a donné.
Avant de regarder comment faire le programme, il faut que tu décides de ce que tu veux que ton système fasse. Comment l'utilisateur va s'en servir. En détail. Après quand tu sauras combien tu veux mettre de boutons, et comment se passe le dialogue avec l'utilisateur, on pourra voir pour la programmation.
Dans ce que je t'ai donné, ça marche avec deux boutons, qui ne prennent sur le shield qu'une entrée analogique (un pont de résistances). C'est facile de remplacer ça par des boutons connectés de la façon usuelle, une pin pour chaque. C'est pas le vrai problème.
On peut aussi faire avec un seul bouton, en décodant les appuis courts et les appuis longs (comme pour régler les montres).
- Edité par michelbillaud 18 juillet 2018 à 21:32:10
Je voudrais utiliser deux boutons, un bouton pour naviguer dans les menus et on autre bouton qui fera office de ENTRER dans les sous menus.
Pour chaque sous-menus des deux catégories, je voudrais trois vitesses, pour le moteur PaP je rentrerai des valeurs de pas précises pour chaque vitesse. Et pour le moteur DC, je vais varier la fréquence PWM pour pouvoir modifier la vitesse.
Je veux que mon système me permette de contrôler mon slider que je vais fabriquer sous peu et ma plaque tournante. Le problème est que je ne sais pas comment faire le menu. Et je n'ai pas de shield, j'ai connecté deux boutons poussoirs avec une résistance de 10Kohms qui fait résistance de pull-down.
Il te reste à définir l'enchainement des menus et des actions.
A chaque étape, ce que tu veux voir, et ce qui se passe quand tu appuies sur un bouton, ou sur l'autre. Un beau dessin. Indispensable pour avoir les idées claires.
Exemple de question à se poser: avec deux boutons, comment tu reviens d'un sous-menu au menu ?
C'est pour ça que je me suis enquiquiné à te faire un exemple dans le début de mon message du 17/7.
PS: tu peux même te passer de résistances, avec des entrées en pullup.
- Edité par michelbillaud 19 juillet 2018 à 12:33:43
Donc ce que je peux faire c'est ajouter un troisième bouton Retour.
J'ai fait un petit organigramme
Et pour l'option retour le mieux est de faire comme dans l'organigramme ci-dessous, où juste look à la fin de la loop si le bouton est pressé et on retourne au menu 1. Quel est le plus judicieux ?
Si tu n'en dis pas plus sur ce que tu sais faire ou pas en programmation, et ce que tu ne comprends pas, on va pas avancer.
---
Sinon, on peut faire avec deux boutons seulement, par exemple ajoutant un item "retour" en bas de chaque sous-menu
Le menu principal afficherait le nom des paramètres de configuration, en montrant leur valeur courante. Ca équivaudrait à un menu de plusieurs lignes, avec défilement par [suivant].
Si on est sur Vitesse, et qu'on appuie sur [entrer], ça entre dans le menu de choix configuration d'un paramètre. Là on pourrait défiler entre les différentes valeurs possibles, la valeur courante étant mise en évidence. Plus un choix pour le retour
Là aussi, [suivant] navigue entre les valeurs possibles, on se positionne sur celle qu'on veut, et avec [entrer] on change le paramètre pour la valeur sélectionnée, et ça revient au menu.
Voila une autre version, dans l'esprit de ce que racontais plus haut.
Remarques :
les menus ont été "réifiés", ils sont matérialisés par des structures de données plutôt que par des instructions.
ça serait mieux si le menu principal faisait défiler les paramètres, avec leur valeur actuelle (qui correspond au setting). Pour faire ça bien, il faudrait 2 classes pour les menus, avec polymorphisme etc : j'ai préféré éviter ça aux ames sensibles.
pour la même raison, un tableau de menus plutot que des pointeurs.
le décodage des touches est à repiquer dans le code précédent.
SET_SPEED et SET_POWER pourraient être ramenés à une seule constant SET_VALUE
Il y a un petit problème ligne 36, qui fait que ton programme ne doit pas compiler, et encore moins s'exécuter.
Problème aussi aussi avec la consultation des boutons
il y en qu'un de testé
il est testé trop rapidement ce qu'il fait que le menu change plusieurs dizaines/centaines de fois par seconde
tu as du constater que l'affichage était très instable
Première chose à faire : ne pas essayer de tout faire d'un coup. Se donner un objectif partiel: déjà, si un bouton alternait de façon fiable entre deux choix, ça serait un bon début. Le rôle du second bouton, plus tard.
Pour le second problème, une solution est de se dire que, quand on a détecté que le bouton passait à HIGH, il ne faut plus le regarder pendant un certain temps, par exemple 3/10 seconde.
Pour faire ça on utilise
la fonction millis() qui dit "l'heure qu'il est" en millisecondes depuis le démarrage
une variable qui dit à partir de quelle heure on peut regarder la touche la prochaine fois
// variable globale
unsigned long prochaine_consultation = 0;
void loop()
{
unsigned long temps = millis();
if (temps >= prochaine_consultation) { // c'est l'heure ?
if (digitalRead(bouton) == HIGH) {
....
prochaine_consultation = temps + 300;
}
}
....
}
- Edité par michelbillaud 22 juillet 2018 à 17:50:16
Michel Billaud je ne comprends rien au code que vous m'avez donné. Et je m'en excuse, où est la void setup ?
Edgar je suis venu ici pour chercher de l'aide pour construire un code et non payé des personnes pour qu'elle me le fasse, mon but est de le coder et de le comprendre.
Le problème est que je ne comprends pas comment fonctionne le code, en entier, je ne comprends absolument rien, vous ne connaissez pas une autre alternative ?
Le problème est que je ne comprends pas comment fonctionne le code, en entier, je ne comprends absolument rien, vous ne connaissez pas une autre alternative ?
Deux alternatives raisonnables :
apprendre à programmer. Au moins essayer de comprendre.
payer quelqu'un pour le faire.
sinon, attendre un programme tout fait qui passerait dans le ciel par hasard, ça risque pas trop.
Une autre solution : trouver dans son entourage une personne qui sait programmer un Arduino et que le projet amuse.
la connaissance est une chose qui ne nous appauvrit pas quand on la partage.
Mon GitHub
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent