Aller au contenu


Photo
- - - - -

course du soleil


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

#1 michel

michel

    Habitué

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

Posté 30 octobre 2019 - 10:28

bonjour j'aimerai faire un programme qui simule la course du soleil sur un écran st7920

j'ai déjà dans mon programme l'heure de levée et coucher du soleil (library Timelord )

j'ai déjà fat la ligne et la parabole sur l'écran (joint photo)[attachment=10775:IMG_1605.JPG]

je ne sais pas comment faire , si quelqu'un pourrais me donner un fil conducteur.

je suis amateur et je sais que les calculs astronomique sont dur .

d'avance merci



#2 R1D1

R1D1

    Modérateur et Membre passionné

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

Posté 30 octobre 2019 - 11:03

Bonjour michel,

Ou se situe ton problème ? Dans la programmation des calculs ? Dans les calculs eux-mêmes ?
Que veux-tu représenter exactement sur ton diagramme ?

Tu peux commencer par essayer de tracer un rayon de ton cercle en fonction de l'heure actuelle: s'il est 7h05, le rayon ira du centre au point le plus à gauche, s'il est 12h16 ( (17h27-7h04)/2 + 7h04), environ vertical (90°), etc.
Une fois que tu sais afficher ce segment en fonction de l'angle désiré, tu peux facilement changer la manière dont tu calcules l'angle pour représenter différentes informations.
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#3 michel

michel

    Habitué

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

Posté 31 octobre 2019 - 03:14

[attachment=10776:IMG_1604.JPG]

bonjour

voila ce que j'aimerai réaliser .

mais je ne sais pas comment faire , si quelqu'un à une idée je suis preneur .

l'heure de levé et couché du soleil c'est ok .

ceux qui me pose problème c'est de faire évoluer le soleil autour de du cercle .

D'avance merci .Bonne soirée.



#4 ashira

ashira

    Pilier du forum

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

Posté 31 octobre 2019 - 06:39

Salut! 

 

Tu pourrai utiliser le cercle trigonométrique par exemple. En prenant comme angle 0° pour le levé du soleil et 180° pour le couché. Ensuite avec les sinus et cosinus de cet angle tu obtiens les coordonnées :)



#5 Mike118

Mike118

    Staff Robot Maker

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

Posté 01 novembre 2019 - 07:10

Commence par savoir dessiner ton soleil après il suffira d'être capable de le déplacer.  =)


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  

 

 

 


#6 michel

michel

    Habitué

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

Posté 01 novembre 2019 - 10:00

bonjour à tous les membres ,

merci pour vos réponses .

j'ai regardé le code d'une horloge analogique à aiguilles  :

 

http://www.instructables.com/id/DS3231-OLED-clock-with-2-button-menu-setting-and-t/

apparemment il faudrait calculer l’angle de déplacement du soleil pour l’écran

drawLine

X1,Y1, 1point de la droite        X2 ,Y2 2 point de la droite étant le centre du cercle

X1,Y1  calculer par l’angle et en heures

calculer la durée du jour D = HC - HL et le  convertir en degré : Theta = D x 15. // HC heure de couché, HL heure de levé

