Contrôle du chauffage électrique par Arduino

Le contrôle du chauffage au sol par Arduino n’est pas une nouveauté. Mais la possibilité de contrôler la température du sol à partir d’un capteur de lumière vous permettra de rendre l’utilisation de sols chauds dans la salle de bain ou la cuisine aussi économique que possible. Nous avons publié ici une description détaillée du montage du projet, un schéma de câblage avec les capteurs, ainsi qu’un programme de travail pour la carte Arduino Micro.


Pour cette activité, nous aurons besoin:

  • Arduino Micro / Arduino Mega
  • module relais statique
  • module RTC ds1302 / ds1307 / ds3231
  • oled display 128×64 i2c
  • capteur de température lm35
  • photorésistance et resistance
  • boutons-poussoirs
  • librairies OLED_I2C.h et iarduino_RTC.h

Matériel supplémentaire sur ce sujet:

  1. Branchement afficheur OLED i2c avec Arduino
  2. Branchement module horloge DS1302 / DS1307
  3. Branchement module relais statique Arduino

Régulation de chauffage par le sol par Arduino Micro

Contrôle du chauffage électrique par Arduino
Contrôle du chauffage électrique par Arduino Micro

Comme il est nécessaire de réguler la température du système de chauffage électrique par le sol principalement en fonction de l’heure et du jour de la semaine, le module d’horloge à temps réel RTC 1307 est utilisé dans le projet (un autre module peut être utilisé). Dans ce cas, l’heure sera affichée sur un petit écran OLED. Il est donc souhaitable de flasher le module à l’avance, en y réglant l’heure et la date, comment le faire lire ici: Arduino Real Time Clock.

Vous pouvez charger tous les paramètres dans l’EEPROM de l’Arduino Micro en utilisant le programme suivant. Toutes les lignes ont des commentaires indiquant le but de la variable. L’heure, le mode de fonctionnement du chauffage par le sol et la température peuvent être modifiés à tout moment. Les nouveaux réglages seront également sauvegardés dans l’EEPROM, de sorte que les réglages ne seront pas modifiés lorsque l’appareil sera éteint.

Programme pour sauvegarde des paramètres dans l’EEPROM

#include "EEPROM.h"

// === réglage de la température par défaut === //
int t_day = 20;        // température du sol pendant la journée
int t_night = 15;      // température du sol pendant la nuit
int t_presence = 25;   // température du sol lorsque la lumière est allumée
int t_day_week = 15;   // température au sol la journée pendant le week-end
int t_night_week = 10; // température au sol la nuit pendant le week-end

// === mode de fonctionnement par défaut === //
int m = 1; // 1, 2 ou 3

// === réglage de l'heure par défaut === //
int h_day = 10;   // heure d'activation de la température journalière
int h_night = 22; // heure d'activation de la température nocturne

void setup() {
  Serial.begin(9600);
 
  // enregistrer les données dans la mémoire EEPROM
  EEPROM.update(0, t_day);
  EEPROM.update(1, t_night);
  EEPROM.update(2, t_presence);
  EEPROM.update(3, t_day_week);
  EEPROM.update(4, t_night_week);
  EEPROM.update(5, m);
  EEPROM.update(6, h_day);
  EEPROM.update(7, h_night);
 
  delay(1000);
 
  // afficher toutes les données sur le moniteur du port
  Serial.println("t_day - " + String(EEPROM.read(0)));
  Serial.println("t_night - " + String(EEPROM.read(1)));
  Serial.println("t_presence - " + String(EEPROM.read(2)));
  Serial.println("t_day_week - " + String(EEPROM.read(3)));
  Serial.println("t_night_week - " + String(EEPROM.read(4)));
  Serial.println("m - " + String(EEPROM.read(5)));
  Serial.println("h_day - " + String(EEPROM.read(6)));
  Serial.println("h_night - " + String(EEPROM.read(7)));
}

void loop() {

}

