Bonjour,
L'inscription sur ce forum et les premiers messages sont modérés par un Administrateur.
Ce n'est pas très convivial mais malheureusement nécessaire suite au spam intensif de nos amis russes.
Cordialement,
Dominique

Help: Objectif quiz!

Concerne la réalisation de projets Makers / Electroniques autour d'une carte MicroPython.
Forum rules
La PYBStick est supporté par MC Hobby (MicroPython) et Garatronic (Arduino IDE).
Merci de suivre les recommandations suivantes.
Pensez à:
  • Titre claire: permettant d'identifier le produit et le problème
  • Contenu complet: schema, message d'erreur, etc (tout ce qui permet d'aider à distance).
  • Fichier joint: Max 300 Ko
  • Courtoisie et précision
Post Reply
totorock
Posts: 10
Joined: Mon 11 Oct 2021 15:02

Help: Objectif quiz!

Post by totorock »

Bonjour a tous!
Dans le cadre d'un petit projet de création de quiz pour enfant, j'ai commencé un petit programme qui me donne du fil a retordre.
L'objectif étant a l'aide d'une carte RPi Pico, d'un écran GC9A01, et d'un bouton momentanée, de réalise un quiz affichant des photos jpg. Le tout prendra place dans un boîtier imprimé en 3d. Je vous rajouterai les 3ds au format STL quand je les aurais validés IRL.
Bref rentrons dans le vif du sujet!

Voici le "prototype" de code détaillé:

Code: Select all

import utime
import machine
import gc
button = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_UP) #déclaration bouton
import gc9a01 #import librairie écran
gc.enable()
gc.collect()

def gpio_set(pin,value): #détection appui bouton
  if value >= 1:
    Pin(pin, Pin.OUT).on()
  else:
    Pin(pin, Pin.OUT).off()

def main(): #activation écran et déclaration de ses branchements
    
    spi = SPI(1, baudrate=60000000, sck=Pin(14), mosi=Pin(15))
    tft = gc9a01.GC9A01(
        spi,
        240,
        240,
        reset=Pin(11, Pin.OUT),
        cs=Pin(13, Pin.OUT),
        dc=Pin(12, Pin.OUT),
        backlight=Pin(10, Pin.OUT),
        rotation=2)  # ecran 180deg, mettre 0 pour normal

    # initialisation ecran
    tft.init()
    
    while True:
          GC9A01.on()
          print('question1')
          tft.jpg("q1.jpg", 0, 0, gc9a01.SLOW)#affichage image 1
          utime.sleep_ms(180000) #blocage du bouton pour 3minutes
          while True:
                if not button.value():
                  print('question2')
                  tft.jpg("q2.jpg", 0, 0, gc9a01.SLOW)
                  utime.sleep_ms(180000)
                  while True:
                      if not button.value():
                        print('question3')
                        tft.jpg("q3.jpg", 0, 0, gc9a01.SLOW)
                        utime.sleep_ms(180000)
                        while True:
                            if not button.value():
                              print('question4')
                              tft.jpg("q4.jpg", 0, 0, gc9a01.SLOW)
                              utime.sleep_ms(180000)
                              GC9A01.off()
                              break
                        break
                  break
          break
Maintenant voila les problèmes de ce code:
- 1: il semblerait que la déclaration des pins de l'écran interfère avec la détection du bouton. Les 2 commandes fonctionnent seules, mais quand je les rassembles dans le programme ça ne fonctionne plus, et je ne trouve pas de solutions.
-2 : le montage des photos en arborescence avec les "N" break a la fin est compliqué pour l'utilisation d'un grand nombre de photos.

Comme on le dit par chez moi, je pédale dans la semoule, donc si l'un de vous qui lisait ce poste, aurais des idées a partager, je suis preneur!

Au plaisir de solutionner ça avec vous.
Bye
User avatar
Coyotte
Posts: 28
Joined: Mon 12 Apr 2021 16:42
Location: Liège (Belgium)

Re: Help: Objectif quiz!

Post by Coyotte »

Hello,

Je suis loin d'être un spécialiste en Python mais je pense que utime.sleep_ms(180000) provoque l'arrêt temporaire du processeur pendant le temps requis (180 secondes) et donc le programme serait inerte pour 3 minutes. Du coup, il faut avoir de la chance pour que tu appuies sur le bouton juste au moment ou le programme se réveille...
Pour ma part , je créerais une fonction 'touche' qui se contente de boucler en testant l'appui sur la touche concernée.
Une fois que la touche est enfoncée, la fonction rend la mai.n (revient)

Pour résoudre ton problème d'arborescence, une option consiste à factoriser le code d'affichage d'une image dans une fonction à laquelle tu passe l'image à afficher.
Tu peux alors placer les noms des images dans un tableau .
Il serait alors assez simple de une boucle qui parcourt le tableau et pour chaque élément
- appelle la fonction d'affichage pour l'image courante
- appelle la fonction touche qui attend qu'une touche soit pressée.

