Go Down

Topic: Arduino + control aquarium (Read 3572 times) previous topic - next topic

233figfoz

Bonjour, suis débutant sur arduino, et aurai besoin d'aide pour réaliser un petit projet pour mon aquarium !
Le projet consiste à allumer et éteindre une rampe de leds (l'éclairage de l'aquarium) avec effet « fade ».
J'ai une LRD qui me donne valeur ambiante, donc, ce que j'aimerai c'est que le matin si la valeur es supérieur a 100(par exemple) l'éclairage s'allume en « fade », et le soir dès que lumière ambiante baisse l'éclairage de l'aquarium s'étend aussi en « fade » !, quelqu'un peut m'aider ?

Heloderma-kris

oui on peut t'aider mais il faudrait deja que tu couche , au moins une esquise de code car la c'est un peut juste !
une petite recherche sur e forum te donnera deja les basse.
http://playground.arduino.cc/Learning/PhotoResistor

apres il va falloir nous en dire un peut plus sur ta rampe a led tension puissance alimentation bref des carracteristique qui puissent nous orienté afin de te conseiller!

dans un second temps le choix de la LDR est discutable , a premiere vue ça peut semblé intérésant pour les heur de lever et couché mais  si tu te place dans le cas de figure ou tu rentre a minuit pour regardé la TV dans ton salon et que tu allume la lumiere ton aquarium va s'alummé et perturbé le cycle de tes poissons.

regarde du coté des RTC pour avoir une basse temporel fixe ( ou variable) pour l'allumage , mais pas un mode dynamique environemental.

233figfoz

Bonjour et merci, j'ai déjà ce bout de code, mais ce que j'aimerai faire, ce serai qu'il s'allume et s'arrête par « fade » !! et ça je n'y arrive pas !!

byte led1=9; //configura o led1 na porta 13

int ldr =A0; //configura o ldr na entrada analogica 0
int luz=0;// cria a variavel luz para guardar o valor lido no ldr

void setup()
{
  pinMode(led1,OUTPUT); // configura o led1 como saida
  digitalWrite(led1,0); //apaga o led1
  Serial.begin(115200);  //inicializa a serial para ler o valor do ldr no serial monitor
}

void loop()
{
  luz = analogRead(ldr); //armazena o valor lido do ldr na variavel luz
  Serial.println(luz); // envia o valor da variavel luz para o pc
   
     if(luz >500) // se luz for maior que 700...
       {
       
        digitalWrite(led1,0);//acenda o led1
       
       }
     if(luz < 500) // e se for menor que 300...
       {
       digitalWrite(led1,1); //apague o led1
       }
     
       
       
       

  delay(100); //aguarde 100 milisegundos
}

Heloderma-kris

je vais essayer de partir du debut car je ne sait pas vraiment ou tu te situ en code arduino, alors ne le prend pas mal si defoit ça te parai evident:

1er ce que tu appelle fade et une diminution ou une augmentation progresive de la puissance fournie a ta ou tes led.
en arduino on realise cela assez facilement avec les broche qui sont capable de généré un signal PWM. ( pulse with modulation  en français modulation de largeur d'impultion) .

en gros sur une periode defini comme T on va alume un interupteur et l'etindre simultanément dans certaine proportion , plus l'interupteur est alumé longtemp sur cete periode T plus la puissance fournie et proche de sont maxima ( 100%).

avec le code arduino on gére cela facilement grace a la fonction analogWrite(pin , valeur) avec valeur code sur 256 posibilité
0->0%(complétement etint)
255->100%( complétement allumé)

seul certain pin sont géré en PWM et cela depent de ton model.


2er : maintenant que tu sait utiliser le PWM il va faloir cree une fonction (ou bout de code ) qui va a partire du'une valeur de reference , par exemple la tension mesuré au borne de la LDR, convertire ça en valeur de 0 à255.

pour cela tu peut utilisé la fonction map ( valref,valrefmin,valrefmax,valsortiemin ,valsortiemax)
cette fonction te permetra de convertie la tension en valeur de 0 à 255 que tu poura envoyer dans la fonction analoglwrite().

voila pour le moment cela te permetra de comprendre qle code que tu as et de le modifier a ta convenance d'avoir quelque chose ! je te laise reflechire au code .  :smiley-mr-green:

Minicarpet

Salut,

En effet il va falloir que tu utilises le PWM : cependant attention, tu risques de pas avoir assez d'A (si je dis pas de connerie) pour allumé toutes tes LEDs, (puisque tu veux une rampe, sinon achète une barre lumineuse :p)
Regarde du coté des registre a décalage, avec ça tu pourras faire ce que tu veux de tes LEDs surtout si tu connectes ton entrée Vcc du composant a du PWM tu pourras tout gérer : quelle LED allumé, quelle intensité etc etc

Le 74HC595 est le plus connu

On peut faire ce genre de truc : https://www.youtube.com/watch?v=WlfD1bFekmI

Cordialement
Arduino UNO R3, ESPLORA, Due, Zero Pro
Robot Arduino
Arduino Standalone

Heloderma-kris

#5
Aug 07, 2014, 09:01 am Last Edit: Aug 07, 2014, 09:39 am by Heloderma-kris Reason: 1
Le montage avec un registre a decalage ne permetra pas de magniere simple de faire du vraix PWM c'est du on/off rapide, le plus adapte serai des tlc5940 qui sont des driver a led avec une posibilite sur 4096 valeur :
http://www.zem.fr/comprendre-le-composant-tcl5940-multiplexeur-pwn/

apres il y a plusieur façon de procédé c'est sur ! le plus important eqt de bien comprendre le fonctionement des fonction de basse. sur un mega 2560 tu a  15 sortie PWM ce qui offre deja une belle possibilité

il est sur que direct sur l'arduino ça ne marchera pas il va faloir faire un etage de puissance !( mais c'est dans un second temps )