Explication du code pour sauvegarde des paramètres dans l’EEPROM:

  1. toutes les variables seront stockées exclusivement dans la mémoire non volatile de l’Arduino Micro afin d’économiser la mémoire du microcontrôleur;
  2. si vous ne chargez pas ce code, toutes les variables seront à 255 jusqu’à ce que vous ajustiez les valeurs manuellement.

Unité de contrôle du chauffage par le sol sur Arduino

Unité de contrôle du chauffage par Arduino Micro
Unité de contrôle du chauffage par Arduino Micro

Le circuit utilise un relais statique pour allumer les tapis chauffants (attention au courant maximum que le relais peut supporter). La carte Mega 2560 peut être utilisée à la place de la carte Arduino Micro. Le capteur de température LM35 et le capteur de lumière sur le LDR sont installés à l’endroit où vous souhaitez mesurer la température et la lumière. Avant de télécharger le programme, n’oubliez pas d’installer les bibliothèques nécessaires.

Programme Arduino pour contrôle du chauffage par le sol

#include "EEPROM.h"

#include "iarduino_RTC.h"
iarduino_RTC myRTC (RTC_DS1307);             // DS1307 i2C
// iarduino_RTC myRTC (RTC_DS1302, 7, 8, 9); // DS1302
// iarduino_RTC myRTC (RTC_DS3231);          // DS3231 i2C

#include "OLED_I2C.h"
OLED myOLED(SDA, SCL, 8);

extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t BigNumbers[];

#define B1 12   // broche du premier bouton
#define B2 9    // broche du deuxième bouton
#define B3 6    // broche du troisième bouton
#define RELE 13 // broche de relais
#define LM35 A1 // broche de capteur lm35
#define LDR A3  // broche de de la photorésistance
#define ldr 500 // niveau d'éclairement lorsque la lumière est allumée

bool button1WasUp = true;
bool button2WasUp = true;
bool button3WasUp = true;
bool button1IsUp;
bool button2IsUp;
bool button3IsUp;
bool f;

int temp, t;
byte w;

void setup() {
  myOLED.begin();
  myRTC.begin();
 
  pinMode(B1, INPUT_PULLUP);
  pinMode(B2, INPUT_PULLUP);
  pinMode(B3, INPUT_PULLUP);
  pinMode(LDR, INPUT);
  pinMode(LM35, INPUT);
  pinMode(RELE, OUTPUT);
}

void loop() {
  int m = EEPROM.read(5);

  myOLED.clrScr();
  myOLED.setFont(BigNumbers);
  myOLED.print(String(t), 45, 2);
  myOLED.setFont(SmallFont);
  myOLED.print("*", 77, 3);
  myOLED.setFont(MediumNumbers);
  myOLED.print(myRTC.gettime("H-i-s"), CENTER, 32);
  myOLED.setFont(SmallFont);

  if (f == 0) {
    digitalWrite(RELE, LOW);
    myOLED.print("floor heating OFF", CENTER, 56);
  }
  if (f == 1) {
    digitalWrite(RELE, HIGH);
    myOLED.print("floor heating ON", CENTER, 56);
  }

  myOLED.update();

  temp = analogRead(LM35);
  t = (temp / 1023.0) * 5.0 * 1000 / 10;

  if (m == 1) mode1();
  if (m == 2) mode2();
  if (m == 3) mode3();

  button1IsUp = digitalRead(B1);
  button2IsUp = digitalRead(B2);
  button3IsUp = digitalRead(B3);

  if (button1WasUp && !button1IsUp) {
    delay(10);
    button1IsUp = digitalRead(B1);
    if (!button1IsUp) { delay(500); w = 1; temp_setting(); }
  }
  button1WasUp = button1IsUp;

  if (button2WasUp && !button2IsUp) {
    delay(10);
    button2IsUp = digitalRead(B2);
    if (!button2IsUp) { delay(500); w = 1; clock_setting(); }
  }
  button2WasUp = button2IsUp;

  if (button3WasUp && !button3IsUp) {
    delay(10);
    button3IsUp = digitalRead(B3);
    if (!button3IsUp) {
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      myOLED.print("analogRead(LDR)", CENTER, 12);
      myOLED.setFont(MediumNumbers);
      myOLED.print(String(analogRead(LDR)), CENTER, 32);
      myOLED.update();
      delay(2000);
    }
  }
  button3WasUp = button3IsUp;
}

