20
oct
09

Petite mise à jour

Pas grand-chose de nouveau dans le bac, tout tourne et semble rouler, si ce n’est que mon Scopas a commencé à trouver que certains petits coraux (notamment les palythoas roses), c’était très bon à manger et que je les ai quasiment tous perdus. J’ai déplacé la pierre en hauteur, où le Scopas va rarement, et j’espère que ça repoussera. Quelques photos, désolée il y a des algues que j’ai de la peine à enlever (mais j’espère que quelques nouveaux détritivores m’aideront prochainement à réaliser cette tâche !)

DSCF1303

DSCF1304

DSCF1305 DSCF1306

Une petite image de la décantation,  on voit que le refuge a bien poussé. Il y a env. 10cm de sable de mon ancien bac, quelques pierres vivantes et des algues. Et bien entendu, une micro-faune considérable, ce qui est l’effet recherché.

Au milieu, on notera les graines de palétuvier qui poussent gentiment (enfin, les racines poussent). J’ai aussi décidé de recycler mon ancien écumeur Tunze, il ne tourne normalement que la nuit en supplément du Deltec.

DSCF1298

Une image plus détaillée du refuge…

 

DSCF1300

DSCF1301

Et de la partie écumage (le Deltec est éteint là, je refais un peu la tuyauterie interne).

DSCF1302

04
sept
09

Un peu silencieuse… mais pas sans projets

Cela fait quelques semaines que je n’ai pas mis à jour ce blog, ce qui ne signifie pas que mes projets sont au point mort, bien au contraire !

L’urgence du moment, c’est que j’ai des spots halogènes dans ma cuisine dont les ampoules ne cessent d’exploser (probablement dû à une mauvaise installation initiale du cuisiniste) et que je commence à en avoir assez. Je suis en train de considérer un prototype de spot de remplacement en LEDs, en réalité une plaque de plexiglas qui sera composée soit de 80 LEDs, soit d’une 40aine en fonction du type de LED que je vais prendre (c’est à l’étude en ce moment).

En résumé, cela sera également un prototype pour l’éclairage de mes aquariums, d’abord pour mon aqua d’eau douce, ensuite peut-être pour le récifal. Tout cela probablement contrôlé, bien entendu.. par un Arduino, vous vous en doutez !

Dans la cuisine, l’idée est d’utiliser à la fois la détection de mouvement, un détecteur de lumière et une temporisation pour que l’éclairage s’allume automatiquement (et s’éteigne de même.)

Plus de détails lorsque la réalisation commencera !

25
juil
09

Petite Evolution

Petits changements, peu spectaculaires (mais nécessaires !) pour mon contrôleur… soudé la plupart des câbles du LCD et de l’horloge sur une platine indépendante pour libérer de la place sur la platine d’essai (les températures négatives sont dues au fait qu’il n’y avait pas de capteur de branché à ce moment-là) DSCF1263

et remplacé le capteur de température par un LM35DZ, un processeur linéaire. Sa précision est moindre que celle du thermistor initial (il fonctionne par défaut par pas de 0.5° C), mais il est plus facile à mettre en oeuvre (pas de calibration, lecture des résultats linéaire etc.).

Il sera la “sonde” qui mesurera la température de l’eau dans le futur.

DSCF1265

19
juil
09

Mon Arduino sait lire l’heure (DS1307)

DSCF1256 Arrivage d’Asie (Futurlec, une adresse à connaître !). Je reviendrai sur mes autres achats, mais ce qui m’a occupée aujourd’hui c’est une petite horloge “real time” basée sur la puce DS1307.

L’idée est que mon Arduino conserve la date et l’heure en permanence, histoire que les statistiques soient correctes.

DSCF1257

Voici la “bête” et sa référence chez  futurlec. J’ai dû me battre un peu avec les librairies DS1307 pour l’Arduino (il y a des modifications constantes), et surtout j’ai dû mettre un condensateur 10nf sur le circuit pour lisser le courant.

