Go Down

Topic: Contrôleur d’aquarium (Read 8759 times) previous topic - next topic

smo68170

Bonjour,
Je vous présente le contrôleur d'aquarium ACKduino réalisé par quelques membres de l'Aqua-Club de Kingersheim.  Il est basé sur une Mega 2560 avec écran tactile. Il est en charge de mon aquarium depuis 4 mois et gère :
L'éclairage LED (5 canaux)
Le contrôle  de la température de l'aquarium
Le contrôle de la température des Leds
Le contrôle des pompes de brassage via oscillateur ( cycle de marée)
Le contrôle des pompes de brassage « stop fooding »
Jusqu'à 8 pompes doseuses programmables par jours et par demi-heures.
La réserve de l'eau douce
L'osmolation de l'aquarium

Le projet a été réalise sous codeblock.
Vous trouverez une vidéo de présentation ci-dessous
http://youtu.be/gNX5qQZW4qg

Après la présentation les questions ….
Pour seconder l'ACKduino nous envisageons de réaliser un deuxième automate basé sur une Mega 2560 qui aura la charge de :
Contrôler quelque paramètre du l'aquarium.
Communiquer avec  l'ACKduino via une liaison série.
Servir de serveur WEB pour contrôler l'ACKduino (via la liaison série) par une page htlm
D'avertir par mail des éventuels problèmes, ou d'envoyer périodiquement des rapports mail
D'avertir par SMS des éventuels problèmes, ou d'envoyer périodiquement des rapports SMS
Pouvoir fonctionné qq minutes sur batterie le temps d'envoyer les SMS d'alerte lors d'une coupure de courant.

Ma première question est : est-il possible de faire fonctionner sur une carte Mega 2560 en même temps une carte schield Ethernet et/ou WIFI et une carte schield GSM. Si oui pouvez vous me donner les références de ces cartes compatibles.
Merci

Seb

Artouste


...


Ma première question est : est-il possible de faire fonctionner sur une carte Mega 2560 en même temps une carte schield Ethernet et/ou WIFI et une carte schield GSM. Si oui pouvez vous me donner les références de ces cartes compatibles.
Merci

Seb

Bonjour
rapide reflexion
les shield ethernet utilisent le SPI
la plupart des module gsm discutent en serial
AMHA une mega n'est pas vraiment obligatoire, mais si c'est votre base de travail pourquoi pas


peut etre partir sur 
ça pour le gsm
http://hackspark.fr/fr/sim900-gsm-gprs-shield-for-arduino-icomsat.html

sur ça pour l'ethernet
http://arduino.cc/en/Main/ArduinoEthernetShield