Heloderma-kris

bon voici une version de ton code que je vien de modifier , mais il te faut faire la comparaison pour comprendre ce qu'il fait ( le principe )
il compile mai je ne l'ai pas tester :

Code: [Select]
byte led1=9; //configura o led1 na porta 13

int ldr =A0; //configura o ldr na entrada analogica 0
int luz=0;// cria a variavel luz para guardar o valor lido no ldr

void setup()
{
 pinMode(led1,OUTPUT); // configura o led1 como saida
 digitalWrite(led1,0); //apaga o led1
 Serial.begin(115200);  //inicializa a serial para ler o valor do ldr no serial monitor
}

void loop()
{
 luz = analogRead(ldr); //armazena o valor lido do ldr na variavel luz
 Serial.println(luz); // envia o valor da variavel luz para o pc
 
    if(luz >500) // si la valeur de detection depasse le seuille maximum ici 500
      {
       
       analogWrite(led1,255);//on allume la led a 100%=255
     
      }else
       if(luz < 100) // si la valeur de detection passe en desous du seuil minimu ici 100
      {
       analogWrite(led1,0); //on eteint la led a 0%=0
      }
      else{// sinon entre les deux on fait du pwm en fonction da la valeur
      analogWrite(led1,map(luz, 100, 500, 0, 255) );
      }
 delay(100); //aguarde 100 milisegundos
}


ps: pense a metre ton code entre le balise '['code']''['/code']'dans ton premier message

Minicarpet

Il y a moulte choix, tout dépend de ton budget, du matériel dont tu disposes, et de ce que tu veux disposer exactement ;)
en tout cas merci je cherchais un mux efficace :D
Arduino UNO R3, ESPLORA, Due, Zero Pro
Robot Arduino
Arduino Standalone

Heloderma-kris

#8
Aug 07, 2014, 01:47 pm Last Edit: Aug 07, 2014, 04:56 pm by Heloderma-kris Reason: 1
on va travailler sur le code que tu m'a envoyer en message ( il vaut mieux poster ici puisque c'est un forum ;)):

Quote
Bonjour et encore une fois merci pour ton aide, mais ce que tu m'as fait, je sais le faire aussi, ce que j'aimerai c'est que l'allumage soit progressive, par exemple passer de 0 a 255 en 20 secondes. J'ai aussi ce code mais là, le problème c'est que dès qu'il allume les leds la LRD arrête de capter les valeurs et les leds font du 0 à 255 e puis recommencent de nouveaux elles ne s'arrêtent pas à 255 !!.
merci


Code: [Select]