DSCF1262

Après quelques heures de tests et de programmation, mon Arduino sait lire (et garder !) l’heure, et encore mieux, l’afficher…

DSCF1259

Le résultat sur le port sériel (sera utilisé plus tard pour faire des statistiques sur PC), les données sont envoyées toutes les 10 secondes sur le port sériel.

DSCF1260

Le code actuel (je n’ai pas la prétention d’être une grande codeuse, alors à prendre “tel quel” ! Je commente beaucoup car j’ai peu de mémoire, alors c’est pour référence ultérieure. A noter que les pin 20 et 21 sont les ports one-wire sur l’Arduino Mega, ce sont les PIN 4 et 5 sur le modèle standard.

//**************** AquaControleur Test code ****************

//**************** Libraries ****************
#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <Debounce.h>
#include <math.h>
#include <WProgram.h> //for the clock
#include <Wire.h> //for the clock
#include <DS1307.h> //for the clock

//**************** Defines PIN ****************
#define Ventilator 22
// Ventilator is put on Pin 22 – no PWM so far
// Temperature on analog 0 (no need to declare)
// SDA 20 //IC22 ports clock (no need to declare)
// SDC 21 //IC21 ports clock (no need to declare)

//Insert template for streaming
/*This allows you to write succinct code like
Serial << “My name is ” << name << ” and I am ” << age << ” years old.”;
or
Serial << “GPS unit #” << gpsno << ” reports lat/long of ” << lat << “/” << long;*/
template<class T> inline Print &operator <<(Print &obj, T arg) {
obj.print(arg);
return obj;
}

//**************** LiquidCrystal display ****************
//rs on pin 12
//rw on pin 11
//enable on pin 10 d4, d5, d6, d7 on pins 5, 4, 3, 2 */
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

//**************** Other Variables ****************
//Temp Average calcs
const int NumberValuesAVG = 100; // Defines how many values the array will keep for the temp averages
double ReadingsAVG[NumberValuesAVG]; //array that contains the values
int index = 0;
double total = 0;
double average = 0;

//Temp values
#define ThermistorPIN 0   // Analog Pin 0 contains thermistor reading
double temp; //temperature var
double currentTemp = 0; //temporary Temp Variable
double HighLow[] = {
0,99,1};// HighLow[0]=High, HighLow[1]=low, HighLow[2]=AVG
double ventLimit[]  = {
26.0, 25.5}
; //first is the threshold to start vent, [0], second to stop vent [1]

//Date and Time Values
int rtc[7]; //real time clock values

//SerialPrint interval (set when we print to the serial port)
long LGpreviousMillis = 0;
long SHpreviousMillis = 0;

// Code Running intervals
long LGinterval = 10000; //interval at which the serial data is updated, here 10 secs
long SHinterval = 1000; //actions to run more often (every sec)

//**************** Thermistor Functions ****************
//Schematic:
// [Ground] —- [10k-Resister] ——-|——- [Thermistor] —- [+5v]
//                                     |
//                                Analog Pin 0
// using a 4.7K thermistor

// Inputs ADC Value from Thermistor and outputs Temperature in Celsius
//  requires: include <math.h>
// Utilizes the Steinhart-Hart Thermistor Equation:
//    Temperature in Kelvin = 1 / {A + B[ln(R)] + C[ln(R)]^3}
//    where A =0.0012819121, B = 0.00023789205 and C = 0.00000010217758
// Values for a,b,c taken from spec sheet here (p. 33 ) :: http://www.epcos.com/inf/50/db/ntc_06/LeadedDisks__B57164__K164.pdf then
// calculated from : http://www.capgo.com/Resources/Temperature/Thermistor/ThermistorCalc.html
//Thermistor code from http://www.arduino.cc/playground/ComponentLib/Thermistor2 (short code)

double Thermister(int RawADC) {
double Temp;
Temp = log(((10240000/RawADC) – 10000));
Temp = 1 / (0.0012819121 + (0.00023789205 * Temp) + (0.00000010217758 * Temp * Temp * Temp));
Temp = Temp – 273.15;            // Convert Kelvin to Celsius
//Temp = (Temp * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit
return Temp;
}

//RTC Functions

void printDec2(byte decVal)
{
if (decVal < 10)
Serial.print(“0″);
Serial.print(decVal, DEC);
}

void printLCDDec2(byte decVal)
{
if (decVal < 10)
lcd.print(“0″);
lcd.print(decVal, DEC);
}

void printDayName(byte d)
{
switch (d) {
case 1:
Serial.print(“MON”);
break;
case 2:
Serial.print(“TUE”);
break;
case 3:
Serial.print(“WED”);
break;
case 4:
Serial.print(“THU”);
break;
case 5:
Serial.print(“FRI”);
break;
case 6:
Serial.print(“SAT”);
break;
case 7:
Serial.print(“SUN”);
break;
default:
Serial.print(“???”);
}
}

// **************** SETUP ****************
void setup()
{
//Define the time — Uncomment to reset date/time (one-time operation)
/*RTC.stop();
RTC.set(DS1307_SEC,1);
RTC.set(DS1307_MIN,38);
RTC.set(DS1307_HR,17);
RTC.set(DS1307_DOW,7);
RTC.set(DS1307_DATE,19);
RTC.set(DS1307_MTH,07);
RTC.set(DS1307_YR,9);
RTC.start();*/

// start serial port at 9600 bps:
Serial.begin(9600);

//Clear Screen
lcd.clear();
lcd.home();
lcd << “Starting Up…” ;

//Init variables
pinMode (Ventilator, OUTPUT); //defines the ventilator is an output
HighLow[2] = Thermister(analogRead(0));

//Init RTC variables
for(int i=0; i<56; i++)
{
RTC.set_sram_byte(65,i);
}

}

// **************** LOOP ****************
void loop()
{

//**** TIME ****
RTC.get(rtc,true); // set the RTC

//Update time variables
byte sec = rtc[0];
byte min = rtc[1];
byte hour = rtc[2];
byte dow = rtc[3];
byte date = rtc[4];
byte month = rtc[5];
int year = rtc[6];

//**** TEMPERATURE ****
//Read Thermistor value
currentTemp = Thermister(analogRead(0));
//**** Actions do to in a short interval (here every 1 secs)

if (millis() – SHpreviousMillis > SHinterval) {
SHpreviousMillis = millis();

//print Temp on LCD
lcd.home();
lcd << “T:” << currentTemp << ” “;
printLCDDec2(hour);
lcd.print (“:”);
printLCDDec2(min);
lcd.print (“:”);
printLCDDec2(sec);
//lcd << “T:” << currentTemp << ” A:” << HighLow[2]; //temp & average
lcd.setCursor (0,1);
lcd << “L:” << HighLow[1] << ” H:” << HighLow[0];
if (currentTemp < HighLow[1] )
{
HighLow[1] = currentTemp;
}
else if (currentTemp > HighLow[0]){

HighLow[0] = currentTemp;

}

}

//**** Actions with do every X seconds (defined by the Interval value  **** (here every 10 secs)
if (millis() – LGpreviousMillis > LGinterval) {
// save the last time serialPrint was done
LGpreviousMillis = millis();

//Calculate the AVG to avoid a calc that is too quick
//Average calculation
total= total – ReadingsAVG[index];
ReadingsAVG[index]= currentTemp;
total = total + ReadingsAVG[index];
index = index + 1;
//Calculates the AVG when the number of readings is reached
if (index >=NumberValuesAVG){
index = 0;
HighLow[2]=total/NumberValuesAVG;
}

//Print values on Serial for debugging & future logging on PC
// Prints the date
printDec2(hour);
Serial.print (“:”);
printDec2(min);
Serial.print (“:”);
printDec2(sec);
Serial.print (” “);
printDayName(dow);
Serial.print (” “);
printDec2(date);
Serial.print (“/”);
printDec2(month);
Serial.print (“/”);
Serial.print(year);

Serial << ” |L ” << HighLow[1] << ” |H ” << HighLow[0] <<” |C ” << currentTemp << ” |A ” << HighLow[2];
Serial.println(” “);

if (currentTemp >= ventLimit[0] && digitalRead(Ventilator) == LOW){ //put Ventilator on if temp > 26 and if vent is off
digitalWrite(Ventilator, HIGH);
lcd.home();
lcd.clear();
lcd << “T:” << currentTemp << “>=LM:” << ventLimit[0] ;
lcd.setCursor (0,1);
lcd << “Vent Starting”;
//printdate
printDec2(hour);
Serial.print (“:”);
printDec2(min);
Serial.print (“:”);
printDec2(sec);
Serial.print (” “);
printDayName(dow);
Serial.print (” “);
printDec2(date);
Serial.print (“/”);
printDec2(month);
Serial.print (“/”);
Serial.print(year);
Serial << ” Temp : ” << currentTemp << ” Ventilator Starting”;
Serial.println(” “);
}
else if (currentTemp <= ventLimit[1] && digitalRead(Ventilator) == HIGH) { // puts ventilator down if temp lower than 25.5 and if the vent is on
digitalWrite (Ventilator, LOW);
lcd.home();
lcd.clear();
lcd << “T:” << currentTemp << “<=LM:” << ventLimit[1] ;
lcd.setCursor (0,1);
lcd << “Vent Stopping”;
//printdate
printDec2(hour);
Serial.print (“:”);
printDec2(min);
Serial.print (“:”);
printDec2(sec);
Serial.print (” “);
printDayName(dow);
Serial.print (” “);
printDec2(date);
Serial.print (“/”);
printDec2(month);
Serial.print (“/”);
Serial.print(year);
Serial << “Temp : ” << currentTemp << ” Ventilator Stopping”;
Serial.println(” “);

}

}

}

14
juil
09

Petits progrès…

DSCF1254 Les progrès d’hier (parce qu’aujourd’hui je n’ai rien fait sur le contrôleur). Mise en place de l’écran LCD + câblage sur une platine d’essai. Ca laisse un peu de place sur la platine sans soudure ;)

