Venom, j'ai déjà fait ce tuto pour moi et pour plus tard car, à mon âge...
Convertir du code PureBasic en bibliothèque Arduino pour ce cas précis
Objectif :
Transformer un ensemble de fonctions PureBasic (ex : calculs astronomiques) en bibliothèque Arduino (LunaPhases) réutilisable dans un sketch Arduino.

Étape 1 : Analyser le code PureBasic
Ce que tu as :
Des fonctions comme AgeLune(), IlluminationLune(), JourJulien(), etc.
Des variables globales (à éviter dans une bibliothèque).
Des constantes, des calculs mathématiques, des formules astronomiques.

Ce qu’il faut garder :
Les algorithmes de calcul (ex : Jour Julien, longitude lunaire, illumination) de PB.
Les entrées/sorties claires : update(année, mois, jour, heure, minute, seconde) → getAgeLunaire(), getIllumination(), getPhase().

Étape 2 : Créer la structure de la bibliothèque Arduino
Arborescence :
LunaPhases/
├── src/
│ ├── LunaPhases.h
│ └── LunaPhases.cpp
├── keywords.txt
└── library.properties

Étape 3 : Créer LunaPhases.h
Code : Tout sélectionner
#ifndef LunaPhases_h
#define LunaPhases_h
#include "Arduino.h"
class LunaPhases_
{
public:
LunaPhases_();
void update(long year, int month, int day, int hour, int minute, int second);
float getAgeLunaire();
float getIllumination();
const char* getPhase();
private:
float _age;
float _illumination;
const char* _phase;
// Méthodes privées
double JourJulien(int year, int month, int day, int hour, int minute, int second);
void CalculateSolarLunar(double JD, double* lambdaS, double* lambdaL, double* M, double* Mp, double* L, double* D);
double PositifMod360(double x);
};
extern LunaPhases_ LunaPhases;
#endif

Étape 4 : Créer LunaPhases.cpp
Traduire les fonctions PureBasic en méthodes C++.
Adapter les types : Float PureBasic → float ou double Arduino.
Gérer les angles : Mod(x, 360) → PositifMod360(x).
Optimiser : utiliser double pour les calculs critiques, float pour les résultats.

Étape 5 : Gérer les différences de précision
PureBasic utilise Float (64 bits).
Arduino (ATmega) : float = 32 bits, double = 32 bits aussi (sur ATmega).
Pour plus de précision, utiliser double dans les calculs critiques, mais stocker les résultats en float.

Étape 6 : Gérer les bibliothèques Arduino
#include <math.h> pour sin, cos, acos, etc.
Ne pas redéfinir DEG_TO_RAD ou RAD_TO_DEG : déjà définies dans Arduino.h.

Étape 7 : Créer keywords.txt
LunaPhases KEYWORD1
getAgeLunaire KEYWORD2
getIllumination KEYWORD2
getPhase KEYWORD2
update KEYWORD2

Étape 8 : Créer library.properties
name=LunaPhases
version=1.0.0
author=PhM
maintainer=PhM
sentence=Bibliothèque pour calculer les phases lunaires
paragraph=Calcul de l'âge lunaire, illumination et nom de la phase
category=Data Processing
url=
https://github.com/yourname/LunaPhases (reste éventuellement à faire)
architectures=*

Étape 9 : Tester la bibliothèque
Code : Tout sélectionner
#include <LunaPhases.h>
void setup() {
Serial.begin(9600);
LunaPhases.update(2025, 10, 29, 22, 0, 0);
Serial.print("Age lunaire : ");
Serial.println(LunaPhases.getAgeLunaire(), 2);
Serial.print("Illumination : ");
Serial.println(LunaPhases.getIllumination(), 2);
Serial.print("Phase : ");
Serial.println(LunaPhases.getPhase());
}
void loop() {}

Étape 10 : Optimiser et valider
Comparer les résultats avec le code PureBasic et Stellarium
Ajuster les calculs si nécessaire (erreurs d’arrondi).
Vérifier la consommation mémoire.

Résumé :
1 Analyser le code PureBasic
2 Créer l’arborescence de la bibliothèque
3 Écrire LunaPhases.h
4 Écrire LunaPhases.cpp
5 Gérer les types et précision
6 Inclure les bonnes bibliothèques
7 Créer keywords.txt
8 Créer library.properties
9 Tester dans un sketch Arduino
10 Valider et optimiser

Astuce finale et reflexion :
Tu peux tester les calculs sur un ordinateur avec un environnement C++ avant de les passer sur Arduino, pour valider les algorithmes.
Utilise des tableaux de tests (dates connues → résultats attendus) pour valider la précision notamment avec Stellarium. Il est d'ailleurs à noter, à ma grande surprise, que le microcontrôleur Arduino donnait des calculs au moins aussi précis que PB sur un PC x64 !