Go Down

Topic: Help! Terrarium automatisé qui freeze (Read 846 times) previous topic - next topic

Dominaria

Bonjour à tous!

J'ai débuter il y a quelque mois mon premier vrai projet Arduino, un terrarium tout automatisé.
Pour cela j'ai un Arduino Mega alimenter en 9V, 6relais pour le 220V, un module rtc DS1307 et des kilomètre de câble ^^
L'ensemble tourne plutôt bien excepté 1 point que je n'arrive pas à résoudre:
Il y a 2 pompes, 1 ventilateur et un nébuliseur. Parfois sans qu'il n'y ai de raison valable (à mon sens) tout se bloque, je ne peux appuyer sur aucun bouton et généralement (pas tout le temps) un des composants ci dessus reste sur ON. La seule solution que j'ai est de couper le courant et redémarrer, mais en faisant  cela l'horloge reset à 00h00 alors qu'elle est sensé conserver en mémoire le temps. J'ai vérifié la pile elle est OK, le câblage du RTC est ok aussi...ça me rends dingue.

Pourriez vous m'aider? Et aussi si vous avez des conseils pour mon code je suis tout ouïe  :)


Code: [Select]
#include "DHT.h"  
#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"

#define DHTPIN A1  
#define DHTTYPE DHT22

LiquidCrystal lcd(40, 41, 42, 43, 44, 45);
DHT dht(A1, DHT22);
RTC_DS1307 RTC;

const int inconi = 22;
const int nebuliseur = 24;
const int ventilateur = 26;
const int lumiere = 28;
const int pompe1 = 30;
const int pompe2 = 32;
int statventilateur = 0;
int statnebuliseur = 0;
int statpompe1 = 0;
int statpompe2 = 0;
int statlumiere = 0;

const int butJaune= 50;
const int butBlanc= 51;
const int butVert= 52;
const int butRouge= 53;
int Jaune=0;
int Blanc=0;
int Vert=0;
int Rouge=0;

const int LCD= 48;
const int retro= 49;
int statLCD = 0;
int statretro = 0;

const int capteur = A2;
int lvl;          

const int niveau = A3;
int niv;

const int led1=34;
const int led2=36;
const int led3=38;
const int led4=35;
const int ledniv=37;

void setup() {
  lcd.begin(16, 2);
  dht.begin();
  Wire.begin();
  RTC.begin();
  //RTC.adjust(DateTime(__DATE__, __TIME__));  

  pinMode(inconi, OUTPUT);
  pinMode(nebuliseur, OUTPUT);
  pinMode(ventilateur, OUTPUT);
  pinMode(lumiere, OUTPUT);
  pinMode(pompe1, OUTPUT);
  pinMode(pompe2, OUTPUT);

  pinMode(butRouge, INPUT);
  pinMode(butVert, INPUT);
  pinMode(butJaune, INPUT);
  pinMode(butBlanc, INPUT);

  pinMode(LCD, OUTPUT);
  pinMode(retro, OUTPUT);

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(ledniv, OUTPUT);

  digitalWrite(inconi, HIGH);
  digitalWrite(nebuliseur, HIGH);
  digitalWrite(ventilateur, HIGH);
  digitalWrite(lumiere, HIGH);
  digitalWrite(pompe1, HIGH);
  digitalWrite(pompe2, HIGH);
}