for(int z=0 ;z<180 ;z+15){// levée 0 degré , coucher 180

float angle =z ;

1heure =15 degrés

je ne sais pas si c’est comme cela qu'il faut calculer et je ne sais pas comment finir la formule de calcul .

d’avance merci



#7 Mike118

Mike118

    Staff Robot Maker

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

Posté 01 novembre 2019 - 10:54

Formule de calcule d'angle , en arduino tu as la fonction map qui le fait pour toi : 

map( heure, heureMin, heureMax, angleMin, angleMax ) 


Angle Min  = 0 

angle Max = 180 

heure Min = heure de levée 
heure Max = Heure de couché. 

 

si tu n'as pas la fonction map tu peux directement la faire : 


float map( float heure, float heureMin, float heureMax, float angleMin, float angleMax )  {

 

 return   heure * ( angleMax - angleMin ) / (heureMax - heureMin)  + heureMin ;

 

}


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  

 

 

 


#8 Oracid

Oracid

    Pilier du forum

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

Posté 01 novembre 2019 - 12:01

return   heure * ( angleMax - angleMin ) / (heureMax - heureMin)  + heureMin ;

Trop fort !

#9 michel

michel

    Habitué

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

Posté 02 novembre 2019 - 05:36

merci à tous les membres , pour votre aide , je vous tiens au courant .

bonne soirée.



#10 michel

michel

    Habitué

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

Posté 03 novembre 2019 - 05:50

Bonsoir les membres ,

je reviens vers vous car je n'ai rien réussi à faire .

dans le programme que j'utilise pour avoir l'heure de levée et couché du soleil .

sunset et sunrise et décomposée en deux parti l'heure et les minutes .

et je ne savais pas comment faire pour calculer l'angle .

je vous es mis le code :

j'aurais du vous le dire dés le départ .

 

int CalcSun () { //Calculates the Sunrise and Sunset times
    DateTime now = RTC.now();
    sunTime[3] = now.day(); // Give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunRise(sunTime); // Computes Sun Rise.
    Sunrise = sunTime[2] * 60 + sunTime[1]; // Sunrise returned in minutes past midnight
    SunriseHour = sunTime[2];
    SunriseMin = sunTime [1];
    sunTime[3] = now.day(); // Uses the Time library to give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunSet(sunTime); // Computes Sun Set.
    Sunset = sunTime[2] * 60 + sunTime[1]; // Sunset returned in minutes past midnight
    SunsetHour = sunTime[2];
    SunsetMin = sunTime [1];
    
}

merci d'avance



#11 michel

michel

    Habitué

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

Posté 03 novembre 2019 - 05:56

bonsoir à tout les membres ,

BON DIMANCHE.

bon courage pour cette semaine .



#12 Mike118

Mike118

    Staff Robot Maker

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

Posté 04 novembre 2019 - 12:57

le plus simple c'est de tout traduire en minute ... 

 



int CalcSun () { //Calculates the Sunrise and Sunset times
    DateTime now = RTC.now();
    
    sunTime[3] = now.day(); // Give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    
    uint16_t time = now.hour() * 60 + now.minute();

    myLord.SunRise(sunTime); // Computes Sun Rise.
    uint16_t sunrise = sunTime[2] * 60 + sunTime[1]; // Sunrise returned in minutes past midnight

    myLord.SunSet(sunTime); // Computes Sun Set.
    uint16_t sunset = sunTime[2] * 60 + sunTime[1]; // Sunset returned in minutes past midnight

    int16_t angle = map(time, sunrise, sunset, 0, 180); 

    if(angle < 0)
     angle = 0;
    else if(angle > 180) 
     angle = 180;
    
}

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  

 

 

 


#13 michel

michel

    Habitué

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

Posté 05 novembre 2019 - 10:00

bonjour à tout les membres,

voila ce que donne le programme .

hier soir indique 180 degrés, ce matin 1à7h00 degré à 9h17 toujours 1 degré , je pense que l'angle ne bouge  pas au cour de la journée .

joint photo, pris 9h17, ce matin.

je dois aussi je pense pour faire bouger la droite x1,y1 Drawline  de l’écran lui donner un angle sin,cos.

int x1=(64+(sin(angle)*20));// pris sur l'exemple de l'horloge 
int y1=(40-(cos(angle)*20)); // pris sur l'exemple de l'horloge

merci pour votre aide , bonne journée.



#14 R1D1

R1D1

    Modérateur et Membre passionné

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

Posté 05 novembre 2019 - 11:05

Comment est appelée ta fonction CalcSun ? Si tu utilises une Arduino, elle doit être dans la fonction "loop" pour être appelée régulièrement.
Si tu ne veux pas mettre à jour l'écran à chaque tour de cette boucle (qui est très rapide par rapport à l'évolution de l'angle), tu peux lire le temps en dehors de CalcSun (mais dans looop), vérifier qu'il s'est passé au moins x secondes/minutes (e.g. 30 ou 60 secondes) et dans ce cas mettre à jour en passant le temps comme argument de ta fonction.
Je ne vois pas non plus dans ta fonction où est mis à jour l'écran. Si c'est en dehors de la fonction CalcSun, il faut faire un "return angle" pour récupérer la valeur mise-à-jour.

Par ailleurs, tu peux utiliser les balises
[code]
xxx
[/code]
dans ton message (en remplaçant xxx par ton code) pour mettre le code en une forme plus lisible.
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#15 michel

michel

    Habitué

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

Posté 05 novembre 2019 - 11:52

le code est dans:

void draw(void) {
    DateTime now = RTC.now();
    sunTime[3] = now.day(); // Give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunRise(sunTime); // Computes Sun Rise.
    Sunrise = sunTime[2] * 60 + sunTime[1]; // Sunrise returned in minutes past midnight
    SunriseHour = sunTime[2];
    SunriseMin = sunTime [1];
    sunTime[3] = now.day(); // Uses the Time library to give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunSet(sunTime); // Computes Sun Set.
    Sunset = sunTime[2] * 60 + sunTime[1]; // Sunset returned in minutes past midnight
    SunsetHour = sunTime[2];
    SunsetMin = sunTime [1];
    SeasonTime[3] = now.day();
    SeasonTime[4] = now.month();
    SeasonTime[5] = now.year();
    myLord.Season(SeasonTime);// Computes Season
    SeasonTime[2]= SeasonHour;
    SeasonTime[1]= SeasonMin;
    SeasonHour = now.hour();
    SeasonMin =  now.minute();
    uint16_t time = now.hour() * 60 + now.minute();
    uint16_t sunrise = sunTime[2] * 60 + sunTime[1];
    uint16_t sunset = sunTime[2] * 60 + sunTime[1];
    uint16_t angle = map(time, sunrise, sunset, 0, 180);

    if(angle < 0)
     angle = 0;
    else if(angle > 180)
     angle = 180;

EEPROM.update(13,angle);

j'utilise l'EEPROM car j'utilise plusieurs draw comme affichage secondaire 

 

void draw2(void){//écran secondaire
          DateTime now = RTC.now();
          
          u8g.firstPage();
      do {
       
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,10);
          u8g.print(" Draw2 ");
          u8g.setPrintPos(55,10);
          u8g.print(EEPROM.read(13));//angle
          int x1=(64+(sin(EEPROM.read(13))*20));
          int y1=(40-(cos(EEPROM.read(13))*20));
          u8g.drawLine(20, 50, 110, 50);
          u8g.drawLine(x1,y1,65,50);//x1=65,y1=10,x2=65,y2=50
          u8g.drawCircle(65, 50, 35, U8G_DRAW_UPPER_RIGHT);
          u8g.drawCircle(65, 50, 35, U8G_DRAW_UPPER_LEFT);
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(5,60);
          if(EEPROM.read(9)<10);
          u8g.print("0");
          u8g.print(EEPROM.read(9));
          u8g.print (":");
          if (EEPROM.read(10) <10)
          u8g.print("0");
          u8g.print (EEPROM.read(10));
          u8g.setPrintPos(95,60);
          if(EEPROM.read(11)<10)
          u8g.print("0");
          u8g.print (EEPROM.read(11));
          u8g.print (":");
          if (EEPROM.read(12) <10)
          u8g.print("0");
          u8g.print (EEPROM.read(12));
          
          }
          while (
          u8g.nextPage() );
          }

voila le code complet :

d'avance merci



#16 michel

michel

    Habitué

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

Posté 06 novembre 2019 - 05:29

BONSOIR à tout les membres,
pour mieux comprendre j'ai épurer le code au strict minimum
c'est à dire le minimum pour avoir date mois année ,
heure minutes secondes
je vous joint le code
et c'est toujours pareil angle 1 ° sunrise 7 h10  sunset 17h19 angle 180 ° pas d'évolution entre deux .
 d'avance merci .
#include <Wire.h>
#include "RTClib.h" //
#include <LiquidCrystal_I2C.h>
#include <TimeLord.h> //  
RTC_DS1307 RTC;
LiquidCrystal_I2C lcd(0x3F,20,4);
const int TIMEZONE = +1; // UTC france = +1hiver, +2 été
const float LATITUDE = 43.70, LONGITUDE = 7.25; // Nice = latidude = 43.7000000 longitude = 7.250000
int Sunrise, Sunset; //sunrise and sunset expressed as minute of day (0-1439)
TimeLord myLord; // TimeLord Object, Global variable
byte sunTime[]  = {0, 0, 0, 1, 1, 13}; // 17 Oct 2013
int SunriseHour, SunriseMin, SunsetHour, SunsetMin; //Variables used to make a decent display of our sunset and sunrise time.
int TimeMins;
void setup() {
    Wire.begin(); //start I2C interface
    RTC.begin(); //start RTC interface
    lcd.begin();//Start LCD (defined as 16 x 2 characters)
    lcd.backlight();
    //Checks to see if the RTC is runnning, and if not, sets the time to the time this sketch was compiled.
    if (! RTC.isrunning()) {
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  //Timelord initialisation
    myLord.TimeZone(TIMEZONE * 60);
    myLord.Position(LATITUDE, LONGITUDE);
    
 }

void loop() {
    
    DateTime now = RTC.now(); //get time from RTC
    sunTime[3] = now.day(); // Give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunRise(sunTime); // Computes Sun Rise.
    Sunrise = sunTime[2] * 60 + sunTime[1]; // Sunrise returned in minutes past midnight
    SunriseHour = sunTime[2];
    SunriseMin = sunTime [1];
    sunTime[3] = now.day(); // Uses the Time library to give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunSet(sunTime); // Computes Sun Set.
    Sunset = sunTime[2] * 60 + sunTime[1]; // Sunset returned in minutes past midnight
    SunsetHour = sunTime[2];
    SunsetMin = sunTime [1];
    uint16_t time = now.hour() * 60 + now.minute();
    uint16_t sunrise = sunTime[2] * 60 + sunTime[1];
    uint16_t sunset = sunTime[2] * 60 + sunTime[1];
    uint16_t angle = map(time, sunrise, sunset, 0, 180);
     
     if(angle < 0)
     angle = 0;
    else if(angle > 180)
     angle = 180;
    
    //Display current time
    lcd.setCursor (0,0);
    lcd.print(now.day(), DEC);
    lcd.print('/');
    lcd.print(now.month());
    lcd.print('/');
    lcd.print(now.year(), DEC);
    lcd.print("    ");
    lcd.setCursor (12,0);
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    if (now.minute() <10)
      {
        lcd.print("0");
      }
    lcd.print(now.minute(), DEC);
    lcd.print(':');
    if (now.second() <10)
      {
        lcd.print("0");
      }
    lcd.print(now.second());
    lcd.print(" ");

   
  lcd.setCursor (0,1);
  lcd.print ("Sun");
  lcd.setCursor(4,1);
  lcd.print("R");
  lcd.setCursor(6,1);
  lcd.print (SunriseHour);
  lcd.print (":");
  if (SunriseMin <10)
     {
     lcd.print("0");
     }
  lcd.print (SunriseMin);
  lcd.setCursor (12,1);
  lcd.print ("S");
  lcd.setCursor(14,1);
  lcd.print (SunsetHour);
  lcd.print (":");
    if (SunsetMin <10)
     {
     lcd.print("0");
     }
  lcd.print (SunsetMin);
  lcd.setCursor(1,2);
  lcd.print("angle:    ");
  lcd.print(angle);      
   // }
    TimeMins = (now.hour() * 60) + now.minute();
    
 if (TimeMins >= Sunrise && TimeMins <=Sunset-1) { //If it's after sunrise and before sunset, switch our relay on
           lcd.backlight();// lcd rétroéclairage On
        }
        else {  //otherwise switch it off
            lcd.noBacklight();// lcd rétroéclairage Off
        }
      }


#17 michel

michel

    Habitué

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

Posté 12 novembre 2019 - 11:48

bonjour à tous les membres .

voila le nouveau code qui incrémente mon angle dés le levée du soleil jusqu’au couché .

il ne reste plus qu'a trouver comment faire varier la droite drawline en fonction de l'angle et du temps .

si quelqu'un à une idée je suis preneur .

d'avance merci .

[code]
#include <Wire.h>
#include "RTClib.h" //
#include <LiquidCrystal_I2C.h>
#include <TimeLord.h> //  
RTC_DS1307 RTC;
LiquidCrystal_I2C lcd(0x3F,20,4);
const int TIMEZONE = +1; // UTC france = +1hiver, +2 été
const float LATITUDE = 43.70, LONGITUDE = 7.25; // Nice = latidude = 43.7000000 longitude = 7.250000
int Sunrise, Sunset; //sunrise and sunset expressed as minute of day (0-1439)
TimeLord myLord; // TimeLord Object, Global variable
byte sunTime[]  = {0, 0, 0, 1, 1, 13}; // 17 Oct 2013
int SunriseHour, SunriseMin, SunsetHour, SunsetMin; //Variables used to make a decent display of our sunset and sunrise time.
int TimeMins;
void setup() {
    Wire.begin(); //start I2C interface
    RTC.begin(); //start RTC interface
    lcd.begin();//Start LCD (defined as 16 x 2 characters)
    lcd.backlight();
    //Checks to see if the RTC is runnning, and if not, sets the time to the time this sketch was compiled.
    if (! RTC.isrunning()) {
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  //Timelord initialisation
    myLord.TimeZone(TIMEZONE * 60);
    myLord.Position(LATITUDE, LONGITUDE);
    
 
}

void loop() {
    
   
DateTime now = RTC.now(); //get time from RTC
    sunTime[3] = now.day(); // Give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunRise(sunTime); // Computes Sun Rise.
    Sunrise = sunTime[2] * 60 + sunTime[1]; // Sunrise returned in minutes past midnight
    SunriseHour = sunTime[2];
    SunriseMin = sunTime [1];
    sunTime[3] = now.day(); // Uses the Time library to give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunSet(sunTime); // Computes Sun Set.
    Sunset = sunTime[2] * 60 + sunTime[1]; // Sunset returned in minutes past midnight
    SunsetHour = sunTime[2];
    SunsetMin = sunTime [1];
    uint16_t time = now.hour() * 60 + now.minute();
   
    uint16_t angle = map(time, Sunrise, Sunset, 0, 180);// Sunrise et Sunset incrémente l'angle par Timelord
     
    
if(angle < 0)
     angle = 0;
    else if(angle > 180)
     angle = 180;
    
   
//Display current time
    lcd.setCursor (0,0);
    lcd.print(now.day(), DEC);
    lcd.print('/');
    lcd.print(now.month());
    lcd.print('/');
    lcd.print(now.year(), DEC);
    lcd.print("    ");
    lcd.setCursor (12,0);
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    if (now.minute() <10)
      {
        lcd.print("0");
      }
    lcd.print(now.minute(), DEC);
    lcd.print(':');
    if (now.second() <10)
      {
        lcd.print("0");
      }
    lcd.print(now.second());
    lcd.print(" ");

   
  lcd
.setCursor (0,1);
  lcd.print ("Sun");
  lcd.setCursor(4,1);
  lcd.print("R");
  lcd.setCursor(6,1);
  lcd.print (SunriseHour);
  lcd.print (":");
  if (SunriseMin <10)
     {
     lcd.print("0");
     }
  lcd.print (SunriseMin);
  lcd.setCursor (12,1);
  lcd.print ("S");
  lcd.setCursor(14,1);
  lcd.print (SunsetHour);
  lcd.print (":");
    if (SunsetMin <10)
     {
     lcd.print("0");
     }
  lcd.print (SunsetMin);
  lcd.setCursor(1,2);
  lcd.print("angle:    ");
  lcd.print(angle);      
  
// }
    TimeMins = (now.hour() * 60) + now.minute();
    
 
if (TimeMins >= Sunrise && TimeMins <=Sunset-1) { //If it's after sunrise and before sunset, switch our relay on
           lcd.backlight();// lcd rétroéclairage On
        }
        else {  //otherwise switch it off
            lcd.noBacklight();// lcd rétroéclairage Off
        }
      }

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

j'utilise l'EEPROM car j'utilise plusieurs draw comme affichage secondaire 

 

void draw2(void){//écran secondaire
          DateTime now = RTC.now();
          
          u8g.firstPage();
      do {
       
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,10);
          u8g.print(" Draw2 ");
          u8g.setPrintPos(55,10);
          u8g.print(EEPROM.read(13));//angle
          int x1=(64+(sin(EEPROM.read(13))*20));// j'avais mis cela met cela ne fonctionne pas
          int y1=(40-(cos(EEPROM.read(13))*20));// j'avais mis cela met cela ne fonctionne pas
          u8g.drawLine(20, 50, 110, 50);
          u8g.drawLine(x1,y1,65,50);//x1=65,y1=10,x2=65,y2=50
          u8g.drawCircle(65, 50, 35, U8G_DRAW_UPPER_RIGHT);
          u8g.drawCircle(65, 50, 35, U8G_DRAW_UPPER_LEFT);
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(5,60);
          if(EEPROM.read(9)<10);
          u8g.print("0");
          u8g.print(EEPROM.read(9));
          u8g.print (":");
          if (EEPROM.read(10) <10)
          u8g.print("0");
          u8g.print (EEPROM.read(10));
          u8g.setPrintPos(95,60);
          if(EEPROM.read(11)<10)
          u8g.print("0");
          u8g.print (EEPROM.read(11));
          u8g.print (":");
          if (EEPROM.read(12) <10)
          u8g.print("0");
          u8g.print (EEPROM.read(12));
          
          }
          while (
          u8g.nextPage() );
          }

voila le code complet :

d'avance merci

[/code]



#18 Mike118

Mike118

    Staff Robot Maker

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

Posté 12 novembre 2019 - 09:36

Bonjour, 

Pour une meilleure lisibilité merci d'utiliser les balises code : <> pour poster du code : 

//ceci est un commentaire de code

void maFonction() {
  
}

Pour plus d'info sur comment poster du code des images ou autres tu as ce lien : comment poster du contenu sur robot maker

 

Tu peux éditer tes derniers postes pour les rendre plus lisible. 

Pour en revenir sur ton code je te propose de faire plusieurs fonctions. 

Exemple : 

uint16_t computeAngle() {
    DateTime now = RTC.now(); //get time from RTC
    sunTime[3] = now.day(); // Give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunRise(sunTime); // Computes Sun Rise.
    Sunrise = sunTime[2] * 60 + sunTime[1]; // Sunrise returned in minutes past midnight
    SunriseHour = sunTime[2];
    SunriseMin = sunTime [1];
    sunTime[3] = now.day(); // Uses the Time library to give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunSet(sunTime); // Computes Sun Set.
    Sunset = sunTime[2] * 60 + sunTime[1]; // Sunset returned in minutes past midnight
    SunsetHour = sunTime[2];
    SunsetMin = sunTime [1];
    uint16_t time = now.hour() * 60 + now.minute();
   
    uint16_t angle = map(time, Sunrise, Sunset, 0, 180);// Sunrise et Sunset incrémente l'angle par Timelord
    return angle;
}

ensuite faire une fonction qui affiche une droite en fonction d'un angle... 

Et à répéter le tout en boucle ...


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  

 

 

 


#19 michel

michel

    Habitué

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

Posté 17 novembre 2019 - 05:24

bonsoir les membres de ce forum

j'ai trouvé ce code sur internet esque je pourrais utiliser ce type de code pour faire la fonction tracer mon angle sur écran d'avance merci .

#include "U8glib.h"
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);
U8GLIB_ST7920_128X64 u8g(13, 11, 12, U8G_PIN_NONE);
int xmax=128;                                  
int ymax=62;                                   
int xcenter=xmax/2;                            
int ycenter=ymax/2+10;                        
int arc=ymax/2;                             
int angle=0;
int backlight = 6; //backlight control pin 6                                      
char* label[] = {"LOAD","COOLANT","INTAKE", "VOLT", "TEMP"};  
int labelXpos[] = {53, 45, 49, 53};                     
#define potmeterPin A1                                
int p, w, m,a=10;
u8g_uint_t xx=0;
void gauge(uint8_t angle) {
  // draw border of the gauge
  u8g.drawCircle(xcenter,ycenter,arc+6, U8G_DRAW_UPPER_RIGHT);
  u8g.drawCircle(xcenter,ycenter,arc+4, U8G_DRAW_UPPER_RIGHT);
  u8g.drawCircle(xcenter,ycenter,arc+6, U8G_DRAW_UPPER_LEFT);
  u8g.drawCircle(xcenter,ycenter,arc+4, U8G_DRAW_UPPER_LEFT);
  // draw the needle
  float x1=sin(2*angle*2*3.14/360);           
  float y1=cos(2*angle*2*3.14/360); 
  u8g.drawLine(xcenter, ycenter, xcenter+arc*x1, ycenter-arc*y1);
  u8g.drawDisc(xcenter, ycenter, 5, U8G_DRAW_UPPER_LEFT);
  u8g.drawDisc(xcenter, ycenter, 5, U8G_DRAW_UPPER_RIGHT);
  u8g.setFont(u8g_font_chikita); 
  // show scale labels
  u8g.drawStr( 20, 42, "0");                   
  u8g.drawStr( 25, 18, "25");
  u8g.drawStr( 60, 14, "50");
  u8g.drawStr( 95, 18, "75");
  u8g.drawStr( 105, 42, "100"); 
  // show gauge label
  u8g.setPrintPos(labelXpos[0],32);            
  u8g.print(label[4]); 
  // show digital value and align its position
  u8g.setFont(u8g_font_6x10);//(u8g_font_profont22);             
  u8g.setPrintPos(54,60);
  if (w<10){                              
    u8g.print("0");
  }
  if (w>99) {                                  
    u8g.setPrintPos(47,60);
  }
  u8g.print(w);
}
void setup(void) {
  u8g.setFont(u8g_font_chikita);
  u8g.setColorIndex(1); 
  analogWrite(backlight, 255);                       
  // assign default color value
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255);                    
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3);                      
  }
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);                      
  }
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(255,255,255);
  }
}
void loop(void) { 
   p = analogRead(A1);                  
 w = map(p,0,1023,0,100);                    
 m = map(p,0,1023,0,90);                      
  // show needle and dial
  xx = m;                                    
  if (xx<45){                                
    xx=xx+135;
  }
  else {
    xx=xx-45;
  } 
  // picture loop
  {
    u8g.firstPage(); 
    do {             
      gauge(xx);
    }
    while( u8g.nextPage() );
  }
}



