[ARDUINO] Adaptation de l'automate de windaube


Messages recommandés

Bonjour à tous,

 

Ayant lu, et ayant fabriqué le système de windaube31, son automate à 60€, j'ai décidé de l'adapter à mes futurs besoins (ouai, je sais, je mets des mois et des mois, mais la patience porte toujours ses fruits ^^)

 

Etant donné que je pars sur deux espaces distincts dès le départ, l'automate méritait quelques améliorations.

 

 

Donc pour chaque espace, une gestion différente (en gardant peut être pour le futur le mode "fin de flo")

 

 

Espace croissance:

 

Un capteur DHT22 (humidité/température)

Un brasseur

Un brumisateur

Un extracteur

Un jeu de LED

 

 

Espace floraison:

 

Un capteur DHT22 (humidité/température)

Un brasseur

Un déshumidificateur (je tourne à 50% d'humidité au minimum chez moi, c'est pas mal pour la flo)

Un extracteur

Un jeu de LED

 

 

 

En partant du code de Windaube, j'ai réussi à faire fonctionner l'ensemble comme il faut je pense (enfin, j'affiche ce que je veux afficher sur l'écran, avec les valeurs, ect.. J'ai pas encore testé les relais, mais il n'y a pas de raison que ça ne fonctionne pas)

 

Mais il me reste un soucis. Est-ce qu'il y a possibilité de faire gérer deux DHT22 avec l'arduino.

 

J'ai trouvé un semblant de réponse en lorgnant du côté de la librairie DHT22, mais je n'arrive pas à faire fonctionner le capteur avec cette librairie. Le capteur semble fonctionner uniquement avec la librairie DHT, et je ne trouve rien sur le net pour deux capteurs en même temps sur le même arduino.

 

Merci d'avance :)

Lien à poster
Partager sur d’autres sites
Invité elvirinix

plop 

 

arduino , sa a l air vraiment bien mais suis pas en mesure de le faire avec mes connaissance mais si tu peux vas si le climat de notre piece bien bien gerer ta gagner 50/50 de ta prod 

 

ta ete mp GEN , car il fait de un super taf la dessus ...

 

bon courage 

++ ;)

Lien à poster
Partager sur d’autres sites

yop.

 

J'ai entendu mon nom.. Alors je suis viendu voir.

 

#define DHTTYPE DHT22

#define DHT1_PIN   1

#define DHT2_PIN   2

 

lors de l'instanciation de classe DHT

 

DHT                 DHT1(DHT1_PIN, DHTTYPE);

DHT                 DHT2(DHT2_PIN, DHTTYPE);

 

Et vouhala !

 

++

GEN

  • Like 2
Lien à poster
Partager sur d’autres sites

Merci de passer les gens :)

 

Du coup, pour récupérer les infos, je fais :

 

 
float h = dht1.readHumidity();
  float t = dht1.readTemperature();

 

et un autre avec h2, t2 et dht2?

 

J'ai bien compris la leçon? ^^
 

Modifié par Daddario
Lien à poster
Partager sur d’autres sites

wep elvi

 

Ca va, ca va.

 

Je code le programme pour le mini growduino sous le soleil du sud :-)

 

Merci de passer les gens :)

 

Du coup, pour récupérer les infos, je fais :

 

 
float h = dht1.readHumidity();
  float t = dht1.readTemperature();

 

et un autre avec h2, t2 et dht2?

 

J'ai bien compris la leçon? ^^
 

 

Toutafet !

 

++

GEN

Modifié par Gen
  • Like 1
Lien à poster
Partager sur d’autres sites
Invité elvirinix

plop,

 

décente dans le sud dans 2 ou 3 moi voir si c est bin c bin :shock: vrai le climat ce radoucis  mais oui sa fait du bien un peut de soleil :wub:  

Lien à poster
Partager sur d’autres sites

Re,

 

Bon bah voilà, ça m'aura pris l'après midi. C'est rapide en fait, sachant que j'y connais vraiment pas grand chose xD

 

Bien-sur, il faut remercier windaube pour la base du programme, gen pour l'astuce des deux DHT, mais tout m'a l'air fonctionnel.

 

 

Seul "bizarrerie", pour faire fonctionner mes relais, je dois leur envoyer un LOW. Après ça dépend peut être des relais, je n'en sais rien, mais là, tout fonctionne sur ma breadboard, avec les bonnes réactions, les bons relevés

 

 

J'ai donc gardé les valeurs de windaube qui m'ont l'air bonnes (il est plus expérimenté que moi ^^), j'ai juste, parce que c'est la seule façon que j'ai trouvé avec mon peu de savoir, décidé de lancer le brasseur 30minutes par heure, avec cette commande (que jtrouve pas belle)


if (minute <30) 
{digitalWrite (BRASSEURCRO, LOW);
}
if (minute >30){
  digitalWrite (BRASSEURCRO, HIGH);
}

Arf, je voulais l'envoyer sur le site, mais apparement, je ne peux pas :s

 

Tchao les gens

Lien à poster
Partager sur d’autres sites

Re,

 

Bon bah voilà, ça m'aura pris l'après midi. C'est rapide en fait, sachant que j'y connais vraiment pas grand chose xD

 

Bien-sur, il faut remercier windaube pour la base du programme, gen pour l'astuce des deux DHT, mais tout m'a l'air fonctionnel.

 

 

Seul "bizarrerie", pour faire fonctionner mes relais, je dois leur envoyer un LOW. Après ça dépend peut être des relais, je n'en sais rien, mais là, tout fonctionne sur ma breadboard, avec les bonnes réactions, les bons relevés

 

 

J'ai donc gardé les valeurs de windaube qui m'ont l'air bonnes (il est plus expérimenté que moi ^^), j'ai juste, parce que c'est la seule façon que j'ai trouvé avec mon peu de savoir, décidé de lancer le brasseur 30minutes par heure, avec cette commande (que jtrouve pas belle)


if (minute <30) 
{digitalWrite (BRASSEURCRO, LOW);
}
if (minute >30){
  digitalWrite (BRASSEURCRO, HIGH);
}

Arf, je voulais l'envoyer sur le site, mais apparement, je ne peux pas :s

 

Tchao les gens

 

 

on peut écrire cela plus simplement

 

digitalWrite(BRASSEURCRO, minute> 30);

 

ou inversement en fonction du type de carte relais

car en interne LOW = 0 tout comme false = 0

et HIGH = 1 tout comme true = 1

 

sachant que une comparaison (minute> 30) renvoie une expression booléenne interprétable par la fontion digitalWrite()

 

++

GEN

Modifié par Gen
Lien à poster
Partager sur d’autres sites

Re,

 

Bon bah je voulais faire les choses bien, sortir un ptit tuto tout ça, mais en fait j'y arrive pas xD

 

 

Donc je vais laisser le code, j'ai essayé de bien le commenter (il y même encore certains commentaires de windaube xD

#include <SPI.h> //
#include <LiquidCrystal_I2C.h>//Lancement ecran i2c
#include <Wire.h>//
#include <Arduino.h>//
#include <DS1307.h>//Lancement Horloge
#include "DHT.h"//TOUCHE PAS A CA PETIT CON 
#define DHTTYPE DHT22
#define DHT1_PIN   2
#define DHT2_PIN   11
DHT                TCRO(DHT1_PIN, DHTTYPE);
DHT                TFLO(DHT2_PIN, DHTTYPE);


//Bloc Croissance

int BRASSEURCRO = 3;
int LEDCRO = 4;
int BRUMCRO = 5;
int EXTRACRO = 6;


//Bloc Floraison

int BRASSEURFLO = 7;
int LEDFLO = 8;
int EXTRAFLO = 9;
int DESHUM = 10;


int lampe_on = 530;  //allume lA LAMPE A CETTE HEURE EN CRO
int lampe_off = 2330;  //ETIENT LA LAMPE A CETTE HEURE CRO
int lampe_on_flo = 659;//ALLUME LA LAMPE A CETTE HEURE FLO
int lampe_off_flo = 1900;//ETIENT LA LAMPE A CETTE HEURE FLO

int minute;//TOUCHE PAS A CA PETIT CON 
int heure; //TOUCHE PAS A CA PETIT CON 
int seconde;///TOUCHE PAS A CA PETIT CON 
int date;///TOUCHE PAS A CA PETIT CON 
int mois;///TOUCHE PAS A CA PETIT CON 
int annee; ///TOUCHE PAS A CA PETIT CON :)1
int temps_perso;//TOUCHE PAS A CA PETIT CON 


int hydro_on = 65; // HYDRO ON A CETTE VALEUR EN CRO
int hydro_off = 85 ;// HYDRO OFF A CETTE VALEUR EN CRO
int hydro_on_flo = 60;// HYDRO ON A CETTE VALEUR EN FLO
int hydro_off_flo = 40;// HYDRO OFF A CETTE VALEUR EN FLO
int hydro_on_flo2 = 60;// HYDRO ON A CETTE VALEUR EN FIN DE FLO
int hydro_off_flo2 = 40;// HYDRO OFF A CETTE VALEUR EN FIN DE FLO

int extracteur_on = 20;// EXTRA ON A CETTE TEMP OU SUPERIEUR
int extracteur_off = 19;// EXTRA OFF A CETTE TEMP OU INFERIEUR


LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);





void setup() {

  // RTC.stop();
// RTC.set(DS1307_SEC,00);        //réglage secondes
// RTC.set(DS1307_MIN,24);        //réglage minutes
// RTC.set(DS1307_HR,20);         //réglage heures
// RTC.set(DS1307_DOW,04);         //réglage jour de la semaine
// RTC.set(DS1307_DATE,23);       //réglage date
// RTC.set(DS1307_MTH,03);         //réglage mois
// RTC.set(DS1307_YR,17);          //réglage année
// RTC.start();REGLAGE HEURE

  //Sortie Pin Croissance

  pinMode(BRASSEURCRO, OUTPUT);
  pinMode(LEDCRO, OUTPUT);
  pinMode(BRUMCRO, OUTPUT);
  pinMode(EXTRACRO, OUTPUT);
  digitalWrite(BRASSEURCRO, HIGH);
  digitalWrite(LEDCRO, HIGH);
  digitalWrite(BRUMCRO, HIGH);
  digitalWrite(EXTRACRO, HIGH);

  //Sortie Pin Floraison

  pinMode(BRASSEURFLO, OUTPUT);
  pinMode(LEDFLO, OUTPUT);
  pinMode(EXTRAFLO, OUTPUT);
  pinMode(DESHUM, OUTPUT);
  digitalWrite(BRASSEURFLO, HIGH);
  digitalWrite(LEDFLO, HIGH);
  digitalWrite(EXTRAFLO, HIGH);
  digitalWrite(DESHUM, HIGH);

  //Lancement Thermo+LCD

  
    lcd.begin(20,4);//Lancement écran
   
  lcd.print("  Forum Canaweed  ");
  lcd.setCursor(0,1);
  lcd.print(" Twinbox ");
    lcd.setCursor(0,2);
  lcd.print(" Par Daddario ");
      lcd.setCursor(0,3);
  lcd.print("    ALPHA   ");
 delay(5000);

  lcd.clear();

}

void loop() {{
  //Récupérer l'heure du DS1307**********************************************************************************************

  heure = RTC.get(DS1307_HR,true);  
  minute = 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) + minute;  //creation temps_perso


if (minute <30) 
{digitalWrite (BRASSEURCRO, LOW);
}
if (minute >30){
  digitalWrite (BRASSEURCRO, HIGH);
}
float h = TCRO.readHumidity();
  float t = TCRO.readTemperature();
  
  
  if (isnan(t) || isnan(h)) {
  } else {


if(t > extracteur_on){
  digitalWrite(EXTRACRO, LOW);
}
if(t < extracteur_off){
  digitalWrite(EXTRACRO, HIGH);
}
if(h > hydro_off){
  digitalWrite(BRUMCRO, HIGH);
}
if(h < hydro_on){
  digitalWrite(BRUMCRO, LOW);
}

  if(temps_perso > lampe_on && temps_perso < lampe_off){
   digitalWrite(LEDCRO,LOW);
 }
  else
  {
digitalWrite(LEDCRO, HIGH);
  }

}


  
  // fin du texte a modifier
  
  
    

lcd.setCursor(0,0);
  lcd.print("  Partie Croissance  ");
  lcd.setCursor(0,1);
  lcd.print("T= ");
  lcd.print(t); 
  lcd.print(" C");
  lcd.setCursor(0,2);
  lcd.print("H= ");
  lcd.print(h); 
  lcd.print(" %");
  
  lcd.setCursor(8,3);
   if(digitalRead(LEDCRO) == LOW)
   {
   lcd.print("Jour");
   }
   else
   {
   lcd.print("Nuit");
   }
   delay(10);
      lcd.setCursor(0,3);
  if (heure < 10)
  {
    lcd.print("0");
  } 
  lcd.print(RTC.get(DS1307_HR,true)); 
  lcd.print("H");
  if (minute < 10)
  {
    lcd.print("0");
  }
  lcd.print(RTC.get(DS1307_MIN,false));
  lcd.print(" ");


delay(5000);
lcd.clear();


lcd.setCursor(0,0);
  lcd.print("Extracteur  ");
  lcd.setCursor(11,0);
   if(digitalRead(EXTRACRO) == LOW)
   {
   lcd.print("ON ");
   }
   else
   {
   lcd.print("OFF");
   }

   lcd.setCursor(0,1);
  lcd.print("Brumisateur  ");
  lcd.setCursor(12,1);
   if(digitalRead(BRUMCRO) == LOW)
   {
   lcd.print("ON ");
   }
   else
   {
   lcd.print("OFF");
   }  
      lcd.setCursor(0,2);
  lcd.print("Brasseur ");
  lcd.setCursor(9,2);
   if(digitalRead(BRASSEURCRO) == LOW)
   {
   lcd.print("ON ");
   }
   else
   {
   lcd.print("OFF");
   }  
   

   
   delay(5000);
   lcd.clear();
}
{

//PARTIE FLORAISON


  
float h1 = TFLO.readHumidity();
  float t1 = TFLO.readTemperature();
  
  if (isnan(t1) || isnan(h1)) {
  } else {


if(t1 > extracteur_on){
  digitalWrite(EXTRAFLO, LOW);
}
if(t1 < extracteur_off){
  digitalWrite(EXTRAFLO, HIGH);
}
if(h1 > hydro_off_flo){
  digitalWrite(DESHUM, LOW);
}
if(h1 < hydro_on_flo){
  digitalWrite(DESHUM, HIGH);
}


  if(temps_perso > lampe_on_flo && temps_perso < lampe_off_flo){
   digitalWrite(LEDFLO,LOW);
 }
  else
  {
digitalWrite(LEDFLO, HIGH);
  }

}

if (minute <30) 
{digitalWrite (BRASSEURFLO, LOW);
}
if (minute >30){
  digitalWrite (BRASSEURFLO, HIGH);}
  
  // fin du texte a modifier
  
  
    

lcd.setCursor(0,0);
  lcd.print("   Partie Floraison   ");
  lcd.setCursor(0,1);
  lcd.print("T= ");
  lcd.print(t1); 
  lcd.print(" C");
  lcd.setCursor(0,2);
  lcd.print("H= ");
  lcd.print(h1); 
  lcd.print(" %");
  
  lcd.setCursor(8,3);
   if(digitalRead(LEDFLO) == LOW)
   {
   lcd.print("Jour");
   }
   else
   {
   lcd.print("Nuit");
   }
   delay(10);
      lcd.setCursor(0,3);
  if (heure < 10)
  {
    lcd.print("0");
  } 
  lcd.print(RTC.get(DS1307_HR,true)); 
  lcd.print("H");
  if (minute < 10)
  {
    lcd.print("0");
  }
  lcd.print(RTC.get(DS1307_MIN,false));
  lcd.print(" ");
}