// === daily work mode === //
void mode1() {
  int t_day = EEPROM.read(0);
  int t_night = EEPROM.read(1);
  int t_presence = EEPROM.read(2);
  int h_day = EEPROM.read(6);
  int h_night = EEPROM.read(7);
  int hour = myRTC.gettime("H");

  if (hour >= h_night) {
    if (t > t_night) f = 0;
    if (t < t_night - 2) f = 1;
  }
  if (hour >= h_day) {
    if (t > t_day) f = 0;
    if (t < t_day - 2) f = 1;
  }
  if (analogRead(LDR) > ldr and t < t_presence) f = 1;
}

// === weekday / weekend mode === //
void mode2() {
  int t_day = EEPROM.read(0);
  int t_night = EEPROM.read(1);
  int t_presence = EEPROM.read(2);
  int t_day_week = EEPROM.read(3);
  int t_night_week = EEPROM.read(4);
  int h_day = EEPROM.read(6);
  int h_night = EEPROM.read(7);
  int hour = myRTC.gettime("H");
  int day = myRTC.gettime("D");

  if (hour >= h_night and day != 6 or day != 7) {
    if (t > t_night) f = 0;
    if (t < t_night - 2) f = 1;
  }
  if (hour >= h_day and day != 6 or day != 7) {
    if (t > t_day) f = 0;
    if (t < t_day - 2) f = 1;
  }
  if (hour >= h_night and day == 6 or day == 7) {
    if (t > t_night_week) f = 0;
    if (t < t_night_week - 2) f = 1;
  }
  if (hour >= h_day and day == 6 or day == 7) {
    if (t > t_day_week) f = 0;
    if (t < t_day_week - 2) f = 1;
  }
  if (analogRead(LDR) > ldr and t < t_presence) f = 1;
}

// === independent mode === //
void mode3() {
  int t_day = EEPROM.read(0);
  int t_night = EEPROM.read(1);
  int h_day = EEPROM.read(6);
  int h_night = EEPROM.read(7);
  
  if (myRTC.gettime("H") >= h_night) {
    if (t > t_night) f = 0;
    if (t < t_night - 2) f = 1;
  }
  if (myRTC.gettime("H") >= h_day) {
    if (t > t_day) f = 0;
    if (t < t_day - 2) f = 1;
  }
}