11
juil
09

Vue d’ensemble du bac…

Ces temps, je ne vous parle que bricolage (ça m’amuse, je dois l’avouer !). Mais le bac n’est pas en reste, et il va bien… une petite vidéo (je m’y met, désormais !) avec une idée globale de ce que ça donne. Je suis très contente du résultat *croise les doigts*.

Ps. le truc jaune par terre, c’est une feuille de Nori enroulée sur un tuyau rigide. Bien plus pratique que le clip pour permettre à mes chirurgiens de manger toute la journée !

Une petite vue de mes ventilos…

Et de la décante en action

11
juil
09

l’Automate s’améliore… contrôle des ventilateurs opérationnel

Désormais, mon petit automate est capable de contrôler des ventilateurs en fonction de la température ambiante. Je vous présente une petite vidéo toute beurk (je ne maîtrise pas bien mon appareil photo pour ça !), mais ça donne une idée.

En gros, dès que la température ambiante dépasse les 26°, le ventilateur se met en marche. Pour le moment, il est sur l’alimentation 5V de l’Arduino, je n’ai pas voulu jouer avec les tensions différentes pour le moment (il faut encore que je comprenne comment fonctionnent les relais, quoiqu’un transistor de type MOSFET et/ou un octocoupleur semblent aussi faire l’affaire). L’écran LCD montre respectivement la température actuelle, la moyenne sur les 50 dernières mesures (correspond à env. 8 minutes de mesure), la température la plus basse et la plus haute. Tout cela est contrôlé par l’Arduino et pas du tout de manière physique (circuit automatisé etc..)

