Gen

GDW#5 Growduino Shield pour MEGA2560 + LCD 4x20 en open source. [TERMINE]

Recommended Posts

Gen

LA V2 EST ICI

 

La V1ci-dessous n'est plus d'actualité

 

Bonjour à tous.

 

J'ai de nouveau une idée en tête concernant les contrôleurs climatiques, il s'agit juste d'un shield pour arduino Mega. Le but est de fournir une solution de base ultra cheap cost <150€ car tous n'ont pas l'opportunité d'investir de grandes sommes dans un proto, et je ne veux pas les oublier, il sera capable de gérer:

 

2 temporisateurs journaliers

2 temporisateur cycliques

gestion HR up

gestion HR down

gestion Temp up

gestion Temp down

gestion pH (optionnel)

gestion EC (optionnel)

gestion CO2 (optionel)

gestion intracteur

gestion extracteur.

RTC

 

le tout open source, un code de base fonctionnel sera fourni mais si vous le désirez, vous pourrez ajouter ce que vous voulez pour la saisie des données ainsi que tout autres fonctionnalités car des I/O seront disponibles afin de compléter le mini-growduino à votre guise.

 

Je m'y attacherai dès que j'ai clôturé le GDW#4

 

++

GEN

Edited by Gen
  • Like 9

Share this post


Link to post
Share on other sites
DoomBot

Salut Gen,

 

La bonne idée que voilà! Avec tout ce que tu proposes ci-dessus 99 % des besoins des marabouts de la pousse seront comblés je pense :)

 

Questions:

  • As-tu éventuellement prévu une extension sur le nombre de temporisateurs journaliers? Perso il m'en faut 4 pour gérer mon usine à gaz...
  • Quand tu dis open source, est-ce qu'une quiche en électronique/informatique à ses chances de bricoler le truc sans se vautrer lamentablement?

 

Merci et bonne chance pour la suite :-P

Share this post


Link to post
Share on other sites
Gen

Salut Doombot

 

R1 :Pas besoin d'extension pour des temporisateurs journaliers suppl, il suffira de faire une nouvelle instanciation de classe dans ton code et de référencer la pin .. tu peux en avoir 50 si tu le désires, ca ne posera aucun problème.

 

R2: oui sans trop de difficulté vu qu'un code de base sera fourni :-)

 

++

GEN

  • Like 1

Share this post


Link to post
Share on other sites
Gen

Salut à tous.

 

J'ai commencé l'ébauche du mini-growduino que voici

 

gallery_616177_4758_22810.png

 

il me reste encore à mettre :

- le DS3132SN (RTC)

- les 2 circuits d'isolation pour le pH et l'EC

- les 2 transistors pour la conversion TTL du MH-Z-14

 

Comme vous pouvez le constater, c'est pas grand. J'ai laisser de disponible les sorties digitales de 22 à 53 ainsi que les 8 I/O analogique et le connecteur ISCP.

 

Ainsi vous pourrez rajouter et modifier tout ce que vous voudrez

 

J'ai également dupliqué le pinheader d'alim car une fois le shield superposé à l'arduino MEGA, il ne sera plus accessible

 

La partie contrôle et pilotage moteur est terminée ( intra + extra), le tout piloté par un MCP23017 auquel j'ai rajouté 3 mini-interrupteurs afin que vous puissiez définir vous même l'adressage I2c si nécessaire.

 

 

@pluche

GEN

Edited by Gen
  • Like 2

Share this post


Link to post
Share on other sites
Gen

Bonsoir à tous

 

C'est bientôt terminé en ce qui concerne l'électronique

 

Voici à quoi cela ressemble actuellement.

gallery_616177_4758_16853.png

 

il me reste à placer le RTC, connecter et mettre sur la platine la partie conversion TTL pour le MH-Z-14 ,que vous voyez hors platine sur la gauche. et définir les largeurs de pistes + ctrl des alignements des composants et des légendes.

 

Comme vous pouvez le voir, seront libres ensuite, les 2 pinheaders analogiques ainsi que le pinheader digital de 22 à 53, et au centre I'ISCP.

 

@pluche

GEN

Edited by Gen

Share this post


Link to post
Share on other sites
Gen

Salut.

 

J'ai quasi terminé la partie électronique du Mini-growduino.

Comme vous pouvez le remarquer sur cette image à l'échelle, il est vraiment mini :-)

 

gallery_616177_4758_89382.jpg

 

Je vous le présente sur l'arduino Mega pour vous donner une idée de ce que cela donnera une fois placé.

 

gallery_616177_4758_98759.jpg

 

Comme vous pouvez le voir, une fois le shield posé, il vous restera de libre toutes les entrées analogiques (en bas à droite), ainsi que la réglette complète des I/O digitaux de 22 à 53 !!!!

 

Du coté gauche, nous avons les connecteurs à vis pour le DHT ainsi que pour le capteur CO2 MH-Z-14.

 

Au dessus, nous avons la connectique pour :

 

- Timer journalier 1

- Timer journalier 2

- Temporisateur cyclique 1

- Temporisateur cyclique 2

