Pages: 1 [2] 3 4   Go Down
Author Topic: gestion aquarium recifal allumage progressif  (Read 8244 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 160
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

re

alors, je vient de supprimer la ligne "valeurPWM = floor( pow( valeurPWM / 255 , GAMMA_CORRECTION ) * 255 );"
et la miracle sa m'affiche la valeur -pwm qui monte jusque a 0 et les led s'allume progressivement.
a quoi servait cette ligne ?
depuis le début je ne comprenais pas la correction gamma.
ais je trouver la solution ?
Logged

Haute Normandie
Offline Offline
Full Member
***
Karma: 1
Posts: 139
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

oui tu as compris, la correction gamma a pour but d'avoir une transition beaucoup plus linéaire, je pense que le soucis vient du (int) essai ceci :
change les int par des float

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



et dans la fonction met ceci :
 if ((heure ==  smiley-cool && (minut >=30)) {
    PWMStep = 255 / 29;
    timerPWM = minut-30;
    valeurPWM = timerPWM * PWMStep;
    valeurPWM = floor( pow( valeurPWM / 255 , GAMMA_CORRECTION ) * 255 );

    Serial.print("Plage 8h30 - 9h00"  -  Valeur écrite sur la sortie blanc :");
    Serial.println(valeurPWM);
    analogWrite (blanc, (int)valeurPWM);
  }

Je regarderais cela ce soir car je ne suis pas sur de ce que je t'avance mais le soucis vient du type int ou float car la formule pour la correction gamma est bonne.

En tout cas content que cela avance un peu
Logged

Rien ne sert de chercher à tout savoir, mieux vaut savoir où tout chercher

Offline Offline
Full Member
***
Karma: 0
Posts: 160
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Désoler de ne pas avoir repondu avant mais depuis ton dernier message je suis en test intensif ...
  smiley-razz
Bon, resultat ...
Toutes mes progression fonctionne correctement !
Mais bien sur j'ai 2 petit probleme qui son apparu  smiley-twist

 le premier concerne mes power led, elle on besoin d'une tension minimum et du coup le début de la progression les fait scintiller.
A tu une formule pour que la progression se fasse a partir d'un niveau minimum ?

Le second concerne l'affichage, j'ai besoin de faire apparaître des informations et le problème ces que l'heure et la température son figer le Temp du loop.
A tu aussi une solution a cela ?

Je remet mon code afin que tu regarde ces 2 problèmes et que d'autre aquariophilie puisse en profiter aussi.

Code:
#include <Time.h>
#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 GAMMA_CORRECTION = 2.2;
float PWMStep = 0;


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

int bleu_uv_on_time = 1930;  //allume la pompe à cette heure
int bleu_uv_off_time = 2359; //éteint la pompe à cette heure
int ventilateur_on_temp = 27;  //allume chauffage à cette température
int ventilateur_off_temp = 26.3; //éteint le chauffage à cette température

int minut;
int heure;
int seconde;
int date;
int mois;
int annee;
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,50);           //réglage secondes
  RTC.set(DS1307_MIN,59);              //réglage minutes
  RTC.set(DS1307_HR,9);               //réglage heures
  RTC.set(DS1307_DOW,1);               //réglage jour de la semaine
  RTC.set(DS1307_DATE,10);             //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 l'heure du DS1307**********************************************************************************************

  heure = RTC.get(DS1307_HR,true); 
  minut = RTC.get(DS1307_MIN,false);
  seconde = RTC.get(DS1307_SEC,false);
  date = RTC.get(DS1307_DATE,false);
  mois = RTC.get(DS1307_MTH,false);
  annee = RTC.get(DS1307_YR,false);
  temps_perso = (heure * 100) + minut; 

  //Récupération de la température du LM35 ***************************************************************************************

  temp = analogRead(sensorPin); 
  temp = temp * 0.48828125;
 

  //****************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(2000);
  }
 
 else if ((heure == 20) && (minut >30)) { // entre 20:00 et 20:59:59
    PWMStep = 255 / 29;
    timerPWM = 30-minut;
    valeurPWM = (int)(timerPWM * PWMStep);
    analogWrite (rouge, valeurPWM);
    lcd.setCursor(0,1);
    lcd.print(" - - ROUGE - - ");
    delay(2000);
  } 
 
  else if ((heure >= 9 ) && (heure < 21)) {
    analogWrite(rouge, 255);
    lcd.setCursor(0,1);
    lcd.print("  ROUGE   ON    ");
    delay(2000);
  }
else if (heure <= 21) {
    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(2000);
  }
 
 else if (heure == 20) { // entre 20:00 et 20:59:59
    PWMStep = 255 / 60;
    timerPWM = 60-minut;
    valeurPWM = (int)(timerPWM * PWMStep);
    analogWrite (blanc, valeurPWM);
    lcd.setCursor(0,1);
    lcd.print(" - - BLANC - - ");
    delay(2000);
  } 
 
  else if ((heure >= 9 ) && (heure < 21)) {
    analogWrite(blanc, 255);
    lcd.setCursor(0,1);
    lcd.print("  BLANC   ON    ");
    delay(2000);
  }
else if (heure <= 21) {
    analogWrite(blanc, 0);
  }

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

  if (heure ==  9)  {
    PWMStep = 255 / 59;
    timerPWM = minut-60;
    valeurPWM = (int)(timerPWM * PWMStep);
    analogWrite (power_led, valeurPWM);
    lcd.setCursor(0,1);
    lcd.print(" + POWER LED + ");
    delay(2000);
  }
else if (heure == 20) { // entre 20:00 et 20:59:59
    PWMStep = 255 / 60;
    timerPWM = 60-minut;
    valeurPWM = (int)(timerPWM * PWMStep);
    analogWrite (power_led, valeurPWM);
    lcd.setCursor(0,1);
    lcd.print(" - POWER_LED - ");
    delay(2000);
  }
else if ((heure >= 10 ) && (heure < 21)) {
    analogWrite(power_led, 255);
    lcd.setCursor(0,1);
    lcd.print(" POWER LED   ON  ");
    delay(2000);
  }
else if (heure <= 21) {
    analogWrite(power_led, 0);
  }

//****Gestion de l'Affichage Sur l'écran ********

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

  lcd.setCursor(10,0);
  delay(100);
  lcd.print(temp);
  lcd.print((char)223);

  //Affichage heure******************************************************************************************
  lcd.setCursor(0,0);
  if (heure < 10)
  {
    lcd.print("0");
  }
  lcd.print(RTC.get(DS1307_HR,true));
  lcd.print("H");
  if (minut < 10)
  {
    lcd.print("0");
  }
  lcd.print(RTC.get(DS1307_MIN,false));
  lcd.print(" ");
 delay(200);
    //****Affichage ventilateur ********

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

}
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 62
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Je suis aquariophile et donc directement intéressé par le sujet.

