Bonjour , je me suis inspiré du Programmateur Horaire Multivoies de Julien Monterrin.
J'ai adapté son code pour un écran OLED I2c et un arduino MEGA afin de piloter 7 relais 12v commandés via des transistors. (6 relais en mode programmation et 1 relais commandé manuellement via 1 switch)
Mon programme fonctionne et les sorties sont bien pilotées aux heures prescrites, l'affichage de l'heure se fait correctement, par contre l'affichage de la voie active ne se fait que pendant 1 minutes alors que j'aimerais qu'il se fasse tout le temps que cette voie est active.
Où est le bug ?
#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
RTC_DS3231 rtc;
// display config
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int buttonPin = 12; // défini entrée switch Mode Manuel en D3
const int relay1Pin = 10; // Pin out relais 1 pour le mode manuel
int buttonState = 0; // variable pour lire état status switch définie sur 0
byte i;
// Variables de la plage horaire multiples
int TabEvt [6][4] =
{
{20,22,20,32},// 9h00 - 9h14 voie 1 vert
{20,33,20,43},// 9h15 - 9h25 voie 2 bleu
{20,44,20,54},// 9h26 - 9h36 voie 3 rouge
{20,55,21,5},
{21,6,21,16},
{21,17,21,27},
};
byte PinSorties [6] = {5, 4, 7, 6, 9, 8};
void setup() {
//Serial.begin (95200);
pinMode(buttonPin, INPUT);// initialize the switch pin as an input en D3, R 1K entre D3 et +5v , autre côté du switch à GND
pinMode(10,OUTPUT); // defini D8 pour sortie voie 1
// initialisation pour 6 relais en D4,D5,D6,D7,D8,D9
for ( i = 0; i < 6; i++ ) {pinMode(PinSorties[i], OUTPUT); digitalWrite (PinSorties[i], LOW);}
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Adresse I2C 0x3C
for(;;);
}
if (!rtc.begin()) {
for(;;);
}
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Décommenter pour régler l'heure
}
void loop() {
DateTime now = rtc.now(); // Lecture de l'heure actuelle
// --- Affichage display ---
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(10,0);
//display.print("Heure: ");
display.print(now.hour());
display.print(":");
if (now.minute() < 10) display.print("0"); // Affichage propre
display.print(now.minute());
display.print(":");
if (now.second() < 10) display.print("0"); // Affichage propre
display.print(now.second());
// logique de commande pour switch mode manuel
buttonState = digitalRead(buttonPin);// lit valeur état du switch en D5
if (buttonState == HIGH ) // si D10=high on est en mode MAN sinon on reste en AUTO
{
display.setCursor(2, 50);
display.print("EV MANUEL");
digitalWrite(10,HIGH); //relais en D3 est actif
}
else // dans le cas contraire D3 est LOW et on est en mode auto
{
display.setCursor(2, 50);
display.print("MODE AUTO");
digitalWrite(10,LOW); //relais en D9 est inactif
}
// -- logique de commande pour relais multiples ----
// Rechercher si heure actuelle est dans dans la ou les plages horaires
for ( i = 0; i < 6; i++ ) {
if (now.hour() == TabEvt [i][0] && now.minute() == TabEvt [i][1]) { // si H et Min spnt dans la plage horaire de la pos1 du tableau.
digitalWrite (PinSorties[i], HIGH);
display.setCursor(2, 24);
display.print("Voie:");
display.setCursor(62, 24);
display.print(i+1);
}
if (now.hour() == TabEvt [i][2] && now.minute() == TabEvt [i][3]) {
digitalWrite (PinSorties[i], LOW);
display.setCursor(62, 24);
display.print("-");
}
}
//digitalRead(PinSorties[i]);
/*display.setCursor(2, 24);
display.print("Voie:");
display.setCursor(52, 24);
if (digitalRead(PinSorties[i]) == HIGH) {
//Serial.println (i);
display.print(i);
}
if (digitalRead(PinSorties[i]) == LOW) {
}
else {
display.setCursor(62, 24);
display.print("-");
//display.display();
//}
}*/
display.display();
delay(1000); // Mise à jour chaque sec
}