Système chronomètre

Bonjour,

Je suis actuellement en cour de projet en entreprise.

Grâce a une carte Raspberry, mon but est de chronométrer le temps d’étuve d’un four.

Voici mon problème :

Le chronomètre se déclenche lorsque la température dépasse le seuil de 25°C puis se s’arrête lorsque la température est inférieur à 25°C et reprend son cycle lorsque que la température repasse la consigne de 25°C.
Cependant, le chrono prend en compte le temps passé en dessous du seuil de 25°C ce que ne souhaite pas, auriez vous une astuce afin de régler ce problème ?

Je vous fourni ci-dessous le programme actuel, en vous remerciant pour votre aide et pour vos réponse.

Programme :

# before import the max6675, you must save the max6675.py file at "/usr/lib/python2.7/dist-packages"

# wiring
# Raspberry         MAX6675
#       GND   ------   GND
#        5V     ------   VCC
#   pin 18     ------   SCK
#   pin 22     ------   CS
#   pin 16     ------   SO

import random, sys, time, pygame, datetime, max6675
from pygame.locals import *

# set the pin for communicate with MAX6675
cs = 22
sck = 18
so = 16

# max6675.set_pin(CS, SCK, SO, unit)   [unit : 0 - raw, 1 - Celsius, 2 - Fahrenheit]
max6675.set_pin(cs, sck, so, 1)


FPS = 30
WINDOWWIDTH = 1280
WINDOWHEIGHT = 960
FLASHSPEED = 500 # in milliseconds
FLASHDELAY = 200 # in milliseconds
BUTTONSIZE = 200
BUTTONGAPSIZE = 20
TIMEOUT = 4 # seconds before game over if no button is pushed.

#                R    G    B
WHITE        = (255, 255, 255)
BLACK        = (  0,   0,   0)
BRIGHTRED    = (255,   0,   0)
RED          = (155,   0,   0)
BRIGHTGREEN  = (  0, 255,   0)
GREEN        = (  0, 155,   0)
BRIGHTBLUE   = (  0,   0, 255)
BLUE         = (  0,   0, 155)
BRIGHTYELLOW = (255, 255,   0)
YELLOW       = (155, 155,   0)
DARKGRAY     = ( 40,  40,  40)
bgColor = BLACK


XMARGIN = int((WINDOWWIDTH - (2 * BUTTONSIZE) - BUTTONGAPSIZE) / 2)
YMARGIN = int((WINDOWHEIGHT - (2 * BUTTONSIZE) - BUTTONGAPSIZE) / 2)

# Rect objects for each of the four buttons
YELLOWRECT = pygame.Rect(XMARGIN, YMARGIN, BUTTONSIZE, BUTTONSIZE)
BLUERECT   = pygame.Rect(XMARGIN + BUTTONSIZE + BUTTONGAPSIZE, YMARGIN, BUTTONSIZE, BUTTONSIZE)
REDRECT    = pygame.Rect(XMARGIN, YMARGIN + BUTTONSIZE + BUTTONGAPSIZE, BUTTONSIZE, BUTTONSIZE)
GREENRECT  = pygame.Rect(XMARGIN + BUTTONSIZE + BUTTONGAPSIZE, YMARGIN + BUTTONSIZE + BUTTONGAPSIZE, BUTTONSIZE, BUTTONSIZE)
score = 0

def main():
    global FPSCLOCK, DISPLAYSURF, BASICFONT, BEEP1, BEEP2, BEEP3, BEEP4

def terminate():
    pygame.quit()
    sys.exit()

def checkForQuit():
    for event in pygame.event.get(QUIT): # get all the QUIT events
        terminate() # terminate if any QUIT events are present
    for event in pygame.event.get(KEYUP): # get all the KEYUP events
        if event.key == K_ESCAPE:
            terminate() # terminate if the KEYUP event was for the Esc key
        #pygame.event.post(event) # put the other KEYUP event objects back


