Accueil > Forum > Electronique > Arduino > course du soleil

course du soleil

1 2
MichelHohm MichelHohm 9 Messages
bonjour à tout les membres du forum
j'ai 59 Ans je suis à la retraite et j'aimerai faire sur un ecran st7920 la course du soleil.
sur un plan horizontal de 0° a gauche et 180 ° a droite
dans mon programme j'ai sunrise et sunset avec la library Timelord .
elle me donne chaque jour le levé et couché du soleil avec la longitude et latitude de nice ou j'habite .
j'utilise map pour calculer l'angle :
ci-joint code arduino ;


int CalcSun () {
//Calculates the Sunrise and Sunset times
DateTime now = RTC.now();
sunTime[3] = now.day();
// Give Timelordthe current date    
sunTime[4] = now.month();    
sunTime[5] = now.year();     
uint16_t time = now.hour() * 60 +now.minute();     
myLord.SunRise(sunTime); 
// Computes SunRise.    
uint16_t sunrise = sunTime[2] * 60 +sunTime[1]; 
// Sunrise returned in minutes past midnight     
myLord.SunSet(sunTime); 
// Computes SunSet.    
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;
}

mon soucis c'est que l'angle n’évolue pas au cours de la journée .
calcSun () et bien dans le loop ()
si vous auriez une solution à mon probléme ça serait super .
je vous souhaite une bonne journée .
https://github.com/
lobodol lobodol 596 Messages BIG BOSS
Salut et bienvenue. Je me suis permis de déplacer ton message dans le bon forum et j'ai mis en forme ton code Arduino pour qu'il soit lisible.
A chaque faute d'orthographe que vous faites, votre sexe rétrécit inexorablement ...
MichelHohm MichelHohm 9 Messages
BONJOUR MERCI INFINIMENT
https://github.com/
lobodol lobodol 596 Messages BIG BOSS
Par contre je ne comprends pas trop ton code. Pour commencer, ta fonction est censée retourner un integer et là elle ne retourne rien. Ça m'étonne d'ailleurs que ça compile.
Ensuite, tu utilises des variables qui ne sont déclarée null part. Sont-elles déclarées globalement ?
Normalement tu n'as pas besoin de faire le if/else à la fin de ton script, la fonction map() fait le job.
A chaque faute d'orthographe que vous faites, votre sexe rétrécit inexorablement ...
MichelHohm MichelHohm 9 Messages
bonjour
retourner à angle c'est ce que vous voulez dire ?
ce n'es pas moi qui es fait ce code .
les variables sont déclarées globalement .
if /else  avec ou sans cela ne change rien .
peut-être une idée pour m'aider svp merci.
https://github.com/
MichelHohm MichelHohm 9 Messages
rebonjour
pour bien comprendre j'ai refait un code simple juste avec le code et les éléments pour calculer l'angle .
je vous joint le code
merci pour votre aide et vous souhaite une bonne soirée .

#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 
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];
/* Calcul de l'angle en fonction de levée et couché du soleil */
    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); 
/* Affichage de l'angle obtenu */
  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
        }
      }
https://github.com/
lobodol lobodol 596 Messages BIG BOSS
Re, mets ton code entre balises [code=arduino]ton code ici[/code] stp, c'est un peu compliqué de le lire comme ça
A chaque faute d'orthographe que vous faites, votre sexe rétrécit inexorablement ...
MichelHohm MichelHohm 9 Messages
bonjour désolé je n'arrive pas à le faire
pas l'habitude
bonne journée
https://github.com/
lobodol lobodol 596 Messages BIG BOSS
Non, ne reposte pas ton code, édite ton message :

[code=arduino]
ton code ici
[/code]

PS: je sais que c'est pas évident pour les novices, je travaille à rendre l'insertion de code plus user friendly
A chaque faute d'orthographe que vous faites, votre sexe rétrécit inexorablement ...
lobodol lobodol 596 Messages BIG BOSS
Salut, je ne comprends pas comment ton code fait savoir l'heure qu'il est. Tu utilises un module externe ?
Quand tu print ta variable "time" elle évolue bien ?

Autre question annexe : est-ce que tu gagnerais pas en précision en exprimant "time", "sunset" et "sunrise" en secondes ?

PS: l'adresse mail de ton compte utilisateur ne semble pas valide
A chaque faute d'orthographe que vous faites, votre sexe rétrécit inexorablement ...
MichelHohm MichelHohm 9 Messages
BONSOIR ?
j'utilise un module rtc ds 1307
oui ma variable DateTime now =RTC.now me donne  heures minutes secondes
pour ta question annexe je ne peux pas te répondre je ne sais pas  .
merci d'avance .
https://github.com/
lobodol lobodol 596 Messages BIG BOSS
Ah mais c'est normal que tu ais toujours le même retour, il n'y a aucune différence entre sunset et sunrise :


uint16_t sunrise = sunTime[2] * 60 + sunTime[1];
uint16_t sunset  = sunTime[2] * 60 + sunTime[1];


Tu dois stocker les sunset et sunrise dans des variables différentes :

myLord.SunSet(sunSet);   // Computes Sun Set.
myLord.SunRise(sunRise); // Computes Sun Rise.

uint16_t sunset  = sunSet[2]  * 60 + sunSet[1];
uint16_t sunrise = sunRise[2] * 60 + sunRise[1];
A chaque faute d'orthographe que vous faites, votre sexe rétrécit inexorablement ...
MichelHohm MichelHohm 9 Messages
Bonjour à tout les membres 
merci pour le code .
maintenant comment je pourrais faire depuis l'angle pour faire bouger la droite drawline en fonction de l’angle je n'en es aucune idée .
j'ai trouvé cela sur internet mais je ne' y comprend rien .
https://busy.org/@pakganern/oled-display-gauge-meter-using-potentiometer-arduino .
peut - être en remplaçant le potentiomètre par l'angle incrémenter par sunrise sunset
d'avance merci .
https://github.com/
MichelHohm MichelHohm 9 Messages
bonsoir à tous les membres
j'ai trouvé ce code es-que je pourrais l'utiliser en le modifiant en remplaçant le potentiomètre p = A1 PAR ANGLE
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() );
  }
}

https://github.com/
lobodol lobodol 596 Messages BIG BOSS
En principe j'ai envie de dire oui. T'as essayé ?
A chaque faute d'orthographe que vous faites, votre sexe rétrécit inexorablement ...
1 2
Vous devez être connecté pour pouvoir répondre à ce sujet.
Utilisation des données

Afin d'améliorer ton expérience utilisateur, nous utilisons des cookies 🍪