#20 michel

michel

    Habitué

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

Posté 28 novembre 2019 - 05:54

bonsoir ,

j'ai un peu avancer sur ma course du soleil

j'ai réussi à faire la course du soleil avec drawLine .

par contre j'ai voulu ajouter un bitmap pour afficher un soleil , mais il y a une différence avec la drawLine .

pourriez vous m'expliquer pourquoi et comment faire pour rectifier le problème .

JE VOUS MET LE CODE :

u8g.drawLine(20, 50, 110, 50);//droite du bas de l'écran
    u8g.drawCircle(x1, y1, r_1, U8G_DRAW_UPPER_RIGHT);//x1=65,y1=50,r_1=35
    u8g.drawCircle(x1, y1, r_1, U8G_DRAW_UPPER_LEFT);//cercle
    
    u8g.drawLine(x0,y0,x0-r*cos(1*angle*2*3.14/360),y0-r*sin(1*angle*2*3.14/360));//droite qui visualise l'angle du soleil
     
     
    u8g.drawXBMP(x1-r_1*cos(1*angle*2*3.14/360),y1-r_1*sin(1*angle*2*3.14/360),u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//dessin du soleil[attachment=10907:IMG_1629.JPG][attachment=10910:IMG_1626.JPG][attachment=10909:IMG_1627.JPG][attachment=10908:IMG_1628.JPG]





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

0 members, 0 guests, 0 anonymous users