delay(5000);
lcd.clear();
 lcd.setCursor(0,0);
  lcd.print("Extracteur  ");
  lcd.setCursor(11,0);
   if(digitalRead(EXTRAFLO) == LOW)
   {
   lcd.print("ON ");
   }
   else
   {
   lcd.print("OFF");
   }

   lcd.setCursor(0,1);
  lcd.print("Assecheur  ");
  lcd.setCursor(11,1);
   if(digitalRead(DESHUM) == LOW)
   {
   lcd.print("ON ");
   }
   else
   {
   lcd.print("OFF");
   }  
    lcd.setCursor(0,2);
  lcd.print("Brasseur ");
  lcd.setCursor(9,2);
   if(digitalRead(BRASSEURFLO) == LOW)
   {
   lcd.print("ON ");
   }
   else
   {
   lcd.print("OFF");
   }  
   
delay(5000);
lcd.clear();
}


Lien à poster
Partager sur d’autres sites

re :

 

Si cela t'intéresses

 

1 - je ne vois pas pourquoi tu charges la librairie SPI.

2 - les identifiants de pin se déclarent en #define et non en 'int' même si cela prends un peu plus de place en mémoire.

Ce qui leurs assurent une sécurité de lecture seule

3 - tu peux simplifier les forêts de 'if' avec l'utilisation de tableau (array)

 

++

GEN

Lien à poster
Partager sur d’autres sites

Re,

 

Bien sur que ça m’intéresse, je fais pas ça seulement pour le placard, je le fais surtout pour apprendre ^^.

 

Jvais voir ce dont tu me parles :)

 

EDIT:

 

Gen, je viens de tester ce que tu me dis, après deux trois recherches, j'ai trouvé quelque chose sur les tableau je crois, mais quand j'écris mon code, il me réclame un int au lieu d'un #define pour les pins xD

 

Exemple:

EXTRAFLO= (h1>hydro_off_flo) ? LOW : HIGH;

 

Alors je pense qu'on doit surement pas parler de la même chose, étant donné que je suis plus qu'amateur dans le domaine (la décompilation ça apprend pas très bien si c'est mal commenté xD)

 

Tchao :)

Modifié par Daddario
Lien à poster
Partager sur d’autres sites

Yop les gens :)

 

J'ai essayer de comprendre tout GEN, mais je n'y arrive vraiment pas, j'arrive vraiment pas à comprendre dans quel optique l'utilisation d'un tableau couperait ma forêt d'if, puisque si j'utilise un tableau, la seul difference du code ça sera

 

