gestion aquarium recifal allumage progressif

Merci pour le lien.

Si j'ai bien compris tu as donc un driver par led.
En amont du driver, tu utilises aussi une alimentation par led ou une alimentation globale pour tes 5 leds.

Personnellement, je parts sur la réalisation d'une rampe led avec des leds de 20W.

Re

Toute mon installation est alimenter par un transfo 12V 5a car les 5 led 10w consomme ~800ma

Re, j'ai fais des essais et pour que la correction gamma fonctionne, il faut que tu fasses cela :

Tu déclares en haut de ton programme :

float timerPWM = 0;
float valeurPWM=0;
float GAMMA_CORRECTION = 2.2;
float PWMStep = 0;

et ensuite dans ta fonction tu met cela :

PWMStep = 255 / 29;
timerPWM = i-30;
valeurPWM = timerPWM * PWMStep;
valeurPWM = floor(pow( valeurPWM / 255 , GAMMA_CORRECTION ) * 255) ;
analogWrite (rouge, (int)valeurPWM);

pense a modifier la formule de PWMStep en fonction de la durée de la plage d'allumage et d'extinction et timerPWM en fonction que tu désires un allumage progressif ou une extinction progressive

Si ton programme se bloque c'est parceque tu utilise la fonction delay();

Enfin cela n'est pas très compliqué de rajouter un seuil minimum
//Adéclarer avec tes variables
int SeuilMini = 10;

else if (heure == 20) { // entre 20:00 et 20:59:59
PWMStep = 255 / 60;
timerPWM = 60-minut;
valeurPWM = (int)(timerPWM * PWMStep);

// La super formule pour définir un seuil mini
if( valeurPWM < SeuilMini ) valeurPWM = 0;

analogWrite (power_led, valeurPWM);
lcd.setCursor(0,1);
lcd.print(" - POWER_LED - ");

//Le fameux delay qui bloque le programme :smiley:
delay(2000);

//Pourquoi ce delay ?

}

ok
que faut t'il mètre pour definir i ?
mais que faut il mètre a la place de delay stp ?
et comment faire demarer la progression a une valeur supérieur a 0 ?
merci

pardon tu remplaces i par minut

et comment faire demarer la progression a une valeur supérieur a 0 ?
La réponse est au dessus n'oublies pas de déclarer SeuilMini
if( valeurPWM < SeuilMini ) valeurPWM = 0;

pkoi tu veus mettre un delay() ?

ba le delay c'est pour faire défiler mes message un certain temps
c'est pas comme sa qu'il faut faire ?

il est un peu tard la mais je vais te mettre sur la voie google fera le reste. Dans ton programme tu as utilisé des comparaisons avec des heures et des minutes donc la c'est la même chose mais avec millis();
allé je te mâche un peu le travail : Arduino Forum
Bonne soirée

bonsoir,

Merci pour tout le temps que tu passe a m'aider.
j'ai regarder le lien que tu a mis au dessus et j'ai chercher sur google ...
Mais je ne sait pas si tu la remarquer mais j'ai debuter sur arduino ou plutot sur l'electronique avec se projet il y a 3 mois maintenant, et franchement , ton lien pour moi c'est du charabia :disappointed_relieved:
si tu pouvais une dernière fois me donner la formule a mètre en place pour ne pas mètre le delay sa serais sympa.
De plus sa permettras au autre aquariophile de profiter de nos expériences.
je ne manquerais pas de mètre des photos de ma rampe des quelle seras installé
merci encore

Après relecture de ton code tu devrais pouvoir t'en sortir avec les delay() et cela devrai même marcher puisque les plus gros que tu utilises sont delay(2000); soit deux secondes et au total de tout tes delay il y en a pour moins d'une minute donc ton heure ne devrait pas rester bloquée, et n'ayant pas de module RTC et d'ecran LCD difficile pour moi de tester ce qui ne vas pas.

Est ce que ton programme ne reste pas bloqué dans une condition pour une plage horaire, il faut que tu fasses des test en mettant des Serial.print("blabla"); pour voir ou cela coince.