- Enclenchement air conditionner

- Enclenchement chauffage

- Enclenchement dessicateur

- Enclenchement humidificateur

 

ensuite sur le bus I2C

 

Connecteur isolé pour le module pH (au choix tant qu'il fonctionne sur I2c)

Connecteur isolé pour le module Ec ((au choix tant qu'il fonctionne sur I2c)

3x connecteurs standards I2c pour y mettre ce que vous voulez (écran LCD etc..)

 

Pour les commandes moteurs

 

Connecteurs pour la platine relais de l'auto-transfo

1x intracteur

1x extracteur

 

Ensuite vous pourrez à votre guise modifier le code source de base pour rajouter tout ce que vous voulez.

 

NDLR : Je crois que cela va faire des heureux ... ;-)

 

A bientôt pour la suite

++

GEN

  • Like 4

Share this post


Link to post
Share on other sites
Gen

Salut à tous

 

Partie électronique terminée !

 

Le schéma (cliquez pour agrandir)

 

gallery_616177_4758_36987.png

 

La platine dans sa version finale

 

gallery_616177_4758_17714.png

 

 

Les fichiers GERBER

 

Mini-GrowDuino.zip

 

Je vais attaquer la partie programmation en attendant les pièces et platines pour terminer le GDW#4

 

++

GEN

 

 

 

 

 

Edited by Gen
  • Like 2

Share this post


Link to post
Share on other sites
rotavap'

C'est vraiment impressionnant, encore un super projet que tu nous proposes là.. Et tu as été super vite !

Quelques questions quand même ;)

à quoi servent les connecteurs sda et scl en bas à droite puisqu'il y en a déjà sur la partie Bus I2C ?

est-ce que la platine peut être utilisé en même temps qu'un écran tft (avec son shield) ?

A+

Share this post


Link to post
Share on other sites
Gen

yop rotavap'

 

Ce sont des jumpers pour activer le pull-up si nécessaire pour le SCl et SDA du MCP23017.

le petit bloc de 3 switch (ref S1) c'est pour modifier l'adresse sur le bus I2c en cas de conflit d'adresse.

 

oui tout dépend du type de shield. C'est pour cela que je laisse l'ICSP accessible, soit pour un shield TFT, ou un module Ethernet etc...

Ceci dit mettre un TFT sur un mega 2560, c'est super lent.

Mais via le bus I2c vous pourrez mettre des écrans LCD 2x18 ou 4X20 voir même plus grand.

 

Pour du TFT faut passer sur le proto.

 

Là je viens d'envoyer 5 platines en Prod pour tests.. Ensuite je pourrai les produire en grande quantité ou bien vous pourrez vous en charger vous même, vu que les fichiers GERBER sont disponibles.

 

++

GEN

Edited by Gen
  • Like 1

Share this post


Link to post
Share on other sites
rotavap'

Merci pour la réponse et les précisions apportées ;)

Donc le lcd semble plus judicieux,

 

Est-ce que tu prévois des mettre en ligne les fichiers BOM et coordinate ?

Share this post


Link to post
Share on other sites
Gen

Re:

 

non.. car cela permettrait à une personne peu scrupuleuse d'en faire facilement un usage commercial

C'est pas l'objet de ma démarche..

 

++

GEN

Edited by Gen
  • Like 2

Share this post


Link to post
Share on other sites
Gen

Salut à tous,

 

J'ai reçu confirmation que les platines sont en traitement

 

Là, j'ai commencé le code, Il me reste une petite journée pour le boucler.

voici une vue actuelle pour vous donner une idée de l'agencement.

Ensuite je le testerai avec le shield (quand il sera réceptionné).

 

 

 

/*===========================================================================
  MiniGroDuino Shield 1.0 program sample
  Created 3 December 2016 by Gentronik

  I dedicate any and all copyright interest in this software to the
  public domain. I make this dedication for the benefit of the public at
  large and to the detriment of my heirs and successors. I intend this
  dedication to be an overt act of relinquishment in perpetuity of all
  present and future rights to this software under copyright law.
  ===========================================================================
*/

#include <Wire.h>
#include <SoftwareSerial.h>
#include "RTClib.h"
#include "DHT.h"
#include "Timer.h"
#include "Cyclic.h"
#include "Functions.h"


// Wardware definition
#define LIGHTING_PIN    7        // Don't modify this line !!  
#define TIMER_PIN        6        // Don't modify this line !!
#define CYCLIC1_PIN        5        // Don't modify this line !!
#define CYCLIC2_PIN        4        // Don't modify this line !!
#define TEMPUP_PIN        3        // Don't modify this line !!
#define TEMPDOWN_PIN    2        // Don't modify this line !!
#define HRUP_PIN        1        // Don't modify this line !!
#define HRDOWN_PIN        0        // Don't modify this line !!
#define DHT_PIN            14        // Don't modify this line !!
#define DHTTYPE DHT22              // Use DHT11 or DHT22

// Set the right I2C address below
// you can use the I2C bus sniffer included into the tools directory to find addresses
#define PH_ADDRESS      0x4D
#define EC_ADDRESS      0x2F
#define MOTOR_ADDRESS    0x20

