Premier programme et remise en question ...

Merci Zlika pour ton cop de pouce , mon idée est de leur offrir un visuel de leur compteur temps (histoire de les motiver un peu !) ...

Je n'ai pas trop le temps de me pencher sur le code ces derniers jours mais je pense reprendre le concept avec le enum et le switch case ,

enum { neutre, blue, red, end_game} state_bomb

neutre = le statut de départ, personne n'a appuyé

blue = équipe blue a capturé , on active le chrono blue , on l'affiche

red = équipe red a capturé , on active le chrono red, on l'affiche

end game = fin du temps au compteur , on compare les temps blue & red et on affiche celui qui domine jusqu'a appuie d'une touche ....

j'ai revu mon projet a la baisse, c'est mon premier il me servira a aquerrir les bases car bon ... je lis des centaines de choses mais mon code j'ai du mal a lui donner forme , maintenant je comence a y voir plus clair sur la façon de procéder ... reste la bibliothèque simple minuteur a intégrer et a transposer en
MM:SS ...

a bientôt :slight_smile:

le switch case pour appliquer le code par type de statut ...

dans tout les cas il ne pourra y avoir au max que 2 chronos actif , temps partie (décompte) et celui de l'équipe qui domine ... je pense que c'est jouable quand même ?

T'inquiète pas pour la limitation. En dehors du matériel, la seule limitation est le temps que tu va passer sur le projet. Par contre, pour la motivation des joueurs, il va falloir qu'ils s'approche suffisamment pour réussir à lire les chronomètres. Perso quand je joue, la distance qui me sépare de la cible (la bombe dans ton cas) est proportionnelle au temps que je peux lui accorder (lecture des chronomètres) tellement il y du monde autour qui veut te sortir.
Il est grand ton terrain? Sinon tu déportes tes informations avec une liaison sans fils dans le respawn.

Je suis un peu rouillé niveau code mais si ça peut te servir:

Pour faciliter le formatage des nombres sur 2 chiffres (hh:mm:ss), tu peux ajouter 100 à ton nombre et ne prendre que les 2 derniers caractères.

String SS_str = String(secondes +100).substring(1)
String MM_str = String(minutes+100).substring(1)
String HH_str = String(heures+100).substring(1)
String Tps_str = HH_str + String(':') + MM_str + String(':') + SS_str

Si tu bloques sur un bout de code ou que tu ne sais pas comment faire, n'hésite pas à poster. Je reste dans le coin.

l'affichage déporté est une très bonne idée ! j'ai vu quelques projet a base de wifi et d'antenne qui va bien c'est top !

je vais penser le hardware de façon a être évolutif , par la suite je lui apporterai les modifs dont je suis capable ...

pourquoi ajouter 100 ? je ne voit pas en quoi ça rend la chose plus simple en fait ?

merci bcp pour ton aide c'est cool

Dans ton cas, tu détectes la présence du chiffre des dizaines en testant si le nombre est supérieur à 9.
En ajoutant 100, on sait qu'il existe et qu'il est composé de 3 chiffres. Seules les unités et dizaines nous intéresse.
Il suffit donc de transformer ce nombre en chaîne de caractères et de ne garder que les deux derniers caractères (2 derniers chiffres) .
String. Substring(1) ne prend que le restant de la chaîne à partir du deuxième caractère (0 étant le premier).
C'est plus simple car tu ne fait pas de test et que 4 lignes de code suffisent pour formater ton chronomètre.
Après, ton code fonctionne aussi, donc c'est juste un choix purement esthétique.

Regarde du côté des esp8266, c'est ce que j'ai utilisé dans mon projet.

ah yes malin, de ce fait les 09 ou les 10 sont correctement écrit sans passer par mes if(minute >=9) etc ...

merci, j'ai appris une chose de plus ce soir !

avant de partir sur du wifi est des trucs compliqués quand on est débutant, il me semble qu'il vaudrait mieux faire marcher correctement ce que tu as déjà. Déporter l'affichage ne le rendra pas plus fluide si la méthode n'est pas la bonne...

on attends toujours ton code complet pour trouver ce qui n'y va pas :wink:

Je précise au passage qu’utiliser la classe String comme cela vient de t’être conseillé est plutot à proscrire : String utilise l’allocation dynamique de mémoire, ce qui pose rapidement de gros problèmes sur un microcontroleur avec 2ko de ram…

Et en plus c’est inutilement compliqué, bien plus qu’un simple

if(minute<10) lcd.print("0");
lcd.print(minute);

bon alors n’ayant pas le reste du code, je me base sur des suppositions. De ce que j’ai compris : minute et seconde contiennent les valeurs de chrono générales de la partie, et celles en *Red ou *Blue celles des équipes concernées. Jesupposeque cette valeur décroit jusqu’a 0 mais ne devient pas negative.

Comme tu semble utiliser YASM, je te propose de rajouter une machine pour gérer l’écran :

YASM ecran;

//dans setup()
ecran.next(ecran_debut);

//dans la loop():
ecran.run()

//au momentoù ilfautpasser sur les chronos :
ecran.next(ecran_chronos);

///////gestion de l'ecran/////
void ecran_debut()
{
 //mettre ici ce que tu dois afficher avant de passer sur les chronos
}

void ecran_chronos()
{
 if (ecran.isFirstRun())
 {
 //Affichage du texte (fixe)
 lcd.setCursor(0, 0); lcd.print ("Time:");
 lcd.setCursor(0, 1); lcd.print ("Stat:"); lcd.print ("Disarmed");// cette ligne est juste là pour tester la présentation ( sera remplacee par la valeur d'une variable )
 lcd.setCursor(0, 2); lcd.print ("Blue:");
 lcd.setCursor(0, 3); lcd.print ("Red :");
 }
 
 if (ecran.periodic(500)) //on rafraichit toutes les 500ms
 {
 //temps global
 lcd.setCursor(6, 0);
 if (minute<10) lcd.print("0");
 lcd.print(minute);
 lcd.print(":");
 if (seconde<10) lcd.print("0");
 lcd.print(seconde);
 
 //temps bleu
 lcd.setCursor(6, 0);
 if (minuteBlue<10) lcd.print("0");
 lcd.print(minuteBlue);
 lcd.print(":");
 if (secondeBlue<10) lcd.print("0");
 lcd.print(secondeBlue);
 
 //temps rouge
 lcd.setCursor(6, 0);
 if (minuteRed<10) lcd.print("0");
 lcd.print(minuteRed);
 lcd.print(":");
 if (secondeRed<10) lcd.print("0");
 lcd.print(secondeRed);
 
 //affichage sur port série
 Serial.print(minute);
 Serial.print(" : ");
 Serial.print(seconde);
 
 Serial.print("  - Blue >>  ");
 Serial.print(minuteBlue);
 Serial.print(" : ");
 Serial.print(secondeBlue);
 
 Serial.print("  - Red >>  ");
 Serial.print(minuteRed);
 Serial.print(" : ");
 Serial.println(secondeRed);
 }
}

voila un code plus simple que le tien qui devrait fonctionner, mais encore une fois, sans voir le reste du code, c’est TRES COMPLIQUE de te faire une proposition…

EDIT : je ne sais pas pourquoi l’indentation n’est plus bonne, elle est bonne dans mon éditeur pourtant… :frowning:

bricofoy:
avant de partir sur du wifi est des trucs compliqués quand on est débutant, il me semble qu'il vaudrait mieux faire marcher correctement ce que tu as déjà. Déporter l'affichage ne le rendra pas plus fluide si la méthode n'est pas la bonne...

c'est bien ce que j'ai écris plus haut :wink:

et comme écris également , je n'y ai pas bossé dessus ces derniers jours, je parcours juste des notices encore et encore ...

merci Bricofoy , je pourrais coller dans ecran_debut() la saisie des temps de jeu !

en fait mon approche n'est peut être pas très bonne mais je lis bcp de chose et je prends bcp d'infos dans le but d'avoir une meilleure idée de ce que je "connais" et de ce que je veux faire , une fois que j'aurais mes réponses , ce sera plus simple pour moi d'écrire mon code sans me couper toutes les 10 min pour aller chercher des infos sur le comment du pourquoi ...

par exemple , les librairies j'ai bcp de mal a utiliser les fonctions car très peu d'exemples pour un débutant, j'ai demandé dans le topic de simple minuteur un peu d'infos mais tjr pas de réponses ... alors je patiente :grinning:

là je vois que tu utilise "periodic(500)" , une fois écris c'est très simple pour un débutant comme moi mais idem , où trouver les infos de ce que l'ont peut faire exactement YASM ou autre ?

Et rien n'empêche de parler d'éventuels développements du projet en même temps. C'est bien de rêver un peu :D. Ça donne de la motivation... Après ça va prendre un peu de temps, chaque personne a son propre rythme. En passant, je précise juste que l'esp8266 intègre le WiFi, est plus petit (donc plus facile à caser dans la bombe), pas très cher sur les sites chinois, plus rapide et surtout plus de flash et de ram. Il peut faire serveur Web (donc accès depuis un smartphone) et on pourrait même imaginer la sauvegarde des parties joués.mise à jour On The Air donc par le WiFi ce qui est bien pratique. Je vends bien le rêve non ? ;D

Oups... Pas vu la demande pour les temporisations. Je te donnerai un exemple demain. Maintenant c'est dodo ;D

ouai mais bon … tu parles a un mec qui vient d’apprendre a faire clignoter une p*** de Led ! mdr

je prends mon mal en patience … là c’est la partie bourrage de crane, l’amusement sera après l’apprentissage :slight_smile:

