Daddario 5 Posté(e) avril 9, 2017 Partager Posté(e) avril 9, 2017 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 Posté(e) avril 9, 2017 Partager Posté(e) avril 9, 2017 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
Gen 2 808 Posté(e) avril 9, 2017 Partager Posté(e) avril 9, 2017 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 2 Lien à poster Partager sur d’autres sites
Daddario 5 Posté(e) avril 9, 2017 Auteur Partager Posté(e) avril 9, 2017 (modifié) 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é avril 9, 2017 par Daddario Lien à poster Partager sur d’autres sites
Invité elvirinix Posté(e) avril 9, 2017 Partager Posté(e) avril 9, 2017 plop mdr ta vus j ai pas menti sa vas gen la forme Lien à poster Partager sur d’autres sites
Gen 2 808 Posté(e) avril 9, 2017 Partager Posté(e) avril 9, 2017 (modifié) 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é avril 9, 2017 par Gen 1 Lien à poster Partager sur d’autres sites
Invité elvirinix Posté(e) avril 9, 2017 Partager Posté(e) avril 9, 2017 plop, décente dans le sud dans 2 ou 3 moi voir si c est bin c bin vrai le climat ce radoucis mais oui sa fait du bien un peut de soleil Lien à poster Partager sur d’autres sites
Daddario 5 Posté(e) avril 9, 2017 Auteur Partager Posté(e) avril 9, 2017 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
Gen 2 808 Posté(e) avril 9, 2017 Partager Posté(e) avril 9, 2017 re. Effectivement sur certaines platines, il faut inverser l'état des commandes ++ GEN Lien à poster Partager sur d’autres sites
Gen 2 808 Posté(e) avril 9, 2017 Partager Posté(e) avril 9, 2017 (modifié) 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é avril 9, 2017 par Gen Lien à poster Partager sur d’autres sites
Daddario 5 Posté(e) avril 9, 2017 Auteur Partager Posté(e) avril 9, 2017 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
Gen 2 808 Posté(e) avril 9, 2017 Partager Posté(e) avril 9, 2017 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
Daddario 5 Posté(e) avril 9, 2017 Auteur Partager Posté(e) avril 9, 2017 (modifié) 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é avril 9, 2017 par Daddario Lien à poster Partager sur d’autres sites
Gen 2 808 Posté(e) avril 9, 2017 Partager Posté(e) avril 9, 2017 Re, Si tu as des questions, tu sais où me trouver Bon développement ++ GEN Lien à poster Partager sur d’autres sites
Daddario 5 Posté(e) avril 10, 2017 Auteur Partager Posté(e) avril 10, 2017 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
Gen 2 808 Posté(e) avril 10, 2017 Partager Posté(e) avril 10, 2017 (modifié) 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é avril 10, 2017 par Gen Lien à poster Partager sur d’autres sites
Daddario 5 Posté(e) avril 10, 2017 Auteur Partager Posté(e) avril 10, 2017 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
Gen 2 808 Posté(e) avril 10, 2017 Partager Posté(e) avril 10, 2017 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 je l'ai en pdf anglais, si cela t’intéresses ++ GEN Lien à poster Partager sur d’autres sites
Messages recommandés