petit soucis avec prg et moniteur serie

Bonjour , j’ai fais ce petit programme pour nourrir des chèvres naines , le probleme c’est que quand je regarde le moniteur série ,l’heure du ds3231 se remet à l’heure préréglée , je ne comprend pas .

autre question , puis-je faire une autre alarme pour par exemple 9h00 du matin en plus de celle de 17h00 avec le ds3231 ?
Merci de votre aide.

// FOOD TIME CHEVRES
// projet distribution croquette pour chevres naines avec servo
// une distribution à 17h00 tous les soirs
// ARTNOW (c)   libre de droit .

#include <Servo.h>
#include <DS3231.h>
#include <Wire.h>
DS3231 clock;
RTCDateTime dt;
Servo myservo;
int pos = 0; // variable pour la position 0 du servo
int b;
int bp = 2; // un bouton poussoir sur la borne (2)
// schema : (-) -------[R 10 Kohm]--------O BP O------------ (+)
//          (2)--------------------------/


void setup() {
  Serial.begin(9600); // lecture sur interface serie
  myservo.attach(9);    // entree servo sur borne (9)
  pinMode(bp, INPUT);   // broche (2) en entrée pour le bouton poussoir

  // Initialize DS3231
  Serial.println("initialisation du DS3231 ");
  clock.begin();

  // Mise a zero des alarmes
  clock.armAlarm1(false);
  clock.armAlarm2(false);
  clock.clearAlarm1();
  clock.clearAlarm2();

  // pour le reglage manuel de la date et heure (Year, Month, Day, Hour, Minute, Second)
  // enlever les // devant clock ci dessous
 //clock.setDateTime(2015, 11, 22, 15, 20, 0);

  // heure de la journee pour le declenchement du cycle de distribution
  // une alarme à 17h00 tous les soirs
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  //clock.setAlarm1(0, 17, 00, 00, DS3231_MATCH_H_M_S);
  


  // prise en compte alarme
  checkAlarms();
}
void checkAlarms()
{
  RTCAlarmTime a1;

  if (clock.isArmed1())
  {
    a1 = clock.getAlarm1();

    Serial.print("Alarme 1 declenchee ");
    switch (clock.getAlarmType1())
    {

      case DS3231_MATCH_H_M_S:
        Serial.print("Quand il sera : ");
        Serial.println(clock.dateFormat(" H:i:s", a1));
        break;
    }
  } else
  {
  }
}


void loop() {
  dt = clock.getDateTime();
  Serial.println(clock.dateFormat("d-m-Y H:i:s - l", dt));
  delay(1000);
  if (clock.isAlarm1())

  {
    distribution ();
    Serial.println("ALARM 1 DECLENCHEE DONC DISTRIBUTION!");
  }

  //distribution manuelle

  if ( digitalRead(bp) == HIGH) {
    delay(30);
    distribution ();
    delay(100);
  }
}

void distribution() {
  // GESTION DU SERVO SUR SORTIE (9)
  for (int i = 0; i <= 25; i++) // le chiffre 1 pour 2 cycles
    for (pos = 0; pos <= 190; pos += 6) // va de 0 degrees a 190 degrees
    { // avec des pas de 1 degre
      myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos'
      delay(50);                       // pause  50ms
    }
  for (pos = 190; pos >= -0; pos -= 6) // va de  190 degres a  0 degrees
  { // avec des pas de 4 degrees donc retour rapide
    myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos'
    pos = 0;                    // position 0 du servo
    delay(50);                       // pause  50ms
  }
}

là, il doit se passer des choses ...

for (pos = 190; pos >= -0; pos -= 6) // va de  190 degres a  0 degrees
  { // avec des pas de 4 degrees donc retour rapide
    myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos'
    pos = 0;                    // position 0 du servo
    delay(50);                       // pause  50ms
  }

bonsoir dfgh , je ne comprends pas votre réponse ?

as tu récupéré le prg que je t'ai posté au dessus ? l'as tu essayé?

dfgh: as tu récupéré le prg que je t'ai posté au dessus ? l'as tu essayé?

milles excuses mais le code que tu as donné est identique au mien , il manque un bout non ? :)

oui, excuses moi, j'ai confondu ton post avec celui d'un autre arduiniste je voulais dire que dans ta boucle " for (pos = 190; pos >= -0; pos -= 6) " tu mets pos = 0 au milieu de la boucle donc, pos n'évolue pas de 190= 0 par pas de -6

