Probleme avec un module DS3231

Salut, je suis en train d'essayer de faire marcher le programme de ce tutoriel :

Mais quand j'importe le code suivant :

#include <DS3231.h>
#include <LiquidCrystal.h>

DS3231  rtc(SDA, SCL);
LiquidCrystal lcd(1, 2, 4, 5, 6, 7);
void setup() { 
 rtc.begin();
 lcd.begin(16,2);
}
void loop() { 
 lcd.setCursor(0,0);
 lcd.print("Time:  ");
 lcd.print(rtc.getTimeStr());
 
 lcd.setCursor(0,1);
 lcd.print("Date: ");
 lcd.print(rtc.getDateStr());
 
 delay(1000); 
}

j'obtiens l'erreur suivante :

Arduino : 1.8.5 (Windows Store 1.8.10.0) (Windows 10), Carte : "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

Les options de compilation ont été modifiées, tout sera recompilé
clock:4: error: no matching function for call to 'DS3231::DS3231(const uint8_t&, const uint8_t&)'

 DS3231  rtc(SDA, SCL);

                     ^

C:\Users\Skyy\Documents\Arduino\clock\clock.ino:4:21: note: candidates are:

In file included from C:\Users\Skyy\Documents\Arduino\clock\clock.ino:1:0:

C:\Users\Skyy\Documents\Arduino\libraries\DS3231/DS3231.h:64:3: note: DS3231::DS3231()

   DS3231();

   ^

C:\Users\Skyy\Documents\Arduino\libraries\DS3231/DS3231.h:64:3: note:   candidate expects 0 arguments, 2 provided