Je ne connais pas la librairie LCD mais quand tu écris quelquechose sur l'ecran, si tu ne mets pas de delay cela s'efface tout de suite? il n'y a pas un buffer qui fait en sorte que quand tu envois du texte il reste affiché dans quel cas tu n'as pas besoin des delay();

Bonsoir,

Si je ne met pas de délais l’écran scintille et c'est illisible.
Avec les délais, le Temps que tout le loop soit fait l'heure n'avance pas et les fonctions associer a l'heure ne se déclenche quand la boucle recommence ...

Comment font les personne qui font défiler plusieurs message pour ne pas bloquer leur programme ?

Tu m'as déjà beaucoup aider et je t'en remercie, pour ne pas t’embêter plus longtemps je vais poster cette question sur le forum.

Merci encore

Je suis désolé mais n'ayant pas le matériel pour tester le programme il m'est difficile de t'aider pour cela j'espère que tu auras ta solution enfin tu as déjà ton allumage progressif

bonjour,

voila tout marche correctement :slight_smile:
merci a tout se qui mon aider depuis le début.

voici mon code pour tout les germanophile

#include "LiquidCrystal.h"
#include "WProgram.h"
#include "Wire.h"
#include "DS1307.h"

/*
 sorti /entre Arduino
 Analog Pin 0 = Température Sensor
 Analog Pin 4 = SDA pour ds1307
 Analog Pin 5 = SCL pour ds1307
 Digital Pin 2 = LCD
 Digital Pin 3 = LCD
 Digital Pin 4 = LCD
 Digital Pin 5 = LCD
 Digital Pin 6 = power led
 Digital Pin 7 = ventilateur
 Digital pin 9 = rouge 
 Digital pin 10 = blanc
 Digital Pin 11 = LCD
 Digital Pin 12 = LCD
 Digital Pin 8 = bleu uv
 */

//Configuration des Pin de cablage**********************

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int sensorPin = 0;
int power_led = 6;
int bleu_uv = 8;
int rouge = 10;
int blanc = 9;
int ventilateur = 7;
int time;
float temp;
int timerPWM = 0;
int valeurPWM=0;
float PWMStep = 0;

//Configuration des heures allumage/extinction ( format HHMM )**********************

int bleu_uv_on_time = 2030;  
int bleu_uv_off_time = 2359; 
int ventilateur_on_temp = 26.75;  
int ventilateur_off_temp = 26.00;

int minut;
int heure;
int temps_perso;

//Configuration de l'heure ( pour modifier l'heure de votre Arduino, enlevez les /* et */ puis une foi le programe envoyé, remettez les )**********************

void setup() {
   /*
  RTC.stop();
  RTC.set(DS1307_SEC,30);           //réglage secondes
  RTC.set(DS1307_MIN,52);              //réglage minutes
  RTC.set(DS1307_HR,11);               //réglage heures
  RTC.set(DS1307_DOW,6);               //réglage jour de la semaine
  RTC.set(DS1307_DATE,15);             //réglage date
  RTC.set(DS1307_MTH,9);               //réglage mois
  RTC.set(DS1307_YR,12);                 //réglage année
  RTC.start();
  */
  
 //Configuration des entrées/sorties********************** 
  
  pinMode(ventilateur, OUTPUT);  // digital pin ventilateur 1 
  pinMode(bleu_uv, OUTPUT);  // digital pin pour bleu uv
  pinMode(blanc, OUTPUT);  // digital pin pour blanc
  pinMode(rouge, OUTPUT);  // digital pin pour rouge
  pinMode(power_led, OUTPUT);  // digital pin pour power led

lcd.begin(16,2);
Serial.begin(9600);  

}