tu devais mettre for (pos = 190; pos >= -0; pos -= 6) // va de 190 degres a 0 degrees { // avec des pas de 4 degrees donc retour rapide myservo.write(pos); // dit au servo d aller en position en fonction de la variable 'pos' delay(50); // pause 50ms }

merci dfgh , effectivement c’était une coquille , pour le reste peux tu m'aider ? merci

j'ai compris ma bêtise , je m’était // devant le réglage de l'heure , mais il faut absolument recharger le programme dans le contrôleur pour qu'il ne modifie plus l’heure au moment ou j'ouvre le moniteur serial .... :)

oui,c'est bien cela tu charges le prg sans les commentaires // devant la ligne le prg initialise l'heure et la date tu mets les // devant la ligne tu recharges le prg lorsque tu ouvres le moniteur, il relance le prg. mais la ligne de mise à l'heure étant commentée // elle n'est plus effectuée

Merci , donc maintenant j’aimerais rajouter une alarme à 8h00 en plus celle de 17h00 , mais j’ai l’impression que le registre de l’alarme 2 ne peux pas gérer une alarme pour une heure par jour comme le registre de l’alarme 1 que j’ai utilisé ?

// FOOD TIME CHEVRES
// projet distribution croquette pour chevres naines avec servo
// une distribution à 17h00 tous les soirs
// ARTNOW (c) libre de droit .

#include <Servo.h>
#include <DS3231.h>
#include <Wire.h>
DS3231 clock;
RTCDateTime dt;
Servo myservo;
int pos = 0; // variable pour la position 0 du servo
int b;
int bp = 2; // un bouton poussoir sur la borne (2)
// schema : (-) -------[R 10 Kohm]--------O BP O------------ (+)
// (2)--------------------------/

void setup() {
Serial.begin(9600); // lecture sur interface serie
myservo.attach(9); // entree servo sur borne (9)
pinMode(bp, INPUT); // broche (2) en entrée pour le bouton poussoir
clock.begin();

// Mise a zero alarme
clock.armAlarm1(false);
clock.clearAlarm1();

// pour le reglage manuel de la date et heure (Year, Month, Day, Hour, Minute, Second)
// enlever les // devant clock ci dessous
// clock.setDateTime(2015, 11, 22, 21, 57, 0);

// heure de la journee pour le declenchement du cycle de distribution
// une alarme à 17h00 tous les soirs
// setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
clock.setAlarm1(0, 17, 00, 00, DS3231_MATCH_H_M_S);
// clock.setAlarm2(0, 0, 1, DS3231_MATCH_M);

// prise en compte alarme
checkAlarms();
}
void checkAlarms()
{
RTCAlarmTime a1;

if (clock.isArmed1())
{
a1 = clock.getAlarm1();

Serial.print("Alarme 1 declenchee ");
switch (clock.getAlarmType1())
{

case DS3231_MATCH_H_M_S:
Serial.print(“Quand il sera : “);
Serial.println(clock.dateFormat(” H:i:s”, a1));
break;
}
} else
{
}
}

void loop() {
dt = clock.getDateTime();
Serial.println(clock.dateFormat(“d-m-Y H:i:s - l”, dt));
delay(1000);
if (clock.isAlarm1())

{
distribution ();
Serial.println(“ALARM 1 DECLENCHEE DONC DISTRIBUTION!”);
}

//distribution manuelle

if ( digitalRead(bp) == HIGH) {
delay(30);
distribution ();
delay(100);
}
}

void distribution() {
// GESTION DU SERVO SUR SORTIE (9)
for (int i = 0; i <= 25; i++) // le chiffre 1 pour 2 cycles
for (pos = 0; pos <= 190; pos += 6) // va de 0 degrees a 190 degrees
{ // avec des pas de 1 degre
myservo.write(pos); // dit au servo d aller en position en fonction de la variable ‘pos’
delay(60); // pause 50ms
}
for (pos = 190; pos >= -0; pos -= 6) // va de 190 degres a 0 degrees
{ // avec des pas de 4 degrees donc retour rapide
myservo.write(pos); // dit au servo d aller en position en fonction de la variable ‘pos’
delay(60); // pause 50ms
}
}

bonjour,
merci d emettre le code entre balise code </>

1/ edites tes posts pour mettre ton code entre balises

ici, http://forum.arduino.cc/index.php?topic=102179.0

il est dit

Pensez à l’utilisation des balises `` pour nous exposer votre code.

lorsque tu fais un post, en haut à gauche, il y a </>.
tu cliques dessus, ensuite tu places ton curseur au centre et tu colles ton code.