int led = 9;  // pin 9 is an analog pin
int ldr =A0; //configura o ldr na entrada analogica 0
int lumiere=0;// cria a variavel luz para guardar o valor lido no ldr
void setup() {
 pinMode(led, OUTPUT);
 Serial.begin(115200);  //inicializa a serial para ler o valor do ldr no serial monitor }

void loop() {
// int delayTime = 20;
   lumiere = analogRead(ldr);
 Serial.println(lumiere);
 

 if(lumiere >500){        
       
       allumer();      
      }
      if(lumiere <500){
     
        eteindre();      
      }
}

void allumer(){
 int delayTime = 20;
// slowly turn the led on
 for (int i=0; i<255; i++) {
   analogWrite(led, i);
   delay(delayTime);
 }
}
void eteindre(){
  int delayTime = 20;
for (int i=255; i>=0; i--) {
   analogWrite(led, i);
   delay(delayTime);
 }
}


il faut que tu utilise une base temporel vu que tu n'a pas la RTC tu peut utiliser la fonction, millis() qui va te renvoyer le temp en miliseconde ecouler depuis que ton arduino est sous tension.

actuelement ton code verifie la valeur de la LDR puis si une de tes condition est respecter il va se perdre dans des boucle for() quil va executer avec un delay de 20 miliseconde a chaque boucle tant que i n'est pas arivé a sont maximum  et repart vers la boucle de tes contion et ainsi de suite .


ce qu'il te faut c'est detecter un seuil et ensuite efectuer  faire ton PWM , mais il te faudra aussi une base de temps pour parametre ton pwm

voila ce que tu peut faire :
Code: [Select]
#define led  9  // pin 9 is an analog pin
#define ldr A0 //configura o ldr na entrada analogica 0 int lumiere=0;// cria a variavel luz para guardar o valor lido no ldr void setup() {
#define delayTime 20 //seconde
#define delayFade delayTime*1000// on convertie en miliseconde
int lumiere=0;// cria a variavel luz para guardar o valor lido no ldr
boolean testFadeP=false;// varible pour fade Positif
boolean testFadeN=false;// variable pour test negatif
void setup() {
 pinMode(led, OUTPUT);
 Serial.begin(115200);  //inicializa a serial para ler o valor do ldr no serial monitor
 }

void loop() {
// int delayTime = 20;
   lumiere = analogRead(ldr);
 Serial.println(lumiere);
 

 if(lumiere >500){  // on detecte si on est superieur a 500      
       if(testFadeP==false){// on verifie que l'on a pas deja effectuer va variation
       allumer();// on efectue la variation
       testFadeP=true;// on passe la variable test a vrai pour evité de refaire la variation
       testFadeN=false;// on passe la variable test a faux pour reinitialisé
     }  
digitalWrite(led,HIGH); // comme la variation a deja eu lieu on est allumé a 100%    
      }
 if(lumiere <500){  // on detecte si on est inferieur a 500      
       if(testFadeN==false){// on verifie que l'on a pas deja effectuer va variation
       eteindre();// on efectue la variation
       testFadeN=true;// on passe la variable test a vrai pour evité de refaire la variation
       testFadeP=false;// on passe la variable test a faux pour reinitialisé
     }  
digitalWrite(led,LOW); // comme la variation a deja eu lieu on est eteint a 100%
}
}
void allumer(){
long t_Depart =millis();// on enregistre le temps initial( debut de fade)
while(delayFade-(millis()-t_Depart)>0){// tanque l'on a pas ateind la duree du fade
  int i=delayFade-(millis()-t_Depart);// on calcule le temps ecouler
  byte fade =map(i,0,delayFade,0,255);// on convertie en valeur de 0à 255 la base de temps
  Serial.print("fade="); Serial.println(fade);
analogWrite(led,fade );// on envoi un signal proportionel a la duree restante
 }
 }

void eteindre(){
  long t_Depart =millis();// on enregistre le temps initial( debut de fade)
while(delayFade-(millis()-t_Depart)>0){// tanque l'on a pas ateind la duree du fade
  int i=delayFade-(millis()-t_Depart);// on calcule le temps ecouler
  byte fade =map(i,0,delayFade,255,0);// on convertie en valeur de 0à 255 la base de temps
  Serial.print("fade="); Serial.println(fade);
analogWrite(led,fade );// on envoi un signal proportionel a la duree restante
 }
 }


j'ai normalement tout commenter pour que tu puise comprendre ma logique , biensur ça compile mais je n'est pas tester a toit de voir pour modifier par la suite
ce code peut etre optimiser mais je pense que comme ça tu as toute les etapes.

Minicarpet

Attention tu as mis allumer dans ton if<500
Sinon effectivement, ça doit être otpimisable (un seul boolean pour vérifié que le test est fait devrait suffire), mais la tel quel ça devrait fonctionner. Ne pas oublié de brancher ta LED sur une PWM (voir les infos sur la page de ta carte sur ce site), la pin 9 en est une.
dans son prog tu peux définir toi même la durée que tu veux que ça dure. nice job :)
Arduino UNO R3, ESPLORA, Due, Zero Pro
Robot Arduino
Arduino Standalone

Heloderma-kris

harg saleté de ctrl+c,ctr+v je me suis pas relut  :smiley-mr-green:

Go Up