sur ça pour la fonctionalité wifi (peut toujours etre rajouté par la suite , c'est transparent vu du code arduino)
http://www.ldlc.com/fiche/PB00125271.html

pour l'autonomie par batterie ça se dimensionne assez facilement


Heloderma-kris

super boulot ,
j'avais vue il y a quelque temps une video du sebduino est ce que votre projet est fait en commun?
une petite question en quoi consiste la fonction pour retiré la SD carte?

smo68170

bonjour,
Merci
Pour réalisé le projet ACKduino nous ne sommes pas partie de feuille blanche mais nous avons pris comme base le Sebduino. Aujourd'hui les deux projets évolue de chacun de leurs côté.

il est prévu dans l'évolution de l'ACKduino d'écrire des fichiers "Log" en csv sur la carte pour avoir des stats ( temperatur PH  etc ...)
La fonction retiré  le carte SD a été programmé (en avance) pour avoir la possibilité de retirer et remettre la carte sans faire "planté l'arduino* afin de récupérer ces fichiers.

Pour info nous partageons les sources à l'adresse ci dessous.
http://aquaclubking.fr/?p=200
Seb


Heloderma-kris

Merci pour la reponse , si besoin j'ai deja mon programe qui log sur la sd donc faut pas hésité si vous voulez! :D

smo68170

oui cela serais sympa d'avoir ton bout de code...
autre question sais tu, ou as tu programmer une fonction qui retourne l'espace utilisé /libre de la carte SD afin de générer une alerte quand celle-ci est presque pleine.
Seb

Heloderma-kris

non je n'ai rien programé de tel car un de mes fichier log fait pour une journée environ 40Ko du coup comme j'ai une carte de 8Go

8x10^9/40x10^3= 200000jours soit envion 548 ans du coup je neme prend pas la tete! XD

mon code est le suivant brut de brut :
Code: [Select]
void terrarium::DattaLog(Heure*H, Date*D)
{
#ifdef DEBUG_SERIAL
    Serial.println(F("dattalog en cours..."));
#endif
    long fin;
    boolean fichierok;

    Heure timeOn ,timeOff;
    sprintf(Buff_16, "%02i:%02i:%02i", H->h, H->m, H->s);//impresion heure
if (objetExiste(LUMFLUO)==true){

    if (m_fluo->getMode(EPHE)==1)
    {
        m_fluo->getHeurOnOff(&timeOn, &timeOff);
    }
    else
    {
        m_fluo->getHeurOnOffM(&timeOn, &timeOff);
    }
}else if(objetExiste(CHAUF)==true){
if (m_fluo->getMode(EPHE)==1)
    {
        m_chauf->getHeurOnOff(&timeOn, &timeOff);
    }
    else
    {
        m_chauf->getHeurOnOffM(&timeOn, &timeOff);
    }
}
    sprintf(Buff_Nom_Fichier, "%s/DATLOG", m_name);
    if (SD.exists(Buff_Nom_Fichier)!=true)
    {
        sprintf(Buff_Nom_Fichier, "%s/DATLOG", m_name);
        SD.mkdir(Buff_Nom_Fichier);
    };

    sprintf(Buff_Nom_Fichier, "%s/DATLOG/%02i%02i%04i.txt", m_name,D->j, D->m, D->a);
    fichierok= SD.exists(Buff_Nom_Fichier);
    fichier =SD.open(Buff_Nom_Fichier, FILE_WRITE);
    if(fichier==true)
    {
        if (fichierok==false)
        {

            fichier.print(F("Fichier du : "));
            fichier.print(D->j);
            fichier.print(F("/"));
            fichier.print(D->m);
            fichier.print(F("/"));
            fichier.println(D->a);
            fichier.print(F("heure de lever : "));

            fichier.print(timeOn.h);
            fichier.print(F("H"));
            fichier.println(timeOn.m);
            fichier.print(F("heure de coucher : "));
            fichier.print(timeOff.h);
            fichier.print(F("H"));
            fichier.println(timeOff.m);
            fichier.print(F("Duree d'eclairage : "));
            fichier.print(timeOff.h-timeOn.h);
            fichier.print(F("h"));
            fichier.print(timeOff.m-timeOn.m);
            fichier.print(F("m"));
            fichier.println(F("les donnees sont au format suivant : "));
            fichier.print(F("hh:mm:ss;"));
            if(m_fluo!=0)
            {
                fichier.print(F("Temperature fluo;"));
            }
            if(m_uvChauf!=0)
            {
                fichier.print(F("Temperature uvChauf;"));
            }
            if(m_chauf!=0)
            {
                fichier.print(F("Temperature Chauf;"));
            }
            fichier.println(F("humidite Piece "));
            fichier.println();
            fichier.print(Buff_16);
            fichier.print(F(";"));
            if(m_fluo!=0)
            {
                fichier.print(m_fluo->getTemp());
                fichier.print(F(";"));
            }
            if(m_uvChauf!=0)
            {
                fichier.print(m_uvChauf->getTemp());
                fichier.print(F(";"));
            }
            if(m_chauf!=0)
            {
                fichier.print(m_chauf->getTemp());
                fichier.print(F(";"));
            }
            fichier.println(m_hum);
        };
        if (fichierok==true)
        {
            fin=fichier.size();
            fichier.seek(fin+1L);
            fichier.print(Buff_16);

            fichier.print(F(";"));
            if(m_fluo!=0)
            {
                fichier.print(m_fluo->getTemp());
                fichier.print(F(";"));
            }
            if(m_uvChauf!=0)
            {
                fichier.print(m_uvChauf->getTemp());
                fichier.print(F(";"));
            }
            if(m_chauf!=0)
            {
                fichier.print(m_chauf->getTemp());
                fichier.print(F(";"));
            }
            fichier.println(m_hum);
        };
    };
    fichier.close();
#ifdef DEBUG_SERIAL
    Serial.println(F("dattalog terminer!"));
#endif

}


bon c'est du brut comme il est dans ma lib, pour info :
Date et heure ont des structure de int
exemple :
Code: [Select]
typedef struct Date Date;
struct Date
{
    int j;//jour
    int m;//mois
    int a;//annee
};

typedef struct Heure Heure;
struct Heure
{
    int h;//heure
    int m;//Minute
    int s;//seconde
};


enfin tu as dedans des fonction qui verifi la presence d'un objet type LUMFLUO pour lumiere Fluo exemple:
Code: [Select]
objetExiste(LUMFLUO)==true
verifie que mon pointeur sur objet et diferent de 0 , bref tu fait ton trie si c'est pas claire n'hesite pas!

smo68170


benoitchampougny

salut a tous,

Je suis a la recherche de développeur pour un projet opensource similaire, Nous somme déjà 3 sur ce projet.
Ce projet consiste a rendre accessible aux plus novices les fonctionnalités du rapberry pi et arduino combinés dans le but de gérer des systêmes domotiques annexes tel qu'une ruche, un jardin, un aquarium, une cave a vin, une champignonnière, un terrarium, une serre, enfin presque tout enfaite.

Une interface graphique seras accessible depuis partout. Un systême de scénarios configurable permettra la régulation ainsi que l'alerte mail et sms du systême.

Le But étant de pouvoir partager depuis un site communautaire des données créer par la communauté dans un esprit de DRY (don't repeat yourself), pour éviter que chacun écrive sont petit morceau de code dans sont coin alors qu'il pourrais le rendre accessible a toute une communauté. Quel gains de temps pour toute une communauté!!!.

n'hésitez pas à nous rejoindre, on ne mort pas lol!!! les projets open sources ont besoin de vous!!

https://ardui-farm.sonetin.com

Go Up