Eclairage automatique

Bonjour je reviens pour vous redemander de l'aide pour mon code. Il consiste à allumer une lampe de 8h30 à 18h30 du Lundi au Samedi avec 6 semaines de fermeture en juillet et août. Pour l'instant mon code me permet d'allumer la lampe de 8h30 à 18h30 et j'ai rajouter cette ligne pour identifier les jours de la semaine const char daysOfTheWeek[7][12] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};

J'ai mis le résultat sur un écran LCD et cela correspond bien à la date indiqué.

Ici je met mon code entier et du coup j'aimerais avoir de l'aide pour que ma lampe ne s'allume que du Lundi au Samedi avec 6 semaines de fermeture entre juillet et août.

#include "RTClib.h" //Librairie pour le module RTC horloge en temps réel
#include "rgb_lcd.h" //Librairie pour la configuration du LCD
#include <Wire.h> //Librairie pour les différents composants
RTC_DS1307 RTC; //Réference du module RTC
rgb_lcd lcd; //Référence de l'écran LCD

const int lampeRelaisPin = 3; // valeur broche du relais lampe
float startProg1 = 8.5; // heure de départ du programme
float endProg1 = 18.49; // heure de fin du programme
const char daysOfTheWeek[7][12] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};

void setup() {
  Serial.begin(57600); //Taux de rafraîchissement
  lcd.begin(16,2); //Config de l'écran LCD
  lcd.setRGB(255,55,155); //Couleur de l'écran LCD
  RTC.begin(); //Initialisation du module RTC
  RTC.adjust(DateTime(2019,2,27,8,29,55)); //Réglage de l'heure

  pinMode(lampeRelaisPin, OUTPUT); // Relais Lampe en sortie
}

void loop() {

  Heure(); //Raccourci du void Heure() 
  DateTime now = RTC.now(); // récupere l'heure du module RTC
  float heureActuelle = now.hour() + now.minute() / 60.0; //Mise à l'échelle de l'heure
  analogWrite(lampeRelaisPin, (heureActuelle  >= startProg1 && heureActuelle  <= endProg1) && (daysOfTheWeek[now.dayOfTheWeek()] >= "Lundi" && daysOfTheWeek[now.dayOfTheWeek()] <= "Samedi")? 255 : 0);   //Allumer la LED entre 8h30 et 18h30
}

void Heure () { //Partie affichage de l'heure et de la date sur le LCD
  DateTime now = RTC.now(); //Fonction obligatoire
  lcd.setCursor(0,0); //Première ligne du LCD
  lcd.print("Date: ");
  lcd.print(now.year()); //Année
  lcd.print('/');
  lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
  lcd.print('/');
  lcd.print(now.day()); //Jour
  lcd.print(' ');
  lcd.setCursor(0,1); //Seconde ligne du LCD
  lcd.print("Heure: ");
  lcd.print(now.hour()); //Heure
  lcd.print(':');
  lcd.print(now.minute()); //Minute
  lcd.print(':');
  lcd.print(now.second()); //Seconde
  lcd.println(); //Fin de l'écriture
  delay(1000); //Délais d'une seconde
}

Votre test à la fin de "loop" marche, mais il est très long (on ne peut pas le voir sur un petit écran...)
De plus, analogwrite consomme de la place (et vous écrivez soit low, soit false)
non testé:

byte aEcrire = LOW;
if ( (heureActuelle  >= startProg1)  && (heureActuelle  <= endProg1) ) {
if ( now.dayOfTheWeek() >=1 ) && ( now.dayOfTheWeek()  <= 5)) {
// reste le test de juillet : y a-t-il des numeros de semaine, ou de jour dans l'année?
  aEcrire = HIGH;
}
}

EDITE (compte tenu de remarques ultérieures) :


il faut dupliquer la ligne:
byte aEcrire = LOW; // l'initialisation est ambigue
en
byte aEcrire; // création
aEcrire = LOW;// valeur par défaut
pour être sûr qu'il est créé et initialisé à chaque appel de loop (de toutes façon, une condition aussi gigantesque ne peut pas être lue sur une seule ligne avec un seul écran; c++ s'accomode très bien d'instructions réparties sur plusieurs lignes)

