Go Down

Topic: Le Programmateur Horaire nouveau est arrivé => instable dans les horaires ? (Read 774 times) previous topic - next topic

bobardui

Bonjour,
Je me suis intéressé de près au projet finis de Sweethome publier sous le titre "Le Programmateur Horaire nouveau est arrivé " 
Après avoir acheté les composants, réalisé le câblage et copier le programme, j'ai changer les horaires dans la table "TabEvt" pour être présent au moment du fonctionnement du prototype.
Tout fonctionne bien avec quelques erreurs dans les heures..., à titre d'exemple, j'ai programmer sur la voie 1 une mise en action à 20h08 et un arrêt à 21h11. Dans la réalité c'est une mise en marche à 20h08 avec un arrêt à 20h11, puis une deuxième mise en marche à 21h08 avec un arrêt à 21h11.
Cela ne se produit pas sur toutes les voies ... Pourquoi ?
Merci de votre aide

lesept

Ton message n'est pas posté dans la bonne section, il n'aura certainement pas beaucoup de réponses ici, au bar (seuls quelques alcooliques comme moi y trainent  :smiley-confuse: malgré le couvre feu) : demande au modo de le déplacer (bouton "report to moderator")

Pour répondre à ta question, c'est dû à la manière de tester l'heure dans le code : elle ne fonctionne pas dans tous les cas. Après lecture rapide du code, je pense que ton problème doit se produire si les minutes de l'heure de fin sont supérieures aux minutes de l'heure de début d'une plage donnée.

Je pense que le code aura aussi des difficultés si une plage horaire est située autour de minuit, mais c'est un cas à traiter lorsque le reste ira bien...

Il faudrait modifier le code, il est possible de l'optimiser en faisant des boucles et surtout en changeant la façon de coder les heures. Le plus efficace est d'utiliser un int qui vaut heures * 100 + minutes, ça facilite les comparaisons.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

bobardui

En effet le dérèglement se produit bien dans le cas que tu décris
Par contre je n'ai pas compris ta proposition « heures *100 + minutes »
Peux-tu m'aider avec un exemple ?


Pas j'ai demandé au modérateur de déplacer le message dans la bonne rubrique

lesept

Ça consiste à représenter l'heure avec un format réduit qui permet les comparaisons. Par exemple, on code 14:21 avec le chiffre 1421.
Comme ça on voit facilement que 934 < 1254 par exemple
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

bobardui

Ok, je comprends mieux ,
Cela veut dire que je dois appliquer cette formule à l'info qui vient de l'horloge, et aussi dans la table " TabEvt" qui sert de mémorisation des plages programmées
J'espère que j'arrive à me faire comprendre...
Mais alors comment faire  ? 
Dois-je remplacer le " nowhour" et le "nowminute",  ou ajouter des variables ?
Merci de ton aide 

lesept

Tu crées une variable :
Code: [Select]
int heure = now.hour() * 100 + now.minute();

Ensuite, tu parcours le tableau TabEvt :
Code: [Select]
void loop() {
  DateTime now = RTC.now();
  // Afficher l'heure sur la premiêre ligne du LCD
  lcd.setCursor(0, 0);       
  lcd.print("Heure: ");
  if (now.hour() < 10) lcd.print("0");
  lcd.print(now.hour());
  lcd.print(":");
  if (now.minute() < 10) lcd.print("0");
  lcd.print(now.minute());
  // Afficher Voies actives sur la deuxième ligne du LCD
  lcd.setCursor(0,1);
  lcd.print("Voies:");
  int heure = now.hour() * 100 + now.minute();

  for (int i = 0; i < 6; i++) {
    if (TabEvt[i][0] == 25) continue; // On en fait rien dans ce cas
    int heureDebut = TabEvt[i][0] * 100 + TabEvt[i][1];
    int heureFin = TabEvt[i][2] * 100 + TabEvt[i][3];
    if (heureDebut <= heure && heure < heureFin) {
      lcd.print(i+1);
      digitalWrite (PinSorties[i], LOW);
    } else {
      lcd.print("-");
      digitalWrite (PinSorties[i], HIGH);
    }
  }
  delay(1000);
  lcd.clear();
}


