fyflo
Posts: 1
Joined: Tue Feb 26, 2019 1:21 pm

Projet chronomètre

Tue Feb 26, 2019 1:26 pm

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é`

jelopo
Posts: 1509
Joined: Wed Oct 17, 2012 7:53 pm

Re: Projet chronomètre

Thu Feb 28, 2019 6:43 am

Bonjour,

C'est un problème d’algorithmique.
Déjà le nom des variables n'est pas optimisé pour comprendre le problème (date, date1,date2), alors que date, c'est l'heure de la dernière mesure, date1, c'est le début du comptage, et date2 c'est une différence de temps.

date2 est toujours calculé à partir de l'heure de début de comptage date1, donc le compteur ne s'arrête pas quand on est au dessous de la consigne
Il n'y a pas de mémorisation de la dernière valeur de date2 quand les 2 conditions si sont passées.

Voici une proposition, à voir ci c'est bon, je n'ai pas testé

Code: Select all

if (a >= tempconsigne) and (tempmem == 1):
   if date2 == 0:
         date2 = date-date1
   else:
         date2=date2-date
A+

Return to “Français”