Un RTC DS1307 va allègrement dériver dans le temps = plusieurs secondes par jour.
Prends plutôt un DS3231 à la place = plusieurs secondes par an

Merci pour votre réponse mais le code n'a pas l'air de fonctionné mais je ne comprends pas pourquoi il est compris entre 1 et 5 if (( now.dayOfTheWeek() >=1 ) && ( now.dayOfTheWeek()  <= 5)) {
alors que j'ai définis les jours en mettant Dimanche, Lundi... Et pour le mois de juillet et août je pense que l'on pourrait mettre les mois en numéro de 1 à 12 tous simplement je vais essayer de faire un code pour les mois

EDIT: j'avais mal compris le code mais en faite j'ai remplacé le aEcrire par un digitalWrite(lampeRelaisPin, HIGH) et la led s'allume mais ne s'éteint pas à 18h30

quentinlenain2:
Merci pour votre réponse mais le code n'a pas l'air de fonctionné mais je ne comprends pas pourquoi il est compris entre 1 et 5

if (( now.dayOfTheWeek() >=1 ) && ( now.dayOfTheWeek()  <= 5)) {

alors que j'ai définis les jours en mettant Dimanche, Lundi... Et pour le mois de juillet et août je pense que l'on pourrait mettre les mois en numéro de 1 à 12 tous simplement je vais essayer de faire un code pour les mois

Fait le contraire , mets une condition pour l'éteindre le Dimanche ..

if (( now.dayOfTheWeek() == 1 )  {  // 1 DImanche ??
}

Vous feriez mieux de compter les semaines depuis le 1er janvier...(si ce n'est déjà fait) voire les jours (si ce n'est déjà fait)

int dayOY(uint8_t mois, uint8_t jour) {
 int cusum ;
 cusum = jour;
 uint8_t nbjr[] = {31,28,31,30,31,30,31,31,30,31,30,31};
 for (uint8_t im = 0; im < (mois -1); im++ { cusum += nbjr[im];}
 return cusum;
}

devrait marcher -non testé- (sauf pour les années bissextiles : j'ai la flemme de les gèrer ((annee && 0x03) == 0)

Par ailleurs, sous quelles latitudes êtes vous, si vous voulez allumer/éteindre aux heures où il n'y a pas de soleil -sinon, je ne comprends pas votre plage horaire, qui est constante quelle que soit la saison...)

for (uint8_t im = 0; im < (mois -1); im++) { cusum += nbjr[im];}
                                         ^

Mais ceci marche aussi :

for (uint8_t im = 0; im < mois -1; im++) cusum += nbjr[im];

Certes, monsieur Sept: mais je préfère parenthèser (et mettre des crochets bouclés "curly brackets") complètement, quitte à être redondant -et cette redondance est effacée par l'optimiseur-.
L'avantage de mettre plein de curly brackets : si on "débuggue" par printf/Serial.print, on peut intercaler une ligne de "débugging" sans tourner en bourrique... elle est mis dans le bloc que l'on veut

Merci pour votre réponse mais je ne sais pas où mettre le code que vous m'avez proposer (Désolé du temps de réponse j'ai eu un problème avec mon ordinateur)

Bon;
Si vous voulez inactiver votre lampe à partir du 14 juillet (jour 181 + 14 == 195 depuis le début de l'année) et pendant 6 semaines (185 +6*7) , il vous suffit de mettre, en debut de loop

calcul de cusum à partir d'une consultation de l'horloge
si ((cusum >= 195) && (cusum <= (195+(6*7)))) alors
inactiver lampe
return // quiite loop; tous les autres tests sont inutiles

Par ailleurs, je préfère tester les numéros de jour dans la semaine que leurs noms -varient suivant les langues; le test est sujet aussi à des fautes de frappe-
Je ne sais pas comment vous gèrez les jours ouvrables .
Allumer une lampe à 18h30 l'été , à la Saint Jean, est un peu inutile; à 18 heures, en janvier, il vaudrait mieux qu'elle soit allumée sous les latitudes de France métropolitaine...