// Definition of globals constants
#define GROWTH_MODE        1
#define FLOWERING_MODE    2



// Class definition
RTC_DS1307    rtc;
DHT         dht(DHT_PIN, DHTTYPE);
Timer         lamp(LIGHTING_PIN    , LIGHTING_PIN );    // The second parameter defined the exit pin of a led, if you do not use this feature, leave the code as it stands
Timer       timer(TIMER_PIN      , TIMER_PIN    ); // The second parameter defined the exit pin of a led, if you do not use this feature, leave the code as it stands
Cyclic      cyclic1(CYCLIC1_PIN  , CYCLIC1_PIN  );    // The second parameter defined the exit pin of a led, if you do not use this feature, leave the code as it stands
Cyclic      cyclic2(CYCLIC2_PIN  , CYCLIC2_PIN  );    // The second parameter defined the exit pin of a led, if you do not use this feature, leave the code as it stands

//Software parameters
//Without a input interface, define bellow all parameters

//********************** LAMP SETTINGS ***********************************
// INPUT FORMAT HH,MM
int lamp_Grow_Start_Time            = convert(18,30);        // Activation    time in growth mode   
int lamp_Grow_Stop_Time                = convert(12,30);        // Desactivation time in growth mode
int lamp_Bloom_Start_Time            = convert(18,00);        // Activation    time in flowering mode
int lamp_Bloom_Stop_Time            = convert(06,00);        // Desactivation time in flowering mode
//********************* TIMER2 SETTINGS ***********************************
// INPUT FORMAT HH,MM
int timer_Grow_Start_Time            = convert(01,45);        // Activation    time in growth mode   
int timer_Grow_Stop_Time            = convert(19,45);        // Desactivation time in growth mode
int timer_Bloom_Start_Time            = convert(01,00);        // Activation    time in flowering mode
int timer_Bloom_Stop_Time            = convert(13,00);        // Desactivation time in flowering mode
//********************* CYCLIC1 SETTINGS **********************************
// INPUT FORMAT 0-9999
int cyclic1_Day_Duration_ON         = 180;                    // Duration of daylight activity in seconds
int cyclic1_Day_Duration_OFF        = 3600;                    // Duration of daylight inactivity in seconds
int cyclic1_Night_Duration_ON       = 30;                    // Duration of night activity in seconds
int cyclic1_Night_Duration_OFF      = 7200;                    // Duration of night inactivity in seconds
//********************* CYCLIC2 SETTINGS **********************************
// INPUT FORMAT 0-9999
int cyclic2_Day_Duration_ON         = 60;                    // Duration of daylight activity in seconds
int cyclic2_Day_Duration_OFF        = 1800;                    // Duration of daylight inactivity in seconds
int cyclic2_Night_Duration_ON       = 15;                    // Duration of night activity in seconds
int cyclic2_Night_Duration_OFF      = 3600;                    // Duration of night inactivity in seconds
//*************** WORKING TEMPERATURES DEFINITION *************************
// INPUT FORMAT 0-99                                        // ALL TEMPERATURES ARE IN CELCIUS
int growth_day_max_temp             = 27;                    // Growth Maximum day temperature
int growth_day_min_temp             = 22;                    // Growth Minimum day temperature
int growth_night_max_temp           = 24;                    // Growth Maximum night temperature
int growth_night_min_temp           = 19;                    // Growth Minimum night temperature
int flowering_day_max_temp          = 27;                    // Flowering Maximum day temperature
int flowering_day_min_temp          = 22;                    // Flowering day temperature
int flowering_night_max_temp        = 20;                    // Flowering night temperature
int flowering_night_min_temp        = 18;                    // Flowering night temperature
//***************** WORKING HUMIDITY DEFINITION ***************************
// INPUT FORMAT 0-99
int growth_day_max_humidity            = 70;                    // Growth Maximum daylight humidity   
int growth_day_min_humidity         = 50;                    // Growth Minimum daylight humidity   
int growth_night_max_humidity       = 50;                    // Growth Maximum night humidity   
int growth_night_min_humidity       = 40;                    // Growth Minimum night humidity   
int flowering_day_max_humidity      = 50;                    // Flowering Maximum daylight humidity   
int flowering_day_min_humidity      = 30;                    // Flowering Minimum daylight humidity   
int flowering_night_max_humidity    = 40;                    // Flowering Maximum night humidity   
int flowering_night_min_humidity    = 30;                    // Flowering Minimum night humidity   


//************************ WORKING VARIABLES ******************************
DateTime now;
int      workingMode = GROWTH_MODE;      // Select here the current working mode ( GROWTH_MODE or FLOWERING_MODE), you can implemented this with a switch
int      co2ppm      = 0;
int      humidity    = 0;
int      temperature = 0;

//*********************  MISCELANOUS FUNCTIONS  ***************************
void setPinMode()
{
    for(int i = 0 ; i <= 7; i++)
    {
        pinMode(i, OUTPUT);
    }
}

void initialiseObjets()
{
    lamp.initialise(GROW_START, lamp_Grow_Start_Time    );
    lamp.initialise(GROW_STOP , lamp_Grow_Stop_Time        );
    lamp.initialise(FLO_START , lamp_Bloom_Start_Time    );    
    lamp.initialise(FLO_STOP  , lamp_Bloom_Stop_Time    );    

    timer.initialise(GROW_START, timer_Grow_Start_Time    );
    timer.initialise(GROW_STOP , timer_Grow_Stop_Time    );
    timer.initialise(FLO_START , timer_Bloom_Start_Time    );    
    timer.initialise(FLO_STOP  , timer_Bloom_Stop_Time    );    

    cyclic1.initialise(DAY_DURATION_ON   , cyclic1_Day_Duration_ON   );
    cyclic1.initialise(DAY_DURATION_OFF  , cyclic1_Day_Duration_OFF  );
    cyclic1.initialise(NIGHT_DURATION_ON , cyclic1_Night_Duration_ON );
    cyclic1.initialise(NIGHT_DURATION_OFF, cyclic1_Night_Duration_OFF);

    cyclic2.initialise(DAY_DURATION_ON   , cyclic2_Day_Duration_ON   );
    cyclic2.initialise(DAY_DURATION_OFF  , cyclic2_Day_Duration_OFF  );
    cyclic2.initialise(NIGHT_DURATION_ON , cyclic2_Night_Duration_ON );
    cyclic2.initialise(NIGHT_DURATION_OFF, cyclic2_Night_Duration_OFF);  


}


void initialiseHardware()
{
    Wire.begin();
    rtc.begin();
    // uncomment one of the 2 lines to set the RTC
    // don't forget to comment this the line again before final compilation
    //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    //rtc.adjust(DateTime(2015, 11, 14, 17, 9, 0));

    Serial.begin(9600);    //  
    Serial2.begin(9600);   // used by MH-Z-14
    dht.begin();
    //rtc.init();
}

int getCo2PPM ()
{
  char reponse[9];
  byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
  Serial2.write(cmd,9);
  Serial2.readBytes(reponse, 9);
  int poidsFort = (int) reponse[2];
  int poidsFaible = (int) reponse[3];
  int ppm = (256*poidsFort)+poidsFaible;
  return ppm;
}

void catchAllData()
{
    now           = rtc.now();
    co2ppm        = getCo2PPM();
    //humidity    =
    //temperature =

}

void execute()
{
    int currentTimeInMinutes = convert(now.hour(),now.minute());
    long unixtime = now.unixtime();
    lamp.run(currentTimeInMinutes,workingMode,MODE_AUTO);
    timer.run(currentTimeInMinutes,workingMode,MODE_AUTO);
    cyclic1.run(unixtime,lamp.isWorking());
    cyclic2.run(unixtime,lamp.isWorking());
    // todo mist
    // todo temp
    // todo motors
}

void setup()
{
    setPinMode();
    initialiseHardware();
    initialiseObjets();
}

void loop()
{
    catchAllData();
    execute();
}

 

 

 

 

A bientôt pour la suite

++

GEN

Edited by Gen
  • Like 3

Share this post


Link to post
Share on other sites
Gen

Bonsoir à tous.

 

Il ne me reste plus qu'a ajouter trois classes, mais en gros voila où j'en suis arrivé dans le code.

 

 

 

 

/*===========================================================================
  MiniGroDuino Shield 1.0 program sample
  Created 3 December 2016 by Gentronik

  I dedicate any and all copyright interest in this software to the
  public domain. I make this dedication for the benefit of the public at
  large and to the detriment of my heirs and successors. I intend this
  dedication to be an overt act of relinquishment in perpetuity of all
  present and future rights to this software under copyright law.
  ===========================================================================
*/

#include <Wire.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
#include "DHT.h"
#include "Timer.h"
#include "Cyclic.h"
#include "Functions.h"
#include "HystDrive.h"




// Wardware definition
#define LIGHTING_PIN    7        // Don't modify this line !!  
#define TIMER_PIN        6        // Don't modify this line !!
#define CYCLIC1_PIN        5        // Don't modify this line !!
#define CYCLIC2_PIN        4        // Don't modify this line !!
#define TEMPUP_PIN        3        // Don't modify this line !!
#define TEMPDOWN_PIN    2        // Don't modify this line !!
#define HRUP_PIN        1        // Don't modify this line !!
#define HRDOWN_PIN        0        // Don't modify this line !!
#define DHT_PIN            14        // Don't modify this line !!
#define DHTTYPE DHT22              // Use DHT11 or DHT22

// Set the right I2C address below
// you can use the I2C bus sniffer included into the tools directory to find addresses
#define PH_ADDRESS      0x4D
#define EC_ADDRESS      0x2F
#define MOTOR_ADDRESS    0x20

// Definition of globals constants
#define GROWTH_MODE        0
#define FLOWERING_MODE    1



// Class definition
RTC_DS1307    rtc;
DHT         dht(DHT_PIN, DHTTYPE);
Timer         lamp(LIGHTING_PIN    , LIGHTING_PIN );    // The second parameter defined the exit pin of a led, if you do not use this feature, leave the code as it stands
Timer       timer(TIMER_PIN      , TIMER_PIN    );     // The second parameter defined the exit pin of a led, if you do not use this feature, leave the code as it stands
Cyclic      cyclic1(CYCLIC1_PIN  , CYCLIC1_PIN  );    // The second parameter defined the exit pin of a led, if you do not use this feature, leave the code as it stands
Cyclic      cyclic2(CYCLIC2_PIN  , CYCLIC2_PIN  );    // The second parameter defined the exit pin of a led, if you do not use this feature, leave the code as it stands
HystDrive   HumidityDriver(HRUP_PIN , HRDOWN_PIN);
HystDrive   TempDriver(TEMPUP_PIN,TEMPDOWN_PIN);


LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display


//Software parameters
//Without a input interface, define bellow all parameters

//********************** LAMP SETTINGS ***********************************
//                               INPUT FORMAT HH,MM
int lamp_Grow_Start_Time            = convertTimeInMinutes(00,30);        // Activation    time in growth mode   
int lamp_Grow_Stop_Time                = convertTimeInMinutes(18,30);        // Desactivation time in growth mode
int lamp_Bloom_Start_Time            = convertTimeInMinutes(12,00);        // Activation    time in flowering mode
int lamp_Bloom_Stop_Time            = convertTimeInMinutes(06,00);        // Desactivation time in flowering mode
//********************* TIMER2 SETTINGS ***********************************
//                               INPUT FORMAT HH,MM
int timer_Grow_Start_Time            = convertTimeInMinutes(01,45);        // Activation    time in growth mode   
int timer_Grow_Stop_Time            = convertTimeInMinutes(19,45);        // Desactivation time in growth mode
int timer_Bloom_Start_Time            = convertTimeInMinutes(01,00);        // Activation    time in flowering mode
int timer_Bloom_Stop_Time            = convertTimeInMinutes(13,00);        // Desactivation time in flowering mode
//********************* CYCLIC1 SETTINGS **********************************
// INPUT FORMAT 0-9999
int cyclic1_Day_Duration_ON         = 180;                    // Duration of daylight activity in seconds
int cyclic1_Day_Duration_OFF        = 3600;                    // Duration of daylight inactivity in seconds
int cyclic1_Night_Duration_ON       = 30;                    // Duration of night activity in seconds
int cyclic1_Night_Duration_OFF      = 7200;                    // Duration of night inactivity in seconds
//********************* CYCLIC2 SETTINGS **********************************
// INPUT FORMAT 0-9999
int cyclic2_Day_Duration_ON         = 60;                    // Duration of daylight activity in seconds
int cyclic2_Day_Duration_OFF        = 1800;                    // Duration of daylight inactivity in seconds
int cyclic2_Night_Duration_ON       = 15;                    // Duration of night activity in seconds
int cyclic2_Night_Duration_OFF      = 3600;                    // Duration of night inactivity in seconds
//*************** WORKING TEMPERATURES DEFINITION *************************
// INPUT FORMAT 0-99                                        // ALL TEMPERATURES ARE IN CELCIUS
int growth_day_max_temp             = 27;                    // Growth Maximum day temperature
int growth_day_min_temp             = 22;                    // Growth Minimum day temperature
int growth_night_max_temp           = 24;                    // Growth Maximum night temperature
int growth_night_min_temp           = 19;                    // Growth Minimum night temperature
int flowering_day_max_temp          = 27;                    // Flowering Maximum day temperature
int flowering_day_min_temp          = 22;                    // Flowering day temperature
int flowering_night_max_temp        = 20;                    // Flowering night temperature
int flowering_night_min_temp        = 18;                    // Flowering night temperature
//***************** WORKING HUMIDITY DEFINITION ***************************
// INPUT FORMAT 0-99
int growth_day_max_humidity            = 70;                    // Growth Maximum daylight humidity   
int growth_day_min_humidity         = 50;                    // Growth Minimum daylight humidity   
int growth_night_max_humidity       = 50;                    // Growth Maximum night humidity   
int growth_night_min_humidity       = 40;                    // Growth Minimum night humidity   
int flowering_day_max_humidity      = 50;                    // Flowering Maximum daylight humidity   
int flowering_day_min_humidity      = 30;                    // Flowering Minimum daylight humidity   
int flowering_night_max_humidity    = 40;                    // Flowering Maximum night humidity   
int flowering_night_min_humidity    = 30;                    // Flowering Minimum night humidity   


//************************ WORKING VARIABLES ******************************

int      workingMode           = FLOWERING_MODE;    // Select here the current working mode ( GROWTH_MODE or FLOWERING_MODE), you can implemented this with a switch
bool     pH_activated          = true;            // change to true if a pH module is connected
bool     eC_activated          = false;            // change to true if a EC module is connected
bool     co2_activated         = false;            // change to true if a MH-Z-14   is connected    
long     sensors_timelaps     = 1;                 // interrogation probes interval in seconds ( 0 to desactivate fonctionnality)
int      humidityHysteresisPercent = 10;
int      temperatureHysteresisInDegreeCelcius = 2;



DateTime now;
int      co2ppm        = 437;  // values for test
int      humidity      = 0;   
int      temperature   = 0;
float    eC            = 0.1;  //voir affichage du 0 pour zero d'ec
float    pH            = 5.8;

//*********************  MISCELANOUS FUNCTIONS  ***************************
void setPinMode()
{
    for(int i = 0 ; i <= 7; i++)
    {
        pinMode(i, OUTPUT);
    }
}




// PROGRAM

void initialiseObjets()
{
    lamp.initialise(GROW_START, lamp_Grow_Start_Time    );
    lamp.initialise(GROW_STOP , lamp_Grow_Stop_Time        );
    lamp.initialise(FLO_START , lamp_Bloom_Start_Time    );    
    lamp.initialise(FLO_STOP  , lamp_Bloom_Stop_Time    );    

    timer.initialise(GROW_START, timer_Grow_Start_Time    );
    timer.initialise(GROW_STOP , timer_Grow_Stop_Time    );
    timer.initialise(FLO_START , timer_Bloom_Start_Time    );    
    timer.initialise(FLO_STOP  , timer_Bloom_Stop_Time    );    

    cyclic1.initialise(DAY_DURATION_ON   , cyclic1_Day_Duration_ON   );
    cyclic1.initialise(DAY_DURATION_OFF  , cyclic1_Day_Duration_OFF  );
    cyclic1.initialise(NIGHT_DURATION_ON , cyclic1_Night_Duration_ON );
    cyclic1.initialise(NIGHT_DURATION_OFF, cyclic1_Night_Duration_OFF);

    cyclic2.initialise(DAY_DURATION_ON   , cyclic2_Day_Duration_ON   );
    cyclic2.initialise(DAY_DURATION_OFF  , cyclic2_Day_Duration_OFF  );
    cyclic2.initialise(NIGHT_DURATION_ON , cyclic2_Night_Duration_ON );
    cyclic2.initialise(NIGHT_DURATION_OFF, cyclic2_Night_Duration_OFF);  

    TempDriver.initialise(growth_day_max_temp, growth_day_min_temp,
                      growth_night_max_temp, growth_night_min_temp,
                      flowering_day_max_temp, flowering_day_min_temp,
                      flowering_night_max_temp,flowering_night_min_temp,
                      humidityHysteresisPercent);

    HumidityDriver.initialise(growth_day_max_humidity,growth_day_min_humidity,
                            growth_night_max_humidity,growth_night_min_humidity,
                            flowering_day_max_humidity,flowering_day_min_humidity,
                            flowering_night_max_humidity,flowering_night_min_humidity,
                            temperatureHysteresisInDegreeCelcius);

}


void initialiseHardware()
{
    Wire.begin();
    lcd.init();
    lcd.backlight();
    lcd.setCursor(0,0);
    rtc.begin();
    // uncomment one of the 2 lines to set the RTC
    // don't forget to comment this the line again before final compilation
    //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    //rtc.adjust(DateTime(2015, 11, 14, 17, 9, 0));
    Serial.begin(9600);    //  
    Serial2.begin(9600);   // used by MH-Z-14
    dht.begin();
    
}



int read_Humidity()
{
    float h = dht.readHumidity();
    if (!isnan(h))
    {
        humidity = (int)h;
    }    

    return humidity;
}


int read_Temperature()
{
    float t = dht.readTemperature();
    if (!isnan(t))
    {
        temperature = (int)t;
    }    
    return temperature;
}

float read_pH()
{
    float _pH = 0.0;
    if(pH_activated)
    {
        //code
        
    }
    return _pH;
}

float read_eC()
{
    float _eC = 0.0;
    if(eC_activated)
    {
        //code

    }
    return _eC;
}



int read_co2PPM ()
{
    int ppm = 0;
    char reponse[9];
    byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};

    if(co2_activated)
    {
        Serial2.write(cmd,9);
        Serial2.readBytes(reponse, 9);
        int poidsFort = (int) reponse[2];
        int poidsFaible = (int) reponse[3];
        ppm = (256*poidsFort)+poidsFaible;
    }
    return ppm;    
}


void read_Data_From_Sensors()
{
    //co2ppm      = read_co2PPM();
    humidity    = read_Humidity();
    temperature = read_Temperature();
    //pH          = read_pH();
    //eC          = read_EC();
}

void catchAllData()
{
    now = rtc.now();
    if(sensors_timelaps == 0)
    {
        read_Data_From_Sensors();
    }
    else
    {
        if(now.unixtime()%sensors_timelaps == 0)
        {
            read_Data_From_Sensors();
        }
    }
}

void displayData()
{    
    String line[4];
    String label = "";
    // Concatenation of line 0
    if(lamp.isWorking()) {label = " ON";} else {label = "OFF";}  
    line[0]=formatIntNumberInXdigits(now.hour(),2)+":"+
            formatIntNumberInXdigits(now.minute(),2)+":"+
            formatIntNumberInXdigits(now.second(),2)+"  LAMPE: "+ label;
    // Concatenation of line 1        
    if(humidity == 100) {label = "";} else {label=" ";}
    line[1]="TEMP:"+ formatIntNumberInXdigits(temperature,2) + (char)223 + "C HYGRO:"+ label +formatIntNumberInXdigits(humidity,2)+"%";
    // Concatenation of line 2
    if(!eC_activated || eC == 0.0){line[2]="EC  :0.00 PH   :";} else {line[2]="EC  :"+ float2String(eC,2) + " PH   :";}    
    if(pH >=10.0) {label = "";} else {label = " ";}
    line[2]=line[2] + label + float2String(pH,1);
    // Concatenation of line 3
    if(workingMode == GROWTH_MODE) {label = "GROWTH    ";} else {label = "FLOWERING ";}
    line[3]= "CO2 :" +  formatIntNumberInXdigits(co2ppm,4) +" "+ label;
    // Screen filling
    for(int i = 0 ; i <= 3 ; i++)
    {
        lcd.setCursor(0,i);
        lcd.print(line);
    }
}


void execute()
{
    int currentTimeInMinutes = convertTimeInMinutes(now.hour(),now.minute());
    uint32_t unixtime = now.unixtime();

    lamp.run (currentTimeInMinutes,workingMode,MODE_AUTO);
    timer.run(currentTimeInMinutes,workingMode,MODE_AUTO);
    cyclic1.run(unixtime,lamp.isWorking());
    cyclic2.run(unixtime,lamp.isWorking());
    HumidityDriver.run(humidity,workingMode,lamp.isWorking());
    TempDriver.run(temperature,workingMode,lamp.isWorking());
    // todo motors
}

void setup()
{
    setPinMode();
    initialiseHardware();
    initialiseObjets();
}

void loop()
{
    catchAllData();
    displayData();
    execute();
}
 

 

 

 

Si  vous avez des questions sur le code, n'hésitez pas.

++

GEN

  • Like 1

Share this post


Link to post
Share on other sites
rotavap'

Re:

 

non.. car cela permettrait à une personne peu scrupuleuse d'en faire facilement un usage commercial

C'est pas l'objet de ma démarche..

 

++

GEN

 

Salut,

Oui je comprend tout à fait la raison.

Sur le schéma, dans la partie DHT, il y a une résistance (R6 de 4k7), à quoi sert-elle ? Est-ce qu'elle permet de ne pas acheter un shield DHT22 avec résistance mais directement une sonde DHT22 ?

A+

 

PS : chapeau pour le code ! Il est très détaillé en plus, ça donne pas mal d'idées !

 

Rota

Edited by rotavap'

Share this post


Link to post
Share on other sites
Gen

yop et merci

 

la résistance s'appelle un pull-up et est comme tu l'as vu, prévue. Donc pas besoin de shield.

idem pour le DS18B20 et le MH-Z-14 qui en plus nécessite un convertisseur TTL qui est déjà sur la platine.

les entrées pH et Ec sont isolées donc pas non plus besoin de se munir d'un shield isolateur.

 

++

GEN

Edited by Gen

Share this post


Link to post
Share on other sites
Gen

J'ai reçu confirmation, les platine sont terminées et en attente d'expédition..

 

++

GEN

  • Like 1

Share this post


Link to post
Share on other sites
joebartoon

Bonsoir Gen,

Ça fait un bout... Quelques soucis, enfin rien de bien méchant. J'ai raté le proto!!! Donc je me lance sur celui là.

Pourrais-tu mettre en ligne la liste des courses? J'ai balancé en production ta série mini: Ec, Ph & GrowDuino ! Tu confirme pas besoin du i2cMotor (déjà intégré)

 

As tu un retour d'experience des chinoiseries MHZ14 à 28€?

 

Cordialement

Share this post


Link to post
Share on other sites
Gen

yop

 

des protos, il en restera de disponibles car apparemment des gens n'ont pas donné suite.

 

Je ne suis pas encore sur la liste des courses, j'ai encore d'autres chats à fouetter, mais t'inquiètes ça va viendre..

 

le MH-Z-14 fonctionne à la perfection, j'en ai d'ailleurs fait une video dans mes GDW# et je n'utilise que cela ou un MH-Z-19

en fonction des besoins.

 

J'espère que tu as commandé des MCP3221 différents sinon cela ne fonctionnera pas (voir mon fil de discuss sur le proto).

 

++

GEN

Share this post


Link to post
Share on other sites
Gen

Salut..

 

Voici l'exemple de code que je mets à votre disposition afin de pouvoir agencer votre MiniGrowDuino à votre sauce.

j'y ai mis toutes les librairies nécessaires ainsi que le sniffer I2c.

J'ai essayé d'être le plus explicite possible dans le commentaires. A votre charge d'implémenter la gestion du pilotage des moteurs en fonction de vos besoins.

le code pH et EC ne sont pas inclus car ils dépendent du hardware que vous allez choisir.

 

