Aller au contenu


Photo
- - - - -

course du soleil


  • Veuillez vous connecter pour répondre
224 réponses à ce sujet

#161 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 28 février 2020 - 04:50

par contre je voulais faire un affichage en fonction du moment :

c'est à dire au lieu d'afficher heure Sunrise et Sunset et zenith et prendre toute la ligne de l'afficheur j'ai essayer de faire un void affichage .

mais cela ne fonctionne pas et j'ai bien mis Affichage ();

dans void loop ()

j’espère que tes vacances se sont bien passées .

d'avance merci.

je viens de trouver pourquoi cela ne s'afficher pas il fallait le mettre dans le draw()

void Affichage(void){
  DateTime now = RTC.now();
  TimeMins = (now.hour() * 60) + now.minute();
  if(TimeMins>Sunset&&TimeMins<Sunrise){// Affichage heure de Sunrise
          u8g.setPrintPos(50,20);
          if(SunriseHour<10);
          u8g.print("0");
          u8g.print(SunriseHour);
          u8g.print (":");
          if (SunriseMin <10)
          u8g.print("0");
          u8g.print (SunriseMin);
  }
   if(TimeMins>Sunrise&&TimeMins<heureMidi){// Affichage Zenith Sun
    /* affichage heure zenith*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(50,20 );
          if(zenith_Hour<0)
          u8g.print("0");
          u8g.print(zenith_Hour);
          u8g.print(":");
          if (zenith_Min<10)
          u8g.print("0");
          u8g.print (zenith_Min);
   }      
     if(TimeMins>heureMidi&&TimeMins>Sunrise){//Affichage Sunset
          u8g.setPrintPos(50,20);
          if(SunsetHour<10)
          u8g.print("0");
          u8g.print (SunsetHour);
          u8g.print (":");
          if (SunsetMin <10)
          u8g.print("0");
          u8g.print (SunsetMin);
       }
   }


#162 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 29 février 2020 - 06:44

Bonsoir,

je suis pas sur d'avoir compris ton problème.

La ligne après le "merci d'avance", tu l'as ajouté après coup pour dire que tu as résolu le problème, c'est bien ça?


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#163 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 01 mars 2020 - 04:41

bonjour Sandro ,

oui j'ai solutionner le problème d'affichage .

par contre dans # 161 j'ai un soucis dans l'affichage de l'heure Sunrise que je ne vois pas afficher puisque l'afficheur est éteint et ne s'allume en même temps que Sunrise pour le voir afficher en attendant l'heure d'affichage de zenith et ensuite sunset .

peut-être ajouter + 1 heure

if(TimeMins>Sunset&&TimeMins<Sunrise+1hour){// Affichage heure de Sunrise
          u8g.setPrintPos(50,20);
          if(SunriseHour<10);
          u8g.print("0");
          u8g.print(SunriseHour);
          u8g.print (":");
          if (SunriseMin <10)
          u8g.print("0");
          u8g.print (SunriseMin);
  }


#164 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 01 mars 2020 - 04:56

et pour turntable quand il calcul 360° il s'arrête à quelque degrés de 0 ° du coup quand il calcul le premier jour du mois de mars il affiche 0° au lieu de 10° je pense que je dois mettre if(alfa_1 =360°) alfa_1=0 ;

je ne sais pas ce que tu en pense d'avance merci .

je t'ai remis le code du turntable je ne sais pas si tu te r'appel EEPROM n'enregistre pas 360° limite 255 .

bonne soirée .

void moteur(){
  DateTime now = RTC.now();
  int n;
  alfa_1 = 360*now.day()/max_day();
    
  angle = (alfa_1/2)*2;//angle pair
 
  currentAngle =  (EEPROM.read(22)*2);  // EEPROM maxi 255,cuurentAngle *2;
  if( currentAngle != angle ){
        
  if( currentAngle < angle){

  digitalWrite(dirPin,HIGH);
  digitalWrite(enPin,LOW);
  n = angle - currentAngle;
  numstep = n / stepPerAngle;
 }
  else if( currentAngle > angle){

  digitalWrite(dirPin,LOW);
  digitalWrite(enPin,LOW);
  n = currentAngle - angle;
  if( angle == 0){
  n =currentAngle;
 }
  numstep = n / stepPerAngle;

 }

 for(int x = 0; x < numstep; x++) {
 digitalWrite(stepPin,HIGH);
 delayMicroseconds(1000);
 digitalWrite(stepPin,LOW);
 delayMicroseconds(1000);
         
 }
 currentAngle = angle;
 currentAngle_1=(currentAngle)/2 ; //EEPROM maxi 255,cuurentAngle /2;
 EEPROM.update(22,currentAngle_1);

  }
   delay(500);
   Serial.println("Deblocage axe");
   digitalWrite( enPin, HIGH ); // logique inversée
 
  }

 
 
 
 


#165 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 01 mars 2020 - 10:58

Bonsoir,

pour le #163, je ne comprends pas ton problème.

 

pour le #164 :

si tu enregistre la moitié de l'angle en degré dans l'EEPROM, alors tu ne dépassera jamais 360/2=180.

Sinon, pour le reste du message, est-ce que tu peux être plus explicite :

- "il calcule 360°" ne veut rien dire : dis moi telle variable, à tel endroit du code, à telle date vaut 360

- "il s'arrête à quelque degrés de 0 °" : tu parles de la turntable physique (vu que tu ne semble pas distinguer la physique du code correspondant)? Si oui, es-tu sur qu'elle était parfaitement à "0" au début du mois? Et qu'elle n'a jamais été bougée manuellement par mégarde (ou bougée par un bout de code)?

- "il affiche 0° au lieu de 10°" : qui affiche? : quelle est la variable affichée? à quelle ligne du code? Sachant que dans le code du #164, il n'y a rien qui affiche une valeur.

- "du coup quand il calcul le premier jour du mois de mars il affiche 0° au lieu de 10" tu semble dire qu'une erreur de calcul découle d'une erreur dans la position du turntable physique, ce qui me semble absurde. Du coup, que veux tu dire? Tu as connaissance d'un lien de causalité, ou s'agit-il d'une hypothèse?

 

Si tu penses qu'ajouter 2 lignes de codes pourrait résoudre le problème, alors teste au lieu de poser la question.

 

Pour être honnête, le débogage est toujours la partie la moins amusante (pour ne pas dire la plus chiante) de la programmation. C'est déjà long et pénible dans le meilleur des cas, quand on débogue son propre code (que l'on connait donc bien) et que celui-ci a été écrit de manière propre et bien structurée de manière à faciliter les tests. Hors, ici, c'est tout le contraire. Quand on utilise en plus du hardware, le débogage devient encore plus compliqué. Mais quand on n'a même pas le hardware en question sous la main, et que le code est écrit de telle manière que rien n'est modulaire et que du coup rien ne peut être testé sans avoir le matériel, alors le débogage devient extrêmement difficile (la méthode usuelle de débogage consistant à effectuer des tests successifs de manière à trouver de plus en plus précisément où se trouve l'erreur). Si en plus de ça tu ne me décrit pas de manière TRÈS PRÉCISE ce qui se passe et quel est le problème, alors c'est quasi impossible.

 

Franchement, déboguer le code des autres ne m'amuse pas, et ne m'apporte généralement pas grand chose (contrairement à d'autres questions qui me font réfléchir sur des aspects de la robotique que je n'avais spas encore abordé sous cet angle). Si je t'aide, et que j'y passe un temps considérable que je pourrais consacrer à des projets qui m'intéressent plus, c'est uniquement dans le but de te rendre service. La moindre des choses serait que tu fasse tout ton possible pour que je puisse t'aider de manière aussi efficace que possible.

 

Du coup, à partir de maintenant, je te demanderais, pour chaque question/problème :

1) formuler explicitement le problème

2) de mettre en pièce jointe la dernière version du code complet

3) mettre les parties du code que tu penses être pertinantes

4) décrire précisément tout ce que tu observe (position du turntable, qu'est-ce qui s'affiche sur l'écran, qu'est ce qui s'affiche dans le moniteur série) et quand. Précise également où dans le code ses valeurs sont affichées (au moins pour celles que tu penses être pertinentes). Penses également à préciser la date du jour.

5) fait une copie du code, dans laquelle tu affiche toutes les variables qui pourraient jouer un rôle : donne moi ces valeurs, ainsi que le code en question (soit les parties modifiées, soit tout le code), en précisant bien les lignes qui provoquent l'affichage.

6) fais des tests toi même avant de poser la question sur le forum.

 

Si tu ne fais pas cet effort de ton coté, alors ne comptes plus sur moi pour passer des heures à essayer de résoudre tes problèmes.

 

Et une chose encore : une fois que les deux problèmes en cours seront résolus (ou même avant si tu préfère), on va re-voir ton code en profondeur de manière à le rendre plus modulaire, et donc plus facile à déboguer. Ça consistera entre autre à utiliser des fonctions avec argument et retour, à éviter autant que possible les variables globales, ... Une bonne partie de ces choses je te les ai déjà suggéré plusieurs fois, mais tu n'as jamais voulu écouter mes conseils sur les bonnes pratiques de programmation (qui sont faites pour gagner du temps sur le long terme en aidant à trouver et corriger les erreurs). Si tu ne veux pas suivre ces bonnes pratiques, c'est ton choix, mais dans ce cas ne comptes plus sur moi pour trouver les erreurs dans ton code.

 

Bonne soirée

Sandro


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#166 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 02 mars 2020 - 04:48

une fois que les deux problèmes en cours seront résolus (ou même avant si tu préfère), on va re-voir ton code en profondeur de manière à le rendre plus modulaire, et donc plus facile à déboguer. Ça consistera entre autre à utiliser des fonctions avec argument et retour, à éviter autant que possible les variables globales...

 

 

 

 

Personnellement moi je commencerais par faire des fonctions et les tester une par une ... 

Faire une fonction qui fait bouger le moteur pas à pas. 
Faire une fonction qui positionne le moteur pas à pas en degré 
etc ... 

 

Après je pense que michel débute il doit être " guidé sur les bonnes pratiques " normalement on apprend les bonnes pratiques sur un projet un peu plus simple et on complexifie au fur et à mesure =) Là il a la chance d'être aidé mais je pense qu'il devrait juste prendre un petit peu de temps pour mettre à plat les choses.

Reprendre son projet au début, étape par étape en ajoutant une seule chose à la fois. Je suis sûr et certains que tous les problèmes seront réglés au fur et à mesure et que cela ira plus vite en fin de compte ...

 

En tout cas Sandro chapeau pour tout le temps que tu as passé pour l'aider =)


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#167 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 02 mars 2020 - 08:25

Bonjour Sandro ,

je ne te remercie jamais assez d'avoir pris tout ce  temps pour m'aider .

c'est grâce à toi si j'ai pu avancer aussi vite et réussi un programme que je n'aurai jamais trouver sur le marché.

désolé de être pas assez précis dans mes explications .

donc pour la question du turntable :

le dernier jour du mois de février alfa_1 =360*29/29=360°.

le moteur pas à pas s’arrête physiquement pas à 0° du fait je pense que rien dans le code ne lui dit que 360° = 0° .

donc je pense que d’après cela le premier jour du mois de mars étant donner qu'il n'étais pas à 0° physiquement mais à 360° il n'a pu ce mettre à 360*1/31=11.61° mais c'est positionner à 0°physique du fait de l'erreur précédente .

je n'ai pas bouger physiquement le moteur

si tu veux bien encore m'aider dis moi si mes explications te semble bonne  et comment je pourrais palier à ce problème .

je te souhaite une bonne reprise et une bonne journée.



#168 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 02 mars 2020 - 08:50

Pour vérifier le comportement du turn table le plus simple est de faire une fonction

 

void setTurnTable(  int monAngle) {

// mettre ici le code qui permet de mettre le turn table à un angle entier donné en degré
// si besoin d'angle à virgule, modifier la fonction pour qu'elle prenne en paramètre un float pour "monAngle " 
// Cette fonction doit mettre le turn table au même angle qu'on lui dise 0 ou 360° 

}

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#169 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 02 mars 2020 - 10:56

Merci Mike118

comme je l'ai dit à Sandro , je ne vous remercierai jamais assez de m'aider .

pardonner moi d'être un peu vague dans mes explications je vous rappel que je suis dans débutant et que j'ai tout à apprendre .

après avoir lu le message de toi et sandro je me sent pas bien comme si j'avais fait quelque chose de mal .

je trouve votre forum super et  encore bravo de prendre le temps de nous aider et surtout déchiffrer ce que l'on désire faire exactement .

voila je tenais à vous le dire .

je vous souhaite une bonne journée .Michel



#170 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 766 messages
  • Gender:Male

Posté 02 mars 2020 - 12:31

Rien à voir avec ton projet, mais permet moi de te proposer 2 tutoriaux qui, à mon avis, te seront bien utiles.

Le premier est une initiation au langage C (29 vidéos) et le deuxième, une initiation au langage C++ (12 vidéos).

 

 



#171 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 02 mars 2020 - 02:00

Bonjour,

le moteur pas à pas s’arrête physiquement pas à 0° du fait je pense que rien dans le code ne lui dit que 360° = 0° .

En soit, ça ne devrait pas être un problème : si le moteur s'arrêtait à la position 360°, alors les loi de la géométrie feraient qu'il serait à 0° (car 360°=0° quand il s'agit de tourner et que seul la position compte).
 

Et je suis totalement d'accord avec Mike : le mieux est probablement de commencer par écrire la fonction setTurnTable : une fois que c'est fait, on pourra facilement découper le bogue en deux causes possible : soit ce sera la fonction setTurnTable qui sera fausse, soit on lui dit d'aller au mauvais angle.

 

Je te propose donc de faire un nouveau code vide avec la fonction setTurnTable et de tester cette fonction seule. Si elle marche, on l’intégrera dans ton code.

 

Bonne journée

Sandro

 

PS : n’hésite pas à regarder les vidéos que t'a suggéré Oracid, je suis sur que tu y apprendra plein de choses qui pourront te servir pour le projet


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#172 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 02 mars 2020 - 03:57

 

après avoir lu le message de toi et sandro je me sent pas bien comme si j'avais fait quelque chose de mal .

 

 

 

Tu n'as pas à te sentir pas bien. Rassure toi on est là pour t'aider =) Par contre toi tu peux nous aider à t'aider =) donc si tu apprécies notre aide essaye de nous aider à t'aider ;)

 

Pour cela : 

+> Faire du code avec des fonctions pour chaque chose permet de segmenter au maximum le problème. 

+> Poser une question claire et "bornée " et qui va donc avoir un impacte que sur une ou deux fonctions , ça simplifie énormément la chose

 

Si tu es d'accord et que sandro est aussi d'accord sur la démarche, je propose de d'abord t'aider à remettre au propre ton code en repartant de zéro  et en ajoutant au fur et à mesure tout le code que tu as fait mais en faisant des fonctions quitte à découper certaines de tes fonctions en plusieurs fonctions plutôt que de chercher à rajouter des fonctions au fur et a mesure dans ton code actuel ... 

Qu'en pensez vous ? 

Juste pour référence peux tu poster ton tout dernier code au complet ? 
 

Ensuite, si vous êtes d'accord tu essayer peux essayer de décomposer et de rédiger ton code un peu comme ci dessous et au fur et à mesure qu'on implémente des fonctions on fera des tests: 

// Un exemple de ce à quoi pourrait ressembler un code découpé avec des fonctions
// exemple à adapter en fonction de tes fonctions.


void setup() {
  Serial.begin(9600); 
  Serial.println("Initialisation");
  initialisationDeMonTurnTable();
  initialisationDeMonEcran();
}

void loop() {
  int heureCourante = getHeureCourante();
  int heureLeve = calculHeureLeve();
  int heureCouche = calculHeureCouche(); 
  afficherHeures(heureCourante, heureLeve, heureCouche); 
  int angleTurnTable = calculAngle(heureCourante, heureLeve, heureCouche); 
  setTurnTable(angleTurnTable);
  
}

void initialisationDeMonTurnTable() {
    // fonction d'exemple à supprimer ou renomer ou compléter en fonction du besoin 
}

void initialisationDeMonEcran() {
    // fonction d'exemple à supprimer ou renomer ou compléter en fonction du besoin 
}

int getHeureCourante() {
    // fonction d'exemple à supprimer ou renomer ou compléter en fonction du besoin 
}

int calculHeureLeve() {
    // fonction d'exemple à supprimer ou renomer ou compléter en fonction du besoin 
}

int calculHeureCouche() {
    // fonction d'exemple à supprimer ou renomer ou compléter en fonction du besoin 
} 

void afficherHeures(int heureCourante, int heureLeve, int heureCouche) {
    // fonction d'exemple à supprimer ou renomer ou compléter en fonction du besoin 
} 

int calculAngle(int heureCourante, int heureLeve, int heureCouche) {
    // fonction d'exemple à supprimer ou renomer ou compléter en fonction du besoin 
}  

void setTurnTable(int angleTurnTable) {
    // fonction d'exemple à supprimer ou renomer ou compléter en fonction du besoin 
} 



Comme tu peux le voir un code "propre" peut presque se lire comme une histoire ... ( d'ailleurs tu peux prendre la structure de code si tu veux ^^ le code ne fait rien mais ça compile =) ) 

Bon après moi je ne fais que proposer une façon de faire ... Libre à vous de voir comment vous voulez faire =)

En tout cas merci pour les remerciement ça fait toujours plaisir à lire ;)
 

@+


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#173 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 02 mars 2020 - 05:20

Rebonjour Sandro ,

j'ai un soucis avec  pwm1

aujourd'hui levée de la lune 11h03, couché 00h59 ,minuit lunaire 6h01

demain      levée de la lune  11h43,              2h01  ,                       6h52

la pwm lune ne s'éteint pas

je ne sais pas si je t'ais aider merci d'avance

int max_pwm_lune=255;   //tu peux remplacer 255 par une valeur qui dépend de la phase de la lune
int riseMin=(Rise_time[0]*60)+Rise_time[1];
int setMin=(Set_time[0]*60)+Set_time[1];
TimeMins = (now.hour() * 60) + now.minute();
int minuit_lunaire_Min=(riseMin+setMin)/2;  //nb : tu peux utiliser une autre formule plus "réaliste" si tu connais mieux pour calculer l'heure où la lune est au plus haut dans le ciel).
int pwm1=0;   //par défaut, la led est éteinte (ainsi, pas la peine de mettre explicitement le cas où il fait jour)
if(riseMin<=TimeMins && TimeMins<= minuit_lunaire_Min) {
    pwm1=map(TimeMins, riseMin, minuit_lunaire_Min,0,max_pwm_lune);
}
else if(minuit_lunaire_Min<TimeMins && TimeMins<= setMin) {
    pwm1=map(TimeMins, minuit_lunaire_Min, setMin,max_pwm_lune,0);
}
analogWrite(8,pwm1);
 
 
 


#174 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 02 mars 2020 - 05:40

bonsoir Mike118

je te joint mon code complet .

carte arduino mega 2560 écran sh1106 encodeur rotary pour reglages heure minutes date longitude latitude timezone .

capteur de pression BME280.

RTC .

voila je pense que c'est tout d'avance merci .



#175 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 02 mars 2020 - 08:15

Bonsoir,

Tu n'as pas à te sentir pas bien. Rassure toi on est là pour t'aider =) Par contre toi tu peux nous aider à t'aider =) donc si tu apprécies notre aide essaye de nous aider à t'aider ;)

 

Pour cela : 

+> Faire du code avec des fonctions pour chaque chose permet de segmenter au maximum le problème. 

+> Poser une question claire et "bornée " et qui va donc avoir un impacte que sur une ou deux fonctions , ça simplifie énormément la chose

 

Si tu es d'accord et que sandro est aussi d'accord sur la démarche, je propose de d'abord t'aider à remettre au propre ton code en repartant de zéro  et en ajoutant au fur et à mesure tout le code que tu as fait mais en faisant des fonctions quitte à découper certaines de tes fonctions en plusieurs fonctions plutôt que de chercher à rajouter des fonctions au fur et a mesure dans ton code actuel ... 

Qu'en pensez vous ? 

Tu n'as pas à te sentir mal. Surtout quand on débute, c'est souvent difficile de savoir comment bien faire. C'est pour ça que j'ai essayé de te faire une liste de manière de nous aider à t'aider.

Je suis tout à fait d'accord avec la démarche de Mike : surtout si tu me dis que tu as encore une nouvelle erreur, alors ça montre qu'il y a eut beaucoup trop peu de tests méthodiques. Donc je confirme, le mieux est probablement de re-construire le code sous forme de fonctions qu'on testera au fur et à mesure : de cette lanière, on saura exactement qu'est-ce qui fonctionne (et qu'on peut donc utiliser ensuite sans se poser de questions).

 

 

Je te propose qu'on commence par les fonctions de base autour du temps :

#include "RTClib.h"

RTC_DS1307 RTC;

void setup() {
  Serial.begin(9600); 
  Serial.println("Initialisation");
  initialisationDuTemps();    //je suis pas sur que tu as besoin d'initialiser quelque chose : si ce n'est pas le cas, alors tu peux supprimer cette fonction
}

void loop() {
  int anneeCourante=getAnneeCourante();
  int moisCourant=getMoisCourant();
  int jourCourant=getJourCourant();
  int heureCourante=getHeureCourante();
  int minuteCourante=getMinuteCourante();
  int secondeCourante=getSecondeCourante();

  //les lignes qui suivent servent juste à tester que tes fonctions donnent le bon résultat
  Serial.print("année courante : ");
  Serial.println(anneeCourante);

  Serial.print("moisCourant : ");
  Serial.println(moisCourant);

  Serial.print("jourCourant : ");
  Serial.println(jourCourant);

  Serial.print("heureCourante : ");
  Serial.println(heureCourante);

  Serial.print("minuteCourante: ");
  Serial.println(minuteCourante);

  Serial.print("secondeCourante : ");
  Serial.println(secondeCourante);
}


void initialisationDuTemps() {    //je suis pas sur que tu as besoin d'initialiser quelque chose : si ce n'est pas le cas, alors tu peux supprimer cette fonction

}

int getAnneeCourante() {
    //à compléter
}

int getMoisCourant() {
    //à compléter
}

int getJourCourant() {   //numéro du jour dans le mois
    //à compléter
}

int getHeureCourante() {
    //à compléter
}

int getMinuteCourante() {
    //à compléter
}

int getSecondeCourante() {
    //à compléter
}

Je te laisse compléter et tester le code ci-dessus.

Une fois qu'il est complété et testé, poste le résultat ici.

Nb : sauf erreur de ma part, il n'y a aucune raison d'utiliser l'EEPROM, ni aucune variable globale à part RTC. Donc n'en utilise pas (si tu penses que j'ai raté quelque chose, argumente).

Nb : si ton horloge temps réel est déjà bien réglée, alors ne t'embête pas pour l'instant à ajouter les fonctions pour la régler. Si elle n'est pas réglée pour l'instant, alors tu peux soit créer une fonction pour le réglage, soit le mettre dans la fonction "initialisationDuTemps"

 

Bonne soirée

Sandro
 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#176 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 03 mars 2020 - 03:48

Bonjour Sandro ,

j'ai repris le code de mon programme à zéro.

RTC avec réglages  long push sur le rotary encoder et pour l'instant écran ST7920 ensuite en fonction de utilisation des Pins je reviendrais au SH1106 i2C .

J'ai déjà mis les écrans secondaires appui court push (ecran Sun, Moon,Turntable,Arrosage)

Boot de la carte sur image Bonsai avec rétroéclairage Pins 6 .

je poste le code en pièces jointes

au fur et à mesure je rajouterai un programme .

Sunrise / Sunset , course du soleil avec les pwm .

Moonrise/Moonset, par contre la pwm ne fonctionne pas bien #173 .

Turntable et arrosage .

BONNE soirée ,

[attachment=11286:RTC_1.ino]



#177 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 03 mars 2020 - 05:28

Bonsoir,

ne vas pas plus vite que la musique!

On a dit qu'on repartait sur un code propre et bien organisé, ce qui implique entre autre de ne pas utiliser de variables globales quand ce n'est pas strictement nécessaire (au début, on ne s'en rend pas forcément compte, mais une variable globale, c'est l'horreur à déboguer : elle peut changer n'importe où dans le code, à n'importe quel moment).

Un code propre, c'est aussi ne pas répéter le même bout de code plein de fois (ce que tu fais avec le réglage de l'heure).

 

Du coup, est-ce que tu pourrais s'il te plait commencer par compléter les trous du code que je te donne au #175.

 

 

Une fois que c'est fait, tu pourra écrire la fonction suivante (qui servira ensuite pour régler proprement l'heure et la date):

int chooseValue(int min, int max, int initialValue)
{
  ...
  return ... //renvoi la valeur choisie
}

Nb : la seule variable globale suplémentaire que je t'autorise est le "knob".

Nb : pour l'instant, n'utilise pas l'écran, que Serial.print

S'il te plait, ne rajoute RIEN d'autre avant d'avoir fini ces fonctions et qu'on ait validé que c'est fait proprement.

 

Bonne soirée

Sandro


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#178 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 03 mars 2020 - 06:27

rebonjour Sandro ,

je suis désolé je ne sais pas faire ce que tu me demande .

Bonne soirée .



#179 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 03 mars 2020 - 07:54

Bonsoir,

 

pour initialisation du temps, laisse tomber pour l'instant.

Pour les autres fonctions, je te donne la solution pour l'année, tu ne devrais pas avoir de mal à faire les autres selon le même modèle :

int getAnneeCourante() {
    DateTime now = RTC.now();
    return now.year();
}

Cette fonction te permet donc de récupérer l'année en cours d'un seul appel de fonction.

Je te laisse faire l'équivalent pour le mois, le jour, l'heure, la minute et la seconde.

 

Fais déjà ça, et on passera à la fonction chooseValue ensuite (si jamais tu veux la commencer, inspire toi du code du réglage de l'heure et de la date de ton code du #176 : c'est en gros la même chose sauf que les valeurs min/max/initial sont passés à la fonction, au lieu d'être fixé par la catégorie (année, mois, ...) et la date/heure).

 

Et s'il te plait, si tu ne sais pas comment faire quelque chose, essaye de préciser qu'est-ce qui te bloque.

 

Bonne soirée

Sandro
 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#180 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 03 mars 2020 - 10:52

Pour compléter ce que te demande Sandro, 

Je te propose de passer par une étape 1 intermédiaire : 
 

Tu pars du code de base que te fournis sandro à savoir : 

 

#include "RTClib.h"

RTC_DS1307 RTC;

void setup() {
Serial.begin(9600);
Serial.println("Initialisation");
}

void loop() {

}

int getAnneeCourante() {
//à compléter
}

int getMoisCourant() {
//à compléter
}

int getJourCourant() { //numéro du jour dans le mois
//à compléter
}

int getHeureCourante() {
//à compléter
}

int getMinuteCourante() {
//à compléter
}

int getSecondeCourante() {
//à compléter
}


tu vérifies que ce code compile chez toi , tu le mets sur ta carte , tu ouvres ton moniteur série et tu vérifies que ta carte t'écris bien  " Initialisation " . 

 

Une fois cette étape 1 réalisée,  tu complète les différentes fonctions comme ce que t'a montré Sandro dans son dernier message et à chaque fois que tu as complété une fonction tu utilise Serial.println pour vérifier que ta fonction te retourne bien ce que tu veux.  =)

 

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users