pygame.init()
FPSCLOCK = pygame.time.Clock()
DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Contrôle du four!')
BASICFONT = pygame.font.Font('freesansbold.ttf', 16)
BASICFONT2 = pygame.font.Font('freesansbold.ttf', 32)
BASICFONT3 = pygame.font.Font('freesansbold.ttf', 64)
BASICFONT4 = pygame.font.Font('freesansbold.ttf', 96)
infoSurf = BASICFONT.render('DV GROUP V1.0', 1, YELLOW)
infoRect = infoSurf.get_rect()
infoRect.topleft = (10, WINDOWHEIGHT - 25)
date1 = 0
tempconsigne = 25
tempmem = 0
date = 0
date2 = 0
instant = 0
instant2 = "Attente"
datedepart = datetime.datetime.now()
instant1 = (str(datedepart.hour) + ':' + str(datedepart.minute)+ ':' + str(datedepart.second))

while True: # main game loop
    # read temperature connected at CS 22
    a = max6675.read_temp(cs)
    date = datetime.datetime.now()
    instant = (str(date.hour) + ':' + str(date.minute)+ ':' + str(date.second))

    if (a >= tempconsigne) and (tempmem == 0):
        tempmem =1
        date1 = datetime.datetime.now()
        instant2 = (str(date1.hour) + ':' + str(date1.minute)+ ':' + str(date1.second))
    if (a >= tempconsigne) and (tempmem == 1):
        date2 = date-date1
        #instant2 = (str(date.hour) + ':' + str(date.minute)+ ':' + str(date.second))
    
    DISPLAYSURF.fill(bgColor)
    DISPLAYSURF.blit(infoSurf, infoRect)
    #affichage heure
    scoreSurf = BASICFONT.render('' + str(instant), 1, WHITE)
    scoreRect = scoreSurf.get_rect()
    scoreRect.topleft = (WINDOWWIDTH - 100, WINDOWHEIGHT - 25)
    DISPLAYSURF.blit(scoreSurf, scoreRect)
    #affichage heure demarrage
    scoreSurf = BASICFONT2.render('Heure de départ:' + str(instant1), 1, YELLOW)
    scoreRect = scoreSurf.get_rect()
    scoreRect.topleft = (10, 0)
    DISPLAYSURF.blit(scoreSurf, scoreRect)
    #affichage heure temp atteind
    scoreSurf = BASICFONT2.render('Heure temp ok:' + str(instant2), 1, YELLOW)
    scoreRect = scoreSurf.get_rect()
    scoreRect.topleft = (10, 30)
    DISPLAYSURF.blit(scoreSurf, scoreRect)
    #affiche text temps etuvage
    scoreSurf1 = BASICFONT2.render('Temps d étuvage: ', 1, RED)
    scoreRect1 = scoreSurf1.get_rect()
    scoreRect1.topleft = (10, 60)
    DISPLAYSURF.blit(scoreSurf1, scoreRect1)
    #affiche compteur temps etuvage 
    scoreSurf1 = BASICFONT3.render(str(date2), 1, RED)
    scoreRect1 = scoreSurf1.get_rect()
    scoreRect1.topleft = (10, 85)
    DISPLAYSURF.blit(scoreSurf1, scoreRect1)
    #affiche text temperature four 
    scoreSurf1 = BASICFONT2.render('Température Four', 1, BLUE)
    scoreRect1 = scoreSurf1.get_rect()
    scoreRect1.topleft = (10, 150)
    DISPLAYSURF.blit(scoreSurf1, scoreRect1)
    #affiche temperature four 
    scoreSurf1 = BASICFONT3.render(str(round(a,0)) + '°C', 1, BLUE)
    scoreRect1 = scoreSurf1.get_rect()
    scoreRect1.topleft = (10, 180)
    DISPLAYSURF.blit(scoreSurf1, scoreRect1)
    #affiche  consigne temperature
    scoreSurf1 = BASICFONT2.render('Consigne de température', 1, GREEN)
    scoreRect1 = scoreSurf1.get_rect()
    scoreRect1.topleft = (10, 245)
    DISPLAYSURF.blit(scoreSurf1, scoreRect1)
    #affiche  temperature de consigne 
    scoreSurf1 = BASICFONT3.render(str(round(tempconsigne,0)) + '°C', 1, GREEN)
    scoreRect1 = scoreSurf1.get_rect()
    scoreRect1.topleft = (10, 280)
    DISPLAYSURF.blit(scoreSurf1, scoreRect1)
    
    checkForQuit()
    #max6675.time.sleep(2)
    pygame.display.update()
    pygame.time.wait(1000)`Texte préformaté`