void temp_setting() {
  int t_day = EEPROM.read(0);
  int t_night = EEPROM.read(1);
  int t_presence = EEPROM.read(2);
  int t_day_week = EEPROM.read(3);
  int t_night_week = EEPROM.read(4);
  int m = EEPROM.read(5);
  int h_day = EEPROM.read(6);
  int h_night = EEPROM.read(7);

  while (w == 1) {
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("MODE SELECTION", CENTER, 12);
    myOLED.print("daily work", 15, 32);
    myOLED.print("weekday / weekend", 15, 44);
    myOLED.print("independent mode", 15, 56);

    if (m == 1) { myOLED.print("-", 2, 32); }
    if (m == 2) { myOLED.print("-", 2, 44); }
    if (m == 3) { myOLED.print("-", 2, 56); }
 
    myOLED.update();

    button1IsUp = digitalRead(B1);
    button2IsUp = digitalRead(B2);
    button3IsUp = digitalRead(B3);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(B1);
      if (!button1IsUp) {
        EEPROM.update(5, m);
        delay(500); w = 2; break;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(B2);
      if (!button2IsUp) {
        m--; if (m < 1) m = 1;
      }
    }
    button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10);
      button3IsUp = digitalRead(B3);
      if (!button3IsUp) {
        m++; if (m > 3) m = 3;
      }
    }
    button3WasUp = button3IsUp;
  }

  while (w == 2) {
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("DAYTIME TEMPERATURE", CENTER, 12);
    myOLED.setFont(MediumNumbers);
    myOLED.print(String(t_day), CENTER, 32);
    myOLED.update();

    button1IsUp = digitalRead(B1);
    button2IsUp = digitalRead(B2);
    button3IsUp = digitalRead(B3);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(B1);
      if (!button1IsUp) {
        EEPROM.update(0, t_day);
        delay(500); w = 3; break;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(B2);
      if (!button2IsUp) {
        t_day--; if (t_day < 0) t_day = 0;
      }
    }
    button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10);
      button3IsUp = digitalRead(B3);
      if (!button3IsUp) {
      t_day++; if (t_day > 40) t_day = 40;
      }
    }
    button3WasUp = button3IsUp;
  }

  while (w == 3) {
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("NIGHT TEMPERATURE", CENTER, 12);
    myOLED.setFont(MediumNumbers);
    myOLED.print(String(t_night), CENTER, 32);
    myOLED.update();

    button1IsUp = digitalRead(B1);
    button2IsUp = digitalRead(B2);
    button3IsUp = digitalRead(B3);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(B1);
      if (!button1IsUp) {
        EEPROM.update(1, t_night);
        delay(500); w = 4; break;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(B2);
      if (!button2IsUp) {
        t_night--; if (t_night < 0) t_night = 0;
      }
    }
    button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10);
      button3IsUp = digitalRead(B3);
      if (!button3IsUp) {
        t_night++; if (t_night > 40) t_night = 40;
      }
    }
    button3WasUp = button3IsUp;
  }

  while (w == 4) {
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("DAY MODE ACTIVATION", CENTER, 12);
    myOLED.setFont(MediumNumbers);
    myOLED.print(String(h_day), CENTER, 32);
    myOLED.update();

    button1IsUp = digitalRead(B1);
    button2IsUp = digitalRead(B2);
    button3IsUp = digitalRead(B3);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(B1);
      if (!button1IsUp) {
        EEPROM.update(6, h_day);
        delay(500); w = 5; break;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(B2);
      if (!button2IsUp) {
        h_day--; if (h_day < 0) h_day = 0;
      }
    }
    button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10);
      button3IsUp = digitalRead(B3);
      if (!button3IsUp) {
        h_day++; if (h_day > 23) h_day = 23;
      }
    }
    button3WasUp = button3IsUp;
  }

  while (w == 5) {
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("NIGHT MODE ACTIVATION", CENTER, 12);
    myOLED.setFont(MediumNumbers);
    myOLED.print(String(h_night), CENTER, 32);
    myOLED.update();

    button1IsUp = digitalRead(B1);
    button2IsUp = digitalRead(B2);
    button3IsUp = digitalRead(B3);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(B1);
      if (!button1IsUp) {
        EEPROM.update(7, h_night);
        delay(500);
        if (m == 3) {
          myOLED.clrScr();
          myOLED.setFont(SmallFont);
          myOLED.print("DATA HAS BEEN SAVED", CENTER, 12);
          myOLED.update();
          delay(2000); w = 0; break;
        }
        w = 6; break;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(B2);
      if (!button2IsUp) {
        h_night--; if (h_night < 0) h_night = 0;
      }
    }
    button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10);
      button3IsUp = digitalRead(B3);
      if (!button3IsUp) {
        h_night++; if (h_night > 23) h_night = 23;
      }
    }
    button3WasUp = button3IsUp;
  }

  while (w == 6 and m == 1 or m == 2) {
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("AMBIENT TEMPERATURE", CENTER, 12);
    myOLED.setFont(MediumNumbers);
    myOLED.print(String(t_presence), CENTER, 32);
    myOLED.update();

    button1IsUp = digitalRead(B1);
    button2IsUp = digitalRead(B2);
    button3IsUp = digitalRead(B3);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(B1);
      if (!button1IsUp) {
        EEPROM.update(2, t_presence);
        delay(500);
        if (m == 1) {
          myOLED.clrScr();
          myOLED.setFont(SmallFont);
          myOLED.print("DATA HAS BEEN SAVED", CENTER, 12);
          myOLED.update();
          delay(2000); w = 0; break;
        }
        w = 7; break;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(B2);
      if (!button2IsUp) {
        t_presence--; if (t_presence < 0) t_presence = 0;
      }
    }
    button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10);
      button3IsUp = digitalRead(B3);
      if (!button3IsUp) {
        t_presence++; if (t_presence > 40) t_presence = 40;
      }
    }
    button3WasUp = button3IsUp;
  }

  while (w == 7 and m == 2) {
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("WEEKEND DAY TEMPERAT", CENTER, 12);
    myOLED.setFont(MediumNumbers);
    myOLED.print(String(t_day_week), CENTER, 32);
    myOLED.update();

    button1IsUp = digitalRead(B1);
    button2IsUp = digitalRead(B2);
    button3IsUp = digitalRead(B3);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(B1);
      if (!button1IsUp) {
        EEPROM.update(3, t_day_week);
        delay(500); w = 8; break;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(B2);
      if (!button2IsUp) {
        t_day_week--; if (t_day_week < 0) t_day_week = 0;
      }
    }
    button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10);
      button3IsUp = digitalRead(B3);
      if (!button3IsUp) {
        t_day_week++; if (t_day_week > 40) t_day_week = 40;
      }
    }
    button3WasUp = button3IsUp;
  }

  while (w == 8 and m == 2) {
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("WEEKEND NIGHT TEMPER", CENTER, 12);
    myOLED.setFont(MediumNumbers);
    myOLED.print(String(t_night_week), CENTER, 32);
    myOLED.update();

    button1IsUp = digitalRead(B1);
    button2IsUp = digitalRead(B2);
    button3IsUp = digitalRead(B3);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(B1);
      if (!button1IsUp) {
        EEPROM.update(4, t_night_week);
        delay(500);
        myOLED.clrScr();
        myOLED.setFont(SmallFont);
        myOLED.print("DATA HAS BEEN SAVED", CENTER, 12);
        myOLED.update();
        delay(2000); w = 0; break;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(B2);
      if (!button2IsUp) {
        t_night_week--; if (t_night_week < 0) t_night_week = 0;
      }
    }
    button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10);
      button3IsUp = digitalRead(B3);
      if (!button3IsUp) {
        t_night_week++; if (t_night_week > 40) t_night_week = 40;
      }
    }
    button3WasUp = button3IsUp;
  }
}