void loop() {

  Rouge= digitalRead(butRouge);
  float h = dht.readHumidity();  
  float t = dht.readTemperature();  
 
   statLCD= digitalRead(LCD);
   statretro= digitalRead(retro);
   DateTime now = RTC.now();
   if (Rouge == HIGH && statLCD == LOW && statretro == LOW) {
    digitalWrite(LCD, HIGH);
    digitalWrite(retro, HIGH);
  }
   else if (Rouge == HIGH && statLCD == HIGH && statretro == HIGH) {
    digitalWrite(LCD, LOW);
    digitalWrite(retro, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led1, LOW);
  }
   if (isnan(t) || isnan(h)) //Si les valeures retournées ne sont pas des nombres :
  {
    lcd.setCursor(0, 1);
    lcd.print(DHTTYPE);
    lcd.setCursor(5, 1);
    lcd.print(" ERROR");
 }
  else if (statLCD == HIGH && statretro == HIGH) {
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print("T:");
    lcd.setCursor(2, 1);
    lcd.print(t);
    lcd.setCursor(6, 1);
    lcd.print((char)223); //Affiche le caractère ° (degrés)
    lcd.setCursor(7, 1);
    lcd.print("C");
    lcd.setCursor(9, 1);
    lcd.print("H:");
    lcd.setCursor(11, 1);
    lcd.print(h);
    lcd.setCursor(15, 1);
    lcd.print("%");
 
    lcd.setCursor(4, 0);
    lcd.print(now.hour());
    lcd.setCursor(6, 0);
    lcd.print("h");
    lcd.setCursor(7, 0);
    lcd.print(now.minute());
    lcd.setCursor(9, 0);
    lcd.print("min    ");
    }

  lvl = analogRead(capteur);

  niv = analogRead(niveau);
  if (niv>225){
    digitalWrite(ledniv, HIGH);
    digitalWrite(led4, HIGH);
    delay(800);
    digitalWrite(led4, LOW);
    delay(800);
    digitalWrite(led4, HIGH);
    delay(800);
    digitalWrite(led4, LOW);
    delay(800);
    digitalWrite(led4, HIGH);
    digitalWrite(led3, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led1, LOW);
  }
  else if (niv>=220 && niv<=225 && statLCD == HIGH){
    digitalWrite(ledniv, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led2, LOW);
    digitalWrite(led1, LOW);
  }
  else if (niv<=219 && niv>=215 && statLCD == HIGH){
    digitalWrite(ledniv, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led1, LOW);
  }
  else if (niv<=214 && statLCD == HIGH){
    digitalWrite(ledniv, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led1, HIGH);
   }
  if (statLCD == LOW){
    digitalWrite(led3, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led1, LOW);  
  }  
  if (statLCD == LOW && niv<=225){
    digitalWrite(ledniv, LOW);
    digitalWrite(led4, LOW);
  }  
 
  if (now.hour()>=10 && now.hour()<=22) {
  digitalWrite(lumiere, LOW);
    }
  if (now.hour()<10 || now.hour()>22) {
  digitalWrite(lumiere, HIGH);
    }
  statlumiere = digitalRead(lumiere);
 
  if (h>90 && statlumiere==LOW && now.minute()>=43) {
    digitalWrite(ventilateur,LOW);
  }
  else if (now.minute()>58) {
    digitalWrite(ventilateur,HIGH);
  }
  if (t>27 && statlumiere==LOW) {
    digitalWrite(ventilateur,LOW);
  }
  else if (t<25 && now.minute()<43) {
    digitalWrite(ventilateur,HIGH);
  }
  Vert= digitalRead(butVert);
  statventilateur= digitalRead(ventilateur);
  if (Vert == HIGH && statventilateur == HIGH) {
    digitalWrite(ventilateur, LOW);
    delay(10000);
  }
  else if (Vert == HIGH && statventilateur == LOW) {
    digitalWrite(ventilateur, HIGH);
  }
 
  if (h<60 && statlumiere == LOW && statventilateur == HIGH) {
      digitalWrite(nebuliseur,LOW);
  }
  else if (h>70) {
      digitalWrite(nebuliseur,HIGH);
  }
  Blanc= digitalRead(butBlanc);
  statnebuliseur= digitalRead(nebuliseur);
  if (Blanc == HIGH && statnebuliseur == HIGH) {
    digitalWrite(nebuliseur, LOW);
    delay(30000);
  }
  else if (Blanc == HIGH && statnebuliseur == LOW) {
    digitalWrite(nebuliseur, HIGH);
  }
  if (now.hour()== 23 && now.minute()>15 && now.minute()<30 && statventilateur == HIGH) {
  digitalWrite(nebuliseur, LOW);
  }
  else if (now.hour()== 23 && now.minute()>=30) {
  digitalWrite(nebuliseur, HIGH);
  }
 
   if (lvl<=949) {
    digitalWrite(pompe2,LOW);
    digitalWrite(pompe1,HIGH);
    delay(180000);
    digitalWrite(pompe2,HIGH);
  }
   statpompe2= digitalRead(pompe2);
 
  statpompe1= digitalRead(pompe1);
  if (now.minute()<25) {
    digitalWrite(pompe1, HIGH);
    }
  else if (now.minute()>=25 && now.minute()<=30 && statlumiere == LOW && lvl>949) {
    digitalWrite(pompe1, LOW);
    }
  else if (now.minute()>30 && now.minute()<50) {
    digitalWrite(pompe1, HIGH);
    }
  else if (now.minute()>=50 && now.minute()<=55 && statlumiere == LOW && lvl>949) {
    digitalWrite(pompe1, LOW);
    }
  else if (now.minute()>55 && now.minute()<=59) {
    digitalWrite(pompe1, HIGH);
    }
  Jaune= digitalRead(butJaune);
   if (Jaune == HIGH && statpompe1 == HIGH) {
    digitalWrite(pompe1, LOW);
    delay(15000);
    digitalWrite(pompe1, HIGH);
  }
  else if (Jaune == HIGH && statpompe1 == LOW) {
    digitalWrite(pompe1, HIGH);
  }
 
delay(1000);
}

pierrotm777

De long câbles peuvent engendrer des résistances importantes donc des courants importants. 40ma par pin sur le mega je crois bien voir 20ma sur les autre arduino. Il chauffe pas un peu trop ?

bilbo83

Bonjour,

Un schéma complet du système, pas un Fritzing, papier crayon c'est ok. Avec si possible la longueur des câbles pour les longs.
Les perturbations peuvent avoir de nombreuses origines.

Dominaria

J'en ai jamais fais donc je vais essayer mais ça va être long!
Mais d'après vous le code à l'air OK?

bilbo83

Comment as-tu pu faire un montage avec des km de câbles sans faire un schéma?
Tu les as connectés au hasard?

Dominaria

Oui et quand ça faisait des étincelles je changeais de trou dans l'arduino.

bilbo83

Tu es un petit marrant.
La demande de schéma c'est pour t'aider.
Mais c'est comme tu veux, dans ces conditions, je pense tu auras du mal à trouver de l'aide.

Dominaria


Go Up