Salut je m’y connais pas mais je propose quand même un ptit truc.
Essayer de placer une autre condition
If (tempconsigne<=24) {action=0}
else {action=1}

Je te propose 2 approches:

  • Soit tu démarres / arrêtes le chrono lorsque tu changes d’état (> 24°C ou < 24°C)
  • dès que la température est supérieure à 24°C, tu incrémentes toutes les secondes un timer

Je souhaiterai qu’une fois le système enclenché, que tout se fasse de manière autonome et que aucune modification manuel soit effectué. Miguel66000, la condition que tu me propose, je l’intègre ou dans le programme ?

Dsl je touche juste le php. Généralement on peut gérer ça avec une condition if.

Peux tu redonner une version explicative de ta demande pour essayer de mieux comprendre et peut être qu’un pro va te donner une solution.

:mouse:

Salut,
Ça, c’est le souhait.
Mais tu as plutôt ceci

C’est bien ça ?

Si c’est ça, ce n’est pas causé par « tempconsigne = 25 » ?

Je verrais aussi :

  • pas d’action si tempconsigne=<24
  • un démarrage si tempconsigne=>24
  • une pause si tempconsigne=<24 alors que chrono lancé
  • une reprise si tempconsigne=>24 alors que chrono est déjà à un temps>0

++

Je ne comprends pas trop le problème que tu rencontres. Le chrono s’arrête mais il prend en compte ? Le programme paraît bien réalisé.
Voir aussi les propositions de neoraptor123.

Définitions:
Repère: tempconsigne = 25
Température en temps réel (sonde 3pin gpio):
a = max6675.read_temp(cs)

Lancement de la boucle while
Condition relative à l’action
if (a >= tempconsigne)
Si température supérieur ou égal à 25
Affichage
checkForQuit()
pygame.display.update()
pygame.time.wait(1000)

La condition if execute les actions si la température est supérieure ou egal à 25, mais que se passe t’il si la temp est inferieure à 25 ?
C’est un compteur de temps des moments supérieur à 25°?

Je prend en compte vos remarque, pour la mauvaise compréhension, je m’excuse.Je m’explique surement mal.

Le chronomètre est censé me donner une valeur de temps seulement lorsque T > 25°C.
Ici lorsque T < 25°C en effet le chronomètre s’arrête à l’afficheur mais continue de tourner sans l’afficher c’est a dire que :

si au bout de 40 secondes la température < 25°C le chrono se stop à 40 seconde mais imaginons que la température repasse le seuil des 25°C 1 minutes après, le chronomètre est censé reprendre à 40 seconde mais ici, il va afficher 1 min 40 sec. (Il prend donc en compte sans l’afficher le temps où T < 25°C

J’espère que vous auriez compris mon problème,
en m’excusant pour mes explication peu clair.

Comme tu vois j’analyse ton code. Je gère le php mais là on est sur du python.

Pour moi c’est plus clair avec ta 2ème explication merci.

Le compteur qui continue à compter en arrière plan c fou ça lol. Je cherche la ligne dans ton code qui effectue l’enregistrement du comptage.
Il y a juste un appel d’une librairie python « pigame », aucun fichier rattaché ? Tout est là dans ce code ?

Un codeur python pourrait te resoudre rapidement ton problème je pense.

A ma connaissance oui tout est la, je ne suis pas non plus un expert en programmation malheureusement x).
cela m’arrangerai