Pourrais-tu m'indiquer (un lien si tu as) quel driver power led tu utilises pour alimenter et piloter tes 5 leds de 10w ?

D'avance merci.

Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 160
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

salut,

voici les lien de mes driver
http://www.sureelectronics.net/goods.php?id=1288

je ne sait pas de quoi tu est équiper mais tu verras vraiment la différence avec un éclairage led.
pour ma part j'ai installer 3 blanche et 2 bleu royal.

bon courage a toi en espérant que le forum t’épargneras tout le temps que j'ai passer a effectuer toute mes recherche.
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 62
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 160
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Re

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

Haute Normandie
Offline Offline
Full Member
***
Karma: 1
Posts: 139
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :
Code:
float timerPWM = 0;
float valeurPWM=0;
float GAMMA_CORRECTION = 2.2;
float PWMStep = 0;

et ensuite dans ta fonction tu met cela :
Quote
    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

Logged

Rien ne sert de chercher à tout savoir, mieux vaut savoir où tout chercher

Haute Normandie
Offline Offline
Full Member
***
Karma: 1
Posts: 139
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Rien ne sert de chercher à tout savoir, mieux vaut savoir où tout chercher

Haute Normandie
Offline Offline
Full Member
***
Karma: 1
Posts: 139
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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-grin
    delay(2000);

    //Pourquoi ce delay ?


  }
Logged

Rien ne sert de chercher à tout savoir, mieux vaut savoir où tout chercher

Offline Offline
Full Member
***
Karma: 0
Posts: 160
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Haute Normandie
Offline Offline
Full Member
***
Karma: 1
Posts: 139
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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() ?
Logged

Rien ne sert de chercher à tout savoir, mieux vaut savoir où tout chercher

Offline Offline
Full Member
***
Karma: 0
Posts: 160
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Haute Normandie
Offline Offline
Full Member
***
Karma: 1
Posts: 139
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 : http://arduino.cc/forum/index.php?action=printpage;topic=81000.0
Bonne soirée
Logged

Rien ne sert de chercher à tout savoir, mieux vaut savoir où tout chercher

Offline Offline
Full Member
***
Karma: 0
Posts: 160
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-sad-blue
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


Logged

Pages: 1 [2] 3 4   Go Up
Jump to: