Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2023-12-20T09:36:16+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533832023-12-20T09:36:16+01:00ajarry/@ajarryhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=2#p253383<p>D’accord, ok je comprends ! Je vais voir de mon coté pour essayer d’en apprendre un peu plus la dessus. Merci pour les conseils ! <img src="/static/smileys/svg/clin.svg" alt=";)" class="smiley"> </p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533782023-12-19T17:38:14+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=2#p253378<p>Très bien, donc ce n’est pas que ça ne t’intéresse pas, c’est simplement que tu as des difficultés, probablement dû à un mauvais enseignement, mais c’est pas grave ça se rattrape avec de la motivation !<br>
Je continue de penser que le mieux c’est de trouver un cours qui te correspond, car on peut t’aider sur les forums sur des points précis, mais pour qu’on se comprenne il faut que tu aie les fondamentaux (ou qu’on écrive carrément un mini tuto en réponse mais c’est compliqué et long, et des rédacteurs de tuto explique probablement mieux).<br>
On a pas encore de tuto vraiment électronique sur ZdS, je ne saurais t’en conseiller un. Par contre on a le <a href="https://zestedesavoir.com/tutoriels/686/arduino-premiers-pas-en-informatique-embarquee/">tuto arduino d’eskimon</a> qui est cool et proche de ce que tu veux faire en l’adaptant à la RPi, mais c’est de l’informatique embarqué, c’est à dire que ça apprends plutôt comment mettre des composants autour d’un MCU et les piloter, que de comprendre les montages électroniques.</p>
<p>Le principe des pull-up / pull-down c’est simplement d’appliquer une tension (donc un niveau logique) sur ton entrée lorsque le contact est ouvert. Donc c’est simplement une grosse résistance qui lie l’entrée à la tension correspondant au niveau logique inverse de ce que ton interrupteur va apporter.<br>
Mais je crois surtout que ce que tu n’as pas saisi c’est que cette résistance est interne à la carte lorsque tu configure ton entrée dans ton programme, donc pas besoin de la brancher sur le montage externe.</p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533772023-12-19T14:41:23+01:00ajarry/@ajarryhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=2#p253377<p>C’est certainement parce que je n’ai jamais eu de très bons cours en électronique… J’essaye de m’y intéresser justement mais comme je comprends pas, logiquement j’aime pas trop <img src="/static/smileys/svg/pinch.svg" alt=">_<" class="smiley"> </p>
<p>Mais justement, je fais ce projet "seul" pour essayer d’apprendre le plus possible donc j’espère ressortir de cette expérience avec un peu plus de connaissances.
Il faut que je regarde mieux le pull down car je pense que je n’ai pas saisi le principe. <img src="/static/smileys/svg/b.svg" alt=":B" class="smiley"> </p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533722023-12-18T13:57:11+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253372<p>Je ne m’attendais pas vraiment à cette réponse … Tu sembles avoir besoin de ces connaissances pour arriver à bout de ton projet, c’est étonnant que tu te lance dedans si tu n’aimes pas ça car si tu t’y prends seul, tu vas <em>devoir</em> apprendre.</p>
<p>Tu le relie déjà au ground au travers la RPi en configurant ta GPIO en pull-down, de manière similaire à ce qui est montré dans le <a href="https://zestedesavoir.com/tutoriels/686/arduino-premiers-pas-en-informatique-embarquee/743_gestion-des-entrees-sorties/3423_un-simple-bouton/#sch%C3%A9ma-r%C3%A9sum%C3%A9-1">tuto arduino</a></p>
<div class="align-center"><figure><img src="https://zestedesavoir.com/media/galleries/954/0d8e0ef1-39f5-4514-939f-b3284b10b438.png.960x960_q85.png"><figcaption>Schéma de câblage d’un bouton sur une entrée arduino configurée en pull-up</figcaption></figure></div>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533652023-12-18T09:34:51+01:00ajarry/@ajarryhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253365<p>Effectivement je n’aime pas vraiment l’électronique… Mais du coup mon bouton, je dois quand même le relier au ground non ?</p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533562023-12-17T19:33:19+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253356<p>J’ai peur de comprendre … ^^'<br>
Je crois que tu as branché le bouton en court-circuit<br>
Il faut que tu fasses soit +5V<->bouton<->GPIO configuré en pull-down, soit GND<->bouton<->GPIO configuré en pull-up.<br>
Mais j’ai l’impression que tu manques de base en électronique et développement informatique. On dirait que tu assembles des bouts de code et de montage sans vraiment les comprendre (en partie mais pas complètement) car tu n’as pas les fondamentaux. Je te conseillerais tout de même de lire des cours avant de te lancer dedans.</p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533442023-12-16T16:21:19+01:00ajarry/@ajarryhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253344<figure><blockquote>
<p>Pourquoi tu as besoin d’une résistance ? La raspberry ne contient pas la résistance de pull down lorsque tu le configure ?</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253333">romantik</a></figcaption></figure>
<p>Je sais pas, ça fait redémarrer la raspberry quand j’appuie sur un bouton qui n’a pas de résistance (il est cablé sur GND/+5V/pinX).</p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533332023-12-15T16:27:59+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253333<p>Pourquoi tu as besoin d’une résistance ? La raspberry ne contient pas la résistance de pull down lorsque tu le configure ?</p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533322023-12-15T16:09:40+01:00ajarry/@ajarryhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253332<figure><blockquote>
<p>Tes GPIO sont configurées en pull down l.28–30 et tu t’attends à un front descendant l.174–176.<br>
Tes boutons sont donc branché au +Vcc ? Est-ce qu’ils sont normalement fermé ou normalement ouvert ?<br>
</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253331">romantik</a></figcaption></figure>
<p>C’est bien là le problème, je m’en suis rendu compte rapidement quand j’ai vu la tête de mon cablâge… <img src="/static/smileys/svg/siffle.svg" alt=":-°" class="smiley"> </p>
<p>Avec les résistances et le +5V ça à l’air beaucoup mieux ! (malheureusement j’ai pas assez de résistances pour faire tous mes tests, je les reprendrai lundi)</p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533312023-12-15T15:44:50+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253331<p>Tes GPIO sont configurées en pull down l.28–30 et tu t’attends à un front descendant l.174–176.<br>
Tes boutons sont donc branché au +Vcc ? Est-ce qu’ils sont normalement fermé ou normalement ouvert ? </p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533302023-12-15T15:10:16+01:00ajarry/@ajarryhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253330<figure><blockquote>
<p>Aucune de tes interruptions fonctionnent ? Si tu mets un <code>print()</code> dans ta fonction <code>enable_flash_light()</code>, rien ne s’affiche à l’appui sur le bouton du GPIO 17 ?</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253329">Vayel</a></figcaption></figure>
<p>En fait j’ai un problème au niveau du cablage je pense, les boutons ne fonctionnent pas mais lorsque je manipule un peu les différents fils j’ai bien mon action qui s’effectue mais pas tout le temps. Je n’arrive pas à savoir quel est le problème…</p>
<p>Et j’ai toujours mon autre problème : la commande "take_a_photo" s’effectue 2 fois par moment et 1 seule fois à d’autres moments…</p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533292023-12-15T14:53:03+01:00Vayel/@Vayelhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253329<p>Aucune de tes interruptions fonctionnent ? Si tu mets un <code>print()</code> dans ta fonction <code>enable_flash_light()</code>, rien ne s’affiche à l’appui sur le bouton du GPIO 17 ?</p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533272023-12-15T14:03:24+01:00ajarry/@ajarryhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253327<p>Voici le code que j’ai actuellement :</p>
<div class="hljs-code-div hljs-code-py"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span><span data-count="29"></span><span data-count="30"></span><span data-count="31"></span><span data-count="32"></span><span data-count="33"></span><span data-count="34"></span><span data-count="35"></span><span data-count="36"></span><span data-count="37"></span><span data-count="38"></span><span data-count="39"></span><span data-count="40"></span><span data-count="41"></span><span data-count="42"></span><span data-count="43"></span><span data-count="44"></span><span data-count="45"></span><span data-count="46"></span><span data-count="47"></span><span data-count="48"></span><span data-count="49"></span><span data-count="50"></span><span data-count="51"></span><span data-count="52"></span><span data-count="53"></span><span data-count="54"></span><span data-count="55"></span><span data-count="56"></span><span data-count="57"></span><span data-count="58"></span><span data-count="59"></span><span data-count="60"></span><span data-count="61"></span><span data-count="62"></span><span data-count="63"></span><span data-count="64"></span><span data-count="65"></span><span data-count="66"></span><span data-count="67"></span><span data-count="68"></span><span data-count="69"></span><span data-count="70"></span><span data-count="71"></span><span data-count="72"></span><span data-count="73"></span><span data-count="74"></span><span data-count="75"></span><span data-count="76"></span><span data-count="77"></span><span data-count="78"></span><span data-count="79"></span><span data-count="80"></span><span data-count="81"></span><span data-count="82"></span><span data-count="83"></span><span data-count="84"></span><span data-count="85"></span><span data-count="86"></span><span data-count="87"></span><span data-count="88"></span><span data-count="89"></span><span data-count="90"></span><span data-count="91"></span><span data-count="92"></span><span data-count="93"></span><span data-count="94"></span><span data-count="95"></span><span data-count="96"></span><span data-count="97"></span><span data-count="98"></span><span data-count="99"></span><span data-count="100"></span><span data-count="101"></span><span data-count="102"></span><span data-count="103"></span><span data-count="104"></span><span data-count="105"></span><span data-count="106"></span><span data-count="107"></span><span data-count="108"></span><span data-count="109"></span><span data-count="110"></span><span data-count="111"></span><span data-count="112"></span><span data-count="113"></span><span data-count="114"></span><span data-count="115"></span><span data-count="116"></span><span data-count="117"></span><span data-count="118"></span><span data-count="119"></span><span data-count="120"></span><span data-count="121"></span><span data-count="122"></span><span data-count="123"></span><span data-count="124"></span><span data-count="125"></span><span data-count="126"></span><span data-count="127"></span><span data-count="128"></span><span data-count="129"></span><span data-count="130"></span><span data-count="131"></span><span data-count="132"></span><span data-count="133"></span><span data-count="134"></span><span data-count="135"></span><span data-count="136"></span><span data-count="137"></span><span data-count="138"></span><span data-count="139"></span><span data-count="140"></span><span data-count="141"></span><span data-count="142"></span><span data-count="143"></span><span data-count="144"></span><span data-count="145"></span><span data-count="146"></span><span data-count="147"></span><span data-count="148"></span><span data-count="149"></span><span data-count="150"></span><span data-count="151"></span><span data-count="152"></span><span data-count="153"></span><span data-count="154"></span><span data-count="155"></span><span data-count="156"></span><span data-count="157"></span><span data-count="158"></span><span data-count="159"></span><span data-count="160"></span><span data-count="161"></span><span data-count="162"></span><span data-count="163"></span><span data-count="164"></span><span data-count="165"></span><span data-count="166"></span><span data-count="167"></span><span data-count="168"></span><span data-count="169"></span><span data-count="170"></span><span data-count="171"></span><span data-count="172"></span><span data-count="173"></span><span data-count="174"></span><span data-count="175"></span><span data-count="176"></span><span data-count="177"></span><span data-count="178"></span></div><pre><code class="hljs language-py"><span class="hljs-keyword">from</span> tkinter <span class="hljs-keyword">import</span> *
<span class="hljs-keyword">from</span> tkinter <span class="hljs-keyword">import</span> font
<span class="hljs-keyword">from</span> picamera <span class="hljs-keyword">import</span> PiCamera
<span class="hljs-keyword">import</span> time
<span class="hljs-keyword">from</span> time <span class="hljs-keyword">import</span> sleep
<span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image, ImageTk
<span class="hljs-keyword">import</span> os
<span class="hljs-keyword">import</span> RPi.GPIO <span class="hljs-keyword">as</span> GPIO
<span class="hljs-comment">#####from pynput import keyboard</span>
<span class="hljs-string">""" +VARIABLES+ """</span>
camera = PiCamera()
path = <span class="hljs-string">'/home/pi/Desktop/Python/Projet/Photos/Photo'</span> <span class="hljs-comment">#chemin d'accès photos (fait parti du nom) //à modifier si chemin différent</span>
count = <span class="hljs-number">2</span> <span class="hljs-comment">#compteur qui permet de limiter le temps de prise de la photo en secondes</span>
camera.resolution = (<span class="hljs-number">1920</span>,<span class="hljs-number">1080</span>) <span class="hljs-comment">#personnalisation de la camera (FULL HD)</span>
camera.framerate = <span class="hljs-number">60</span> <span class="hljs-comment">#personnalisation de la camera (60fps)</span>
pinBtnPhoto = <span class="hljs-number">2</span> <span class="hljs-comment"># Definition des pins bouton</span>
pinBtnFlash = <span class="hljs-number">17</span> <span class="hljs-comment"># Definition des pins bouton</span>
pinBtnNoFlash = <span class="hljs-number">27</span> <span class="hljs-comment"># Definition des pins bouton</span>
pinLedG = <span class="hljs-number">16</span> <span class="hljs-comment"># Definition des pins led</span>
pinLedB = <span class="hljs-number">21</span> <span class="hljs-comment"># Definition des pins led</span>
<span class="hljs-string">""" -VARIABLES- """</span>
<span class="hljs-string">""" +GPIO+ """</span>
GPIO.setwarnings(<span class="hljs-literal">False</span>)
GPIO.setmode(GPIO.BCM)
<span class="hljs-comment"># Definition des pins en entree / sortie</span>
GPIO.setup(pinBtnPhoto, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(pinBtnFlash, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(pinBtnNoFlash, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(pinLedG, GPIO.OUT)
GPIO.setup(pinLedB, GPIO.OUT)
<span class="hljs-string">""" -GPIO- """</span>
<span class="hljs-string">""" +FONCTION+ """</span>
<span class="hljs-comment">###fonction horloge</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">digital_clock</span>():</span>
time_live = time.strftime(<span class="hljs-string">"%H:%M:%S"</span>)
horloge.config(text=time_live)
horloge.after(<span class="hljs-number">500</span>, digital_clock) <span class="hljs-comment">#actualisation toutes les 500ms</span>
<span class="hljs-comment">###fonction camera</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">take_a_photo</span>(<span class="hljs-params">pinBtnPhoto</span>):</span>
dateiso = time.strftime(<span class="hljs-string">"%Y-%m-%d_%H-%M-%S"</span>) <span class="hljs-comment">#date/heure (locale) de la photo</span>
GPIO.output(<span class="hljs-number">21</span>,<span class="hljs-literal">True</span>)
camera.start_preview(fullscreen = <span class="hljs-literal">False</span>, window = (<span class="hljs-number">0</span>,<span class="hljs-number">196</span>,<span class="hljs-number">1280</span>,<span class="hljs-number">720</span>)) <span class="hljs-comment">#permet de placer manuellement la frame du flux vidéo</span>
countdown(count) <span class="hljs-comment">#appel de la fonction countdown</span>
camera.capture(path+<span class="hljs-string">'_'</span>+dateiso+<span class="hljs-string">'.jpeg'</span>)
photo_name = (path+<span class="hljs-string">'_'</span>+dateiso+<span class="hljs-string">'.jpeg'</span>)
photo_button.grid_forget()
maphoto = Image.<span class="hljs-built_in">open</span>(path+<span class="hljs-string">'_'</span>+dateiso+<span class="hljs-string">'.jpeg'</span>)
maphoto = maphoto.resize((<span class="hljs-number">1280</span>,<span class="hljs-number">720</span>))
photo = ImageTk.PhotoImage(maphoto)
photo_label.config(image = photo)
photo_label.image = photo
camera.stop_preview()
GPIO.output(<span class="hljs-number">16</span>,<span class="hljs-literal">False</span>)
GPIO.output(<span class="hljs-number">21</span>,<span class="hljs-literal">False</span>)
<span class="hljs-built_in">print</span> (photo_name)
comment_label.config(text=<span class="hljs-string">'Souhaitez-vous imprimer cette photo ?'</span>)
print_a_photo() <span class="hljs-comment">#appel de la fonction print_a_photo</span>
<span class="hljs-comment">###fonction décompte</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">countdown</span>(<span class="hljs-params">count</span>):</span>
<span class="hljs-keyword">while</span> count:
mins, secs = <span class="hljs-built_in">divmod</span>(count, <span class="hljs-number">60</span>)
timer = <span class="hljs-string">'{:d}'</span>.<span class="hljs-built_in">format</span>(secs)
<span class="hljs-built_in">print</span>(timer, end=<span class="hljs-string">"\r"</span>)
time.sleep(<span class="hljs-number">1</span>)
count -= <span class="hljs-number">1</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">print_a_photo</span>():</span>
print_frame.grid(row=<span class="hljs-number">2</span>, column=<span class="hljs-number">0</span>)
YES_button.grid(row=<span class="hljs-number">0</span>, column=<span class="hljs-number">0</span>, padx=<span class="hljs-number">20</span>)
NO_button.grid(row=<span class="hljs-number">0</span>, column=<span class="hljs-number">1</span>, padx=<span class="hljs-number">20</span>)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">back_to_photo</span>():</span>
print_frame.grid_forget()
YES_button.grid_forget()
NO_button.grid_forget()
photo_button.grid(row=<span class="hljs-number">2</span>, column=<span class="hljs-number">0</span>)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">enable_flash_light</span>(<span class="hljs-params">pinBtnFlash</span>):</span>
GPIO.output(<span class="hljs-number">16</span>,<span class="hljs-literal">True</span>)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">disable_flash_light</span>(<span class="hljs-params">pinBtnNoFlash</span>):</span>
GPIO.output(<span class="hljs-number">16</span>,<span class="hljs-literal">False</span>)
<span class="hljs-string">"""def physical_button_loop(attachedWindow):
etat = GPIO.input(pinBtn)
# etat==0 => bouton appuye => LED allumee
if (etat == 0) :
print("Appui detecte sur le bouton 1")
take_a_photo()
# Scruter le bouton toutes les 20ms
attachedWindow.after(20, lambda : physical_button_loop(attachedWindow))"""</span>
<span class="hljs-string">"""def physical_button2_loop(attachedWindow):
etatbp = GPIO.input(pinBtn2)
# etat==0 => bouton appuye => LED allumee
if (etatbp == 0) :
print("Appui detecte sur le bouton 2")
enable_flash_light()
else :
print("Appui detecte sur le bouton 2")
disable_flash_light()
# Scruter le bouton toutes les 20ms
attachedWindow.after(20, lambda : physical_button2_loop(attachedWindow))"""</span>
<span class="hljs-string">""" -FONCTION- """</span>
<span class="hljs-string">""" +CREATION+ """</span>
mainWindow = Tk() <span class="hljs-comment">#creation mainWindow</span>
title_frame = Frame(mainWindow, width=<span class="hljs-number">350</span>, height=<span class="hljs-number">200</span>, bg=<span class="hljs-string">'black'</span>) <span class="hljs-comment">#creation frame pour contenir le titre</span>
frame = Frame(mainWindow, width=<span class="hljs-number">550</span>, height=<span class="hljs-number">400</span>, bg=<span class="hljs-string">'black'</span>) <span class="hljs-comment">#creation frame pour contenir le reste</span>
print_frame = Frame(frame, bg=<span class="hljs-string">'black'</span>) <span class="hljs-comment">#creation frame pour boutons d'impression</span>
flash_frame = Frame(mainWindow, bg=<span class="hljs-string">'black'</span>)<span class="hljs-comment">#creation frame pour activer/desactiver flash light</span>
<span class="hljs-string">""" -CREATION- """</span>
<span class="hljs-comment">###personnalisation de la fenetre</span>
mainWindow.title(<span class="hljs-string">"SelfIN"</span>)
mainWindow.config(background=<span class="hljs-string">'black'</span>)
mainWindow.attributes(<span class="hljs-string">'-fullscreen'</span>, <span class="hljs-literal">True</span>) <span class="hljs-comment">#application en plein écranS</span>
mainWindow.bind(<span class="hljs-string">'<F>'</span>,<span class="hljs-keyword">lambda</span> e: mainWindow.destroy()) <span class="hljs-comment">#pour enlever le plein écran et quitter</span>
<span class="hljs-comment">###ajout texte</span>
Self = Label(title_frame, text=(<span class="hljs-string">"Self"</span>), font=(<span class="hljs-string">"koliko-Bold.ttf"</span>, <span class="hljs-number">60</span>), bg=<span class="hljs-string">'black'</span>,fg=<span class="hljs-string">'white'</span>)
IN = Label(title_frame, text=(<span class="hljs-string">"IN"</span>), font=(<span class="hljs-string">"koliko-Bold.ttf"</span>, <span class="hljs-number">60</span>), bg=<span class="hljs-string">'black'</span>,fg=<span class="hljs-string">'gold'</span>)
<span class="hljs-comment">###ajout commentaires</span>
comment_label = Label(frame, font=(<span class="hljs-string">"koliko-Bold.ttf"</span>, <span class="hljs-number">20</span>), bg=<span class="hljs-string">'black'</span>, fg=<span class="hljs-string">'white'</span>)
<span class="hljs-comment">###ajout bouton photo</span>
photo_button = Button(frame, text=<span class="hljs-string">"Prendre une photo"</span>, font=(<span class="hljs-string">"koliko-Bold.ttf"</span>, <span class="hljs-number">20</span>), bg=<span class="hljs-string">'gold'</span>, fg=<span class="hljs-string">'black'</span>, command=take_a_photo)
YES_button = Button(print_frame, text=<span class="hljs-string">"Oui"</span>, font=(<span class="hljs-string">"koliko-Bold.ttf"</span>, <span class="hljs-number">20</span>), bg=<span class="hljs-string">'green'</span>, fg=<span class="hljs-string">'white'</span>)
NO_button = Button(print_frame, text=<span class="hljs-string">"Non"</span>, font=(<span class="hljs-string">"koliko-Bold.ttf"</span>, <span class="hljs-number">20</span>), bg=<span class="hljs-string">'red'</span>, fg=<span class="hljs-string">'white'</span>, command=back_to_photo)
enable_flash_button = Button(flash_frame, text=<span class="hljs-string">"EF"</span>, font=(<span class="hljs-string">"koliko-Bold.ttf"</span>, <span class="hljs-number">8</span>), bg=<span class="hljs-string">'grey'</span>, fg=<span class="hljs-string">'black'</span>, command=enable_flash_light)
disable_flash_button = Button(flash_frame, text=<span class="hljs-string">"DF"</span>, font=(<span class="hljs-string">"koliko-Bold.ttf"</span>, <span class="hljs-number">8</span>), bg=<span class="hljs-string">'grey'</span>, fg=<span class="hljs-string">'black'</span>, command=disable_flash_light)
<span class="hljs-comment">###ajout photo</span>
maphoto = Image.<span class="hljs-built_in">open</span>(<span class="hljs-string">"Images/base_background.png"</span>) <span class="hljs-comment">#Chargement d'une image à partir de PIL</span>
maphoto = maphoto.resize((<span class="hljs-number">1280</span>,<span class="hljs-number">720</span>))
photo = ImageTk.PhotoImage(maphoto) <span class="hljs-comment">#Création d'une image compatible Tkinter</span>
photo_label = Label(frame, image=photo, width = <span class="hljs-number">1280</span>, height = <span class="hljs-number">720</span>, borderwidth=<span class="hljs-number">0</span>)
photo_label.image = photo <span class="hljs-comment">#Maintient en vie de photo dans un objet non détruit</span>
<span class="hljs-comment">###ajout horloge</span>
horloge = Label(mainWindow, font=<span class="hljs-string">"koliko-Bold.ttf"</span>, bg=<span class="hljs-string">'black'</span>, fg=<span class="hljs-string">'white'</span>)
<span class="hljs-string">""" +PLACEMENT+ """</span>
title_frame.pack(expand=<span class="hljs-literal">True</span>)
Self.grid(row=<span class="hljs-number">0</span>, column=<span class="hljs-number">0</span>)
IN.grid(row=<span class="hljs-number">0</span>, column=<span class="hljs-number">1</span>)
horloge.pack()
frame.pack(expand=<span class="hljs-literal">True</span>)
photo_label.grid(row=<span class="hljs-number">0</span>, column=<span class="hljs-number">0</span>)
comment_label.grid(row=<span class="hljs-number">1</span>, column=<span class="hljs-number">0</span>)
photo_button.grid(row=<span class="hljs-number">2</span>, column=<span class="hljs-number">0</span>)
<span class="hljs-string">""""""</span>
flash_frame.pack(expand=<span class="hljs-literal">True</span>)
enable_flash_button.grid(row=<span class="hljs-number">0</span>, column=<span class="hljs-number">0</span>)
disable_flash_button.grid(row=<span class="hljs-number">0</span>, column=<span class="hljs-number">1</span>)
<span class="hljs-string">""""""</span>
print_frame.grid_forget()
YES_button.grid_forget()
NO_button.grid_forget()
<span class="hljs-string">""" -PLACEMENT- """</span>
<span class="hljs-string">""" -FONCTION PRINCIPALE- """</span>
digital_clock() <span class="hljs-comment">#horloge</span>
<span class="hljs-comment">#physical_button_loop(mainWindow)</span>
<span class="hljs-comment">#physical_button2_loop(mainWindow)</span>
GPIO.add_event_detect(pinBtnPhoto, GPIO.FALLING, callback=take_a_photo, bouncetime=<span class="hljs-number">1000</span>)
GPIO.add_event_detect(pinBtnFlash, GPIO.FALLING, callback=enable_flash_light, bouncetime=<span class="hljs-number">500</span>)
GPIO.add_event_detect(pinBtnNoFlash, GPIO.FALLING, callback=disable_flash_light, bouncetime=<span class="hljs-number">500</span>)
mainWindow.mainloop() <span class="hljs-comment">#fonction principale application</span>
<span class="hljs-string">""" -FONCTION PRINCIPALE- """</span>
</code></pre></div>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533202023-12-14T11:15:48+01:00ajarry/@ajarryhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253320<figure><blockquote>
<p>Est-ce que tu as aussi supprimé la l.140 ? car tu avais déjà configuré une interruption en fait.</p>
<p>Je crois que le plus simple est que tu repostes le nouveau code.</p>
<p>EDIT : En fait je viens de comprendre que c’est le deuxième bouton avec le commentaire de vayel, mb</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253312">romantik</a></figcaption></figure>
<p>Oui j’ai bien supprimé ma boucle mais c’est au niveau des events je pense… Je n’ai pas accès à mon code tout de suite, je le posterai dès que possible. <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"> </p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533122023-12-13T16:30:19+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253312<p>Est-ce que tu as aussi supprimé la l.140 ? car tu avais déjà configuré une interruption en fait.</p>
<p>Je crois que le plus simple est que tu repostes le nouveau code.</p>
<p>EDIT : En fait je viens de comprendre que c’est le deuxième bouton avec le commentaire de vayel, mb</p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533112023-12-13T15:50:10+01:00ajarry/@ajarryhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253311<p>J’ai bien enlevé la boucle mais en fait j’ai l’impression que c’est que l’action s’exécute et ne s’arrête pas, j’ai une led qui fonctionne en même temps que ma commande et cette led reste allumée même lorsque je ferme le programme, je sais qu’il existe le cleanup (que j’ai pas mis) mais je pense que le problème ne vient pas de là à la base.</p>
<p>Pour l’autre bouton j’ai déclaré le bouton sur "pinBtn2" pour l’instant et il est donc sur une autre pin. Mais par contre j’ai refais la même syntaxe, ce qui veut dire que j’ai 2 lignes <code>add_event_detect()</code> avec chacune ses gpio et ses commandes.</p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533102023-12-13T15:22:53+01:00Vayel/@Vayelhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253310<p>As-tu toujours ta boucle infinie ligne 142 ? Si oui, c’est normal que le code s’exécute deux fois : une fois dans la boucle, une fois via l’interruption.</p>
<p>Pour ton deuxième bouton, as-tu changer le pin dans l’appel à <code>add_event_detect()</code> (ligne 140) ?</p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2533092023-12-13T15:12:00+01:00ajarry/@ajarryhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253309<p>Bonjour Vayel,</p>
<p>Merci pour ta réponse ! J’ai essayé de faire cette technique mais lorsque je presse le bouton, mon action s’exécute 2 fois. J’ai pensé que c’était dû au bouncetime mais même en le modifiant ça ne change pas. Aussi j’ai la même chose à faire avec un deuxième bouton (une deuxième action donc) mais elle n’est pas prise en compte pourtant j’ai repris la même syntaxe…</p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2532352023-12-08T16:42:32+01:00Vayel/@Vayelhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253235<p>Plutôt qu’une boule infinie pour lire l’état de ton bouton, je te conseille de passer par un système d’interruption : <a href="https://roboticsbackend.com/raspberry-pi-gpio-interrupts-tutorial/">https://roboticsbackend.com/raspberry-pi-gpio-interrupts-tutorial/</a></p>
<p>Comme cela se passe dans un autre thread (i.e. en "parallèle" du programme principal), ta boucle d’interface ne sera pas bloquée.</p>
<p>En gros tu aurais :</p>
<div class="hljs-code-div hljs-code-python"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span></div><pre><code class="hljs language-python"><span class="hljs-comment"># Définition de l'interface et des évènements</span>
<span class="hljs-comment"># ...</span>
GPIO.setmode(GPIO.BCM)
GPIO.setup(BUTTON_GPIO, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect(
BUTTON_GPIO,
GPIO.FALLING,
callback=take_photo,
bouncetime=<span class="hljs-number">50</span>
)
mainWindow.mainloop()
</code></pre></div>
<p>Ta boucle infinie ligne 142 fait doublon avec l’interruption qui, en gros, exécute la même chose dans un second thread donc sans bloquer le programme principal.</p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2532302023-12-08T14:28:28+01:00ajarry/@ajarryhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253230<p>Merci pour ta réponse, j’ai modifié un peu le programme que tu m’as donné et ça a l’air de fonctionner pour le moment.
Pour le sleep qu’il y a, c’est pas super grave car cela correspond à un temps d’attente (prise de la photo) mais tu as raison si j’arrive à faire sans ce sera que meilleur.
Pour les classes aussi tu as raison mais je me suis jeté dans le code directement en apprenant sur le tas car je ne savais pas coder en Python… Toujours pareil, si j’arrive à modifier mon code pour le rendre plus propre je le ferai ! <img src="/static/smileys/svg/hihi.svg" alt="^^" class="smiley"> </p>Python execution de commandes sur une IHM depuis un bouton en GPIO, message #2532132023-12-07T16:08:30+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/17245/python-execution-de-commandes-sur-une-ihm-depuis-un-bouton-en-gpio/?page=1#p253213<p>pas vraiment, je connais mal python, mais tu utilises déjà un timer dans ton <code>digital_clock()</code> avec <code>horloge.after()</code>. Tu peux gérer de manière assez similaire.<br>
ça va donner quelque chose un peu comme ça si je touche au minimum à ton code</p>
<div class="hljs-code-div hljs-code-python"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span></div><pre><code class="hljs language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">physical_button_loop</span>(<span class="hljs-params">attachedWindow</span>):</span>
etat = GPIO.<span class="hljs-built_in">input</span>(pinBtn)
<span class="hljs-comment"># etat==0 => bouton appuye => LED allumee</span>
<span class="hljs-keyword">if</span> (etat == <span class="hljs-number">0</span>) :
GPIO.output(<span class="hljs-number">16</span>,<span class="hljs-literal">True</span>)
<span class="hljs-keyword">else</span> :
GPIO.output(<span class="hljs-number">16</span>, <span class="hljs-literal">False</span>)
<span class="hljs-comment"># Scruter le bouton toutes les 20ms</span>
attachedWindow.after(<span class="hljs-number">20</span>, <span class="hljs-keyword">lambda</span> : physical_button_loop(attachedWindow))
<span class="hljs-comment"># [...]</span>
<span class="hljs-string">""" -FONCTION PRINCIPALE- """</span>
digital_clock() <span class="hljs-comment">#horloge</span>
physical_button_loop(mainWindow)
mainWindow.mainloop() <span class="hljs-comment">#fonction principale application</span>
<span class="hljs-string">""" -FONCTION PRINCIPALE- """</span>
</code></pre></div>
<p>mais je pense que tu devrais structurer tout ça et faire des classes, dont la classe MainWindow qui gèrera ce timer en interne (ça éviterait de donner le widget en argument)</p>
<p>Par ailleurs, je vois des sleep qui trainent dans ton code. ça va bloquer les interactions utilisateurs. à partir du moment où tu fais de l’IHM, que tu fonctionne par évènement, tu ne peux pas te permettre de mettre ton programme en pause car il doit être disponible pour l’utilisateur.<br>
Aussi, si tu as de gros traitements, tu peux les déléguer à des coroutines pour libérer ton IHM.</p>