delays d'affichage et gestion temps

Tien voilà une p'tite version que j'ai fais .. j'ai organiser le code .. tester sur mon afficheur .. pas de blocage..

#include <LiquidCrystal.h>
#include <Wire.h>
#include <DS1307new.h>

/*
 sorti /entre Arduino
 Analog Pin 0 = Température Sensor
 Analog Pin 4 = SDA pour ds1307
 Analog Pin 5 = SCL pour ds1307
 Digital Pin 2 = LCD
 Digital Pin 3 = LCD
 Digital Pin 4 = LCD
 Digital Pin 5 = LCD
 Digital Pin 6 = power led
 Digital Pin 7 = ventilateur
 Digital pin 9 = rouge 
 Digital pin 10 = blanc
 Digital Pin 11 = LCD
 Digital Pin 12 = LCD
 Digital Pin 8 = bleu uv
 */

//Configuration des Pin de cablage**********************

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int sensorPin          = 0;
int power_led          = 6;
int bleu_uv            = 8;
int rouge              = 10;
int blanc              = 9;
int ventilateur        = 7;

// variable
int timerPWM           = 0;
int valeurPWM          = 0;
float GAMMA_CORRECTION = 2.2;
float PWMStep          = 0;
int SeuilMini          = 15;
int temp               = 0;
//Configuration des heures allumage/extinction ( format HHMM )**********************

int bleu_uv_on_time      = 1930; //allume la pompe à cette heure 
int bleu_uv_off_time     = 2359; //éteint la pompe à cette heure
int ventilateur_on_temp  = 27;   //allume chauffage à cette température
int ventilateur_off_temp = 26.3; //éteint le chauffage à cette température


int temps;         // plus d'utilité d'avoir les autres avec le ds1307new.. exemple: RTC.hour est une variable.. 
int oldMinute = 0; // pour eviter de faire la boucle tout le temps.

//Configuration de l'heure ( pour modifier l'heure de votre Arduino, enlevez les /* et */ puis une foi le programe envoyé, remettez les )**********************

void setup(void) {
  Serial.begin(9600); 
  
  /* Reglage horloge */
  /*RTC.stopClock();
  RTC.fillByYMD(2012,9,10); // Annéé, mois, jour
  RTC.fillByHMS(8,29,50);   // heure, minute, seconde
  RTC.setTime();
  RTC.startClock();
  */
  //Configuration des entrées/sorties********************** 
  
  pinMode(ventilateur, OUTPUT);  // digital pin ventilateur 1 
  pinMode(bleu_uv,     OUTPUT);  // digital pin pour bleu uv
  pinMode(blanc,       OUTPUT);  // digital pin pour blanc
  pinMode(rouge,       OUTPUT);  // digital pin pour rouge
  pinMode(power_led,   OUTPUT);  // digital pin pour power led
  
  /* Reglage lcd */
  lcd.begin(16, 2); 
}

void loop(void){
  getTemps();
  getTempAndVent();
  
  //****Gestion de l'Affichage Sur l'écran ******** 
  afficheTemperature();
  afficheVentilation();
  
  if(RTC.minute != oldMinute) { // petite astuce qui permet de faire les calcule et l'affichage qu'une fois par minute.
    //**** Affiche l'heure et minute 
    afficheHorloge();
    
    //*****Controle des sorties eclairage *********
    lumiereBleu();
    lumiereRouge();
    powerLed();
    oldMinute = RTC.minute;
  }
}

void getTemps(void) {
  RTC.getTime();  // récupération de temps et du jour
  temps = (RTC.hour * 100) + RTC.minute; 
  Serial.println(RTC.hour);
}
  
void getTempAndVent(void) {
  //Récupération de la température du LM35 ****
  temp = analogRead(sensorPin);  
  temp = temp * 0.48828125;
  
  //****************ventilateur
  if(temp > ventilateur_on_temp){
    digitalWrite(ventilateur, HIGH);
  } else if(temp < ventilateur_off_temp) {    
    digitalWrite(ventilateur, LOW);
  }
}
  