Le petit module que je montre à un moment est la sonde de température. Dès que la température descend à 25.5, le ventilo s’arrête.

Au final, sur la vidéo je montre le log sériel de l’Arduino sur le PC, log qui peut être repris dans un programme externe (Flash, Processing, Ruby, PHP ou ce que vous préférez, voire même un bête Excel…), et montre quand le ventilateur s’est enclenché et déclenché, ainsi qu’un log des valeurs indiquées sur l’écran LCD toutes les 10 secondes.

Il me manque encore une vraie horloge Real Time, ça va viendre ;)

Le projet prend forme, et à une vitesse assez étonnante je dois dire… pour quelqu’un qui comme moi n’avait absolument (mais absolument !) aucune connaissance en électronique. Côté programmation, ça faisait bien dix ans que je n’avais rien fait, mais ça revient vite. La prochaine étape sera l’interfaçage avec un programme externe, j’hésite à faire ça en PHP (que je connais relativement bien) ou à me lancer dans le Ruby qui semble très intéressant.

(promis j’essaierai de faire une meilleure vidéo avec commentaires prochainement !)

09
juil
09

Mon Arduino sait lire la température

Mes progrès du jour… désormais grâce à une thermorésistante fournie dans le kit de démarrage de l’Arduino, je peux mesurer la température ambiante avec l’Arduino, et l’afficher sur mon écran LCD. Le contrôle des ventilateurs par l’Arduino semble tout d’un coup un objectif réaliste !