void clock_setting() {
  int minute = myRTC.gettime("i");
  int hour = myRTC.gettime("H");
  int day = myRTC.gettime("d");
  int month = myRTC.gettime("m");
  int year = myRTC.gettime("Y");

  while (w == 1) {
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("HOUR SETTING", CENTER, 12);
    myOLED.setFont(MediumNumbers);
    myOLED.print(String(hour), CENTER, 32);
    myOLED.update();

    button1IsUp = digitalRead(B1);
    button2IsUp = digitalRead(B2);
    button3IsUp = digitalRead(B3);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(B1);
      if (!button1IsUp) {
        delay(500); w = 2; break;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(B2);
      if (!button2IsUp) {
        hour--; if (hour < 0) hour = 0;
      }
    }
    button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10);
      button3IsUp = digitalRead(B3);
      if (!button3IsUp) {
        hour++; if (hour > 23) hour = 23;
      }
    }
    button3WasUp = button3IsUp;
  }

  while (w == 2) {
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("MINUTE SETTING", CENTER, 12);
    myOLED.setFont(MediumNumbers);
    myOLED.print(String(minute), CENTER, 32);
    myOLED.update();

    button1IsUp = digitalRead(B1);
    button2IsUp = digitalRead(B2);
    button3IsUp = digitalRead(B3);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(B1);
      if (!button1IsUp) {
        delay(500); w = 3; break;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(B2);
      if (!button2IsUp) {
        minute--; if (minute < 0) minute = 0;
      }
    }
    button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10);
      button3IsUp = digitalRead(B3);
      if (!button3IsUp) {
      minute++; if (minute > 59) minute = 59;
      }
    }
    button3WasUp = button3IsUp;
  }

  while (w == 3) {
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("DAY SETTING", CENTER, 12);
    myOLED.setFont(MediumNumbers);
    myOLED.print(String(day), CENTER, 32);
    myOLED.update();

    button1IsUp = digitalRead(B1);
    button2IsUp = digitalRead(B2);
    button3IsUp = digitalRead(B3);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(B1);
      if (!button1IsUp) {
        delay(500); w = 4; break;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(B2);
      if (!button2IsUp) {
        day--; if (day < 0) day = 0;
      }
    }
    button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10);
      button3IsUp = digitalRead(B3);
      if (!button3IsUp) {
        day++; if (day > 31) day = 31;
      }
    }
    button3WasUp = button3IsUp;
  }

  while (w == 4) {
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("MONTH SETTING", CENTER, 12);
    myOLED.setFont(MediumNumbers);
    myOLED.print(String(month), CENTER, 32);
    myOLED.update();

    button1IsUp = digitalRead(B1);
    button2IsUp = digitalRead(B2);
    button3IsUp = digitalRead(B3);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(B1);
      if (!button1IsUp) {
        delay(500); w = 5; break;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(B2);
      if (!button2IsUp) {
        month--; if (month < 0) month = 0;
      }
    }
    button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10);
      button3IsUp = digitalRead(B3);
      if (!button3IsUp) {
        month++; if (month > 12) month = 12;
      }
    }
    button3WasUp = button3IsUp;
  }

  while (w == 5) {
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("YEAR SETTING", CENTER, 12);
    myOLED.setFont(MediumNumbers);
    myOLED.print(String(year), CENTER, 32);
    myOLED.update();

    button1IsUp = digitalRead(B1);
    button2IsUp = digitalRead(B2);
    button3IsUp = digitalRead(B3);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(B1);
      if (!button1IsUp) {
        delay(500); w = 0; break;
      }
    }
    button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(B2);
      if (!button2IsUp) {
        year--; if (year < 0) year = 0;
      }
    }
    button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10);
      button3IsUp = digitalRead(B3);
      if (!button3IsUp) {
        year++; if (year > 99) year = 99;
      }
    }
    button3WasUp = button3IsUp;

    myRTC.settime(0, minute, hour, day, month, year);
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("DATA HAS BEEN SAVED", CENTER, 12);
    myOLED.setFont(MediumNumbers);
    myOLED.print(myRTC.gettime("H-i-s"), CENTER, 32);
    myOLED.update();
    delay(2000);
  }
}