if(h1 > tableau[1]){
digitalWrite(DESHUM, LOW);

 

au lieu de:

 

if(h1 > hydro_off_flo){
digitalWrite(DESHUM, LOW);

 

Je me trompe?

Lien à poster
Partager sur d’autres sites

re:

 

Je t'ai mp un code qui contient moult utilisations de tableaux, de '#define' etc..

 

 

edit :

 

voici un exemple de simplification de structure 'if' en utilisant un tableau

 

int temperature = 22;

String nomDuTableau[2] = {"chaud","froid"};

 

cela signifie que je crée un tableau de 2 cases contenant du texte

et j'assigne directement les valeurs chaud à l'indice 0 et froid à l'indice 1 de mon tableau.

 

En C++ la première occurrence d'un tableau est toujours référencée par 0

 

Maintenant voici comment utiliser cela

 

Serial.print(nomDuTableau[ température < 24];

 

température > 24 renverra une expression booléenne vrai ou faux

hors on sait qu'en interne false = 0 et true = 1

donc mon évaluation renverra soit 0 ou 1 qui lui est accepté comme indice

ce qui t'évites d'écrire une cascade de if, else

 

concernant l'indice d'un tableau, une chose à savoir, c'est qu'on peut également lui passer une opération mathématique mais dont le résultat devra bien entendu être contenu entre 0 et la dimension du tableau - 1, sinon cela plante..

 

 

Concernant le define on l'utilise comme suit.

 

1- les déclarations se font toujours en début de code

2- la commande #define ne prend pas de ';' à la fin comme pour une commande

3-exemple

 

#define dht1Pin 1

#define dht2Pin 2

 

 

 

++

GEN

Modifié par Gen
Lien à poster
Partager sur d’autres sites

Yop GEN,

 

 

Tout d'abord, merci pour le MP, jvais lire ça avec attention, histoire de comprendre un peu plus de chose (j'ai du temps libre devant moi, merci les accidents de travail xD)

 

Mais en lisant ton exemple, effectivement, ça simplifierait grandement le programme, mais je perdrais l’hystérésis dans ce cas présent.

 

A moins que je fasse quelque chose dans ce gout là

 

int TCRO = 22

#define chaud 23

#define froid 19

 

String tableau [2] {"chaud" , "froid"}

 

digitalWrite EXTRA (tableau[ [0]>TCRO]); //resultat NON

digitalWrite EXTRA (tableau[ [1]<TCRO]) //resultat NON

 

Ça ferait un truc comme ça? Il faut juste trouver la bonne comparaison à faire pour pas que l'arduino reçoive deux ordres differents .

 

Je me trompe?

 

Bon avant même de poster je me rends compte que c'est con, mais je laisse noter ça là, ça pourra toujours servir.

 

Peut être en faisant comme ça :

 

 

 

int TCRO = 22

#define chaud 23

#define froid 19

 

String tableau [2] {"chaud" , "froid"}

 

var EXTRA1 (tableau[ [0]>TCRO]); //resultat NON

var EXTRA2 (tableau[ [1]<TCRO]) //resultat NON

 

Et après faire une comparaison des résultats, une opération binaire ou un truc du genre qui écrit sur digitalWrite

 

 

Désolé pour le pâté, j'essaye de comprendre, mais si même mes erreurs peuvent profiter, allons-y ;)

Lien à poster
Partager sur d’autres sites

Yop

 

C'est "trop pas juste" LOL

 

digitalWrite( 1er parametre le n° de pin , 2eme parametre soit HIGH ou LOW);

 

en interne le processeur sait que

 

HIGH = 1

LOW = 0

 

le processeur sait également que

 

true = 1

false = 0

 

donc on peut sans problème remplacer

 

HIGH par true

LOW par false

 

Or on sait qu'un booléen peut être remplacer par une expression (formule) qui renvoie un booléen

 

voila c'est pas plus compliqué que cela

 

Par contre, avant de continuer plus avant, je te conseille d'étudier la syntaxe C++ car le code suivant ne passera JAMAIS au compilateur

 

String tableau [2] {"chaud" , "froid"}

 

var EXTRA1 (tableau[ [0]>TCRO]); //resultat NON

var EXTRA2 (tableau[ [1]<TCRO]) //resultat NON

 

si je peux te conseiller un ouvrage très intéressant car bien vulgarisé pour le néophyte, c'est

L'arduino pour les nuls

 

9782754064293.jpg

 

je l'ai en pdf anglais, si cela t’intéresses

 

++

GEN

Lien à poster
Partager sur d’autres sites