Pataugeade de 3J: Interruption + DS3231

Bonjour,
d'abord, je suis désolé de monopoliser le forum; j'ai vraiment essayé d'éviter, de polluer, mais je suis bloqué depuis 3j, et ne vois pas de levier de compréhension.
Physiquement, l'architecture est "on ne peut" plus simple, j'ai fait un fritzing pour l'illustration.

Il est composé de

  • Arduino uno
  • module DS3231 ZS-042 (CR2032 neuve primaire non rechargeable)
  • une diode

Le code a été minimisé pour une lecture rapide:

// **** INCLUDES *****
#include "LowPower.h"
#include <Wire.h>
#include <DS3231.h>     //  GIT: https://github.com/jarzebski/Arduino-DS3231
                        //  (c) 2014 by Korneliusz Jarzebski

DS3231 clock;

void wakeUp()
{
    detachInterrupt(0); 
}

void setup()
{
    pinMode(13, OUTPUT);
   
    // Setup Alarm
    clock.begin();
    clock.armAlarm1(false);   clock.clearAlarm1();
    clock.armAlarm2(false);   clock.clearAlarm2();
    // Set Alarm1 - Every 20s in each minute --- setAlarm1(Date or Day, Hour, Minute, Second, Mode, Armed = true)
    clock.setAlarm1(0, 0, 0, 20, DS3231_MATCH_S, true);
}

void loop() 
{
    attachInterrupt(0, wakeUp, LOW);
    
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 
    
    digitalWrite(13, HIGH); delay(3000);digitalWrite(13, LOW);
}

L'alarme 1, semble bien écrite, un autre code m'a permis de m'en assurer.
Le soucis c'est que rien ne se passe.

Sans les interruptions, ie, avec des fonctions booléennes qui check l'heures pour savoir si l'alarm est ok, oui cela fonctionne; mais quand la board sera endormi, il sera difficile de la réveiller de cette manière...

Mais avec une interruption, je suis dans une impasse:

Je ne voit pas ce que je n'ai pas compris, et/ou je dois creuser.

Philippe.

hello
ta rtc envoie bien un niveau bas pour réveiller le µ ?

Bonjour
merci pour votre réponse:
un voltmètre branché sur

  • GND de l'Uno
  • l'autre sur SQW du DS3231

donne 2.5V ou 2.49V tout le temps, et la diode est éteinte, toujours. La lecture des alarms: donne la 1 active et programmée pour faire un ON toutes les 20s de chaque minutes, un retour du port serie:

Initialize DS3231
Alarm1 is triggered when seconds match: __ __:__:20
Alarm2 is disarmed.
28-08-2015 16:50:08 - Saturday
ALARM 1 TRIGGERED!

Philippe.

peux tu changer le calage.
mettre le retour de la rtc sur une autre entrée et modifier ton script pour lire le niveau lu par l'arduino
lorsqu'il n'y a pas de top d'alarme ?

je viens de regarder sur le net, il semble que ta sortie alarme soit en collecteur ouvert
il semble qu'il te manque une résistance de pull up
regarde le schema que j'ai trouvé sur le net:

Bonjour

Si ce n'est déjà fait, tu devrais essayer de te plonger dans la lecture du datasheet du DS3231

Extrait de la description de la pin SQW "This open-drain pin requires an external pullup resistor connected to a supply at 5.5V or less"

Par ailleurs, tu peux décomposer le problème en enlevant la partie interruption.
Le bon fonctionnement de la sortie SQW doit pouvoir être vérifié par de simples digitalRead(2)

Grillé :slight_smile:

Ou alors juste mettre la pin2 en mode INPUT_PULLUP

:slight_smile:

Bonjour
ok, je pense comprendre, j'avais lu, pas tout, une partie de la DataSheet du DS3231, je vois et me rappelle ce passage une paupière fermée au mauvais moment. Merci à vous 2.
En revanche, je ne connais pas ce mode:INPUT_PULLUP

Si je vous comprends, et avec cette lecture (pinMode() - Arduino Reference), désolé pour l'expression, on "peut faire comme si" il y avait une resistance sur le pin2 ?

Est ce bien cela ?
Philippe.

oui, c'est bien cela

pinMode(2, INPUT_PULLUP);

Je voudrais vous remercier tous les 2 : dfgh et bricoleau; cela fait env. 18h que je cherche tout seul; et vous m'offrez une porte.
Merci.

digitalMode(pin, INPUT_PULLUP);

est équivalent à

digitalMode(pin, INPUT);
digitalWrite(pin, HIGH);

Utilisation de la résistance de pull up interne à l'arduino.

Mais à la réflexion je ne suis pas sûr que ce soit compatible avec la mise en veille - à vérifier -

Si j'ai bien lu le datasheet, lorsque l'alarme se déclenche, la sortie SQW est active pendant une seconde.

Donc si tu fais un programme qui boucle sur des digitalRead(2), avec un message sur le terminal série lorsque la valeur change, tu pourras vérifier que SQW délivre bien le signal que tu attends.