void loop(){
 
   //Récupération de la température du LM35 ***************************************************************************************

 int reading = analogRead(sensorPin);  
  float voltage = reading * 5.52 / 1024;
  int temp = voltage * 100 ;
 
  //Récupération de l'heure du DS1307**********************************************************************************************

  heure = RTC.get(DS1307_HR,true);  
  minut = RTC.get(DS1307_MIN,false);
  temps_perso = (heure * 100) + minut; 
 
  
  lcd.clear();
   lcd.setCursor(0,0);
   lcd.print ("  AQUA GESTION  ");
       lcd.setCursor(6,1);
  if (heure < 10)
  {
    lcd.print("0");
  }
  lcd.print(heure);
  lcd.print("H");
  if (minut < 10)
  {
    lcd.print("0");
  }
  lcd.print(minut);
  lcd.print(" ");   
   delay(5000);
    lcd.setCursor(0,1);
  lcd.print("       ");
  lcd.print(temp);
  lcd.print((char)223);
  lcd.print("      ");
  delay(5000);

   lcd.setCursor(0,0);
   lcd.print ("    GESTION     ");
  lcd.setCursor(0,1);
   lcd.print ("      lune      ");
   delay(1500);
   lcd.setCursor(0,1);
   lcd.print ("     soleil      ");
   delay(1500);
     lcd.setCursor(0,1);
     lcd.print ("  temperature   ");
   delay(1500);
    lcd.setCursor(0,1);
     lcd.print ("  niveau d'eau  ");
   delay(1500);
   lcd.clear();
  
    //Affichage heure******************************************************************************************
  lcd.setCursor(0,0);
  if (heure < 10)
  {
    lcd.print("0");
  }
  lcd.print(heure);
  lcd.print("H");
  if (minut < 10)
  {
    lcd.print("0");
  }
  lcd.print(minut);
  lcd.print(" ");
  delay (100);


 
  //Affichage température*****************************************************************************

  lcd.setCursor(13,0);
  lcd.print(temp);
  lcd.print((char)223);

  //****************ventilateur
   if(temp > ventilateur_on_temp){
    digitalWrite(ventilateur, HIGH);
      }  
  if(temp < ventilateur_off_temp){    
    digitalWrite(ventilateur, LOW);
  }
  

  
    //*****Controle des sorties eclairage *********
  
   //**on-off******* bleu uv *************
  if(bleu_uv_on_time > temps_perso  || bleu_uv_off_time <= temps_perso){
    digitalWrite(bleu_uv, LOW);
   }
  else{
    
    digitalWrite(bleu_uv, HIGH);
   }
   
    //***on-off***** rouge ***
  
if (heure ==  8)  { 
    PWMStep = 255 / 59;
    timerPWM = minut-60;
    valeurPWM = (int)(timerPWM * PWMStep);
    analogWrite (rouge, valeurPWM);
  lcd.setCursor(0,1);
    lcd.print(" + + ROUGE + +  ");
    delay(5000);
  }
  
 else if ((heure == 20) && (minut >30)) { 
    PWMStep = 255 / 29;
    timerPWM = 30-minut;
    valeurPWM = (int)(timerPWM * PWMStep);
    analogWrite (rouge, valeurPWM);
lcd.setCursor(0,1);
    lcd.print(" - - ROUGE - -  ");
    delay(5000);
 
  }  
  
  else if ((heure >= 9 ) && (heure < 21)) {
    analogWrite(rouge, 255);
   lcd.setCursor(0,1);
    lcd.print("  ROUGE     on  ");
    delay(5000);
  }
else if ((heure <= 21) && (heure > 8 )){
    analogWrite(rouge, 0);
  }
   
 //***on-off***** blanc ***
  
 if ((heure ==  8) && (minut >30)) { 
    PWMStep = 255 / 29;
    timerPWM = minut-30;
    valeurPWM = (int)(timerPWM * PWMStep);
    analogWrite (blanc, valeurPWM);
lcd.setCursor(0,1);
    lcd.print(" + + BLANC + +  ");
    delay(5000);
  
  }
  
 else if (heure == 20) { 
    PWMStep = 255 / 60;
    timerPWM = 60-minut;
    valeurPWM = (int)(timerPWM * PWMStep);
    analogWrite (blanc, valeurPWM); 
lcd.setCursor(0,1);
    lcd.print(" - - BLANC - -  ");
    delay(5000);
  }  
  
  else if ((heure >= 9 ) && (heure < 21)) {
    analogWrite(blanc, 255);
    lcd.setCursor(0,1);
    lcd.print("  BLANC     on  ");
    delay(5000);
  }
else if ((heure <= 21) && (heure > 8 )){
    analogWrite(blanc, 0);
  }

//***on-off***** power led ***

  if ((heure ==  9) && (minut >3))  { 
    PWMStep = 240 / 59;
    timerPWM = minut-60;
    valeurPWM = (int)(timerPWM * PWMStep)+ 15;
    analogWrite (power_led, valeurPWM);
    
lcd.setCursor(0,1);
    lcd.print(" + POWER led +  ");
    delay(5000);

  }
else if (heure == 20) { // entre 20:00 et 20:59:59 
    PWMStep = 240 / 60;
    timerPWM = 60-minut;
    valeurPWM = (int)(timerPWM * PWMStep) + 15;
    analogWrite (power_led, valeurPWM);
lcd.setCursor(0,1);
    lcd.print(" - POWER led -  ");
    delay(5000);

  }
else if ((heure >= 10 ) && (heure < 21)) {
    analogWrite(power_led, 255);
lcd.setCursor(0,1);
    lcd.print(" POWER led   on ");
    delay(5000);

  }
else if ((heure <= 21) && (heure > 9 )){
    analogWrite(power_led, 0);
  } 
       //****Affichage ventilateur ********

  lcd.setCursor(0,1);
  if(digitalRead(ventilateur) == HIGH)
  {
    lcd.println("ventilateur ON  ");
   delay(5000);
  }
  else
  {
    lcd.println("ventilateur OFF ");
    delay(5000);
  }
 }

