Gestion d'une lumière dans une grow box

Bonjour,

Alors voila je suis en train de faire un placard de culture indoor, le tout assisté par arduino qui va gérer la lumière, la ventilation interne qui affichera l'heure, l’état de la lumière,de la ventilation (15minute on 15 minute off) et enfin la température et l'humidité
pour cela j'ai réuni :
un arduino uno
un écran lcd 16x2
un dht22
une carte tiny rtc ds1307
une carte 4 relais

Mais voila, jamais ne se passe rien comme cela devrai j'ai des problemes
petit un, l'heure est instable sur mon écran, elle n'actualise pas les minute ou ne les passe carrément pas, ou alors passe de la bonne heure a une complètement différente cela par intermittence
de plus quand ma sortie relais et activé et une minute se passe, le relais se coupe et se relance
voila j'espere que vous pourriez m'aider

ci joint le code

#include <Wire.h>

#include <DS1307.h>

#include <DHT.h>

#include <LiquidCrystal.h>
#define DHTPIN 12 
#define DHTTYPE DHT22 
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
const int brasseur = 8;
const int lumiere = 9;
int lampe_on = 530; 
int lampe_off = 2330; 
int minut;
int heure; 
int seconde;
int date;
int mois;
int annee; 
int temps_perso;
void setup() {
  // put your setup code here, to run once:
/*RTC.stop();
  RTC.set(DS1307_SEC,55);        //réglage secondes
  RTC.set(DS1307_MIN,28);        //réglage minutes
  RTC.set(DS1307_HR,23);         //réglage heures
  RTC.set(DS1307_DOW,1);         //réglage jour de la semaine
  RTC.set(DS1307_DATE,8);       //réglage date
  RTC.set(DS1307_MTH,9);         //réglage mois
  RTC.set(DS1307_YR,16);          //réglage année
  RTC.start();
*/
 
  pinMode(lumiere, OUTPUT);
  pinMode(brasseur, OUTPUT);

  
  digitalWrite(lumiere, LOW);
  digitalWrite(brasseur, LOW);
   dht.begin();//TOUCHE PAS A CA PETIT CON :)
    lcd.begin(16,2);//TOUCHE PAS A CA PETIT CON :)
   
  lcd.print(" cara de concha ");
  lcd.setCursor(0,1);
  lcd.print("      v1.0      ");

 delay(3000);
 
 
   lcd.clear();
}

void loop() {
  // put your main code here, to run repeatedly:


{
  
   dht.begin();
    lcd.begin(16,2);
  
for (int i=0;i<20;i++)// lcd page 1 
{
// debut du texte a modif de A a Z
  
  
  
  
  
  
   //Récupérer l'heure du DS1307**********************************************************************************************

  heure = RTC.get(DS1307_HR,true);  
  minut = 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) + minut;  //creation temps_perso
  
float h = dht.readHumidity();
  float t = dht.readTemperature();
  
  if (isnan(t) || isnan(h)) {
  } else {


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

}
  
  // fin du texte a modifier
  
  
    

lcd.setCursor(0,0);
  lcd.print("TEMP ");
  lcd.print(t); 
  lcd.print(" C");
lcd.setCursor(7,1);
  lcd.print("H ");
  lcd.print(h); 
  lcd.print(" %");
  
 
      lcd.setCursor(0,1);
  if (heure < 10)
  {
    lcd.print("0");
  } 
  lcd.print(RTC.get(DS1307_HR,true)); 
  lcd.print("H");
  if (minut < 10)
  {
    lcd.print("0");
  }
  lcd.print(RTC.get(DS1307_MIN,false));
  lcd.print(" ");
}





delay(1000);
lcd.clear();



for (int i=0;i<10;i++)// lcd pages 2
{
  
  
// debut du texte a modif de A a Z
  
  
  
  
  
  
   //Récupérer l'heure du DS1307**********************************************************************************************

  heure = RTC.get(DS1307_HR,true);  
  minut = 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) + minut;  //creation temps_perso
  
float h = dht.readHumidity();
  float t = dht.readTemperature();
  
  if (isnan(t) || isnan(h)) {
  } else {



 if(temps_perso > lampe_on && temps_perso < lampe_off){
   digitalWrite(lumiere,HIGH);
 }
  else
  {
digitalWrite(lumiere, LOW);
  }
}
  
  // fin du texte a modifier


      lcd.setCursor(0,0);
  lcd.print("BRASSEUR = ");
  lcd.setCursor(11,0);
   if(digitalRead(brasseur) == HIGH)
   {
   lcd.print("ON ");
   }
   else
   {
   lcd.print("OFF");
   }
   delay(10); 
   lcd.setCursor(0,1);
   if(digitalRead(lumiere) == HIGH)
   {
   lcd.print("LAMPE = ON");
   }
   else
   {
   lcd.print("LAMPE = OFF");
   }
   delay(10);
   
   
   
     
   
}
delay(1000);
lcd.clear();
}
}

