Pages: [1] 2   Go Down
Author Topic: [PROG] gestion éclairage et chauffage aquarium  (Read 9335 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 89
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous et merci à tous ceux qui m'ont aidé pour la programmation de mon Arduino destiné à la gestion de l'éclairage et du chauffage de mon aquarium.
Le but du programme est de créer un allumage et une extinction progressive de ma rampe Leds fabrication maison.

Alors tout d'abord il s'agit d'un bac de 250 litre mesurant 1m10 x 0m45 x 0m50.
C'est un bac destiné à accueillir des cichlidés du lac malawi.
Il n'y a aucune plante, juste un décor à base de bloc de granit d'où l'absence de LEDs bleu et rouge.

Je suis parti sur des LEDs 10mm - 100mA.
Il y a donc 58 LEDs blanches et 18 LEDs blanches chaudes, toutes groupées par trois avec une résistance de 22 Ohm en série.
Il y a également un éclairage lunaire composé de 12 LEDs bleues de 5mm - 20mA également groupées par trois mais avec une résistance en série de 100 Ohm.
Le tout est alimenté en 12 Volts par une alimentation de PC.

Je vous mets juste deux photos de la construction de la rampe car le sujet n'est pas celui là et qu'il y a autant de rampe que de bricoleurs.




Voici les caractéristiques du montage :
1) allumage et extinction automatique du chauffage sur la plage 24 - 26 °C (possibilité de forcer l'allumage avec un switch)
2) Rampe à LEDs Jour avec possibilité d'allumage manuel avec un switch à n'importe quelle heure (pour nettoyage par exemple)
- allumage progressif de la rampe LED de 15h00 à 16h00
- allumage max de 16h00 à 20h00
- extinction progressive de 20h00 à 21h00
3) Rampe à LEDs Lunaire
- allumage à 20h15
- extinction à 23h00
4) Afficheur LCD 2 lignes / 16 caractères : allumage du rétro-éclairage avec un switch
- affichage heure
- affichage température
- affichage de l'état du chauffage ( ON - OFF )

L'allumage et l'extinction progressif utilisent une des sorties PWM de l'Arduino et un Mosfet à choisir en fonction de la puissance de la rampe à commander.
La rampe lunaire utilise un relais commander par un ULN2803. Il s'agit d'un octuple driver d'amplification de puissance ON/OFF : donc 8 relais possible.
J'aurais très bien pu utiliser un autre mosfet pour la rampe lunaire à la place du relais.
Par contre je n'aurais pas pu utiliser un relais pour la rampe jour car avec un relais c'est tout ou rien donc pas de progressif.

Voilà la liste des composants utilisés :

