Calcul de la position du soleil

Bonjour,

Je conçois un tracker solaire.

Pour orienter le panneau j'utilise un Arduino MEGA, et je calcul la position du soleil grâce à l'équation du temps.

Cependant les résultats calculé par l'Arduino ne sont pas correct.
(les résultats ont été comparé avec une calculatrice scientifique)

L'arduino a t'il une limitation avec les calculs?

Un exemple de calcul:
Dec=asin(0.398sin(0.985j-80));

Avant de te lancer dans des recherches d'algorithmes complexes pour un petit microcontroleur as tu chiffré les conséquences des "écarts" de calcul ?

L'erreur de calcul se traduira par un angle d'écart. Cet angle d'écart fera que la surface réellement en face du soleil sera réduite par l'intermédiaire du cosinus de l'angle.
Je prend une valeur de 5 degrés d'erreur qui me parrait déjà énorme.
Combien vaut le cosinus de 5 degrès ? ---> 0;9962
Si tu as le même angle d'erreur dans les deux axes la puissance disponible sera égale à la puissance max affectée d'un multiplicateur 0,992.

Est-ce que perdre théoriquement 0,8% est inaceptable ?
Je ne le pense pas surtout que tu risques d'avoir d'autres erreurs de positionnement plus importantes : origine mécanique ou effet du vent.
Ce qui comptera le plus c'est l'angle d'erreur autour de midi, au soleil bien sûr ( 13 h légale en hiver, 14 h en été) parce que vers le lever ou le coucher du soleil perdre 10 ou 20 % de pas grand chose ne changera rien.

D'accord avec 68tjs.

Dans des conditions idéales le rendement d'un système peut être amélioré jusqu'à 40% en utilisant un tracker, mais le coût d’investissement n’est même pas toujours compensé par l'augmentation du rendement obtenue. Ce type d’installation est limitée aux cas où le rendement optimal coïncide avec une demande importante...

--> avez vous chiffré votre besoin d'énergie (y compris pour l'alimentation des moteurs)?

Parfois c'est plus simple de ne pas avoir de système mobile à entretenir et juste de surdimensionner un peu le panneau, c'est un peu plus cher à l'achat mais vous n'avez pas à payer les 2 moteurs, le système de monte mobile et l'entretien et ça fonctionne pareil

Cela dit pour la beauté de la chose, faire de l'over-engineering c'est cool même si ça ne sert rien :slight_smile:

Voici une petite bibliothèque plus que largement suffisante (erreur de quelques minutes d'arc) pour obtenir les coordonnées du soleil.

Cordialement.

Pierre

Je complète mon premier propos :

Avec une recherche de documentation sérieuse on apprend qu'il n'existe pas que le rayonnement direct, il existe aussi le rayonnement diffus provoqué par la diffraction des rayons ( air chargé de gouttelettes d'eau, réflexion sur différents matériaux dont les nuages).

Ce rayonnement diffus a deux propriétés importantes :

  1. Sa part dans l'énergie totale récupérable doit être prise en compte car non négligeable même s'il est impossible de la quantifier car trop de facteurs aléatoires interviennent dont la météo. La preuve est qu'il est possible de récupérer de l'énergie avec un ciel totalement couvert donc sans rayonnement direct.
  2. Elle est insensible au pointage puisqu'elle provient de toutes les directions.

Je reste dubitatif sur ce chiffre de 40% d'amélioration que j'ai lu plusieurs fois.
Si c'était sur le rendement global (rayons directs et diffus) je pense qu'on verrait plus de panneaux mobiles qu'actuellement. Perso je n'ai pas encore vu de fermes solaires ainsi équipées, mais ce n'est pas parce que je n'en ai pas vu qu'il n'en existe pas.
A mon très humble avis les 40% sont le résultat d'un calcul théorique sur le seul rayonnement direct.

Bonjour,
Fait une recherche sur le forum et tu auras de quoi te faire une opinion :wink:
Regarde également Time.h dans la suite avr-libc qui te permet ce genre de calcul.

Merci infiniment à vous tous pour vos réponses toutes aussi intéressantes les une que les autres.

pepe: Merci pour les explications. Cependant mon niveau en programmation et mes connaissances dans le domaine sont restreint. Mais c'est un point que je devrais étudier par la suite. Je n'avais pas pensée à ce type de restrictions du au format des variables.

68tjs: Pour ce qui est de la précision étant seul sur le projet et vue la taille, je fait de manière simpliste. Il faut que j'ai une production qui permet de recharger une batterie de 12V après une journée complète d'exposition. Donc je ne suis pas pour le moment à la recherche de l'angle parfait. Ce n'est que une fois fini et opérationnel j'optimiserais le tout.

J-M-L: Pour justifier la réalisation du tracker. C'est juste histoire de me donner un défis.
Par rapport au besoin en énergie je n'ai pas pris le temps de le dimensionner de manière précise (chose que je pourrait vite regretter). C'est pour un système d'arrosage automatique. Le système devra orienter le tracker afin de recharger une batterie pour pouvoir alimenter différents capteurs et une petite pompe. Avec une bonne optimisation de la consommation j'ai espoir que ça suffise.

ChPr: Votre bibliothèque est juste génial. C'est exactement ce qu'il me fallait et ça va m'éviter des semaines voir des mois d'écriture et de corrections. Merci beaucoup pour le lien.

Donc je ne suis pas pour le moment à la recherche de l'angle parfait. Ce n'est que une fois fini et opérationnel j'optimiserais le tout.

Les (possibles mauvais) choix de départ risquent d'interdire certaines optimisations.
En début de projet prendre le temps de la réflexion n'est pas du temps perdu, bien au contraire.

Si tu fais un bilan financier n'oublie pas :

  • de quantifier la puissance récupérée par le suivi du soleil et de la transformer en Euros.
    Cela peut se faire en mesurant sur 2 jours consécutifs la puissance récupérée le suivi en service et le jour suivant la puissance récupérée avec le panneau solaire en position fixe (voir les réglages pour ta région).

  • de calculer en combien de temps tu fais un retour sur l'investissement de la mécanique plus moteurs du suivi.

Sauf si c'est pour le seul plaisir de réaliser et là il n'y a pas de limite, fonce et fait toi plaisir.

Huntertherabbtt:
J-M-L: Pour justifier la réalisation du tracker. C'est juste histoire de me donner un défis.

alors d'accord avec 68tjs - dans ce cas faut pas hésiter à explorer :slight_smile:

68tjs:
Sauf si c'est pour le seul plaisir de réaliser et là il n'y a pas de limite, fonce et fait toi plaisir.

Bonsoir
+1 aussi si c'est pour le "plaisir" d'essayer :grin:

bonjour,

Il faut que j'ai une production qui permet de recharger une batterie de 12V après une journée complète d'exposition

avant de chercher une optimisation, il faut connaitre certains paramètres.
ampérage, voltage, composition batterie (gel, acide liquide)
puissance du PV et composition (mono, poly cristalin), fabricant (chinois, allemand)
consommation de l'installation
lieu de l'installation

pour une même installation, si tu l'installe en corse, tu auras un rendement autre que si tu es à lorient où il faudra surement doubler le PV.
une batterie gel a une décharge moindre qu'une acide liquide et résiste mieux au froid.

pense que si tu alimente via la batterie le système de tracking, tu risque de pomper plus que tu ne recharge :slight_smile:

Si vous voulez faire de l'optimisation fine (pour le fun), il faut doubler le tracker solaire par un tracker d'éclairement max. En effet, en cas de nuages masquant partiellement ou totalement le soleil, la meilleure orientation n'est pas forcément celle du soleil.

Pour la déterminer, il faut un capteur en toit avec quatre cellules permettant par un petit asservissement de trouver le meilleur pointage en azimut et hauteur.

Mais c'est vraiment pour le fun (je m'amuserai un jour à en faire un :slight_smile: )

Cordialement.

Pierre

Sauf que par temps completement couvert le système de recherche d'éclairement max va bagoter dans tous les sens à la recherche d'un hypothétique maximum. Il faudra donc ajouter un système pour le désactiver.
Je pense que se baser sur des calculs pour pointer sur le soleil est le moyen le plus sûr qui présente le moins d'inconvénients.

68tjs:
... Il faudra donc ajouter un système pour le désactiver. ...

ChPr:
... il faut doubler le tracker solaire par un tracker d'éclairement max. ...

Le doubler veut évidemment dire qu'il y a un gestion inter-tracker :wink:

Cordialement.

Pierre

Bonjour,

ChPr:
Si vous voulez faire de l'optimisation fine (pour le fun), il faut doubler le tracker solaire par un tracker d'éclairement max. En effet, en cas de nuages masquant partiellement ou totalement le soleil, la meilleure orientation n'est pas forcément celle du soleil.

Un genre d'Héliographe !

Bonjour à tous.

Je prend bien note de tout vos conseil et merci beaucoup :smiley:

J'ai téléchargé et installé la bibliothèque .

Cependant je me casse les dents sur mon bureau car je n'arrive pas à faire mettre
l'heure et la date que mon super DS3231 me donne dans cette ligne:

posSoleil("12/02/2017 09:32:18", -5, 40.76, -73.984, &ha, &az);

J'aimerais remplacer "12/02/2017" et "09:32:18" par des variables qui pourrons
ensuite être traiter automatiquement.

Quelqu'un a une idée?
Merci d'avance pour votre aide

Ceci est le code pour le Tracker.
Il est loin d'être fini et d'être optimisé.
Il n'a jamais été testé (j'attend les moteurs)