Long, long programme , pas facile pour repérer les erreurs quand on manque encore d'expérience, (et même après).
Conseil :
Ecris des petits programmes pour tester un par un la gestion des différents composants.
Si tu ne fais qu'une chose à la fois ce sera plus facile (ou moins difficile) de trouver ce qui ne va pas.
Exemple : pour tester le LCD il n'est pas obligatoire d'avoir la RTC, tu peux simplement lui envoyer une chaine de caractère.
Pour tester la RTC le serial monitor de l'IDE est suffisant.

Quand tout fonctionne individuellement tu peux assembler mais pas avant.

bonjour,
déjà, je ne sais pas si incidence mais

void loop() {
  // put your main code here, to run repeatedly:
{

un { en trop donc un } en trop à la fin aussi

pourquoi s'emmede... a utiliser des true false pour lire l'heure?
regardes la lib rtc ICI

de plus, tu récupères 25000 fois l'heure, mets ca dans un void à part, les variables seront gardées et ca économise du temps.
idem pour la temp et humidité

2 fois delay(1000);
bloque le programme, donc possibilité de bug

bref, comme le dit 68tjs teste module par module et fais des fonctions dans des void
ca va éclaircir énormément ton code

bonjour,
j'ai testé tout les programme séparément, et ils fonctionnes,
j'ai donc voulu "combiner" le rtc (1307) avec le relais pour déclencher un relais dans une période de temps, mais cela ne fonctionne pas, le relais ne se déclenche pas quand ils est dans la fenêtre d'heure voila si joint le code

#include <RTClib.h>
#include <Wire.h>
const int lampeRelaisPin = 9;
RTC_DS1307 rtc;
void setup() {
  // put your setup code here, to run once:
 Wire.begin();
  rtc.begin();
 //RTC.adjust(DateTime(__DATE__, __TIME__));
   
  pinMode(lampeRelaisPin, OUTPUT); // Relais Lampe en sortie
}

void loop() {
  // put your main code here, to run repeatedly:
DateTime now = rtc.now();
 if (now.hour() >= 6 & now.hour() <= 19) {
      // lampe ON
      digitalWrite(lampeRelaisPin, LOW);
      } else {
      // lampe OFF
      digitalWrite(lampeRelaisPin, HIGH);
      }
}

Bonjour,

Vérifies l'heure en l'affichant sur le moniteur serie avec Serial.println().
Vérifies le câblage du relais.

teste ce code pour savoir si le relais fonctionne ou pas

const int lampeRelaisPin = 9;
void setup() {
 pinMode(lampeRelaisPin, OUTPUT); // Relais Lampe en sortie
}

void loop() {
digitalWrite(lampeRelaisPin, LOW);
delay(2000);
digitalWrite(lampeRelaisPin, HIGH);
delay(2000);
}

bonjour
j'ai testé le rtc en serial, j'ai également testé le relais, tout fonctionne bien... je ne sais pas trop quoi faire, peu être tester le serial en même temps que le programme du relais (le deuxième que j'ai proposé) mais normalement l'heure du rtc ne change pas si?

Vu de mon siège, a un bon paquet de kms de toi, cela devrait fonctionner.
Et cela ne fonctionne pas !

Quand on est dans cette situation c'est souvent qu'il y a une conne*ie souvent tellement énorme qu'on ne la voit pas.
Donc tu cesse d'être rationnel, tu envisage tout et tu procède avec méthode.

Je pars du principe que tu as testé la RTC et le relais séparément et que tout fonctionne.
J'espère que ce n'est pas un simple relais mais un module comprenant un transistor en interface avec le micro et une diode de roue libre en parallèle sur la bobine du relais sinon pas bon du tout pour le micro.

Pour commencer la recherche de conner*e, tu affiche toutes les information de date après avoir déconnecté non décâblé complètement le relais, oui complètement il ne doit rester aucun fil.
Cela devrait être bon.

L'étape suivante est d’allumer la diode avec la condition if toujours sans relais.
Tant que cela ne fonctionne pas il est inutile d'aller plus loin.

Ensuite tu câble le relais mais sans l'activer.
Tu affiche les données de date et tu contrôle que c'est bon.

Pour finir tu active le relais.

Mon sentiment c'est que tu as eu des problèmes de câblage "insolites" et difficiles à voir.
En procédant ainsi tu ne devrait pas les revoir.

MAIS attention :
Ce n'est jamais bon d'alimenter le relais sur le 5V de la carte arduino. A l’enclenchement du relais il se produit un appel de courant qui peut provoquer une baisse momentanée du 5V.
Il est préférable d'utiliser un chargeur de téléphone, il y en a plein à récupérer maintenant. ET de BIEN RELIER les MASSES ou plutôt comme le chargeur n'a pas de masse de bien relier les 0V.
Une mauvaise connexion ou un fil trop fin peuvent provoquer des dysfonctionnements aléatoires.

bonjour,
il y a une chose que je n'ai pas precisé , le relais s'active a l’état LOW du pin et non a l’état HIGH.
oui c'est un module 4 relay chinois pour arduino comme on en trouve beaucoup, voila ou je l'ai acheté (je réside en Argentine c'est pour cela que tout est en espagnol) http://articulo.mercadolibre.com.ar/MLA-620086314-modulo-relay-rele-de-4-canales-5v-10a-arduino-pic-avr-_JM

C'est bon, cela fonctionne, j'ai juste ajuster l'heure de nouveau, et cela a marcher, je pensais que l'heure ayant été configuré avec le programme du serial, je ne devait pas l'ajusté de nouveau, voila ou était l'erreur...Maintenant je commence a programmé le ldc et le timer de brasseur 15 minute on et 15 minutes off, une question, il t'il possible de faire une deuxième fonction loop indépendante de la première ?
NON finalement cela ne fonctionne pas, en fait j'ai parlé trop vite, beaucoup trop vite, cela fonctionne dans le sens ou si on règle l'heure entre la période de temps le relais s'active, et quand on regles en dehor de cette periode, celui ci ce coupe, le problème c'est que quand l'heure passe la fenêtre le relais ne change d’état que lorsque que l'on fait un nouveau transfert (avec le meme programe) comme si l'heure se s'actualiser pas
merci beaucoup pour l'aide déjà délivré

RTC + condition if = 2 inconnues c'est à dire une de trop.

Tu peux faire des tests avec une boucle for où la variable serait les heures
Tu ne mets ni RTC ni relais tu vérifie juste avec la del (led).
Et tu mets au point ta condition if.

// montée

Serial.println("Montee);
for (uint8_t h = 0 ; h<=24 ; h++)
{
if  bla bla tu place ta boucle qui teste l'heure
// info de debug
Serial.println(h);
delay(1000);
}

//descente
Serial.println("Descente");
for (uint8_t h = 24 ; h>=0 ; h--)
{
if  bla bla tu place ta boucle qui teste l'heure
//info de debug
Serial.println(h);
delay(1000);
}

L'affichage et le delay c'est juste pour le confort du débogage

PS uint8_t c'est une forme pour forcer un entier sur un octet.
Tu peux tout aussi bien utiliser int ou unsigned int(sur micro avr = 2 octets)