C:\Users\Skyy\Documents\Arduino\libraries\DS3231/DS3231.h:60:7: note: constexpr DS3231::DS3231(const DS3231&)

 class DS3231 {

       ^

C:\Users\Skyy\Documents\Arduino\libraries\DS3231/DS3231.h:60:7: note:   candidate expects 1 argument, 2 provided

C:\Users\Skyy\Documents\Arduino\libraries\DS3231/DS3231.h:60:7: note: constexpr DS3231::DS3231(DS3231&&)

C:\Users\Skyy\Documents\Arduino\libraries\DS3231/DS3231.h:60:7: note:   candidate expects 1 argument, 2 provided

C:\Users\Skyy\Documents\Arduino\clock\clock.ino: In function 'void setup()':

clock:7: error: 'class DS3231' has no member named 'begin'

  rtc.begin();

      ^

C:\Users\Skyy\Documents\Arduino\clock\clock.ino: In function 'void loop()':

clock:13: error: 'class DS3231' has no member named 'getTimeStr'

  lcd.print(rtc.getTimeStr());

                ^

clock:17: error: 'class DS3231' has no member named 'getDateStr'

  lcd.print(rtc.getDateStr());

                ^

exit status 1
no matching function for call to 'DS3231::DS3231(const uint8_t&, const uint8_t&)'

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

je cherche depuis plusieurs jour mais impossible de trouver
Merci de votre aide :slight_smile:

bonjour,

DS3231 rtc(SDA, SCL);

pas d'assignation de pin, donc normal

const byte SDA numero_de_pin
const byte SCL numero_de_pin
DS3231  rtc(SDA, SCL);

mieux vaut utiliser les lib sur github

infobarquee:
bonjour,pas d'assignation de pin, donc normal

const byte SDA numero_de_pin

const byte SCL numero_de_pin
DS3231  rtc(SDA, SCL);

Merci pour ton aide, par contre vu que je suis extremement debutant, comment dois-je noter les pins si ils sont sur le SDA 20 et SCL 21 (sur Arduino Mega2560)

Ces pins sont déjà définis dans pins_arduino.h

Tu peu utiliser

DS3232 rtc(PIN_WIRE_SDA, PIN_WIRE_SCL

A condition d'inclure le fichier .h

#include <arduino.h>

Arduino.h (avec un A majuscule) est inclu automatiquement par l'IDE il n'est pas utile de l'inclure.
On le trouve dans les fichiers internes à l'IDE.

Il est très utile de le lire et d'en avoir une copie papier sous la main.

On y apprend des "choses" très utiles pour la compréhension du "système" Arduino.
Comme le fait remarquer Alain46 on peut y voir que de nombreuses définitions ont déjà été faites et qu'il est inutile de les recommencer, sauf si les noms à ralonge et en anglais gonflent un peu.

Les valeurs SDA et SCL sont prédéfinies. Au moins pour les Arduino Mega, Uno et Pro Mini car la compilation du petit programme suivant n'indique aucune erreur pour chacun de ces modules. Je suppose qu'il en est de même pour les autres types de modules.

class Truc {
  public:
    Truc(uint8_t v1, uint8_t v2) {

    }
};

Truc machin(SDA, SCL);

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

Cordialement.

Pierre

Bon ce n'est pas défini dans "Arduino.h" mais dans "pins_arduino.h" (on a aussi le droit de chercher dans l'arborescence de l'IDE).

/*
  pins_arduino.h - Pin definition functions for Arduino
  Part of Arduino - http://www.arduino.cc/

  Copyright (c) 2007 David A. Mellis

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General
  Public License along with this library; if not, write to the
  Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  Boston, MA  02111-1307  USA
*/

#ifndef Pins_Arduino_h
#define Pins_Arduino_h

#include <avr/pgmspace.h>

#define NUM_DIGITAL_PINS            20
#define NUM_ANALOG_INPUTS           6
#define analogInputToDigitalPin(p)  ((p < 6) ? (p) + 14 : -1)

#if defined(__AVR_ATmega8__)
#define digitalPinHasPWM(p)         ((p) == 9 || (p) == 10 || (p) == 11)
#else
#define digitalPinHasPWM(p)         ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11)
#endif

#define PIN_SPI_SS    (10)
#define PIN_SPI_MOSI  (11)
#define PIN_SPI_MISO  (12)
#define PIN_SPI_SCK   (13)

static const uint8_t SS   = PIN_SPI_SS;
static const uint8_t MOSI = PIN_SPI_MOSI;
static const uint8_t MISO = PIN_SPI_MISO;
static const uint8_t SCK  = PIN_SPI_SCK;

#define PIN_WIRE_SDA        (18)
#define PIN_WIRE_SCL        (19)

static const uint8_t SDA = PIN_WIRE_SDA;
static const uint8_t SCL = PIN_WIRE_SCL;

#define LED_BUILTIN 13

#define PIN_A0   (14)
#define PIN_A1   (15)
#define PIN_A2   (16)
#define PIN_A3   (17)
#define PIN_A4   (18)
#define PIN_A5   (19)
#define PIN_A6   (20)
#define PIN_A7   (21)

static const uint8_t A0 = PIN_A0;
static const uint8_t A1 = PIN_A1;
static const uint8_t A2 = PIN_A2;
static const uint8_t A3 = PIN_A3;
static const uint8_t A4 = PIN_A4;
static const uint8_t A5 = PIN_A5;
static const uint8_t A6 = PIN_A6;
static const uint8_t A7 = PIN_A7;

#define digitalPinToPCICR(p)    (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0))
#define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1))
#define digitalPinToPCMSK(p)    (((p) <= 7) ? (&PCMSK2) : (((p) <= 13) ? (&PCMSK0) : (((p) <= 21) ? (&PCMSK1) : ((uint8_t *)0))))
#define digitalPinToPCMSKbit(p) (((p) <= 7) ? (p) : (((p) <= 13) ? ((p) - 8) : ((p) - 14)))

#define digitalPinToInterrupt(p)  ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT))

#ifdef ARDUINO_MAIN
.......
.......
......

Note importante les dénominations Ao..A5 sont aussi valables en D14..D19.
Puisque A0.. A5 sont au démarrage des entrées numériques comme les autres.

L'extrait ci-dessus concerne le fichier pins_arduino.h STANDART.
Il existe dans le sous répertoire "variants" un fichier complémentaire adapté à chaque modèle de carte.

68tjs:
Bon ce n'est pas défini dans "Arduino.h" mais dans "pins_arduino.h" (on a aussi le droit de chercher dans l'arborescence de l'IDE).

Alain46:
Ces pins sont déjà définis dans pins_arduino.h

Bonjour

Y a un truc bizarre dans votre débat :

Peu importe où sont définies les pins SDA et SCL.
De toute manière, il n'y a qu'un seul bus I2C et celui-ci est pris en charge par les bibliothèques wire.h et twi.h fournies avec l'IDE, aussi bien pour une uno que pour une mega.

A mes yeux, dans une classe destinée à gérer la communication avec un périphérique I2C (ici en l'occurrence un ds3231), on ne devrait jamais avoir à fournir les pin SDA ou SCL dans le constructeur d'objet.

Elle sort d'où la ds3231.h utilisée ici ?

Est-ce à dire qu'elle n'est pas contruite par-dessus wire.h, et qu'elle embarque toutes les fonctionnalités de gestion I2C ? Ce qui la rendrait encore plus douteuse à mes yeux.

et bien oui

La bibliothèque ds3231.h utilisée est spécifique.

Il y a un gros message de warning sur La page du fournisseur de cette bibliothèque

IMPORTANT:

The library has not been tested in combination with the Wire library and I have no idea if they can share pins. Do not send me any questions about this. If you experience problems with pin-sharing you can move the DS3231/DS3232 SDA and SCL pins to any available pins on your development board. This library will in this case fall back to a software-based, TWI-/I2C-like protocol which will require exclusive access to the pins used.

A moins d'avoir un besoin spécifique, ce qui n'est en général pas le cas avec un projet de débutant, je ne vois pas du tout l'intérêt d'utiliser une telle bibliothèque.

Cela s'éloigne des standards proposés par l'IDE arduino, et donc cela ne fait qu'augmenter la probabilité de problèmes potentiels.

La preuve : dès le départ on tombe sur un écueil "quelle valeur pour SDA et SCL?"