slt ,Merci a toi pour le suivie de ton projet .
avec je vais pouvoir essayer de faire mon propre programme mais comme toi je ne metrise pas vraiment la programmation mais a force ca avance ...@+

Bonjour,

toujours a la recherche d’amélioration a apporter a mon projet, j'ai commander un driver afin de faire varier mon ventilateur selon la temperature (car il fait bcp de bruit au max)
Quelqu’un peut me dire Command modifier mon code pour que le ventilateur s'allume a 25% a 26.5° et augmente progressivement pour être au max a 29.5°.
si cela est compliquer progressivement, faire des palier, 26.5° = 25%, 27° = 35%, 27.5° = 45%, 28° = 60°, 28.5°= 75%, 29°= 90%, au dessus = max.

Merci

djbouns:
Bonjour,

toujours a la recherche d’amélioration a apporter a mon projet, j'ai commander un driver afin de faire varier mon ventilateur selon la temperature (car il fait bcp de bruit au max)
Quelqu’un peut me dire Command modifier mon code pour que le ventilateur s'allume a 25% a 26.5° et augmente progressivement pour être au max a 29.5°.
si cela est compliquer progressivement, faire des palier, 26.5° = 25%, 27° = 35%, 27.5° = 45%, 28° = 60°, 28.5°= 75%, 29°= 90%, au dessus = max.

Merci

bonjour
il est où le code ? :grin:

si la progression est (à peu pres) lineaire voir peut etre du coté du coté de la fonction map ?

Bonsoir,

Ba ... le code il est juste au dessus ... je poursuis sur le même forum ... lol
si sa perturbe je peut en crée un nouveau mais pour ceux que sa intéresse cela permet d'avoir tout d'un coup.

bon... j'ai regarder la page que tu a fourni. j'ai compris le principe mais par contre comment faire le lien entre se code et ma température ???

merci

djbouns:
Bonsoir,

Ba ... le code il est juste au dessus ... je poursuis sur le même forum ... lol
si sa perturbe je peut en crée un nouveau mais pour ceux que sa intéresse cela permet d'avoir tout d'un coup.

bon... j'ai regarder la page que tu a fourni. j'ai compris le principe mais par contre comment faire le lien entre se code et ma température ???

merci

bonjour
si j'ai bien lu
reading= la valeur ana lue du LM35 = la T°
ton driver de ventilo, c'est quoi ? commandé comment ?

salut
voici le model de mon driver

http://www.eio.com/p-41276-sure-electronics-le-ll14113-high-power-10w-20w-15a-led-dc-driver.aspx

il seras commander par mon arduino lol