Limp47:
là je vois que tu utilise “periodic(500)” , une fois écris c’est très simple pour un débutant comme moi mais idem , où trouver les infos de ce que l’ont peut faire exactement YASM ou autre ?

au hasard, dans la doc de la librairie ? :slight_smile:
ou avec les exemples fournis :wink:

une fois que j’aurais mes réponses , ce sera plus simple pour moi d’écrire mon code sans me couper toutes les 10 min pour aller chercher des infos sur le comment du pourquoi …

Mais c’est justement là où je te dis qu’il faut poster ton code actuel ! Tu as commencé à écrire un truc qui fonctionne presque, il ne doit donc pas manquer grand chose pour le rendre OK.
Tu demandes des conseils, c’est très bien, mais la meilleure façon de comprendre le comment du pourquoi ça ne fonctionne pas ou mal, et améliorer les choses, c’est de partir de ton code (et donc pour ça il faut le voir…) et de le corriger, ou au moins de t’indiquer la façon de le faire.
Il n’y a pas de honte à poster un truc “pas beau” tout le monde a été débutant un jour :wink:

Parce que là finalement,on en est réduit à faire des suppositions, et à t’indiquer des trucs qui n’ont finalement peut-être rien à voir avec la choucroute… la fonction d’affichage que je t’ai proposée par exemple… sans voir le reste, RIEN ne garanti que ça puisse fonctionner.

Zlika:
Dans ton cas, tu détectes la présence du chiffre des dizaines en testant si le nombre est supérieur à 9.
En ajoutant 100, on sait qu’il existe et qu’il est composé de 3 chiffres. Seules les unités et dizaines nous intéresse.
Il suffit donc de transformer ce nombre en chaîne de caractères et de ne garder que les deux derniers caractères (2 derniers chiffres) .
String. Substring(1) ne prend que le restant de la chaîne à partir du deuxième caractère (0 étant le premier).
C’est plus simple car tu ne fait pas de test et que 4 lignes de code suffisent pour formater ton chronomètre.
Après, ton code fonctionne aussi, donc c’est juste un choix purement esthétique.

Mais c’est un vraiment très très mauvais choix technique…absolument pas performant

D’un point de vue esthétique une petite fonction affiche2digits(nombre) qui fait le if < 9 fera le boulot

Certes, je conçois qui si on utilise un Ardiuno UNO ou équivalent, c'est franchement pas la meilleur des solutions en terme d'utilisation mémoire et cycles d'horloge pour l'exécution. Après, je voulais juste proposer une approche différente de travailler sans forcement passer par des conditions.
Le code idéal est celui qui fait le travail en un minimum de temps et de resources, et le mien ne l'est pas.

Oui l’idée peut paraître un peu séduisante mais ne tient pas…

Un test sur des nombres - surtout s’ils tiennent sur un octet c’est rien du tout en coût - rien que l’usage de classe string va rajouter plus de 1,5k au code et l’allocation mémoire dynamique est hyper coûteuse…

Quelle que soit la plateforme c’est une approche à éviter… quand on peut faire simple, on fait simple :slight_smile:

hello , pourquoi quand je fais cela dans mon prog ça ne fonctionne pas ? alors que dans l'exemple de la librairie keypad ça marche très bien ...

char key = keypad.getKey();

void loop() {
  
  ecran.run();

  if (key == '#') {
ecran.next(ecran_game);
    
  }
}

Bonjour,

Tu utilises la fonction getKey() non bloquante de la librairie keypad. Cette fonction n'attend pas que tu presses une touche pour retourner sa valeur. Il faut donc l'insérer dans la boucle loop() pour que chaque passage scrute le clavier. Dans le cas d'une touche pressée sur le clavier, ta variable key contiendra la valeur de la touche pressée. Dans le cas contraire, key prendra la valeur NO_KEY qui est une constant propre à la librairie. La librairie possède une fonction bloquante waitForKey() qui, elle, attendra que tu presses une touche. Mais une fonction bloquante, tout comme delay() bloque l'exécution du programme, donc empêche par exemple le rafraîchissement d'un écran, le clignotement d'une led, la lecture d'une broche ou la réception de données tant que la fonction n'est pas terminée. Ces instructions sont à éviter si tu veux un programme fluide.

j'ai saisie que je ne bloquais pas avec mon if mais je ne savais pas comment faire ... merci ! je vais le placer ds le setup du coup

Pourquoi le placer dans le setup ? Cette procédure est généralement utilisé pour configurer et initialiser. Tu vas par exemple, initialiser ton clavier, ton port série.. . La saisi des touches du clavier fait partie intégrante de l'exploitation de ton objet. Tu auras sûrement besoin de lire d'autres touches. Donc cette partie va dans la procédure loop(). C'est le seul moyen de pouvoir continuer à utiliser ton clavier.