Le code est censé faire la somme uniquement de l’ensemble des instants au dessus de 25°

voila exactement, le but final est effectivement sa, la somme de l’ensemble des instant au dessus de 25°C et le problème est la, je ne trouve pas la solution car le code ne fait pas cette addition mais prend tout en compte

On peut avoir une photo du compteur, pour visualiser graphiquement ?
Le code n’a peut être pas été conçu pour l’utilisation précise que tu voudrais. À la base il fait peut être la somme du temps total après lancement, je sais pas, je.dis ça parceque le code est fonctionnel et paraît bien réaliser.

La taille de la pièce jointe est trop imposante pour vous l’envoyer :frowning:

Ah oui c’est vrai le site prend que des images de petites tailles

Je pense qu’il va falloir rajouter des lignes de codes parceque le programme ne sait pas faire ce que tu lui demande. Il se base sur 2 références de dates et il fait juste la somme des secondes entre date1 (départ chrono) et date2 (temps actuel).
Mon raisonnement est juste ?

il faut tout simplement la somme des constante quand T > 25°C, mais qu’elle ligne de code ajouté ou modifier pour arriver a ce résultat ?

Essais de réduire la photo avant de uploader…

Le truc c’est que si mon raisonnement est juste, on peut pas lui imposer une pause et lui dire de ne pas compter. Parcequ’il calcule son total secondes suivant 2 repère temps (Calcul simpliste). Tu lui donnes 2 dates alors il peut te dire le temps entre ces 2 dates, mais il peut pas savoir s’il y a eu un ou plusieurs arrêt du chrono temporel entre ces 2 dates. Peut etre une piste…


Test 1

tempmem2 == 0

if (a >= tempconsigne) and (tempmem == 0): tempmem =1 date1 = datetime.datetime.now() instant2 = (str(date1.hour) + ‘:’ + str(date1.minute)+ ‘:’ + str(date1.second)) if (a >= tempconsigne) and (tempmem == 1): date2 = date-date1 #instant2 = (str(date.hour) + ‘:’ + str(date.minute)+ ‘:’ + str(date.second))

if (a <= 24) and (tempmem == 1) and (tempmem2 == 0):
date3 = datetime.datetime.now()
tempmem2 == 1
#instant3 = (str(date3.hour) + ‹ : › + str(date3.minute)+ ‹ : › + str(date3.second))

if (a <= 24) and (tempmem == 1) and (tempmem2 == 1):
date4 = datetime.datetime.now()
tempmem2 == 1
#instant4 = (str(date4.hour) + ‘:’ + str(date4.minute)+ ‘:’ + str(date4.second))
#resultat4 = (instant4-instant3)

if (a >= tempconsigne) and (tempmem == 1) and (tempmem2 == 1):
date5 = datetime.datetime.now()
tempmem2 == 0
#instant5 = (str(date5.hour) + ‘:’ + str(date5.minute)+ ‘:’ + str(date5.second))
#instant2 = (instant2-resultat4)


Test 2 (En dessous de 24° on décompte le temps. Sur ce test j’essais de récupérer des données relatives à la date quand il est sous les 24°, ça peut permettre de trouver une solution)

Pour faire ce test facilement, tu fais un copie-coller de tes 2 conditions que tu as sur ton programme.
Tu colles ça à la suite et tu remplaces (dans les 2 conditions que tu as donc coller) tempconsigne par 24 et tu inverses date1-date. Comme dans l’exemple ci-dessous

if (a >= tempconsigne) and (tempmem == 0): tempmem =1 date1 = datetime.datetime.now() instant2 = (str(date1.hour) + ‹ : › + str(date1.minute)+ ‹ : › + str(date1.second)) if (a >= tempconsigne) and (tempmem == 1): date2 = date1-date #instant2 = (str(date.hour) + ‹ : › + str(date.minute)+ ‹ : › + str(date.second))