void lumiereBleu(void) {
  //**on-off******* bleu uv *************
  if(bleu_uv_on_time > temps  || bleu_uv_off_time <= temps){
    digitalWrite(bleu_uv, LOW);
  } else { 
    digitalWrite(bleu_uv, HIGH);
  }
}
  
void lumiereRouge(void) {
  //***on-off***** rouge ***
  if (RTC.hour ==  8) { 
    PWMStep = 255 / 59;
    timerPWM = RTC.minute-60;
    valeurPWM = (int)(timerPWM * PWMStep);
    analogWrite (rouge, valeurPWM);
    lcd.setCursor(0,1);
    lcd.print(" + + ROUGE + +  ");
  } else if ((RTC.hour == 20) && (RTC.minute >30)) { // entre 20:00 et 20:59:59 
    PWMStep = 255 / 29;
    timerPWM = 30-RTC.minute;
    valeurPWM = (int)(timerPWM * PWMStep);
    analogWrite (rouge, valeurPWM);
    lcd.setCursor(0,1);
    lcd.print(" - - ROUGE - -  ");
  } else if ((RTC.hour >= 9 ) && (RTC.hour < 21)) {
    analogWrite(rouge, 255);
    lcd.setCursor(0,1);
    lcd.print("ROUGE     on    ");
  } else if (RTC.hour <= 21) {
    analogWrite(rouge, 0);
  }
  delay(2000);
}

void powerLed(void) {
  //***on-off***** power led ***
  if (RTC.hour ==  9)  { 
    PWMStep = 255 / 59;
    timerPWM = RTC.minute-60;
    valeurPWM = (int)(timerPWM * PWMStep);
    analogWrite (power_led, valeurPWM);
    if( valeurPWM < SeuilMini ) valeurPWM = 0;
    lcd.setCursor(0,1);
    lcd.print(" + POWER led +  ");
  } else if (RTC.hour == 20) { // entre 20:00 et 20:59:59 
    PWMStep = 255 / 60;
    timerPWM = 60-RTC.minute;
    valeurPWM = (int)(timerPWM * PWMStep);
    analogWrite (power_led, valeurPWM);
    if( valeurPWM < SeuilMini ) valeurPWM = 0;
    lcd.setCursor(0,1);
    lcd.print(" - POWER led -  ");
  } else if ((RTC.hour >= 10 ) && (RTC.hour < 21)) {
    analogWrite(power_led, 255);
    lcd.setCursor(0,1);
    lcd.print("POWER led   on  ");
  } else if (RTC.hour <= 21) {
    analogWrite(power_led, 0);
  }
  delay(2000);
}
  
void afficheTemperature(void) {
  //Affichage température
  lcd.setCursor(10,0);
  lcd.print(temp);
  lcd.print((char)223);
}

void afficheHorloge(void) {
  //Affichage horloge
  lcd.setCursor(0,0);
  // heure
  if (RTC.hour < 10) lcd.print("0");
  lcd.print(RTC.hour);
  lcd.print("H");
  // minute
  if (RTC.minute < 10) lcd.print("0");
  lcd.print(RTC.minute);
  lcd.print(" ");
}

void afficheVentilation(void) {
  //****Affichage ventilateur ********
  lcd.setCursor(0,1);
  if(digitalRead(ventilateur) == HIGH) {
    lcd.print("Ventilateur ON  ");
  } else  {
    lcd.print("Ventilateur OFF ");
  }
}

tu remarquera qu'il y'a une condition avec oldMinute.. tout tes calcules sont fais par rapport aux minute donc inutile de les faire toute les secondes..
Par contre j'ai changer le ds1307 par ds1307New .. (celui que j'utilise maintenant) .. apres a toi de faire avec celui que tu veux.. ^^..
j'ai juste fais le test d'affichage.. pas regarder le reste.. si le reste tourné déjà .. normalement pas de raison qu'il tourne plu..

voilà j'espere t'avoir aidé un poil.. ^^.. 30min a perdre.. avec le montage.. ^^..