J'aimerais programmer un programmateur horaire (qu'on branche a une prise)
C'est un projet sur une carte arduino, le problème c'est que je ne vois pas du tout comment programmer ca (eh oui eh oui je suis débutant :/)
Je pensais partir sur des if() mais c'est un vrai casse tête..
Voila quelques exemples :
Heure départ > 1:20 / Heure fin > 9:00 / Ce qui donne 8:20, Heure fin - Heure départ
Heure départ > 9:00 / Heure fin > 1:20 / Ce qui donne 16:20, (24h - Heure départ) + Heure fin
Je crois que ces deux calculs couvrent toutes les possibilités.
Le problème c'est comment sélectionner le bon calcul en fonction de l'heure de début et l'heure de fin, et j'avoue je m'y perds un peu (Je ne m'occupe pas des minutes pour le moment)
Voila une esquisse, qui fonctionnent dans les grandes lignes, mais certains essais avec différentes heures me renvoie deux cas, donc je pense que c'es surtout les conditions à peaufiner/améliorer:
Tu vas galérer en essayant de gérer les heures et les minutes. Il faut tout convertir en minutes pour faire les calculs et les tests.
Encore mieux utiliser la librairie dateTime qui te donne (entre autre) l'heure au format unix qui te permet de faire les calculs et les comparaisons facilement.
Tout dépend de comment tu vas effectuer tes calcul et déterminer l'heure d'ouverture ou de fermeture du programmateur.
Tout d'abord, as-tu vraiment besoin de calculer le temps entre les deux opérations ?
En général ce genre de machin se met en route à une heure définie et se coupe à une autre heure définie...
Donc tu pourrais simplement comparer l'heure actuelle avec l'heure de démarrage ou de coupure.
Si elle correspondent, tu actives ou désactives le système.
Pas besoin de savants calculs pour cela.
D'autre part, et plus important : Tu parles de brancher ton système sur une prise de courant....
Il faut faire extrêmement attention lorsque l'on souhaite faire fonctionner un appareil sur le secteur. Il y danger de mort.
Je ne sais pas quel est ton niveau en électronique, mais s'il est proche de ton niveau de programmation (ne prend pas mal ce que j'écris ici, c'est une constatation, pas un jugement ) je ne saurais trop te conseiller de te tourner vers un projet moins dangereux pour débuter.
Mais toi seul connaît ton niveau en ces matières.
t1 = 60 * startHour + startMin;
t2 = 60 * endHour + endMin;
currentTime = 60 * hour + min; // on suppose que hour et min sont l'heure du moment
// calcul de la différence de temps
if (t1 > t2) deltaT = t1 - t2; else deltaT = t2-t1;
deltaHour = deltaT / 60;
deltaMin = deltaT % 60; // % c'est le modulo, le reste entier de la division par 60 ici
// actions en fonction du temps présent par rapport aux bornes
if ((currentTime > t1) && (currentTime < t2)) {
// on est entre les 2
} else if (currentTime >= t2) {
// on est après l'heure de fin
} else {
// on est avant l'heure de début
}
Sauf erreur de ma part, JML, le code de calcul de la durée est erroné:
Si, par exemple, StartHour = 22h et Endhour = 1h du matin, la routine calcule
2260 - 160 ce qui correspond à une durée de 21h... (Au lieu des 3 prévues)
J'opterais plutôt pour l'approche suivante
startTime = 60 * startHour + startMin;
endTime = 60 * endHour + endMin;
currentTime = 60 * hour + min; // on suppose que hour et min sont l'heure du moment
// calcul de la différence de temps
if (endTime < startTime)
// Si l'heure de fin est plus petite que l'heure de début, on ajoute 24h à l'heure de fin
deltaT = ( endTime + 24*60) - startTime;
else
deltaT = endTime-startTime;
Ainsi, si l'heure de fin est plus petite que l'heure de début, on fait le calcul comme si elle tombait le jour suivant et cette fois, c'est correct.
@Coyotte
Question de définition - si vous prenez comme base que end est toujours après start dans le temps et que donc ça peut s'étendre sur 2 jours alors vous avez raison
Le test de start plus tard que end c'est juste sur la même journée si ces valeurs inversées Pour le deltaT car modulo ne fonctionne pas bien sur les nombres négatifs
Mais si vous voulez gérer plusieurs jours l'idéal alors c'est de rajouter des infos suplémentaires sur startDay et endDay par exemple
si vous prenez comme base que end est toujours après start dans le temps
...Si 'End' est avant 'Start', il faut une De Lorean pour résoudre le problème...
@Kamill: Je pense que ces if étaient la mise en oeuvre, compliquée, du cas particulier 1h20/9h00...
Mais seul l'intéressé pourrait confirmer ou infirmer la chose...
En toute bonne logique je suis d'accord, mais si end=1h30 du matin et start=6h du matin, toutes les interprétations sont possibles vu que la notion de jours n'a pas été abordée dans le post d'origine
2260 - 160 ce qui correspond à une durée de 21h... (Au lieu des 3 prévues)
ce n'est "que" votre interprétation logique mais pas forcément adaptée. Pour pousser si je dis start = 12h et end=12h est-ce que je veux un fonctionnement de 24h ou de 0 minutes (et quid des secondes)?
En poursuivant ce raisonnement c'est comme cela qu'on arrive à représenter les temps en format unix par exemple, nombre de secondes écoulées depuis le "début du monde" (version informatique du début of course) de façon à,effectivement pouvoir comparer des dates