Modes de fonctionnement du chauffage électrique par le sol sur Arduino:

  • daily work — dans ce mode, il est possible de régler la température du plancher pendant la journée (t_day) et la nuit (t_night), mais indépendamment du jour de la semaine. Le passage du mode jour au mode nuit et vice versa se fait à l’aide des variables h_day et h_night. Ce mode permet également de régler la température du sol lorsque la lumière est allumée (t_presence).
  • weekday / weekend — dans ce mode, en plus des fonctions du premier mode, la possibilité de régler une température différente du plancher chauffant électrique pendant les week-ends de la semaine a été ajoutée (t_day_week et t_night_week). La température du plancher électrique change également lorsque la lumière est allumée, mais indépendamment du jour de la semaine.
  • independent mode — dans ce mode, il n’est pas possible de modifier la température du plancher lorsque la lumière est allumée, sinon tous les réglages correspondent au premier mode.

Conclusion. Tous les réglages du programme sont commentés en détail, et la commande par bouton est assez facile à comprendre, car toutes les informations sont affichées sur l’écran OLED. Lorsque l’on quitte le mode réglage, toutes les informations sont stockées dans l’EEPROM Arduino, et le module RTC à alimentation autonome doit être responsable de l’heure. Si vous avez des questions sur le projet, laissez-les dans les commentaires.





Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. Découvrez comment les données de vos commentaires sont traitées.