(pas testé...)
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

bobardui

Merci , 
Je vois que même qu'au " bar " tu es très efficace (rire..)
J'ai à peu près compris le codage dans le Void Loop
Après avoir saisi ton programme, à la vérification, on m'indiquait ne pas connaitre " now ", donc j'ai créé la variable " DateTime now = RTC.now(); ", puis le compilateur à accepté l'ensemble de la programmation
Ai-je bien fait ?
Par contre après téléversement mon LCD est blanc ou vide
J'ai essayé d'écrire différemment la TabEvt, mais cela bugg 
J'espère que tu es patient pour me transmettre tes connaissances qui me permettront de progresser

bobardui

Au final en n'inscrivant aucune variable supplémentaire, ça a l'air de fonctionner , les voies concernées dans les tranches horaires fonctionnent
Demain soir je me remet aux essais pour s'assurer de la fiabilité de ton void loop
Si je peux me permettre, je souhaitais avoir l'affichage de la TabEvt sur un LCD ou autre écran, j'ai consulté plusieurs tutos sur les différentes possibilités mais aucune ne m'a paru correspondre à mon besoin
As-tu une solution à me proposer ?

lesept

Personnellement, j'utilise peu voire pas du tout ces afficheurs que je trouve trop limités. Je préfère les écrans OLED monochromes ou TFT couleurs.

Pour toi ça dépend de l'écran que tu veux utiliser.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

bobardui

Bonsoir
Comme je suis débutant, j'essaie de m'inspirer de projets finis pour comprendre, monter et utiliser dans une activité de confort.
En l'occurrence, je vais programmer plusieurs plages horaires pour faire fonctionner des électrovannes en fonction de l'humidité du sol
Par le passé les sondes d'humidité étaient toujours sous tension et cela créait de la corrosion aux bornes des sondes. Donc maintenant en mettant des plages horaires, elles ne seront que quelques minutes sous tension ( un individu ne contrôle l'humidité qu'une fois par jour, et n'arrose parfois que tous les deux jours)
Je ne sais pas comment piloter un OLED (toujours débutant), j'accepte volontiers que l'on me guide, d'autant plus que je suis curieux et satisfait d'apprendre
L'objectif final de mon projet est d'être autonome en arrosage sans être présent à la maison, et qui sait, pourrait avoir à distance l'information que tout fonctionne
Jusqu'à maintenant j'ai fabriquer beaucoup d'automatisme avec de relais, fins de course, etc.. mais aucun avec des microprocesseurs et écrans
C'est un début dans ce monde merveilleux
Merci encore de ton aide

lesept

Tu peux regarder ce tuto. Si ça te convient fais bien attention à acheter un écran OLED avec 4 pins, donc pilotable en I2C.

A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

bobardui

Merci pour ce tuto très intéressant, mais qui va me demander d'être encore plus performant ( Challenge)
L'écran OLED devrait me permettre l'affichage d'un plus grand nombre d'information, reste à savoir comment faire pour avoir le contenu de la TabEvt (les plages horaires)

Ton code du programme fonctionne bien pour l'instant (un grand Merci)
Mais j'ai besoin d'une petite explication car je n'ai pas créé la variable "int heure = now.hour() * 100 + now.minute();
Juste pour confirmer mes petites connaissances >= " une variable est toujours inscrite avant le " Woid Setup " ? 
 

lesept

Non une variable est soit globale (sous entendu à l'ensemble du code) soit locale (sous entendu à un bloc et ses éventuels sous blocs). Un bloc est un ensemble de lignes entre deux accolades.

Ce que je viens de décrire s'appelle 'la portée des variables'.
Pour définir une variable globale tu la déclares en dehors des blocs principaux, c'est a dire le setup, la loop et les fonctions.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

bobardui

Ah ok
C'est pour cela que çà fonctionne sans problème
As-tu une idée de paramétrage pour afficher le contenu de la TabEvt ?

lesept

Tu veux l'afficher comment?
Genre :
Créneau 1: 14:23 - 18:24
Créneau 2 etc

Il faut que tu apprennes à te servir de l'écran OLED en examinant les exemples de la bibliothèque d'affichage.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up