#include <AFMotor.h>
#include <Ephem_Soleil.h>
#include <Wire.h>
#include <ds3231.h>

struct ts t;

int pasmoteurconfig = 48;
int numeromoteur;
AF_Stepper motor(pasmoteurconfig, numeromoteur);

int cpt_azimute_1 = 37 ; //Capteur de contact Broche 37 de l’Arduino
int cpt_azimute_2 = 38 ; //Capteur de contact Broche 38 de l’Arduino
int cpt_elevation_1 = 39 ; //Capteur de contact Broche 39 de l’Arduino
int cpt_elevation_2 = 40 ; //Capteur de contact Broche 40 de l’Arduino

float rapport_de_reduction_azimute = 1;
float rapport_de_reduction_elevation = 1;

int azimute1;
int azimute2;


int heure = 15;
double ha;
double az;
String lS, mS, cS;

int jour_calcule;
int mois_calcule;
int annee_calcule;
int heure_calcule;
int minute_calcule;
int seconde_calcule;


void setup() {
  //----------Initialisation de l'horloge---------- *
  Wire.begin();
  DS3231_init(DS3231_INTCN);
  DS3231_set(t);
  
  //Lecture de l'heure
  DS3231_get(&t);
  jour_calcule = t.mday;
  mois_calcule = t.mon;
  annee_calcule = t.year;
  heure_calcule = t.hour;
  minute_calcule = t.min;
  seconde_calcule =  t.sec;
  
  //----------Initialisation du Tracker----------  
  int elevation1;
  int elevation2;
  int nb_pas_azimute_init;
  int nb_pas_elevation_init;
  int nb_pas_azimute;
  int nb_pas_elevation;
  int nbpasaz;
  int nbpasel;  
  
  float position_moteur_azimute;
  float position_moteur_elevation;
  float degres_par_pas;
  float azimute0_deg_enpas;
  float elevation0_deg_enpas;  


  motor.setSpeed(10); // 10 rpm
  motor.release();  
  
  pinMode(cpt_azimute_1, INPUT);
  pinMode(cpt_azimute_2, INPUT);
  pinMode(cpt_elevation_1, INPUT);
  pinMode(cpt_elevation_1, INPUT);
  
  azimute1=digitalRead(cpt_azimute_1);
  azimute2=digitalRead(cpt_azimute_2);
  elevation1=digitalRead(cpt_elevation_1);
  elevation2=digitalRead(cpt_elevation_2);
  
  //Positionnement du panneau pour compter le nombres de pas entres les capteurs à la position +180° et 90°
  while ((azimute1 && elevation1) == LOW){ 
    numeromoteur = 1;
    motor.step(1, FORWARD, SINGLE);
    numeromoteur = 2;
    motor.step(1, FORWARD, SINGLE);
  }  
  
  //Comptage du nombres de pas entres les capteurs jusqu'à la position -180° et 0°
  while ((azimute2 && elevation2) == LOW){ 
    numeromoteur = 1;
    motor.step(1, BACKWARD, SINGLE);
    nb_pas_azimute_init = nb_pas_azimute + 1;
    numeromoteur = 2;
    motor.step(1, BACKWARD, SINGLE);
    nb_pas_elevation_init = nb_pas_elevation + 1;
  }  
  
  nbpasaz = 0;
  nbpasel = 0;
  
  //calcul du nombres de pas en azimute pour aller à -180°
  azimute0_deg_enpas = nb_pas_azimute/2; 
  nb_pas_azimute = (nb_pas_azimute_init - azimute0_deg_enpas) * rapport_de_reduction_azimute;
  
  //calcul du nombres de pas en élévation pour aller à 0°
  elevation0_deg_enpas = nb_pas_elevation/2;
  nb_pas_elevation = (nb_pas_elevation_init - elevation0_deg_enpas)* rapport_de_reduction_elevation;
  
  //Positionnement du panneau à -180° en azimute et 0° en elevation
  while (((((azimute1 && azimute2) == LOW)) && (nbpasaz < nb_pas_azimute-1)) && ((azimute1 && azimute2) == LOW) && (nbpasel < nb_pas_elevation-1)) {
    numeromoteur = 1;
    motor.step(1, FORWARD, SINGLE);
    nbpasaz = nbpasaz + 1;
    numeromoteur = 2;
    motor.step(1, FORWARD, SINGLE);
    nbpasel = nbpasel + 1;
  }
}
  



void loop() {
  double azimute_calcule;
  double elevation_calcule;

  int pas_effectuer_azimute;
  int pas_effectuer_elevation;
  
  int position_panneau_azimute;
  int position_panneau_elevation;
  
  int degre_azimute_a_faire;
  int degre_elevation_a_faire;

  int nbpas_moteur_azimute;
  int nbpas_moteur_elevation;

  int nbpasaz;
  int nbpasel;

  //Calcul de la position du soleil
  posSoleil("12/02/2017 15:00:00", 0, 48.8582333, 2.2944695, &ha, &az);  // Tour Eiffel le 12/02/2017
  azimute_calcule = az;
  elevation_calcule = ha;

  //Calcul de la différence de degré entre la dernière position du panneau et la position du soleil 
  degre_azimute_a_faire = position_panneau_azimute - azimute_calcule;
  degre_elevation_a_faire = position_panneau_elevation - elevation_calcule;

  //Convertion des degrés en pas pour les moteurs
  nbpas_moteur_azimute = degre_azimute_a_faire / (pasmoteurconfig * rapport_de_reduction_azimute);
  nbpas_moteur_elevation = degre_elevation_a_faire / (pasmoteurconfig * rapport_de_reduction_elevation);

  //Orientation du Tracker 
  while (((((azimute1 && azimute2) == LOW)) && (nbpasaz < nbpas_moteur_azimute-1)) && ((azimute1 && azimute2) == LOW) && (nbpasel <  nbpas_moteur_elevation-1)) {
    numeromoteur = 1;
    motor.step(1, BACKWARD, SINGLE);
    nbpasaz = nbpasaz + 1;
    numeromoteur = 2;
    motor.step(1, BACKWARD, SINGLE);
    nbpasel = nbpasel + 1;
  }
}

cordialement

Dans la bibliothèque, il existe une fonction où la date (année, mois, jour) et l'heure (heures, minutes, secondes) peuvent être données sous forme d'entier. Est-ce que cela résout votre problème ?

Cette fonction utilise une chaîne pour la date et l'heure :

void posSoleil(String dh, int tZ, double la, double lon, double *ha, double *az)

Celle-ci utilise des entiers pour la date et l'heure :

void posSoleil(int a, int m, int j, int h, int mn, int s, int tZ, double la, double lon, double *ha, double *az)

Cordialement.

Pierre

L'idée est là!

Mais je ne vois pas du tout comment l’intégrer au programme.

j'ai essayé:
int a;
int m;
int j;
int h;
int mn;
posSoleil(&a,&m,&j,&h,&mn, 0, 48.8582333, 2.2944695, &ha, &az);

et:
int a;
int m;
int j;
int h;
int mn;
posSoleil(a,m,j,h,mn, 0, 48.8582333, 2.2944695, &ha, &az);

Mais sans résultats.

Après le post j'ai eu une idée de génie

void Calcul_Position_du_soleil (int a, int m, int j, int h, int mn, int s, int tZ, double la, double lon, double *ha, double *az)
posSoleil() = Calcul_Position_du_soleil();

Mais toujours sans résultats.

Essayez ce qui suit :

  int a = 2017;
  int m = 8;
  int j = 24;
  int h = 9;
  int mn = 55;
  int sc = 30;
  posSoleil(a, m, j, h, mn, sc, 0, 48.8582333, 2.2944695, &ha, &az);

Car dans votre exemple, vous n'avez pas donné de valeur aux variables et vous avez oublié les secondes.

Dans l'exemple qui est fourni avec la bibliothèque, décommentez les lignes 18 et 19, vous obtiendrez le même résultat qu'avec les lignes 16 et 17.

Cordialement.

Pierre