Aller au contenu


Photo
- - - - -

course du soleil


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

#41 Sandro

Sandro

    Membre passionné

  • Membres
  • PipPipPip
  • 339 messages
  • Gender:Male

Posté 10 décembre 2019 - 01:12

Pardon, j'avais pas vu que tu avais changé le type de pwm2 en byte. Pour que ces codes puissent marcher, il faut le laisser en int (avec byte, si tu obtiens un résultat "négatif", ça ajoute automatiquement 256 pour revenir en positif).

 

Du coup, il faut de nouveau déclarer pwm2 en byte.

 

Une autre solution serait de gérer le cas de la nuit à part :

if(TimeMins < Sunrise - margeAube || timeMins > Sunset + margeCrepuscule){     //il fait nuit
    pwm2 = 0;
}
else {    //il fait jour
    if(TimeMins < heureMidi ){
      pwm2 = map ( time, Sunrise - margeAube, heureMidi, 0, 255);
    }
    else {
        pwm2 = map ( time, heureMidi, Sunset + margeCrepuscule, 255, 0);
    }
    analogWrite(5,pwm2);// PIN 5 timer 8 bits

A noter que dans cette dernière solution, pwm2 peut être indiférament int ou byte



#42 michel

michel

    Membre occasionnel

  • Membres
  • Pip
  • 88 messages
  • Gender:Male
  • Location:nice

Posté 11 décembre 2019 - 08:45

bonjour Sandro,

pour l'instant tout va bien la pwm2 c'est bien arrêter le soir et à bien redémarrer ce matin.

merci infiniment sans ton aide je serais encore à chercher un code .

je vais tester le code que tu m'as fait pour gérer la nuit  .

La pwm est trés complexe pour un amateur qui ne sait pas grand chose .

je recherche un code qui me dirais le nombres de jour qu'il y a chaque mois et que je pourrais ajouter avec #include "RTClib.h" et RTC_DS1307 RTC;

d'avance merci .

bonne journée.



#43 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 183 messages
  • Gender:Male
  • Location:Autriche

Posté 11 décembre 2019 - 09:36

Petite astuce, plutôt que d'attendre toute la nuit, tu peux multiplier le temps lu par 240 pour que le cycle complet se fasse en 6 minutes (plutôt que 24h).
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#44 Sandro

Sandro

    Membre passionné

  • Membres
  • PipPipPip
  • 339 messages
  • Gender:Male

Posté 11 décembre 2019 - 01:56

Pourquoi est-ce que tu veux un code tout prêt pour te donner le nombre de jours dans le mois, alors que c'est facile de coder ça toi même?

Il n'y a que 12 mois, donc tu peux facilement entrer le nombre de jours pour chacun (soit avec un tableau, soit avec un switch cas, soit avec des if/else if/else). Il n'y a que le mois de février qui est un peu plus dur à gérer à cause des années bissextiles.

 

Je pense que tu devrais arriver sans trop de problème à coder une petite fonction qui prend en entrée le mois et l'année et renvois le nombre de jours dans le mois. Si jamais tu bloque, fais moi signe et je te donnerais plus d'indications.

 

 

 

Par contre, j'ai un peu de mal à comprendre pourquoi tu veux intégrer ce code dans la bibliothèque RTCLib? Pourquoi ne pas juste mettre la fonction dans ton sketch arduino, ou à la limite dans un fichier à part?



#45 michel

michel

    Membre occasionnel

  • Membres
  • Pip
  • 88 messages
  • Gender:Male
  • Location:nice

Posté 11 décembre 2019 - 04:23

bonsoir Sandro ,

désolé je pense que je me suis mal exprimé pour la rtclib je voulais juste te préciser que j’utilise cette library pour l'heure , la date etc....

sur le net j'ai trouvé ce type de code mais j'ai essayer de l'ajouter dans mon programme mais arduino me met des pannes  IMG_1648.JPG .

d'avance merci .

int daystotal (int y, int m, int d)
{
    static char daytab[2][13] =
    {
        {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
        {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    };
    int daystotal = d;
    for (int year = 1 ; year <= y ; year++)
    {
        int max_month = ( year < y ? 12 : m-1 );
        int leap = (year%4 == 0);
        if (year%100 == 0 && year%400 != 0)
            leap = 0;
        for (int month = 1 ; month <= max_month ; month++)
        {
            daystotal += daytab[leap][month];
        }
    }
    return daystotal;
}


#46 Sandro

Sandro

    Membre passionné

  • Membres
  • PipPipPip
  • 339 messages
  • Gender:Male

Posté 11 décembre 2019 - 11:59

Je crois (pas sur, et la flemme de vérifier exactement), que la fonction ci dessus calcule le nombre de jours entre le 01/01/0000 et le jour d/m/y.

 

toi, tout ce que tu veux (si j'ai bien compris), c'est le nombre de jours dans un mois donné.

 

Je te propose donc les étapes suivantes :

1) tu écris une fonction int nbr_jours_du_mois(int mois) qui te donne le nombre de jours du mois "mois" en considérant que c'est pas une année bissextile (si mois=janvier=1 tu renvois 31, si mois=février=2 tu renvois 28, ...). Tu peux faire ça avec des if, avec un switch ou avec un tableau, comme tu veux.

2) tu modifie ta fonction pour prendre en compte les années bissextiles : pour ça, tu dois prendre l'année en plus en entrée. Si le mois est février et que l'année est bissextile, alors tu ajoute un jour. Pour rappel, une année est bissextile si elle est un multiple de 4 (ou si tu te soucie de quand tu sera un vieux papi, alors tu peux prendre en compte en plus la règle qu'un centenaire rond n'est pas bissextile (sauf s'il s'agit d'un multiple de 400))

 

PS : essayer de trouver un code tout prêt pour des gros trucs, c'est bien, mais pour de petites fonctions comme ça, il vaut mieux que tu t'entraine à les écrire toi même. Du coup plus d'autres indices tant que tu n'aura pas soit mis un code que tu as écrit toi même (ou que tu me dit sur quel point tu bloque)



#47 michel

michel

    Membre occasionnel

  • Membres
  • Pip
  • 88 messages
  • Gender:Male
  • Location:nice

Posté 12 décembre 2019 - 10:32

bonjour Sandro ,

bien compris si je cherche des idées de code ou des fonctions c'est que je n'ai pas de connaissance en programmation et que je découvre arduino .

j'ai juste un cap d'électricité et j'ai 60 Ans et j'ai du prendre ma retraite  car j'ai perdu mon fils de 22 Ans et je n'arriver plus a faire mon travail et j'ai préférer mettre fin à ma carrière .

voila j'essaye de faire des petits programmes que je ne trouve pas dans le commerce éclairage de bonsaï avec arrosage automatique , je suis loin d'avoir fini mon projet.

je n'ai pas voulu profiter de tes compétences pour ne pas chercher par moi même , je ne savait pas comment faire tout simplement.

j'ai bien compris ce que tu a dit , je te remercie pour tes bons conseils et j essayerais de trouver une solution .

Je te souhaite une bonne journée ainsi que tous les membres de ce forum .



#48 Sandro

Sandro

    Membre passionné

  • Membres
  • PipPipPip
  • 339 messages
  • Gender:Male

Posté 12 décembre 2019 - 11:14

du coup, je te suggérerais de lire un tutoriel sur la programmation d'un Arduino, comme ça tu apprendra toutes les bases.

 

Si tu veux aller plus droit au but, alors je pense que si tu lis les mini tutos suivant, tu saura écrire ta fonction :

- tuto sur les fonctions : https://bentek.fr/ar...-les-fonctions/

- tuto sur les conditions (if/else) : https://www.robot-ma...ions-variables/



#49 michel

michel

    Membre occasionnel

  • Membres
  • Pip
  • 88 messages
  • Gender:Male
  • Location:nice

Posté 23 décembre 2019 - 04:53

bonsoir les membres du forum.

je voudrais vous souhaiter de bonne fêtes de fin d'année .

je vous remerci encore pour votre aide .

j'aurai encore besoin de votre aide pour l'année qui vient .

prenez soin de vous et de votre famille ,à très bientôt ,Bonne soirée.


  • Romaric aime ceci

#50 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 4 752 messages
  • Gender:Male

Posté 23 décembre 2019 - 08:53

Bonne fin d'année à toi également et à l'année prochaine.

#51 michel

michel

    Membre occasionnel

  • Membres
  • Pip
  • 88 messages
  • Gender:Male
  • Location:nice

Posté 27 décembre 2019 - 10:07

bonjour sandro

voila j'ai trouver comment avoir pour chaque mois le nombre de jour .

j'avais besoin de cela pour faire une turntable .

un tour complet par mois .

j'avais pense à un moteur pas à pas .

chaque jour vers minuit une impulsion qui fait tourner la plateau de 360°/ par le nbres de jour du mois .

exemple mois de décembre  : 360° /31= 11.6°

moteur pas à pas 1.8° . 

11.6°/1.8° = 7 pas

par contre je ne sais pas comment faire .

j'ai cru comprendre que le dois utiliser une library #include <Stepper.h>

si vous avez des idées je suis preneur .

d'avance merci .

 
int maxday;// maximum de jours
   if (now.month() == 4 || now.month() == 5 || now.month() == 9 || now.month() == 11){  //30 jours =  Septembre, Avril, Juin,  Novembre.
    maxday = 30;
    
  }
  else {
    maxday = 31; //... all the others have 31
    EEPROM.update(7,maxday);
  }
  if (now.month() == 2 && now.year() % 4 == 0){  //... Exception Fevrier = 28 jours , ou 29 jours année bissextile.
    maxday = 29;
    EEPROM.update(7,maxday);
  }
  if (now.month() == 2 && now.year() % 4 != 0){
    maxday = 28;
    EEPROM.update(7,maxday);
  }


#52 Sandro

Sandro

    Membre passionné

  • Membres
  • PipPipPip
  • 339 messages
  • Gender:Male

Posté 27 décembre 2019 - 06:52

Bonsoir,

Pourquoi est-ce que tu fait des update de l'eeprom dans 3 cas mais pas dans le 4ième?

 

Si on ignore ça, le code me semble correct, même si je suis pas sur qu'il corresponde exactement à ton intention : ce que tu es en train de dire est la chose suivante :

Étape 1 : si on est en Septembre, Avril, Juin ou Novembre, alors il y a 30 jours, sinon il y en a 31 (y compris si on est en février!!!)

Étape 2 : si on est un février d'année bissextile, alors on change à 29 jours.

Étape 3 : si on est un février d'année non bissextile, alors on change à 28 jours.

 

Je te proposerais plutôt la structure suivante (plus "propre")

Cas 1 : Septembre, Avril, Juin,  Novembre -> 30 jours

sinon, Cas 2:

Cas 2.1 pas février -> 31 jours

sinon, Cas 2.2

Cas 2.2.1 année bissextile -> 29 jours

sinon, Cas 2.2.2 -> 28 jours

 

Ce qui sous forme de code (plus clair je trouve qu'en mots) donne :

int maxday;// maximum de jours
if (now.month() == 4 || now.month() == 5 || now.month() == 9 || now.month() == 11){  //30 jours =  Septembre, Avril, Juin,  Novembre.
  maxday = 30;
}
else
{
  if (now.month() != 2)  //pas février, du coup c'est janvier, mars,mai, juillet, aout ou décembre -> 30 jours
  {
    maxday = 31; //... all the others have 31
  }
  else //février
  {
    if(now.year() % 4 == 0)  //année bissextile -> 29 jours
    {
      maxday = 29;
    }
    else  //année normale
    {
      maxday = 28;
    }
  }
}

Ou plus clair (je trouve) et plus compact, avec un else if :

int maxday;// maximum de jours
if (now.month() == 4 || now.month() == 5 || now.month() == 9 || now.month() == 11){  //30 jours =  Septembre, Avril, Juin,  Novembre.
  maxday = 30;
}
else if (now.month() != 2)  //pas février, du coup c'est janvier, mars,mai, juillet, aout ou décembre -> 30 jours
{
  maxday = 31; //... all the others have 31
}
else //février
{
  if(now.year() % 4 == 0)  //année bissextile -> 29 jours
  {
    maxday = 29;
  }
  else  //année normale
  {
    maxday = 28;
  }
}

Edit : pour le moteur pas à pas, il faut que tu nous dise quel controleur (driver) tu as et quel type de moteur (unipolaire ou bipolaire). La librairie stepper.h devrait ensuite te permettre de le bouger (tu as la doc en anglais ci : https://www.arduino....erence/Stepper , sinon tu trouvera plein de tutoriels en français)



#53 michel

michel

    Membre occasionnel

  • Membres
  • Pip
  • 88 messages
  • Gender:Male
  • Location:nice

Posté 29 décembre 2019 - 12:32

bonjour Sandro,

merci encore pour tout des indications précieuse pour moi .

 

j'utilise EEPROM car j'ai plusieurs sous draw ,pour avoir plusieurs écran secondaire en appuyant sur le rotary encodeur, appui long j'ai les réglages heures ,minutes, dates ,années , timezone, longitude,latitude et appui court je passe de l’écran principal  au écran secondaire et une petite routine fait repasser sur l’écran principale et donc j'enregistre des infos dans l'EEPROM.update  et je les utilise pour les  affichées sur les ecrans secondaire avec  EEPROM.read (tu as raison pour les 3 cas sur 4 , j'ai rectifier,merci )

pour le moteur pas à pas j'ai le 28YBJ-48  5v cc  avec la carte pilote uln2003 inclus dans une petite valise arduino.

ensuite j'ai l'intention d'acheter un stepper nema 17.

commande du moteur comme je te le disait vers minuit puisque tout ce passe à minuit .

peut-être avec un compte pas pour arrêter le moteur quand il a fait le nombre de pas en fonction de l'angle

chaque jour vers minuit une impulsion qui fait tourner la plateau de 360°/ par le nbres de jour du mois .

exemple mois de décembre  : 360° /31= 11.6°

moteur pas à pas 1.8° . 

11.6°/1.8° = 7 pas

j'avais penser à cela je suis sûrement brouillon j’espère que tu j'ai été concis dans mes explications .

merci encore pour ton aide .

passe une bonne fin d'année .

 

 

 

 

#54 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 392 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 29 décembre 2019 - 02:07

On a un tutoriel simple pour un moteur pas à pas fait par ashira : 
 

https://www.robot-ma...ste-par-ashira/ 

Ashira a fait plusieurs tests de moteurs pas à pas qui peuvent peut être t'intéresser =) 
 

https://www.robot-ma...ste-par-ashira/


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 ! 

 

Les réalisations de Mike118  

 

 

 


#55 michel

michel

    Membre occasionnel

  • Membres
  • Pip
  • 88 messages
  • Gender:Male
  • Location:nice

Posté 30 décembre 2019 - 08:54

bonjour mike  ,

merci pour les tutos ,

bonne journée.



#56 michel

michel

    Membre occasionnel

  • Membres
  • Pip
  • 88 messages
  • Gender:Male
  • Location:nice

Posté 02 janvier 2020 - 11:52

Bonjour à tous les membres du forum,

j'aimerais vous souhaiter à vous et à vos familles une bonne année 2020 et une bonne santé .
merci à vous tous d'être pour nous aider dans nos recherche de codes et réflexion  sans vous rien ne serait possible .
longue année dans ce forum.


  • Oracid et Mike118 aiment ceci

#57 michel

michel

    Membre occasionnel

  • Membres
  • Pip
  • 88 messages
  • Gender:Male
  • Location:nice

Posté 04 janvier 2020 - 11:12

bonjour à tous les membres du forum,

voila je suis entrain de travailler sur un plateau tournant .

qui chaque jour tourne d'un angle avec un moteur pas à pas .

j'ai déjà commencer par l’écran qui représente le plateau avec l'angle de déplacement du plateau .

IMG_1656.JPG

j'ai calculer l'angle du plateau = un tour complet en un mois = 360°/maxday ,maxday = nombres de jours pour un mois déterminer .

angle par jour x par nombres de jour écouler .

je vous mets le code pour vérification ou simplification ,car comme vous le savait je suis amateur et j'ai tant à apprendre de vous .

j'aurai plus qu'a m'occuper des pas du moteur pour le faire déplacer , la partie mécanique , je dois encore mettre les degrés sur le cercle  .

merci pour votre aide et vos suggestions qui me sont très utiles .

encore une bonne année à tous les menbres .

void draw1(void) {
  DateTime now = RTC.now();
  uint16_t time = now.hour() * 60 + now.minute();
  mois = now.month();
  jour = now.day();
// center  
 int x2=128/2;  
 int y2=64/2;  
 // radius  
 int r2=23;
 // angle  
 int alfa_1 = 0;
 int alfa_2 = 0;
 maxday = EEPROM.read(7);
 
 alfa_2 = 360/maxday ;//* jour;  //map(mois,jour, maxday, 0, 360);
 alfa_1 = alfa_2 * now.day();
 
 u8g.setPrintPos(1,10);
 u8g.print(EEPROM.read(16));
  EEPROM.update(16,alfa_1);
  alfa_1 = EEPROM.read(16);
 u8g.drawLine(x2,y2, x2+r2*sin(1*alfa_1*2*3.14/360), y2-r2*cos(1*alfa_1*2*3.14/360));  
 u8g.drawCircle(x2, y2, r2);
}
       


#58 Sandro

Sandro

    Membre passionné

  • Membres
  • PipPipPip
  • 339 messages
  • Gender:Male

Posté 04 janvier 2020 - 10:35

Bonsoir,

il y a une petite faute dans ton code :

 alfa_2 = 360/maxday;
 alfa_1 = alfa_2 * now.day();

Le problème est que quand tu divise 360 par maxday, vu que c'est des entiers, l'arduino vas tronquer le résultat.

Du coup, si maxday=30, vu que 360 est divisible par 30, tu abtiendras bien ce que tu veux.

Par contre si maxday=31 (ou 28 ou 29), alors le dernier jour du mois tu n'auras pas 360° à cause de la troncature. Pour maxday=31 : 360.0/31.0=11.61, donc alfa_2=11 :du coup, le 31 du mois, tu auras alfa_1=11*31=341° au lieux de 360° !!!

 

Il y a deux solutions à ce problème : soit utiliser des flotants (ie nombres à virgule), ce que je déconseille quand ce n'est pas strictement indispensable (les opérations sur les flottants sont BEAUCOUP plus lentes que celles sur les entiers).

La deuxième solution (conseillée) consiste simplement à faire la multiplication avant la division :

alfa_1=360*now.day()/maxday;

Une petite précaution est néanmoins nécessaire avec cette méthode : s'assurer que la multiplication ne dépasse pas la taille maximale du type utilisé : ici il s'agit de "int", qui vont jusqu'à 2^15, ce qui est plus grand que 360*31, du coup c'est bon (dans le cas contraire, il faut utiliser des types "plus grands", comme par exemple int32_t)

 

Une troisième solution, tout aussi correcte mais un poil plus lourde (mais peut-être un poil plus clair), aurait été d'utiliser map :

alfa_1=map(now.day(),0,maxday,0,360);

 

 

Sinon, encore deux petites remarques :

- la lettre grecque s'écrit "alpha" et pas "alfa"

- ça sert à rien de lire alfa_1 juste après de l'avoir écrit : tu connais déjà ça valeur!

 

Bonne soirée

Sandro

 



#59 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 4 752 messages
  • Gender:Male

Posté 05 janvier 2020 - 08:33

La deuxième solution (conseillée) consiste simplement à faire la multiplication avant la division :

Excellent !

Une troisième solution, tout aussi correcte mais un poil plus lourde (mais peut-être un poil plus clair), aurait été d'utiliser map :

Reste à savoir comment fonctionne map. Avec des entiers ou des flottants ?

#60 Sandro

Sandro

    Membre passionné

  • Membres
  • PipPipPip
  • 339 messages
  • Gender:Male

Posté 05 janvier 2020 - 11:15

La fonction map fonctionne avec des long (ie entiers 32 bits, signés, équivalent de int32_t) : du coup, si en entrée on met des int, on est sur de ne pas avoir de problèmes d'overflow.

Le code source est donné avec la doc : https://www.arduino....tions/math/map/ :

long map(long x, long in_min, long in_max, long out_min, long out_max) {
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Donc dans le cas où on se trouve (in_min=out_min=0), le calcul est exactement le même que avec multiplication puis division, on soustrait juste 3 fois 0 pour rien (je sais pas si le compilateur fait l'optimisation ou pas).

 

Si on veut faire un "map" avec des flottants, la doc dit explicitement qu'il faut le recoder soit même (d'ailleurs, le C standard n'a même pas la fonction map, le C++ a un type map mais qui fait quelque chose de différent)
 


  • Oracid aime ceci




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

0 members, 0 guests, 0 anonymous users