Un petit relais sur du 12V et j’aurai accompli à peu près ce que je fais à présent avec le module UT200 sur prise, pour un coût à peu près similaire… mais des possibilités d’extension quasi infinies !

DSCF1234

La calibration de la thermorésistante a été un exercice intéressant (en gros, j’y ai passé une journée), et je  pense m’orienter sur des modules digitaux (comme le LM35 – ou un système 1-wire). Mais bon, c’est déjà tout à fait utilisable tel quel !

07
juil
09

Mon contrôleur sait parler !

Enfin presque… après quelques déboires j’ai réussi à connecter mon écran LCD à mon Arduino. Les choses sérieuses peuvent commencer (par exemple, mesure de la température avec affichage !).

On va aussi mettre l’écran sur une base plus solide et fixe que la platine d’essai actuelle.

Je ne résiste pas, je dois vous mettre une photo !

DSCF1229

06
juil
09

Projet de… je ne sais pas trop quoi encore ! (ou les débuts avec l’Arduino !)

DSCF1212 Enfin si, j’ai une idée. Mais je ne sais pas si je vais y arriver ;)

Plutôt que d’acheter un contrôleur aqua hors de prix, j’ai décidé de construire un contrôleur aqua hors de prix… c’est bien plus drôle comme ça, non ?

C’est presque une excuse pour que je me mette à l’électronique, qui m’intéresse de plus en plus ces temps. Je vais voir ce que j’arrive à faire !

Pour avoir un contrôleur, il faut déjà avoir le cerveau. Je suis partie de l’Arduino, qui est un microcontrôleur open source, et donc bon marché, possédant son propre langage de programmation (basé sur Processing). En gros, c’est du C mais un peu plus simple ;) .

Il existe plusieurs variations de l’Arduino, la version de base tournant dans les 20€. J’ai opté pour l’Arduino Mega, qui est une plateforme un peu plus boostée et surtout permettant de connecter plus d’entrées et de sorties que le standard.

J’ai aussi fait l’acquisition d’une platine d’essai, du “starter kit” proposé dans les magasins vendant l’Arduino (pratique si comme moi on a rien !), et acheté le bouquin “Getting Started with Arduino” qui donne de bonnes bases pour commencer. Très complémentaire avec ce tutorial pour l’Arduino (le reste du site est intéressant, aussi !).

Au bout de quelques heures, ça y est je fais clignoter plusieurs diodes LED à intervalles différents chaque fois que le bouton est poussé… C’est pas compliqué mais c’est amusant !

DSCF1221

Prochaine étape : connecter un vrai écran LCD… ça promet d’être plus compliqué !