Après, tu pourras ajouter la gestion de la mise en veille et du réveil.

Il n'utilise pas le mode SQW mais le mode Alarme

Exemple de code avec réveil de l'arduino toutes les secondes ( avec cette librairie )

#include <avr/sleep.h>

#include <Wire.h>
#include <Time.h>
#include <DS3232RTC.h>

const uint8_t alarmPin = 2;

void sleep()
{
  Serial.println( "sleeping\n" );
  Serial.flush();

  set_sleep_mode( SLEEP_MODE_PWR_DOWN );
  sleep_mode();

  Serial.println( "awake" );
}


void setup()
{
  Serial.begin( 115200 );
  Serial.println( "setup" );
  
  pinMode( 13, OUTPUT );

  pinMode( alarmPin, INPUT_PULLUP );
  attachInterrupt( digitalPinToInterrupt( alarmPin ), NULL, FALLING );
  
  RTC.alarm( ALARM_1 );
  RTC.alarmInterrupt( ALARM_1, true );
  RTC.setAlarm( ALM1_EVERY_SECOND, 0, 0, 0, 0 );
  
  sleep();
}


void loop()
{
  Serial.println( "loop" );
  
  if ( RTC.alarm( ALARM_1 ) )
  {
    static uint32_t counter;

    Serial.print( "alarm " );
    Serial.println( ++counter );
    
    // faire clignoter la LED de l'arduino toutes les 3 secondes
    if ( counter % 3 )
      digitalWrite( 13, counter & 1 );
  }

  sleep();
}

Edit: j'ai un peu amélioré le code pour qu'il soit plus démonstratif...

Edit tardive: j'ai corrigé une grossière erreur dans mon code...

Bonsoir,
je vous remercie tous, mais rien ne marche. 1) digitalMode(pin, INPUT_PULLUP); ne change rien 2) Le code Guix, non plus, je ne comprends rien, j'utilise également cette librairie, rien ne s'affiche.
Il est tard et marre de rien comprendre. J'ai changer d'arduino, pareil, changé de DS3231 pareil. testé d'autres librairies.
La tension au borne de SQW ne varie semble pas d'un poil, alors que cela devrait il me semble ? toujours 2.5v.
Dépité.

J'ai modifié mon code pour qu'il fonctionne sur arduino uno (désolé je testais avec un arduino mega).

As-tu réglé ton moniteur série à 115200 bauds ?

Ah au fait ce n'est pas comme ça qu'on branche une LED, il faut sûrement une résistance adaptée, sinon tu risque de griller le pin 13, entre autre... Et puis il y a déjà une LED sur l'arduino, connectée au pin 13 (à coté du marquage "L") :slight_smile: .

Et un dernier truc, ce module doit être utilisé avec une pile rechargeable ( LIR2032 ), ou alors tu dois faire une petite modification à cet endroit:

Soit tu coupe la trace, soit tu déssoude la diode ou la résistance.

Bonjour
merci pour votre réponse. J'ai remis la CR2032 rechargeable, retirer ma led sur le pin 13.
J'ai changé le sleep; pour qu'il se fasse toutes les minutes, et pas toutes les secondes; je m'attends avec votre code à voir la led 13, s'allumer toutes les minutes.... rien.
Et je ne comprends pas pourquoi la tension sur SQW ne varie jamais ? cela n'est pas "normal", car dans ce cas comment la carte pourrait distinguer un seuil LOW/HIGH ?

#include <avr/sleep.h>
#include <Wire.h>
#include <Time.h>
#include <DS3232RTC.h>

const int wakeUpPin = 4;

void sleep()
{
  Serial.flush();
  set_sleep_mode( SLEEP_MODE_PWR_DOWN );
  sleep_enable();
  sleep_mode();
  sleep_disable();
  digitalWrite(13, HIGH); delay(3000);digitalWrite(13, LOW); 
}

void setup()
{
  Serial.begin( 115200 );
 
  pinMode( wakeUpPin, INPUT_PULLUP );
  attachInterrupt( wakeUpPin, NULL, FALLING );
 
  RTC.alarm( ALARM_1 );
  RTC.alarmInterrupt( ALARM_1, true );
  RTC.setAlarm(ALM1_MATCH_SECONDS, 0, 0, 0, 0);
  pinMode(13, OUTPUT);
  sleep();
}

void loop()
{
  if ( RTC.alarm( ALARM_1 ) )
  {
    static uint8_t counter;
    Serial.println( counter++ );
    sleep();
  }
}

Si Dieux est connecté, peut il me toucher du doigt ?
Philippe.

Bonjour
après avoir changé la pile CR2032 par la rechargeable, sur le pin SQW, la tension change, de 5V au démarrage, puis se stabilise à 0.047V avec des variations à 0.046v sans régularité.
Cela indique quoi, que l'alarm n'est correctement fixée ?
Philippe.

Bonjour,
désolé pour solliciter encore une fois le forum,
la résistance de 10k doit elle être positionné comme ceci ?
Philippe.

Tu n'as pas besoin de résistance