if (a <= 24) and (tempmem == 0): tempmem =1 date1 = datetime.datetime.now() instant2 = (str(date1.hour) + ‹ : › + str(date1.minute)+ ‹ : › + str(date1.second)) if (a <= 24) and (tempmem == 1): date2 = date-date1 #instant2 = (str(date.hour) + ‹ : › + str(date.minute)+ ‹ : › + str(date.second))

… dis moi ce que le compteur affiche…


Test 3 (force la suppression du temps au total si inferieur à 24°)

if (a >= tempconsigne) and (tempmem == 0): tempmem =1 date1 = datetime.datetime.now() instant2 = (str(date1.hour) + ‹ : › + str(date1.minute)+ ‹ : › + str(date1.second)) if (a >= tempconsigne) and (tempmem == 1): date2 = date-date1 #instant2 = (str(date.hour) + ‹ : › + str(date.minute)+ ‹ : › + str(date.second))

if (a <= 24) and (tempmem == 1):
#instant2=(instant2-1000)

Je te remercie pour ton aide Miguel66000.

j’ai donc essayé cette piste, ai-je utilisé la bonne méthode, je ne sais pas, j’explique ma démarche :

J’ai donc ajouté tempmem2 == 0 dans la partie suivante du programme :

 pygame.init()
FPSCLOCK = pygame.time.Clock()
DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Contrôle du four!')
BASICFONT = pygame.font.Font('freesansbold.ttf', 16)
BASICFONT2 = pygame.font.Font('freesansbold.ttf', 32)
BASICFONT3 = pygame.font.Font('freesansbold.ttf', 64)
BASICFONT4 = pygame.font.Font('freesansbold.ttf', 96)
infoSurf = BASICFONT.render('DV GROUP V1.0', 1, YELLOW)
infoRect = infoSurf.get_rect()
infoRect.topleft = (10, WINDOWHEIGHT - 25)
date1 = 0
tempconsigne = 25
tempmem = 0
tempmem2 == 0
date = 0
date2 = 0
instant = 0
instant2 = "Attente"
datedepart = datetime.datetime.now()
instant1 = (str(datedepart.hour) + ':' + str(datedepart.minute)+ ':' + str(datedepart.second))

j’ai donc ensuite remplacer :

if (a >= tempconsigne) and (tempmem == 0):
        tempmem =1
        date1 = datetime.datetime.now()
        instant2 = (str(date1.hour) + ':' + str(date1.minute)+ ':' + str(date1.second))
    if (a >= tempconsigne) and (tempmem == 1):
        date2 = date-date1
        #instant2 = (str(date.hour) + ':' + str(date.minute)+ ':' + str(date.second))


par : 

if (a <= 24) and (tempmem == 1) and (tempmem2 == 0):
date3 = datetime.datetime.now()
tempmem2 == 1
#instant3 = (str(date3.hour) + ‘:’ + str(date3.minute)+ ‘:’ + str(date3.second))

if (a <= 24) and (tempmem == 1) and (tempmem2 == 1):
date4 = datetime.datetime.now()
tempmem2 == 1
#instant4 = (str(date4.hour) + ‘:’ + str(date4.minute)+ ‘:’ + str(date4.second))
#resultat4 = (instant4-instant3)

if (a >= tempconsigne) and (tempmem == 1) and (tempmem2 == 1):
date5 = datetime.datetime.now()
tempmem2 == 0
#instant5 = (str(date5.hour) + ‘:’ + str(date5.minute)+ ‘:’ + str(date5.second))
#instant2 = (instant2-resultat4)

Apres sa je test donc le programme et une erreur apparait ( expected an indented block ) concernant « date3 » de la code suivante : date3 = datetime.datetime.now()

Probleme résolu sur l’erreur que le programme m’affiché au démarrage.

Alors cette fois ci, le programme se lance correctement, mais lors du test avec la sonde de température, une fois le seuil de 25°C dépassé, le chronomètre ne se déclenche plus dutout (reste à 0 sec).