Ainsi, ton programme reste identique quel que soit le nombre d'images dans la liste.

Mais, comme toujours en informatique , il y a plus d'une manière d'arriver au résultat.

Coyotte
User avatar
Dominique
Administrateur du site
Posts: 259
Joined: Sun 17 May 2020 22:43

Re: Help: Objectif quiz!

Post by Dominique »

Merci Coyotte pour cette participation
Dominique, MC Hobby.
totorock
Posts: 10
Joined: Mon 11 Oct 2021 15:02

Re: Help: Objectif quiz!

Post by totorock »

Salut et merci pour ces réponses!
Je vais suivre tes pistes coyotte, même si je t'avoue ne pas encore trop voir comment les mettre en place. :lol:
En ce qui concerne la fonction "utime.sleep", je l'ai testé sur une application avec un bouton et l'utilisation de "print". Ca verrouille l'utilisation du bouton pendant le temps indiqué, et ça ne pose aucun problème pour le relancer. Même mieux, ça évite de passer par un "debouncer" car en bloquant le bouton, tu évite le risque de rebond! :D
Je vous met le code du test bouton concluant, des fois que ça puisse aider quelqu'un.

Code: Select all

import utime
import machine
button = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_UP)


while True:
  print('demarrage')
  utime.sleep_ms(5000)
  while True:
    if not button.value():
      print('1')
      utime.sleep_ms(5000)
      while True:
        if not button.value():
          print('2')
          utime.sleep_ms(5000)
          while True:
            if not button.value():
              print('3')
              utime.sleep_ms(5000)
              break
          break
      break
  break
User avatar
Coyotte
Posts: 28
Joined: Mon 12 Apr 2021 16:42
Location: Liège (Belgium)

Re: Help: Objectif quiz!

Post by Coyotte »

Bonjour Totorck,
J'avoue ne pas bieen comprendre l'objectif de ce code mais s'il te convient, c'est parfait.

Pour le debouncing, on parle en général de quelque ms, pas de 5000 car cela risque de tuer la réactivité de l'application. (Sauf si tu l'écris pour des escargot asthmatiques auquel cas le timing est bon... :) )

Amuses-toi bien en tous cas car c'est le plus important dans ce genre de projets.

Coyotte
totorock
Posts: 10
Joined: Mon 11 Oct 2021 15:02

Re: Help: Objectif quiz!

Post by totorock »

Aha tu m'as bien fait rire avec l'escargot asthmatique :D
Le code ne me convient pas, mais je voulais vérifier une supposition que tu as faite et qui me travaillait.
Du coup, il faut avoir de la chance pour que tu appuies sur le bouton juste au moment ou le programme se réveille...
Ce programme n'a pas d’intérêts autres que de vérifier si le programme redémarrerait en y laissant un délai plus long que la durée annoncée.
Sur ce point la ça a été une réussite.
Mais c'est plus de la curiosité qu'un besoin réel :lol:
Ta solution du tableau me semble nettement plus pertinente. Mais lorsque tu parle de lancer une boucle qui appelle les images a la suite, je cherche une solution qui empêche de passer a la suivante sur une durée de 3minutes, et en dehors d'un "sleep", je n'ai pas encore trouvé de solutions...
Les joies de la bidouille, mais c'est ça qui est bon!
User avatar
Coyotte
Posts: 28
Joined: Mon 12 Apr 2021 16:42
Location: Liège (Belgium)

Re: Help: Objectif quiz!

Post by Coyotte »

Hello,

Si tu veux forcer une attente de 3 miniutes alors le sleep est ce qu'il te faut.
Mais au bout des 3 miniutes que doit-il se passer ?
- Changes-tu automatiquement d'image ?
- Attends-tu que l'utilisateur ou l'utilisatrice appuie sur un bouton ?

Dans le premier cas, ton sleep suffit.
Dans le second, tu pourrais écrire une petite fonction qui boucle tant que l'on n'a pas appuyé sur le bouton.
Et tu appelles cette fonction après ton sleep.

En passant, pour la durée du sleep, je te conseille d'utiliser une variable définie en début de source. (idéalement une constante mais comme cela ne semble pas exister en Python, une variable fera l'affaire.)
Pourquoi ? Parce que durant la mise au point de ton programme, devoir patienter 3 minutes à chaque fois, cela va vite devenir pénible. :? :P
Donc tu places une valeur correspondant à, par exemple, 5 secondes pour tes tests.
Une fois que le code est au point, tu modifies la valeur avec celle prévue pour l'exécution normale.
Avantage de la variable : Tu changes le comportement de l'application à un seul endroit dans ton code.

Bon amusement,

Coyotte
Post Reply