Vous remarquerez que j'ai placé toutes les variables en tête de programme afin de faciliter les modifications.

Si vous maîtrisez la programmation orientée objet, vous pouvez vous en passer et introduire directement les valeurs dans les méthodes 'initialise' des objets.

 

le code pour un écran LCD 4X20 est déjà implémenté.

 

ps : il n'y a que la classe hystDriver que je n'ai pas encore testée,  je le ferai dès que je réceptionnerai les platines.

 

code source exemple et classes :

MiniGrowduino.zip

 

Si vous rencontrez des problèmes, n'hésitez pas à me contacter

 

Amusez-vous bien.

++

GEN

Edited by Gen
  • Like 2

Share this post


Link to post
Share on other sites
joebartoon

C'est pour ça que je demandé la liste de course... Je me doute qu'il y a des subtilitées... Et puis les chinoiseries c'est long à arriver...

 

Au sujet des subtilitées , c'est possible de souder tout ce petit monde soit même ? Que ce soit sur le shield ou les platines?

 

Concernant les MHZ14 j'en ai vu à tout les prix de 25 à 80 d'où ma question.

 

^^

Share this post


Link to post
Share on other sites
Gen

yop.

 

oui tu peux tout souder toi même mais avec une station à air chaud. ou placer ta platine au four.

Certaines vidéos sur youtube en parlent.

Par contre je comprends pas très bien pourquoi tu te compliques la vie

Ce sont les mêmes modules que sparky's mais à ma sauce , de plus j'en aurai de disponibles où tu peux les prendre directement chez eux.

Je ne suis pas sûr que faire faire juste 1 circuit imprimé par une société (et je ne parle pas des composants) soit plus économique que de l'acheter tout fait.

 

ce sont les mêmes MH-Z-14 qu'ils coûtent 25 ou 80€

La différence réside juste dans le pigeonnage des clients néophytes

 

++

GEN

Edited by Gen

Share this post


Link to post
Share on other sites
Gen

Ce que vous devrez modifier ou contrôler dans le code exemple (n'est plus d'actualité depuis la version 2.0)

 

ligne 35

#define DHTTYPE DHT22              // Use DHT11 or DHT22

sélectionnez le type de sonde (ici DHT22 par défaut)

 

lignes 39 à 42

#define PH_ADDRESS      0x4D
#define EC_ADDRESS      0x2F
#define MOTOR_ADDRESS   0x20
#define I2C_LCD_ADDRESS 0x27

Contrôlez que les adresses correspondent bien aux adresses des modules ou écrans

 

lignes 69 à  110

valeurs variables

Introduisez les valeurs qui vous conviennent

 

lignes 116 à 118

activez ou désactivez vos capteurs

 

lignes 120 &121  valeurs hysteresis

Introduisez les valeurs d'hystérésis

 

ligne 119

long sensors_timelaps     = 1;

définissez le temps en secondes entre chaque interrogation des capteurs afin de diminuer la charge du processeur. 0 = délais d'attente désactivé

 

lignes 190 à 193 mise à jour de l'horloge

Pour la mise à l'heure de l'horloge si nécessaire, enlevez les commentaires des lignes que vous utiliserez en fonction de la méthode de mise à jour choisie

 

ligne 255 float read_pH()

Veuillez compléter avec le code correspondant au hardware utilisé

 

ligne 236 float read_eC()

Veuillez compléter avec le code correspondant au hardware utilisé

 

lignes 269 à 273

dé-commentez les lignes en fonction des capteurs connectés

 

ligne 320  runMotors(int tempValue, int humidityValue)

Complétez le code en fonction de votre manière de faire travailler les moteurs (intra / extra)

 

ligne 345   runMotors();

Modifiez l'appel de cette fonction,  en reference à la ligne 320

 

Voila qui devrait vous éviter de chercher....

 

++

GEN

 

 

 

 

 

 

 

Edited by Gen
  • Like 1

Share this post


Link to post
Share on other sites
joebartoon

Bonjour Gen,

 

Oui en effet à ce prix (55$ FDP compris pour 1 Ec et 1Ph) ça vaut pas le coup de se prendre la tête... J'ai confondu Sparky's et Sparkfun.

 

Par où passe tu pour la production de tes Ci? Car j'ai eu un retour de mon côté, ils ne prennent plus les fichiers GERBER car ils ont des problèmes avec leurs CN sur les parties à évider, perçages...

 

@pluche

Share this post


Link to post
Share on other sites
Gen

tu as le choix :

 

Pour des petites qté

 

PCBWin

WHX electronic

PCBWay

 

mais si tu veux juste les platines vierges, il me reste 1 x EC

Sinon il me reste des modules montés

 

++

GEN

Edited by Gen

Share this post


Link to post
Share on other sites
starlord

salut.

 

vraiment top tes projet j'ai lu le début de suis la.

et je me fait suis de ton proto.

je te suis en :ph34r: 

 

ces tous simplement énorme pour moi qui n'y connais rien et comprend pas grand chose. :lol: 

 

bye

Share this post


Link to post
Share on other sites