J'ai créé un petit programme pour allumer une rampe de led.
Elle s'allume et s'éteint suivant des heures précises (idem pour 2 relais).
Alors tout fonctionne mais un peu trop bien... en fait tout reste allumé en permanence..
C'est mon premier programme sur Arduino et j'ai un peu de mal à voir et comprendre ou se situe le problème
#include <Wire.h>
#include <Time.h>
#include <TimeLib.h>
#include <config.h>
#include <ds3231.h>
/*
Ports utilisés :
Analog Pin 4 = SDA pour ds3231
Analog Pin 5 = SCL pour ds3231
Digital Pin 9 = PWM Blanc
Digital Pin 11 = PWM Bleu
Digital pin 8 = relais pour la rampe
Digital pin 7 = relais pour la pompe
Pour info :
PWM1 = intensité des blancs
PWM2 = intensité des bleus
relais = état du relais
*/
int pwm1=9;
int pwm2=11;
struct ts t;
int val_up=0;
int val_down=0;
int relais1=8;
int relais2=7;
void setup() {
Serial.begin(9600);
Wire.begin();
DS3231_init(DS3231_INTCN);
analogWrite(pwm1,0); //initialise à 0 les leds blanches
analogWrite(pwm2,0); //initialise à 0 les leds jaune
DS3231_get(&t); //récupère les données du DS3231
pinMode(relais1, OUTPUT); //initialise le port du relais en sortie
digitalWrite(relais1, LOW); //le relais est éteint à l'initialisation
pinMode(relais2, OUTPUT); //initialise le port du relais en sortie
digitalWrite(relais2, LOW); //le relais est éteint à l'initialisation
}
void loop() {
val_up = (map (minute(), 0, 59, 0, 255)); //permet d’attribuer une valeur d’intensitp des leds croissante sur 59 minutes, comprise entre 0 et
//255 (valeur maximale du signal PWM)
val_down = (map (minute(), 0, 59, 255, 0)); //permet d’attribuer une valeur d’intensitp des leds dpcroissante sur 59 minutes, comprise entre
//255 et 0 (valeur minimale du signal PWM)
//****************LEDS Jaunes***************************************************
if (hour() == 8) { // entre 8:00:00 et 21:00:00
analogWrite (pwm2, val_up); // allumage progressif sur 59 minutes
}
else if (hour() == 18) { // entre 18:00:00 et 21:00:00
analogWrite (pwm2, val_down); // extinction progressive sur 59 minutes
}
else if ((hour() > 11 ) && (hour() < 18)) { // entre 12:00:00 et 20:59:59
analogWrite(pwm2, 255); // allumage maximum
}
else {
analogWrite(pwm2, 0);//le reste du temps les leds jaunes sont éteintes
}
//****************LEDS BLANCHES*************************************************
if (hour() == 9) { //entre 09:00:00 et 9:00:00
analogWrite (pwm1, val_up*0.8); //allumage progressif
}
else if (hour() == 17) { //entre 17:00:00 et 17:59:59
analogWrite (pwm1, val_down*0.8); // extinction progressive
}
else if ((hour() > 12 ) && (hour() < 16)) { //entre 12:00:00 et 16:59:59
analogWrite(pwm1, 255*0.8); //allumage max
}
else {
analogWrite(pwm1, 0);//le reste du temps les leds blanches sont éteintes
}
//****************Ventilateur ********************************************
if ((hour() > 10 ) && (hour() < 16)) {
digitalWrite(relais2, HIGH);//relais pompe ON
}
else {//sinon
digitalWrite(relais2, LOW);//relais pompe OFF
}
if ((hour() > 8 ) && (hour() < 21)) {
digitalWrite(relais1, HIGH);//relais lumiere ON
}
else {//sinon
digitalWrite(relais1, LOW);//relais lumiere OFF
}
}
[/code͏]
Tu mets les données de ta RTC dans la variable t, avec l'instruction DS3231_get(&t);.
C'est donc t.hour que tu dois comparer dans tes blocs if.
Il faudra certainement mettre la RTC à la bonne heure, si tu ne l'as pas déjà fait. Pour cela, la bibliothèque que tu utilises, DS3231, doit avoir un sketch dans les exemples qui fait ça.
Hello,
merci pour vos retour, j'ai trouvé un petit bout de programme concernant l'heure.
J'ai bien réussi à le mettre à l'heure et vérifier avec le moniteur, c'est OK.
@lesept si j'ai bien compris je dois remplacer mes hour par t.hour ?
Regarde les exemples de la bibliothèque que tu utilises, ils te montreront la syntaxe précise. Moi je ne connais pas cette bibliothèque, il en existe plein pour gérer ces RTC. Je pense que tu dois changer hour () en t.hour
Mais il vaut mieux que tu regardes les exemples pour bien comprendre le fonctionnement de la bibliothèque
Bonjour,
Dans la Loop, je ne vois pas à quel moment les données de l'heure et minutes sont récupérés.
Du coup : les valeurs de hour et minute seront toujours les mêmes.
J’ai utilisé une horloge il y a un pt’i moment déjà... et de souvenir j’ai eu ce type de pb avec la comparaisons du « jour » de la semaine.
En faisant : if ( day() > montest) {.....}
Ça allez pas...
Ma solution a été d’attribuer une variable, du style ;
uint8_t Jour = day();
Et je faisais les comparaisons avec cette variable ...
Leptro:
Bonjour,
Dans la Loop, je ne vois pas à quel moment les données de l'heure et minutes sont récupérés.
Du coup : les valeurs de hour et minute seront toujours les mêmes.
C'est possible, dans ce cas, ajouter dans la loop :
merci à tous pour vos retour.
Problème résolu !
J'en ai découvert d'autres, aussi solutionné mais je bloque à nouveau..
Les PWM ne fonctionnent pas (tout s'allume à 100%).
Je vous mets le code ci-dessous si qq'un a une idée et je continue de chercher, peut être un problème HW mais j'y crois moyen.
#include <Wire.h>
#include <Time.h>
#include <TimeLib.h>
#include <config.h>
#include <ds3231.h>
/*
Ports utilisés :
Analog Pin 4 = SDA pour ds3231
Analog Pin 5 = SCL pour ds3231
Digital Pin 9 = PWM Blanc
Digital Pin 11 = PWM Bleu
Digital pin 8 = relais pour la rampe
Digital pin 7 = relais pour la pompe
Pour info :
PWM1 = intensité des blancs
PWM2 = intensité des bleus
relais = état du relais
*/
int pwm1=9;
int pwm2=11;
struct ts t;
int val_up=0;
int val_down=0;
int relais1=8;
int relais2=7;
void setup() {
Serial.begin(9600);
Wire.begin();
DS3231_init(DS3231_INTCN);
analogWrite(pwm1,0); //initialise à 0 les leds blanches
analogWrite(pwm2,0); //initialise à 0 les leds jaune
DS3231_get(&t); //récupère les données du DS3231
pinMode(relais1, OUTPUT); //initialise le port du relais en sortie
digitalWrite(relais1, HIGH); //le relais est éteint à l'initialisation
pinMode(relais2, OUTPUT); //initialise le port du relais en sortie
digitalWrite(relais2, HIGH); //le relais est éteint à l'initialisation
}
void loop() {
DS3231_get(&t);
val_up = (map (minute(), 0, 59, 0, 255)); //permet d’attribuer une valeur d’intensitp des leds croissante sur 59 minutes, comprise entre 0 et
//255 (valeur maximale du signal PWM)
val_down = (map (minute(), 0, 59, 255, 0)); //permet d’attribuer une valeur d’intensitp des leds dpcroissante sur 59 minutes, comprise entre
//255 et 0 (valeur minimale du signal PWM)
//****************LEDS Jaunes***************************************************
if (t.hour == 8) { // allumage à 8h
analogWrite (pwm2, val_up); // allumage progressif sur 59 minutes
}
else if (t.hour == 19) { // entre 19:00 et 20:00
analogWrite (pwm2, val_down); // extinction progressive sur 59 minutes
}
else if ((t.hour > 10 ) && (t.hour < 19)) { // entre 12:00:00 et 20:59:59
analogWrite(pwm2, 255); // allumage maximum
}
else {
analogWrite(pwm2, 0);//le reste du temps les leds jaunes sont éteintes
}
//****************LEDS BLANCHES*************************************************
if (t.hour == 9) { //allumage à 9h
analogWrite (pwm1, val_up*0.8); //allumage progressif sur 59 minutes
}
else if (t.hour == 16) { //entre 16:00 et 17:00
analogWrite (pwm1, val_down*0.8); // extinction progressive
}
else if ((t.hour > 10 ) && (t.hour < 16)) { //entre 10:00 et 16:00
analogWrite(pwm1, 255*0.8); //allumage max
}
else {
analogWrite(pwm1, 0);//le reste du temps les leds blanches sont éteintes
}
//****************Relais********************************************
if ((t.hour > 10 ) && (t.hour < 16)) {
digitalWrite(relais2, LOW);//relais pompe ON
}
else {//sinon
digitalWrite(relais2, HIGH);//relais pompe OFF
}
if ((t.hour > 7 ) && (t.hour < 20)) {
digitalWrite(relais1, LOW);//relais lumiere ON
}
else {//sinon
digitalWrite(relais1, HIGH);//relais lumiere OFF
}
}
error: macro "min" requires 2 arguments, but only 1 given
val_down = (map (t.min(), 0, 59, 255, 0)); //permet d’attribuer une valeur d’intensitp des leds dpcroissante sur 59 minutes, comprise entre
Il existe plusieurs bibliothèques qui ont le même nom, et donc plusieurs fichiers DS3231.h
Moi je ne peux pas savoir lequel tu utilises. L'un des deux utilise t.min l'autre t.minute
Si le premier ne marche pas, essaye le second, sinon poste le contenu du fichier ds3231.h
qu'est ce qui ne fonctionne toujours pas les comparaisons d'heures et de minutes ou bien le pwms.
Quelques postes plus hauts j'ai cru comprendre que les comparaisons heures et minutes fonctionnaient.
Oui, pardon j'ai hésité à refaire un nouveau poste.
C'est ok pour le DS3231, tout mes éléments s'allument bien suivant les heures que je souhaitent.
C'est le PWM qui ne fonctionnent pas, je n'ai pas eu le temps de m'y remettre, surement demain.
Je me demande si il ne faut pas "inverser" le signal j'ai mis des Meanwell LDD-700h.
Je vais resortir sa doc, il m'aurait bien fallu un oscillo aussi pour voir ce que me sort l'arduino ..