pour ton alarm2
en regardant la bibiothèque, je pense que tu dois la paramètrer comme suit:

clock.setAlarm1(0, 17, 00, 00, DS3231_MATCH_H_M_S);//MATCH_H_M_S ===> seconde, minute, heure et jour de la semaine
clock.setAlarm2(0, 8, 00, DS3231_MATCH_M); //MATCH_M ===> minute, heure et jour de la semaine.

et bien sur traiter les fonctions pour alarm2 comme celles qui sont déjà traitées pour alarm1

#include <Servo.h>
#include <ds3231.h>
#include <Wire.h>
DS3231 clock;
RTCDateTime dt;
Servo myservo;
int pos = 0; // variable pour la position 0 du servo
int b;
int bp = 2; // un bouton poussoir sur la borne (2)
// schema : (-) -------[R 10 Kohm]--------O BP O------------ (+)
//          (2)--------------------------/


void setup() {
  Serial.begin(9600); // lecture sur interface serie
  myservo.attach(9);    // entree servo sur borne (9)
  pinMode(bp, INPUT);   // broche (2) en entrée pour le bouton poussoir
  clock.begin();

  // Mise a zero alarmes

  clock.armAlarm1(false);
  clock.armAlarm2(false);
  clock.clearAlarm1();
  clock.clearAlarm2();

  // pour le reglage manuel de la date et heure (Year, Month, Day, Hour, Minute, Second)
  // enlever les // devant clock ci dessous
  // clock.setDateTime(2015, 11, 22, 21, 57, 0);
  // Manual (YYYY, MM, DD, HH, II, SS

  // heure de la journee pour le declenchement du cycle de distribution
  // une alarme à 17h00 tous les soirs
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  clock.setAlarm1(0, 17, 00, 00, DS3231_MATCH_H_M_S);//MATCH_H_M_S ===>  seconde, minute, heure et jour de la semaine
  clock.setAlarm2(0, 8, 00, DS3231_MATCH_M);         //MATCH_M ===>  minute, heure et jour de la semaine

  // prise en compte alarme
  checkAlarms();
}
void checkAlarms()
{
  RTCAlarmTime a1;
  if (clock.isArmed1())
  {
    a1 = clock.getAlarm1();
    Serial.print("Alarme 1 declenchee ");
    switch (clock.getAlarmType1())
    {
    case DS3231_MATCH_H_M_S:
      Serial.print("Quand il sera : ");
      Serial.println(clock.dateFormat(" H:i:s", a1));
      break;
    }
  } 
  else
  {
  }

  //*******************************************************************
  RTCAlarmTime a2;

  if (clock.isArmed2())
  {
    a2 = clock.getAlarm1();
    Serial.print("Alarme 2 declenchee ");
    switch (clock.getAlarmType2())
    {
    case DS3231_MATCH_H_M_S:
      Serial.print("Quand il sera : ");
      Serial.println(clock.dateFormat(" H:i:s", a2));
      break;
    }
  } 
  else
  {
  }
  //*******************************************************************
}

void loop() {
  dt = clock.getDateTime();
  Serial.println(clock.dateFormat("d-m-Y H:i:s - l", dt));
  delay(1000);
  if (clock.isAlarm1())
  {
    distribution ();
    Serial.println("ALARM 1 DECLENCHEE DONC DISTRIBUTION!");
  }
  //*********************************************************************
  if (clock.isAlarm2())
  {
    distribution ();
    Serial.println("ALARM 2 DECLENCHEE DONC DISTRIBUTION!");
  }
  //*******************************************************************
  //distribution manuelle
  if ( digitalRead(bp) == HIGH) {
    delay(30);
    distribution ();
    delay(100);
  }
}

void distribution() {
  // GESTION DU SERVO SUR SORTIE (9)
  for (int i = 0; i <= 25; i++) // le chiffre 1 pour 2 cycles
    for (pos = 0; pos <= 190; pos += 6) // va de 0 degrees a 190 degrees
    { // avec des pas de 1 degre
      myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos'
      delay(60);                       // pause  50ms
    }
  for (pos = 190; pos >= -0; pos -= 6) // va de  190 degres a  0 degrees
  { // avec des pas de 4 degrees donc retour rapide
    myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos'
    delay(60);                       // pause  50ms
  }
}

Bonsoir dfgh , merci beaucoup pour ton aide précieuse , je teste et je te dis ce que cela donne , je vais essayer aussi de comprendre tes lignes de codes pour progresser . ok pour les <> , je le savais mais lorsque j’ai voulus répondre la dernière fois elles n’apparaissaient pas sur la page , bizarre …

