Update 12/10/2012 :
Ajout d'une feuille de calcul excel vous permettant de déterminer au mieux les 4 valeurs Durée Totale, durée Rampe, Zenith et Max.
Max et le max du PWM (255 en 8 bits, 1024 en 10 bits)
Zenith est l'heure à laquelle la rampe a la valeur max, le zenith quoi
(en minutes depuis minuit)
Durée totale est la durée totale de la courbe (en minutes)
Durée rampe est la durée ascendante de la rampe (en minutes)
il suffit de modifier une des 4 valeurs et le recalcul du graphique est automatique. Il faut activer les macros dans excel ainsi que le recalcul automatique, qui doit y être par défaut.
La feuile de calcul Excel est ici
v1.00 - 12/07/2012 : version initiale
v1.01 - 11/10/2012 :
patch pour le bug en mode 10 bits. Si la valeur pour AnalogWrite est 255, l'arduino n'envoie rien (=0V). donc si la valeur est 255, on envoie 254
TODO : identifier le bug (probablement mauvais param des registres TCCxx)
v1.02 - 25/10/2012 :
correction de la fonction SetLuneMax
v1.03 - 04/11/2012 : compatibilité Atmega 168P/328P
v1.04 09/01/2013 : Possibilité d'appeler SetLuneMax avec une structure "time_t"
modifs dans le fichier exemple
v1.05 07/07/2013 : Ajout de la fonction SunOrRain, qui permet de déterminer s'il pleut, ou s'il fait beau
Correction par
Gerdel de la fonction LisserRampeLed : En phase descendante, pas de lissage dans la même minute
Voilà après quelques échanges avec Billyboyk il y a déjà quelques temps sur son implémentation de l'éclairage avec simulation de lever/coucher de soleil ainsi que la lune, voici le tout réuni dans une librairie qui j'espère sera pratique. C'est une pré version va t-on dire, qui fonctionne sur mon bac depuis 2/3 mois, qui est plus du copier coller du programme d'origine mais qui fonctionne.
Je sais qu'il reste un bug en mode PWM 10 bits lorsque la valeur est de 255, il n'y a plus d'éclairage. Le mode 8 bits fonctionne parfaitement.
Pour l'installation il suffit de décompresser le zip ci dessous dans le répertoire libraries, relancer l'IDE Arduino. Ensuite il y a 2 programmes exemples dans le menu fichier/Exemples/Aqualight. Une version utilisant un module RTC (que je remets ci dessous sans les commentaires de l'exemple), un autre exemple avec simulation rapide du temps qui passe, histoire de voir ce que ça donne rapidement.
Il faudra également la librairie RTC.
Dans l'attente de vos retours, positifs ou négatifs, mais constructifs
Librairie Aqualight v1.05
Librairie RTC et
Librairie Time
#include <Time.h>
#include "AquaLight.h" // La librairie magique
#include <DS1307RTC.h>
#include <Wire.h>
// Numéro de broche PWM
#define LED_Blanc_PIN 2
#define LED_Lune_PIN 3
// on déclare l'objet principal
// Ici on transmet juste le n° de broche, le mode PWM 8 ou 10 bits (PWM8 ou PWM10)
// Ainsi que le type de rampe (classique ou moonlight)
AquaLight LED_Blanc(LED_Blanc_PIN,PWM8,DAYLIGHTMODE);
AquaLight LED_Lune(LED_Lune_PIN,PWM8,MOONMODE);
// La valeur PWM calculée (pour info ou affichage, le digitalWrite étant directement dans la librairie)
int PWM_Led_Blanc=0;
int PWM_Led_Lune=0;
int heures, minutes, secondes, jour, mois, annee;
time_t RTCTime;
tmElements_t RTCtm;
void setup()
{
// Toujours garder une trace du reboot pour ceux qui ne seraient pas voulus !!
Serial.begin(57600);
Serial.println("Reboot!!");
// Init circuit I2C
Wire.begin();
//Ordre des paramètres : DUREE_TOTALE, DURE_RAMPE, MAX, ZENITH,
// Attention aux valeurs de MAX et ZENITH , les valeurs max sont 1024 en mode 10 bits et 255 en mode 8 bits !
// Pour la lune pas de valeur Max à l'initialisation, on calcule après en fonction du jour de l'année.
LED_Blanc.SetParams(750,240,240,945);
LED_Lune.SetParams(720,180,0,950);
}
void loop()
{
SetTime();
PWM_Led_Blanc = LED_Blanc.LisserRampeLED(heures,minutes);
LED_Lune.SetLuneMax(jour, mois, annee);
PWM_Led_Lune = LED_Lune.LisserRampeLED(heures, minutes);
delay(2000);
}
void SetTime()
{
RTCTime=RTC.get(); // Format Unix TimeStamp
breakTime(RTCTime,RTCtm); // Structure RTCtm avec propriétés Heures, minutes ... etc.
heures = RTCtm.Hour;
minutes = RTCtm.Minute; //Minutes
secondes = RTCtm.Second; //Secondes
jour = RTCtm.Day; //Jour
mois = RTCtm.Month; //Mois
annee = RTCtm.Year; //Annee
}