1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250
| #include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Keypad.h>
#include <EEPROM.h>
#include "RTClib.h"
#include "limits.h"
//Pins
int relay1 = 5; //Pin de l'ouverture des volets
int relay2 = 6; //Pin de fermeture des volets
int bp1 = 7; //Pin du bouton ouvrant à moitier les volets
int bp2 = 8; //Pin du bouton ouvrant en entier les volets
int bpStop = 9; //Pin du bouton stop
int bpFermeture = 10; //Pin du bouton fermeture des volets
int rain_drop = 11; //Pin du capteur de pluie
//Keypad
char keys[4][4] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'#','0','*','D'}
};
byte rowPins[4] = {12, 13, 14, 15}; //pin des lignes du keypad
byte colPins[4] = {16, 17, 18, 19}; //pin des colonnes du keypad
//Internal
int heure_ouverture; //heure d'ouverture des volets
int heure_fermeture; //heure de fermeture des volets
unsigned long relay1_close_time = 0; //temps avant le stop du relai 1
unsigned long relay2_close_time = 0; //temps avant le stop du relai 2
LiquidCrystal_I2C lcd(0x27,20,4);
RTC_DS1307 rtc;
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, 4, 4 );
bool nuit = true;
void setup() {
//Initialisation
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
digitalWrite(relay1, LOW);
digitalWrite(relay2, LOW);
pinMode(bp1, INPUT);
pinMode(bp2, INPUT);
pinMode(bpStop, INPUT);
pinMode(bpFermeture, INPUT);
pinMode(rain_drop, INPUT);
lcd.init();
lcd.backlight();
Wire.begin();
rtc.begin();
set_heure_ouverture(EEPROM.read(0));
set_heure_fermeture(EEPROM.read(1));
}
void set_heure_ouverture(int heure)
{
if (heure < 0 || heure > 23){
heure = 8;
}
heure_ouverture = heure;
int heure_maintenant = rtc.now().hour();
if (heure_maintenant >= heure_ouverture && heure_maintenant < heure_fermeture) {
nuit = false;
} else {
nuit = true;
}
EEPROM.write(0, heure_ouverture);
}
void set_heure_fermeture(int heure)
{
if (heure < 0 || heure > 23){
heure = 18;
}
heure_fermeture = heure;
int heure_maintenant = rtc.now().hour();
if (heure_maintenant >= heure_ouverture && heure_maintenant < heure_fermeture) {
nuit = false;
} else {
nuit = true;
}
EEPROM.write(1, heure_fermeture);
}
//Allume le relai 1 pendant le temps spécifié
void ouverture_relai_1(long temps_ouvert) {
digitalWrite(relay1, HIGH);
relay1_close_time = millis() + temps_ouvert;
lcd.clear();
lcd.print("Ouverture toit");
}
//Allume le relai 2 pendant le temps spécifié
void ouverture_relai_2(long temps_ouvert) {
digitalWrite(relay2, HIGH);
relay2_close_time = millis() + temps_ouvert;
lcd.clear();
lcd.print("Fermeture toit");
}
void afficher_chiffre(int chiffre) {
if (chiffre < 10) {
lcd.print(0, DEC);
}
lcd.print(chiffre, DEC);
}
void afficher_date(DateTime temps) {
afficher_chiffre(temps.day());
lcd.print("/");
afficher_chiffre(temps.month());
lcd.print("/");
afficher_chiffre(temps.year() + 2000);
lcd.print(" ");
afficher_chiffre(temps.hour());
lcd.print(":");
afficher_chiffre(temps.minute());
}
char getKeypadChar(unsigned long timeout) {
char key = keypad.getKey();
while (!key && millis() < timeout) {
delay(100);
key = keypad.getKey();
}
return key;
}
int get_two_numbers()
{
lcd.setCursor(0, 1);
lcd.cursor();
char first = getKeypadChar(10000);
if (!first || first < '0' || first > '9')
{
lcd.noCursor();
return -1;
}
lcd.print(first);
char secondkey = getKeypadChar(10000);
if (!secondkey || secondkey < '0' || secondkey > '9')
{
lcd.noCursor();
return -1;
}
return (first - '0' * 10) + (secondkey - '0');
}
void definir_heure_ouverture() {
lcd.clear();
lcd.print("Heure ouverture");
lcd.setCursor(0, 1);
afficher_chiffre(heure_ouverture);
lcd.print(" heure");
int heure = get_two_numbers();
if (heure != -1)
set_heure_ouverture(heure);
}
void definir_heure_fermeture() {
lcd.clear();
lcd.print("Heure fermeture");
lcd.setCursor(0, 1);
afficher_chiffre(heure_fermeture);
lcd.print(" heure");
int heure = get_two_numbers();
if (heure != -1)
set_heure_fermeture(heure);
}
void loop() {
unsigned long loop_time = millis();
// Fermeture du relai 1 si le temps est expiré ou si stop est appuyé
if (loop_time > relay1_close_time || digitalRead(bpStop) == HIGH) {
digitalWrite(relay1, LOW);
relay1_close_time = ULONG_MAX;
lcd.setCursor(0, 0);
lcd.print("Fermeture relai 1");
}
// Fermeture du relai 2 si le temps est expiré ou si stop est appuyé
if (loop_time > relay2_close_time || digitalRead(bpStop) == HIGH) {
digitalWrite(relay2, LOW);
relay2_close_time = ULONG_MAX;
lcd.setCursor(0, 0);
lcd.print("Fermeture relai 2");
}
//Bouton 1 => ouverture du relai 1 pendant 30 secondes
if (digitalRead(bp1) == HIGH) {
ouverture_relai_1(30 * 1000);
}
//Bouton 2 => ouverture du relai 1 pendant 60 secondes
if (digitalRead(bp2) == HIGH) {
ouverture_relai_1(60 * 1000);
}
//Pluie ou bouton fermeture => ouverture du relai 2 (fermeture des volets)
if (digitalRead(rain_drop) == HIGH || digitalRead(bpFermeture) == HIGH) {
ouverture_relai_1(60 * 1000);
}
//Est-ce l'heure d'ouvrir ou fermer les volets ?
DateTime temps_reel = rtc.now();
int heure = temps_reel.hour();
if (nuit && heure == heure_ouverture) {
ouverture_relai_1(30 * 1000);
nuit = false;
} else if (!nuit && heure == heure_fermeture) {
ouverture_relai_2(60 * 1000);
nuit = true;
}
char key = keypad.getKey();
if (key) {
if (key == 'A') {
definir_heure_ouverture();
}
if (key == 'B') {
definir_heure_fermeture();
}
}
//Affichage LCD
lcd.setCursor(0, 1);
afficher_date(temps_reel);
delay(500);
} |
Partager