bonsoir , j’ai corrigé quelque coquilles et fait quelques modifications , et j’ai encore un petit problème quand j’ouvre le moniteur série , il refuse de m’afficher les deux consignes d’alarme ???

sinon je pense que cela doit fonctionner il faut que je teste en condition réelles .

#include <Servo.h>
#include <DS3231.h>
#include <Wire.h>
DS3231 clock;
RTCDateTime dt;
Servo myservo;
int pos = 0; // variable pour la position 0 du servo
int b;
int bp = 2; // un bouton poussoir sur la borne (2)
// schema : (-) -------[R 10 Kohm]--------O BP O------------ (+)
//          (2)--------------------------/


void setup() {
  Serial.begin(9600); // lecture sur interface serie
  myservo.attach(9);    // entree servo sur borne (9)
  pinMode(bp, INPUT);   // broche (2) en entrée pour le bouton poussoir
  clock.begin();

  // Mise a zero alarmes

  clock.armAlarm1(false);
  clock.armAlarm2(false);
  clock.clearAlarm1();
  clock.clearAlarm2();

  // pour le reglage manuel de la date et heure (Year, Month, Day, Hour, Minute, Second)
  // enlever les // devant clock ci dessous
 //clock.setDateTime(2015, 11, 24, 8, 58, 50);
  // Manual (YYYY, MM, DD, HH, II, SS

  // heures de la journee pour le declenchement des cycles de distribution
  // une alarme à9H00 le matin et une a 18h00 le soir
  // setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
  clock.setAlarm1(0, 18, 00, 00, DS3231_MATCH_H_M_S);//MATCH_H_M_S ===>  seconde, minute, heure et jour de la semaine
  clock.setAlarm2(0, 9, 00, DS3231_MATCH_M);         //MATCH_M ===>  minute, heure et jour de la semaine

  // prise en compte alarme
  checkAlarms();
}
void checkAlarms()
{
  RTCAlarmTime a1;
 
  if (clock.isArmed1())
  {
    a1 = clock.getAlarm1();
    Serial.print("Alarme 1 declenchee ");
    switch (clock.getAlarmType1())
    {
    case DS3231_MATCH_H_M_S:
      Serial.print("Quand il sera : ");
      Serial.println(clock.dateFormat(" H:i:s", a1));
      
      break;
    }
  
    } else
  {
    
  }
 RTCAlarmTime a2;
  if (clock.isArmed2())
  {
    a2 = clock.getAlarm2();
    Serial.print("Alarme 2 declenchee ");
    switch (clock.getAlarmType2())
    {
    case DS3231_MATCH_DT_H_M:
      Serial.print("Quand il sera : ");
    Serial.println(clock.dateFormat("d H:i:s", a2));
      break;

    }
  } else
  {
    Serial.println("Alarm2 is disarmed.");
  }
delay (1000);
  //*******************************************************************
}

void loop() {
  dt = clock.getDateTime();
  Serial.println(clock.dateFormat("d-m-Y H:i:s - l", dt));
  if (clock.isAlarm1())
  {
    distribution ();
    Serial.println("ALARM 1 DECLENCHEE DONC DISTRIBUTION!");
  }
  //*********************************************************************
  if (clock.isAlarm2())
  {
    distribution ();
    Serial.println("ALARM 2 DECLENCHEE DONC DISTRIBUTION!");
  }
  delay(1000);
  //*******************************************************************
  //distribution manuelle
  if ( digitalRead(bp) == HIGH) {
    delay(30);
    distribution ();
    delay(100);
  }
}

void distribution() {
  // GESTION DU SERVO SUR SORTIE (9)
  for (int i = 0; i <= 0; i++) 
    for (pos = 0; pos <= 190; pos += 6) // va de 0 degrees a 190 degrees
    { // avec des pas de 1 degre
      myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos'
      delay(60);                       // pause  50ms
    }
  for (pos = 190; pos >= -0; pos -= 6) // va de  190 degres a  0 degrees
  { // avec des pas de 4 degrees donc retour rapide
    myservo.write(pos);              // dit au servo d aller en position en fonction de la variable 'pos'
    delay(60);                       // pause  50ms
  }
}

desolé, n'ayant pas le module horloge, je ne peux faire des tests il va falloir que tu cherches par toi meme.

va voir DS3231.cpp cela devrait t'aider (à éditer avec notepad++)