1 arduino Duemilanove
1 mini carte DS1307
1 capteur de température LM35
1 écran LCD de 2 lignes et 16 caractères
1 ULN2803 (pour commander les relais)
2 diodes 1N4007
1 résistance 10KOhm
1 mosfet (j'ai pris un BUZ11)
2 relais 12V dont un supportant le 230V en sortie pour le chauffage
des connecteurs (j'ai pris des prises XLR que j'avais en stock)
des interrupteurs
du câbles de différentes sections

Toutes les cartes et l'alimentation dans le coffret


Vu des connecteurs et de l'écran sur la face externe du boitier



Logged

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

Et voici le programme

Code:
#include <Time.h>
#include <LiquidCrystal.h>
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>

/*
Arduino Masterbalby Controller
 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 = LCD
 Digital Pin 7 = LCD
 8 = chauffage
 10 = moon_light
 Digital Pin 11 = PWM day_light
 Digital Pin 16 = Bouton poussoir 1 day light
 Digital Pin 15 = Bouton poussoir 2 chauffage
 */

//LiquidCrystal lcd(rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
int sensorPin = 0;
int chauffage = 8;
int moon_light = 10;
int pwm = 11;
int heater_on_temp = 24;  //allume chauffage à cette température
int heater_off_temp = 26; //éteint le chauffage à cette température
int moon_on_time = 2015;  //allume les  moon lights à cette heure (en temps_perso)
int moon_off_time = 2300;  //éteint les moon lights à cette heure (en temps_perso)
int minut;
int heure;
int seconde;
int date;
int mois;
int annee;
int temps_perso;
int BP1=16; //interrupteur Day_light
int BP2=15; //interrupteur Chauffage

void setup() {
/*  RTC.stop();
  RTC.set(DS1307_SEC,00);        //réglage secondes
  RTC.set(DS1307_MIN,59);        //réglage minutes
  RTC.set(DS1307_HR,15);         //réglage heures
  RTC.set(DS1307_DOW,6);         //réglage jour de la semaine
  RTC.set(DS1307_DATE,11);       //réglage date
  RTC.set(DS1307_MTH,12);         //réglage mois
  RTC.set(DS1307_YR,10);          //réglage année
  RTC.start();
*/
  lcd.begin(16, 2);
  delay(10);
  pinMode(chauffage, OUTPUT);  // digital pin pour chauffage en sortie
  pinMode(moon_light, OUTPUT);  // digital pin pour moon light en sortie
  lcd.print("MasterBalby 2.1");
  lcd.setCursor(0, 1) ;
  lcd.print("Gestion Aqua");
  delay(4000);
  lcd.clear();
  delay(10);
  pinMode(BP1, INPUT); //met la broche en entree
  digitalWrite(BP1, HIGH) ; // activation du pullup de la broche en entrée
  pinMode(BP2, INPUT); //met la broche en entree
  digitalWrite(BP2, HIGH) ; // activation du pullup de la broche en entrée
}

void loop(){

  //Récupérer 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;  //creation temps_perso

  //Récupérer la température du LM35 ***************************************************************************************

  int reading = analogRead(sensorPin);  
  float voltage = reading * 5.0 / 1024;
  int temp = voltage * 100 ;

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

  lcd.setCursor(6,0);
  lcd.print("Temp : ");
  delay(10);
  lcd.print(temp);
  lcd.println("C");  

  //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(1000);

  //Controles des sorties ***************************************************************************************

  //****************Chauffage

  if((temp < heater_on_temp) || (digitalRead(BP2)==LOW)) {    
    digitalWrite(chauffage, HIGH);
  }  
  else if (temp > heater_off_temp)
  {  
    digitalWrite(chauffage, LOW);
  }

  //****************Day Lights**********************************************************************************

  if (heure == 15) { // entre 15:00 et 15:59:59
    analogWrite (pwm, (1 << map (minute() * 60 + second(), 0, 3600, 0, 10)) -1); // allumage progressif exponentiel
//    analogWrite (pwm, map (minute() * 60 + second(), 0, 3600, 0, 1024));  // allumage progressif linéaire
  }
  else if (heure == 20) { // entre 20:00 et 20:59:59
    analogWrite (pwm, (1 << map (minute() * 60 + second(), 0, 3600, 10, 0)) -1); // extinction progressif exponentiel
//    analogWrite (pwm, map (minute() * 60 + second(), 0, 3600, 1024, 0));  // extinction progressif linéaire
  }  
  else if ((heure > 15 ) && (heure < 20)) {
    analogWrite(pwm, 255);
  }
  else if (((heure > 0  && heure < 15)) && (digitalRead(BP1)==LOW)) {
    analogWrite(pwm, 255);  
  }
  else if (((heure > 20  && heure < 24)) && (digitalRead(BP1)==LOW)) {
    analogWrite(pwm, 255);  
  }
  else if ((heure == 0) && (digitalRead(BP1)==LOW)) {
    analogWrite(pwm, 255);  
  }
  else if (((heure > 0  && heure < 15)) && (digitalRead(BP1)==HIGH)) {
    analogWrite(pwm, 0);  
  }
  else if (((heure > 20  && heure < 24)) && (digitalRead(BP1)==HIGH)) {
    analogWrite(pwm, 0);  
  }
  else if ((heure == 0) && (digitalRead(BP1)==HIGH)) {
    analogWrite(pwm, 0);  
  }

  //****************Moon Lights****************************************************************************

  if(moon_on_time > temps_perso  || moon_off_time <= temps_perso){
    digitalWrite(moon_light, LOW);
  }
  else{
    digitalWrite(moon_light, HIGH);
  }

  //Affichage chauffage allumé********************************************************

  lcd.setCursor(0,1);
  if(digitalRead(chauffage) == HIGH)
  {
    lcd.println("Chauffage ON    ");
  }
  else
  {
    lcd.println("Chauffage OFF   ");
  }
}
« Last Edit: December 11, 2010, 10:46:03 am by masterbalby » Logged

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

Si vous avez des commentaires n'hésitez surtout pas...
Logged

Central Europe
Offline Offline
Edison Member
*
Karma: 7
Posts: 1220
Use the Source, Luke.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En fin de compte, quelle était la raison d'utiliser l'allumage exponentiel et non linéaire?

Et la seconde question, as-tu un cite avec des images du reste de la construction et - si tout est terminé - avec les bestioles?

Korman
Logged

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

pour l'allumage exponentiel je trouve l'allumage plus progressif.

Je n'ai pas encore mis toutes mes photos sur un site, il y en a sur trois site différents.
Voila les liens :
http://aquaohm.xooit.fr/t1033-Montage-electronique-pour-gestion-allumage-extinction-chauffage.htm#p14035
http://aquaohm.xooit.fr/t889-Eclairage-Malawi-250L-brut-sans-plante.htm?start=60
http://www.forumaquario.org/lancement-de-l-aquarium-f30/et-un-250l-de-plus-avec-eclairage-leds-t50787.htm#608819


L'aquarium n'est pas encore en eau.
Je pense le faire cette semaine.
Après il faut attendre un bon mois pour que le pic des nitrates soit passé et après enfin l'introduction des poissons.


[EDIT]
je viens de créer un blog ou tout est recensé.
Voici le lien
http://masterbalby.aqua.over-blog.com/
[EDIT]
« Last Edit: December 12, 2010, 05:05:11 am by masterbalby » Logged

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

J'ai besoin une fois de plus de votre aide.
Je viens de trouver un problème dans mon montage qui n'existait pas en phase de test.

Il s'agit d'un problème avec l'allumage progressif de ma rampe.

Voila les symptômes.

Lors de l'enclenchement de l'allumage progressif l'affichage de l'heure sur l'écran affiche la bonne heure puis quelques secondes plus tard une heure éronnée.
[media]http://www.youtube.com/watch?v=sD3Vb75VPcM
[/media]


La rampe Leds s'éteint puis se rallume constamment.
De plus la rampe n'atteint jamais son éclaraige max.

Ce problème n'est jamais arrivé en phase de test avec uniquement trois Leds de 20mA.

Par contre lors de la deuxième phase d'éclairage , c'est à dire éclairage max sur une période de 4 heures, il n'y a pas de problème avec le LCD ou avec la rampe.

Pour faire des essais j'ai diminué de moitié la quantité de leds sur ma rampe.
Là le problème ne se pose pas.

Je pense donc que le problème est plus matériel que logiciel.

Mais quoi ??

L'alimentation ??? je ne pense pas car lors de la période d'eclairage max il n'y a pas de problème.

Peut-être le Mosfet utilisé. Ici un BUZ11 .
D'après son datashheet il peut dissiper 90Watts. Or mon montage ne dépasse pas les 40 Watts.

Un problème avec le code utilisé ??
Je ne pense pas non plus.

Faut-il changer de Mosfet ??

Merci pour votre aide.
Logged

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

Je viens de vérifier, le phénomène est identique en phase d'extinction progressive.

Pour résumer :

ça sa fonctionne
Code:
analogWrite(pwm, 255);

ça sa ne fonctionne pas
Code:
analogWrite (pwm, (1 << map (minute() * 60 + second(), 0, 3600, 0, 10)) -1);

et sa non plus
Code:
analogWrite (pwm, map (minute() * 60 + second(), 0, 3600, 0, 1024));
« Last Edit: December 12, 2010, 03:38:33 pm by masterbalby » Logged

Central Europe
Offline Offline
Edison Member
*
Karma: 7
Posts: 1220
Use the Source, Luke.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Question intéressant est si analogWrite(pwn, 32) ou similaire fonctionne.

Korman
« Last Edit: December 12, 2010, 05:01:56 pm by Korman » Logged

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

j'y ai pensé cette nuit aussi.
je testerai ce soir
Logged

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

alors voici les résultats des tests.
toutes les valeurs de 1 à 254 posent le même problème.

Je pense que ça doit venir du mosfet qui n'arrive pas à analyser les données PWM envoyées par l'arduino.
Il doit comprendre le min 0 et le max 255 pas les valeurs intermédiaires.

C'est pourquoi je vais changer de mosfet...
J'espère que c'est ça
Logged

France, Nice
Offline Offline
Full Member
***
Karma: 3
Posts: 194
www.Zartronic.fr
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Le mosfet ...
C'est peut être l'étage de commande du mosfet, peux tu mettre le schéma.

A+ Teiva

www.Zartronic.fr : Votre source Arduino en France
« Last Edit: December 14, 2010, 03:01:51 am by Teiva » Logged


www.Zartronic.fr : Arduino & Robotique

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

voila le schéma demandé
pour précision je n'utilise pas le deuxième mosfet

[/URL]

Logged

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

Me voila de retour

j'ai résolu mon problème en rajoutant un mosfet cablé de la même façon que le premier.
J'ai donc un mosfet par demi rampe.

Et là je n'ai plus de problème.
Je peux allumer progressivement les deux rampes en même temps et tout fonctionne.

Je pense donc à un mauvais choix au niveau du mosfet.

J'ai aussi un peu modifié le programme pour que cela fonctionne.
J'ai rajouté une sortie PWM.
J'ai donc deux sorties PWM pour ma rampe de jour.

http://masterbalby.aqua.over-blog.com/
Logged

France, Nice
Offline Offline
Full Member
***
Karma: 3
Posts: 194
www.Zartronic.fr
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Je suis pas électronicien, mais il me semble que le pilotage du mosfet est réduit à son minimum.
Je penses que ça va bien pour une utilisation en remplacement d'un relais, mais pour le pwm c'est peut être pas top.
Voir :
http://www.sullivan-county.com/ele/basic_power_supplies.htm
( ta version en fait parti ).
Le "coté obscur" du Mosfet est sa capacité parasite sur la Gate, il faut un bon driver pour la charger et décharger, dans le cas du pwm c'est encore plus sensible. Dans certains montage on utilise un driver de mosfet pour justement faire cette opération en quelques ns.

Il n'y a pas un électronicien sur la liste ?

A+ Teiva

www.Zartronic.fr : Votre source Arduino en France
Logged


www.Zartronic.fr : Arduino & Robotique

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

Alors j'ai de nouveau les mêmes problèmes.

En cherchant des infos sur les drivers de mos je suis tombé sur un site qui parle de mosfet Logic Level , c'est à dire de mosfet commande compatible avec circuits logiques 5V.

De cette façon on évite l'emploi d'un driver.

Je compte en commander cet après midi.

Merci de m'alerter si je me trompe.
Logged

Pages: [1] 2   Go Up
Jump to: