Horloge + Thermomètre MAX7219+RGB led ring

Bonsoir,

Je tente de "compiler" deux codes en un seul, pour réaliser une horloge composée d'un anneau de 60 leds RGB WS2812B et d'une matrice de leds rouges MAX7216 au centre.

Voici les sources des deux codes en question :

MAX7219 RTC DS1307 dht11 led matrix clock Arduino

Simple wall clock using Adafruit 1/4 60 Ring Neopixel

Je parviens à les faire fonctionner indépendamment l'un de l'autre.
C'est quand je rassemble les deux que ça pose problème.

// Use the DHT11 temp and humidity sensor
#define USE_DS1307

// Header file includes
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include <Wire.h>
#include <MD_DS1307.h>
#include <RTClib.h>
#include "DHT.h"
DHT dht;
#include "Font_Data.h"
#include <Adafruit_NeoPixel.h>

// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN   11
#define DATA_PIN  12
#define CS_PIN    10

#define PIN 4
#define PIXEL 60
#define MAX_BRIGHTNESS 250
#define MIN_BRIGHTNESS 20

Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL, PIN, NEO_GRB + NEO_KHZ800);

DateTime Clock; // Holds current clock time

// HARDWARE SPI
// MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// SOFTWARE SPI
MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);



// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is A0
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

byte hourval, minuteval, secondval;
const int brightnessInPin = A2;    // The Analog input pin that the brightness control potentiometer is attached to.

volatile boolean buttonA = false;
volatile boolean buttonB = false;
volatile boolean buttonC = false;
int StateOfbuttonA = 0;
int StateOfbuttonB = 0;
int StateOfbuttonC = 0;
int NewStateOfbuttonA = 0;
int NewStateOfbuttonB = 0;
int NewStateOfbuttonC = 0;

int temp;
int Humi;
int Mode = 0;
int contrast = 0;
int SPEED_TIME = 75;

#define PAUSE_TIME  0

#define MAX_MESG  20

// Global variables
char szTime[9];    // hh:mm
char szsecond[4];    // ss
char szMesg[MAX_MESG + 1] = "";

uint8_t degC[] = { 6, 3, 3, 56, 68, 68, 68 }; // Deg C

char *mon2str(uint8_t mon, char *psz, uint8_t len)

// Get a label from PROGMEM into a char array
{
  static const __FlashStringHelper* str[] =
  {
    F("Janvier"), F("Février"), F("Mar"), F("Apr"),
    F("May"), F("Jun"), F("Jul"), F("Aug"),
    F("Sep"), F("Oct"), F("Nov"), F("Dec")
  };

  strncpy_P(psz, (const char PROGMEM *)str[mon - 1], len);
  psz[len] = '\0';

  return (psz);
}

char *dow2str(uint8_t code, char *psz, uint8_t len)
{
  static const __FlashStringHelper*  str[] =
  {
    F("Sunday"), F("Monday"), F("Tuesday"), F("Wednesday"),
    F("Thursday"), F("Friday"),
    F("Saturday")
  };

  strncpy_P(psz, (const char PROGMEM *)str[code - 1], len);
  psz[len] = '\0';

  return (psz);
}

void getTime(char *psz, bool f = true)
// Code for reading clock time
{
  RTC.readTime();
  sprintf(psz, "%02d%c%02d", RTC.h, (f ? ':' : ' '), RTC.m);
}
void getTim(char *psz, bool f = true)
// Code for reading clock time
{
  RTC.readTime();
  sprintf(psz, "%02d%c%02d", RTC.h, ':', RTC.m);
}

void getDate(char *psz)
// Code for reading clock date
{
  char  szBuf[10];

  RTC.readTime();
  sprintf(psz, "%d %s %04d", RTC.dd, mon2str(RTC.mm, szBuf, sizeof(szBuf) - 1), RTC.yyyy);

}
void getTem(char *psz, bool f = true)
// Code for reading clock date
{

  temp = dht.getTemperature();
  sprintf(psz, "%02d", temp);

}
void getHumi(char *psz, bool f = true)
// Code for reading clock date
{

  Humi = dht.getHumidity();
  sprintf(psz, "%02d", Humi);

}

void getsecond(char *psz)
// Code for reading clock date
{
  char  szBuf[10];

  RTC.readTime();
  sprintf(psz, "%02d", RTC.s);
}


void gethh(char *psz, bool f = true)
// Code for reading clock time
{
  RTC.readTime();
  sprintf(psz, "%c%02d%c%02d", (f ? ':' : ' '), RTC.h, (f ? ':' : ' '), RTC.m);
}


void getmin(char *psz, bool f = true)
// Code for reading clock time
{
  RTC.readTime();
  sprintf(psz, "%02d%c%02d%c", RTC.h, (f ? ':' : ' '), RTC.m, (f ? ':' : ' '));
}

void getsec(char *psz)
// Code for reading clock date
{
  char  szBuf[10];

  RTC.readTime();
  sprintf(psz, "%02d", RTC.s);
}

void getdyy(char *psz)
{
  char  szBuf[10];

  RTC.readTime();
  sprintf(psz, "%02d", RTC.dd);

}

void getmon(char *psz)
// Code for reading clock date
{
  char  szBuf[10];

  RTC.readTime();
  sprintf(psz, "%s", mon2str(RTC.mm, szBuf, sizeof(szBuf) - 1));

}

void getyyyy(char *psz)
// Code for reading clock date
{
  char  szBuf[10];

  RTC.readTime();
  sprintf(psz, "%04d", RTC.yyyy);

}

void setup(void)
{

  strip.begin();
  uint32_t low = strip.Color(0, 0, 0);
  uint32_t high = strip.Color(170, 0, 170);

  // Turn them off
  for ( int i = 0; i < PIXEL; i++) {
    strip.setPixelColor(i, high);
    delay(15);
    strip.show();
  }

  for ( int i = 0; i < PIXEL; i++) {
    strip.setPixelColor(i, low);
    delay(15);
    strip.show();
  }
  delay(500);

  strip.show(); // Initialize all pixels to 'off'
  // strip.setBrightness(50);

  
  dht.setup(2); // data pin 2
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  P.begin(3);
  P.setInvert(false);
  P.setZone(2, 0, 3);
  P.setZone(1, 1, 3);
  P.setZone(0, 4, 1);
  P.setFont(1, numeric7Se);
  P.setFont(0, numeric7Seg);
  P.displayZoneText(1, szTime, PA_LEFT, SPEED_TIME, PAUSE_TIME, PA_PRINT, PA_NO_EFFECT);
  P.displayZoneText(0, szsecond, PA_LEFT, SPEED_TIME, 0, PA_PRINT, PA_NO_EFFECT);
  P.displayZoneText(2, szMesg, PA_CENTER, SPEED_TIME, 0, PA_PRINT, PA_SCROLL_LEFT);
  P.addChar('

(Je n'ai pas mis la fin du code, car le forum n'accepte pas la longueur du post)

A la compilation du code j'ai un message d'erreur dont voici le log :

\Arduino\libraries\RTClib/RTClib.h:30:7: note: no known conversion for argument 1 from 'void' to 'const DateTime&'

exit status 1
no match for 'operator=' (operand types are 'DateTime' and 'void')

C'est la ligne suivante qu'il n'aime pas :
Clock = RTC.now(); // get the RTC time

J'ai bien tenté des choses, mais je débute… (j'ai commencé le cours d'Eskimon) j'essaye de comprendre la logique, mais là je cale.
Auriez-vous une idée ??

, degC);
  RTC.control(DS1307_CLOCK_HALT, DS1307_OFF);
  RTC.control(DS1307_12H, DS1307_OFF);
  getTime(szTime);
}

void loop()
{
// read the analog brightness value:
  //int brightValue = analogRead(brightnessInPin);
  // map it to the range of the FastLED brightness:
  int mappedValue = map(analogRead(brightnessInPin), 0, 1023, 0, 255);
  //int outputValue = constrain(mappedValue, MIN_BRIGHTNESS, MAX_BRIGHTNESS);

// now we set the brightness of the strip
  strip.setBrightness(constrain(mappedValue, MIN_BRIGHTNESS, MAX_BRIGHTNESS));

Clock = RTC.now(); // get the RTC time
  secondval = Clock.second();  // get seconds
  minuteval = Clock.minute();  // get minutes
  hourval = Clock.hour();      // get hours

if (hourval > 11) hourval -= 12; // This clock is 12 hour, if 13-23, convert to 0-11
  hourval = (hourval * 60 + minuteval) / 12;

strip.setPixelColor(hourval, 0x0000FF); strip.setPixelColor(hourval - 1, 0x3B3BFB); strip.setPixelColor(hourval + 1, 0x3B3BFB);
//  strip.setPixelColor(hourval-2, 0x001010);strip.setPixelColor(hourval+2, 0x001010);
  strip.setPixelColor(minuteval, 0x800080);
//  strip.setPixelColor(minuteval-1, 0x200020);strip.setPixelColor(minuteval+1, 0x200020);
  strip.setPixelColor(secondval, 0x808000);//strip.setPixelColor(secondval-1, 0x002F00);strip.setPixelColor(secondval+1, 0x002F00);
  strip.show();

strip.setPixelColor(hourval, 0x000000); strip.setPixelColor(hourval - 1, 0x000000); strip.setPixelColor(hourval + 1, 0x000000);
//  strip.setPixelColor(hourval - 2, 0x000000); strip.setPixelColor(hourval + 2, 0x000000);
  strip.setPixelColor(minuteval, 0x000000); strip.setPixelColor(minuteval - 1, 0x000000); strip.setPixelColor(minuteval + 1, 0x000000);
  strip.setPixelColor(secondval, 0x000000);
//strip.setPixelColor(secondval-1, 0x000000);strip.setPixelColor(secondval+1, 0x000000);

delay(25);


(Je n'ai pas mis la fin du code, car le forum n'accepte pas la longueur du post)

A la compilation du code j'ai un message d'erreur dont voici le log : 

\Arduino\libraries\RTClib/RTClib.h:30:7: note: no known conversion for argument 1 from 'void' to 'const DateTime&'

exit status 1
no match for 'operator=' (operand types are 'DateTime' and 'void')

C'est la ligne suivante qu'il n'aime pas : 
Clock = RTC.now(); // get the RTC time

J'ai bien tenté des choses, mais je débute… (j'ai commencé le cours d'Eskimon) j'essaye de comprendre la logique, mais là je cale.
Auriez-vous une idée ??

Je ne vois nulle part la déclaration de ta RTC, une ligne genre :

RTC_DS1307 RTC ;

Elle y était bien au début, mais j'ai cru bon de l'enlever car j'avais ce message :
conflicting declaration 'RTC_DS1307 RTC'

Tu dois avoir un conflit ou une redondance de variables : j'ai l'impression que les 2 programmes utilisent 2 librairies différentes pour la RTC ...

A mon avis , il faut que tu recodes un des 2 exemples en te servant d'une seule librairie (c'est de l'autre exemple) :wink: .

Oui, ça me semble être pertinent comme démarche.
j'ai supprimé la librairie RTClib, car j'ai l'impression qu'on retrouve pas mal de ses fonctions dans MD_DS1307.

Comment puis-je remplacer "DateTime Clock;" ?
Est-ce que je dois déclarer une variable ? "int Clock"

J'aurai gardé RTClib ..il y a un exemple où tu récupères toutes les infos que tu veux : date, jour, heure etc ...

Le code que tu nous as donné qui fait la même chose me semble lourd et un peu superflu .. Refaire une fonction pour récupérer le jour par exemple alors qu'une simple ligne de code suffit ..je vois pas trop l'intérêt .

Il est clair que je n'ai pas encore assez de connaissance pour me lancer dans ce projet, mais j'aime bien aussi apprendre comme ça… et avec votre aide (désolé) :wink:

Les deux codes me plaisent beaucoup mais visiblement ils ne cohabitent pas bien ensemble.
Peut-être faudrait-il que j'en trouve un meilleur pour gérer l'affichage de la date, heure, température et humidité sur la matrice de points, pour l'intégrer à celui de l'anneau de leds.
Idéalement qui repose sur la librairie RTClib aussi.

Si vous avez un code à me conseiller je suis preneur ; pas mal que je teste sans succès, plein d'erreurs de compilation/

Voici comme j'aborderais la chose . D'abord il ne faut pas chercher à brûler les étapes .

Fais une liste de tout ce que tu as besoin de savoir faire pour ton projet :

-récupérer une température
-récupérer une valeur d'humidité
-commander une ou plusieurs led sur ta matrice
-commander une ou plusieurs led sur ton anneau
-récupérer une date ( jour mois année , heure , minute etc etc

  • etc etc

Codes chacune de ces fonctions au fur et à mesure (ou séparément) en t'aidant des exemples des librairies .

En gros , aides toi des exemples mais ne cherches pas à faire un programme en faisant juste un copié/collé de différentes sources ...

:wink: .

Tu as raison, je vais y aller par étapes.
Mais comme souvent on ouvre le manuel quand on est vraiment bloqué :wink:

Je rajoute les fonctionnalités au fur et à mesure du coup.
Je suis parti du code de l'anneau RGB, je viens de rajouter le capteur de température DHT11.

Maintenant, je dois trouver le moyen d'afficher l'heure, la date et la température sur la matrice MAX7219.

Regardes le projet de @lesept :

https://forum.arduino.cc/index.php?topic=544433.0

Ca peut te donner des idées au niveau de ta matrice ..

Ok, je vais regarder. Merci.

En attendant j'ai un peu avancé.

Je suis reparti du code de l'anneau de 60 leds RGB.

Ensuite, j'ai fait un nouveau code en partant de l'exemple Parola_Zone_TimeMsg inclut dans la librairie MD_Parola.
J'ai adapté le code pour être sur une seule zone car ma matrice est composée de 4 modules de 8x8 leds.
Je parviens à avoir la date et parfois la température/humidité du capteur DHT11. Je ne parviens pas encore à maitriser les cycles d'affichage des effets, mais ce n'est pas le plus important pour le moment.
Il fonctionne plutôt bien comme ça alors je décide de l'intégrer au code de l'anneau.

Ca fait beaucoup de librairies incluses mais bon.
A la compilation, Là j'ai un message d'erreur qui remonte avec notamment un concernant le fichier joint de fonts Font_Data.h, chose qui ne se produisait pas avec le code Parola_Zone_TimeMsg :

In file included from C:\Users\Matthieu\Documents\Arduino\Horloge-RGB_Ring-Dot_Matrix-Mattx38\Horloge-RGB_Ring-Dot_Matrix-Mattx38.ino:4:0:

Font_Data.h:5:1: error: 'MD_MAX72XX' does not name a type; did you mean 'MD_MAX72xx_h'?

MD_MAX72XX::fontType_t numeric7Seg[] PROGMEM =

^~~~~~~~~~

MD_MAX72xx_h

Horloge-RGB_Ring-Dot_Matrix-Mattx38:34:12: error: conflicting declaration 'RTC_DS1307 RTC'

RTC_DS1307 RTC;

^~~

In file included from C:\Users\Matthieu\Documents\Arduino\Horloge-RGB_Ring-Dot_Matrix-Mattx38\Horloge-RGB_Ring-Dot_Matrix-Mattx38.ino:5:0:

C:\Users\Matthieu\Documents\Arduino\libraries\MD_DS1307\src/MD_DS1307.h:359:18: note: previous declaration as 'MD_DS1307 RTC'

extern MD_DS1307 RTC; ///< Library created instance of the RTC class

^~~

C:\Users\Matthieu\Documents\Arduino\Horloge-RGB_Ring-Dot_Matrix-Mattx38\Horloge-RGB_Ring-Dot_Matrix-Mattx38.ino: In function 'void loop()':

Horloge-RGB_Ring-Dot_Matrix-Mattx38:170:19: error: no match for 'operator=' (operand types are 'DateTime' and 'void')

Clock = RTC.now(); // get the RTC time

^

In file included from C:\Users\Matthieu\Documents\Arduino\Horloge-RGB_Ring-Dot_Matrix-Mattx38\Horloge-RGB_Ring-Dot_Matrix-Mattx38.ino:8:0:

C:\Users\Matthieu\Documents\Arduino\libraries\RTClib/RTClib.h:30:7: note: candidate: DateTime& DateTime::operator=(const DateTime&)

class DateTime {

^~~~~~~~

C:\Users\Matthieu\Documents\Arduino\libraries\RTClib/RTClib.h:30:7: note: no known conversion for argument 1 from 'void' to 'const DateTime&'

exit status 1
'MD_MAX72XX' does not name a type; did you mean 'MD_MAX72xx_h'?

Qu'en pensez vous messieurs les Experts ??

Voici le code à ce stade :

// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include <Adafruit_NeoPixel.h>
#include <dht11.h>
#include "Font_Data.h"
#include <MD_DS1307.h>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <RTClib.h>
#include <SPI.h>
#include <Wire.h>

// Matrix setup :
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN   11
#define DATA_PIN  12
#define CS_PIN    10

// DHT11 setup :
#define DHT11_PIN 2
dht11 DHT11;

// RGB Ring setup :
#define PIN 4
#define PIXEL 60
#define MAX_BRIGHTNESS 250
#define MIN_BRIGHTNESS 20

Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL, PIN, NEO_GRB + NEO_KHZ800);

// RTC setup :
byte hourval, minuteval, secondval;
const int brightnessInPin = A2;    // The Analog input pin that the brightness control potentiometer is attached to.
RTC_DS1307 RTC;
DateTime Clock; // Holds current clock time

MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

#define SPEED_TIME  50
#define PAUSE_TIME  0
#define MAX_MESG  20

// Global variables
char szTime[9];    // mm:ss\0
char szMesg[MAX_MESG + 1] = "";
uint8_t degC[] = { 6, 3, 3, 56, 68, 68, 68 }; // Deg C
uint8_t degF[] = { 6, 3, 3, 124, 20, 20, 4 }; // Deg F
char *mon2str(uint8_t mon, char *psz, uint8_t len)

// Get a label from PROGMEM into a char array
{
  static const char str[][10] PROGMEM =
  {
    "Janvier", "Février", "Mars", "Avril", "Mai", "Juin",
    "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"
  };

  *psz = '\0';
  mon--;
  if (mon < 12)
  {
    strncpy_P(psz, str[mon], len);
    psz[len] = '\0';
  }

  return (psz);
}

char *dow2str(uint8_t code, char *psz, uint8_t len)
{
  static const char str[][10] PROGMEM =
  {
    "Dimanche", "Lundi", "Mardi", "Mercredi",
    "Jeudi", "Vendredi", "Samedi"
  };

  *psz = '\0';
  code--;
  if (code < 7)
  {
    strncpy_P(psz, str[code], len);
    psz[len] = '\0';
  }

  return (psz);
}

void getTime(char *psz, bool f = true)

// Code for reading clock time
{
  RTC.readTime();
  sprintf(psz, "%02d%c%02d", RTC.h, (f ? ':' : ' '), RTC.m);
}

void getDate(char *psz)

// Code for reading clock date
{
  char  szBuf[10];
  RTC.readTime();
  sprintf(psz, "%d %s %04d", RTC.dd, mon2str(RTC.mm, szBuf, sizeof(szBuf) - 1), RTC.yyyy);
}

// *** SETUP ***

void setup () {

  Wire.begin();   // Begin I2C

  // Moniteur série init :
  Serial.begin(9600);
  Serial.println();
  Serial.println("Status\tHumidity (%)\tTemperature (C)");

  // RTC.adjust(DateTime(__DATE__, __TIME__));

  // RGB ring init :
  strip.begin();
  uint32_t low = strip.Color(0, 0, 0);
  uint32_t high = strip.Color(170, 0, 170);

  for ( int i = 0; i < PIXEL; i++) {
    strip.setPixelColor(i, high);
    delay(15);
    strip.show();
  }

  for ( int i = 0; i < PIXEL; i++) {
    strip.setPixelColor(i, low);
    delay(15);
    strip.show();
  }
  delay(500);

  strip.show(); // Initialize all pixels to 'off'

  P.begin(0);
  P.setInvert(false);
  P.setIntensity(1);

  P.setZone(0, 0, MAX_DEVICES);
  // P.setZone(1, MAX_DEVICES - 4, MAX_DEVICES - 1);
  // P.setFont(1, numeric7Seg);

  P.displayZoneText(0, szTime, PA_CENTER, SPEED_TIME, PAUSE_TIME, PA_PRINT, PA_NO_EFFECT);
  P.displayZoneText(0, szMesg, PA_CENTER, SPEED_TIME, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);

  P.addChar('

, degC);

RTC.control(DS1307_CLOCK_HALT, DS1307_OFF);
  RTC.control(DS1307_12H, DS1307_OFF);

getTime(szTime);

}

// *** LOOP ***

void loop ()
{
// Brightness adjust :
  int mappedValue = map(analogRead(brightnessInPin), 0, 1023, 0, 255);
  int outputValue = constrain(mappedValue, MIN_BRIGHTNESS, MAX_BRIGHTNESS);
  strip.setBrightness(constrain(mappedValue, MIN_BRIGHTNESS, MAX_BRIGHTNESS));

// RTC for the RGB ring :
  Clock = RTC.now(); // get the RTC time
  secondval = Clock.second();  // get seconds
  minuteval = Clock.minute();  // get minutes
  hourval = Clock.hour();      // get hours

if (hourval > 11) hourval -= 12; // This clock is 12 hour, if 13-23, convert to 0-11
  hourval = (hourval * 60 + minuteval) / 12;

strip.setPixelColor(hourval, 0x0000FF); strip.setPixelColor(hourval - 1, 0x3B3BFB); strip.setPixelColor(hourval + 1, 0x3B3BFB);
  //  strip.setPixelColor(hourval-2, 0x001010);strip.setPixelColor(hourval+2, 0x001010);
  strip.setPixelColor(minuteval, 0x800080);
  //  strip.setPixelColor(minuteval-1, 0x200020);strip.setPixelColor(minuteval+1, 0x200020);
  strip.setPixelColor(secondval, 0x808000);//strip.setPixelColor(secondval-1, 0x002F00);strip.setPixelColor(secondval+1, 0x002F00);
  strip.show();

strip.setPixelColor(hourval, 0x000000); strip.setPixelColor(hourval - 1, 0x000000); strip.setPixelColor(hourval + 1, 0x000000);
  //  strip.setPixelColor(hourval - 2, 0x000000); strip.setPixelColor(hourval + 2, 0x000000);
  strip.setPixelColor(minuteval, 0x000000); strip.setPixelColor(minuteval - 1, 0x000000); strip.setPixelColor(minuteval + 1, 0x000000);
  strip.setPixelColor(secondval, 0x000000);
  //strip.setPixelColor(secondval-1, 0x000000);strip.setPixelColor(secondval+1, 0x000000);

delay(25);

// Matrix informations :
static uint32_t lastTime = 0; // millis() memory
  static uint8_t  display = 0;  // current display mode
  static bool flasher = false;  // seconds passing flasher

P.displayAnimate();

if (P.getZoneStatus(0))
  {
    switch (display)
    {
      case 0: // Temperature deg C
        P.setTextEffect(0, PA_SCROLL_LEFT, PA_SCROLL_UP_LEFT);
        display++;

if (DHT11.read(DHT11_PIN) == 0)
        {
          dtostrf(DHT11.temperature, 3, 1, szMesg);
          strcat(szMesg, "$");
        }
        break;

case 1: // Relative Humidity
        P.setTextEffect(0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
        display++;

if (DHT11.read(DHT11_PIN) == 0)
        {
          dtostrf(DHT11.humidity, 3, 0, szMesg);
          strcat(szMesg, "% RH");
        }
        break;

case 2: // day of week
        P.setTextEffect(0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
        display++;

dow2str(RTC.dow, szMesg, MAX_MESG);

break;

default:  // Calendar
        P.setTextEffect(0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
        display = 0;
        getDate(szMesg);
        break;
    }

P.displayReset(0);
  }

// Finally, adjust the time string if we have to
  if (millis() - lastTime >= 1000)
  {
    lastTime = millis();
    getTime(szTime, flasher);
    flasher = !flasher;

P.displayReset(1);
  }

Serial.println(DHT11.temperature);
  Serial.println(RTC.dow);

}

Pour le problème lié à MD_DS1307, c'est dû au fait que tu as toujours les deux bibliothèques dans ton code.

L'autre problème de situe dans le fichier Font_Data.h que tu n'as pas joint à ton message.

Voici le fichier Font_Data.h :

// Data file for user example user defined fonts
#ifndef FONTDATA_H
#define FONTDATA_H

MD_MAX72XX::fontType_t numeric7Seg[] PROGMEM = 
{
	0,		// 0
	0,		// 1
	0,		// 2
	0,		// 3
	0,		// 4
	0,		// 5
	0,		// 6
	0,		// 7
	0,		// 8
	0,		// 9
	0,		// 10
	0,		// 11
	0,		// 12
	0,		// 13
	0,		// 14
	0,		// 15
	0,		// 16
	0,		// 17
	0,		// 18
	0,		// 19
	0,		// 20
	0,		// 21
	0,		// 22
	0,		// 23
	0,		// 24
	0,		// 25
	0,		// 26
	0,		// 27
	0,		// 28
	0,		// 29
	0,		// 30
	0,		// 31
	1, 0,		// 32 - 'Space'
	0,		// 33 - '!'
	0,		// 34 - '"'
	0,		// 35 - '#'
	0,  	// 36 - '

L'exemple Parola utilise la librairie MD_DS1307. Il faudrait donc que je reprenne le code de l'anneau pour qu'il utilise cette librairie et plus la RTClib.h. Pas évident pour moi
0, // 37 - '%'
0, // 38 - '&'
0, // 39 - '''
0, // 40 - '('
0, // 41 - ')'
0, // 42 - '*'
0, // 43 - '+'
0, // 44 - ','
0, // 45 - '-'
1, 64, // 46 - '.'
0, // 47 - '/'
5, 127, 65, 65, 65, 127, // 48 - '0'
5, 0, 0, 127, 0, 0, // 49 - '1'
5, 121, 73, 73, 73, 79, // 50 - '2'
5, 73, 73, 73, 73, 127, // 51 - '3'
5, 15, 8, 8, 8, 127, // 52 - '4'
5, 79, 73, 73, 73, 121, // 53 - '5'
5, 127, 73, 73, 73, 121, // 54 - '6'
5, 1, 1, 1, 1, 127, // 55 - '7'
5, 127, 73, 73, 73, 127, // 56 - '8'
5, 79, 73, 73, 73, 127, // 57 - '9'
1, 20, // 58 - ':'
0, // 59 - ';'
0, // 60 - '<'
0, // 61 - '='
0, // 62 - '>'
0, // 63 - '?'
0, // 64 - '@'
5, 127, 9, 9, 9, 127, // 65 - 'A'
5, 127, 73, 73, 73, 54, // 66 - 'B'
5, 127, 65, 65, 65, 65, // 67 - 'C'
5, 127, 65, 65, 65, 62, // 68 - 'D'
5, 127, 73, 73, 73, 73, // 69 - 'E'
5, 127, 9, 9, 9, 9, // 70 - 'F'
0, // 71 - 'G'
0, // 72 - 'H'
0, // 73 - 'I'
0, // 74 - 'J'
0, // 75 - 'K'
0, // 76 - 'L'
0, // 77 - 'M'
0, // 78 - 'N'
0, // 79 - 'O'
0, // 80 - 'P'
0, // 81 - 'Q'
0, // 82 - 'R'
0, // 83 - 'S'
0, // 84 - 'T'
0, // 85 - 'U'
0, // 86 - 'V'
0, // 87 - 'W'
0, // 88 - 'X'
0, // 89 - 'Y'
0, // 90 - 'Z'
0, // 91 - '['
0, // 92 - ''
0, // 93 - ']'
0, // 94 - '^'
0, // 95 - '_'
0, // 96 - '`'
5, 127, 9, 9, 9, 127, // 97 - 'a'
5, 127, 73, 73, 73, 54, // 98 - 'b'
5, 127, 65, 65, 65, 65, // 99 - 'c'
5, 127, 65, 65, 65, 62, // 100 - 'd'
5, 127, 73, 73, 73, 73, // 101 - 'e'
5, 127, 9, 9, 9, 9, // 102 - 'f'
0, // 103 - 'g'
0, // 104 - 'h'
0, // 105 - 'i'
0, // 106 - 'j'
0, // 107 - 'k'
0, // 108 - 'l'
0, // 109 - 'm'
0, // 110 - 'n'
0, // 111 - 'o'
0, // 112 - 'p'
0, // 113 - 'q'
0, // 114 - 'r'
0, // 115 - 's'
0, // 116 - 't'
0, // 117 - 'u'
0, // 118 - 'v'
0, // 119 - 'w'
0, // 120 - 'x'
0, // 121 - 'y'
0, // 122 - 'z'
0, // 123 - '{'
1, 127, // 124 - '|'
0, // 125
0, // 126
0, // 127
0, // 128
0, // 129
0, // 130
0, // 131
0, // 132
0, // 133
0, // 134
0, // 135
0, // 136
0, // 137
0, // 138
0, // 139
0, // 140
0, // 141
0, // 142
0, // 143
0, // 144
0, // 145
0, // 146
0, // 147
0, // 148
0, // 149
0, // 150
0, // 151
0, // 152
0, // 153
0, // 154
0, // 155
0, // 156
0, // 157
0, // 158
0, // 159
0, // 160
0, // 161
0, // 162
0, // 163
0, // 164
0, // 165
0, // 166
0, // 167
0, // 168
0, // 169
0, // 170
0, // 171
0, // 172
0, // 173
0, // 174
0, // 175
0, // 176
0, // 177
0, // 178
0, // 179
0, // 180
0, // 181
0, // 182
0, // 183
0, // 184
0, // 185
0, // 186
0, // 187
0, // 188
0, // 189
0, // 190
0, // 191
0, // 192
0, // 193
0, // 194
0, // 195
0, // 196
0, // 197
0, // 198
0, // 199
0, // 200
0, // 201
0, // 202
0, // 203
0, // 204
0, // 205
0, // 206
0, // 207
0, // 208
0, // 209
0, // 210
0, // 211
0, // 212
0, // 213
0, // 214
0, // 215
0, // 216
0, // 217
0, // 218
0, // 219
0, // 220
0, // 221
0, // 222
0, // 223
0, // 224
0, // 225
0, // 226
0, // 227
0, // 228
0, // 229
0, // 230
0, // 231
0, // 232
0, // 233
0, // 234
0, // 235
0, // 236
0, // 237
0, // 238
0, // 239
0, // 240
0, // 241
0, // 242
0, // 243
0, // 244
0, // 245
0, // 246
0, // 247
0, // 248
0, // 249
0, // 250
0, // 251
0, // 252
0, // 253
0, // 254
0, // 255
};

#endif


L'exemple Parola utilise la librairie MD_DS1307. Il faudrait donc que je reprenne le code de l'anneau pour qu'il utilise cette librairie et plus la RTClib.h. Pas évident pour moi

Voici le code de l'anneau dans lequel j'ai supprimé la librairie RTClib.h et qu'il faut adapter pour qu'il utilise la librairie MD_DS1307.h.

Je coince dès la ligne "DateTime Clock; // Holds current clock time", car visiblement "DateTime" ne fait pas partie de la librairie MD_DS1307.h. J'ai tenté de le remplacer par "now" ou "readTime", mais ça ne fonctionne pas.

#include <Wire.h>
#include <Adafruit_NeoPixel.h>
#include <MD_DS1307.h>

#define PIN 4
#define PIXEL 60
#define MAX_BRIGHTNESS 250
#define MIN_BRIGHTNESS 20

Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL, PIN, NEO_GRB + NEO_KHZ800);

MD_DS1307 RTC;
DateTime Clock; // Holds current clock time

byte hourval, minuteval, secondval;
const int brightnessInPin = A2;    // The Analog input pin that the brightness control potentiometer is attached to.

void setup() {
  Serial.begin(9600);
  Wire.begin();   // Begin I2C
  RTC.begin();   // begin clock

// RTC.adjust(DateTime(__DATE__, __TIME__));
  strip.begin();
  uint32_t low = strip.Color(0, 0, 0);
  uint32_t high = strip.Color(170, 0, 170);

  // Turn them off
  for ( int i = 0; i < PIXEL; i++) {
    strip.setPixelColor(i, high);
    delay(15);
    strip.show();
  }

  for ( int i = 0; i < PIXEL; i++) {
    strip.setPixelColor(i, low);
    delay(15);
    strip.show();
  }
  delay(500);

  strip.show(); // Initialize all pixels to 'off'
  // strip.setBrightness(50);

}

void loop() {

 // read the analog brightness value:
  //int brightValue = analogRead(brightnessInPin);
  // map it to the range of the FastLED brightness:
  int mappedValue = map(analogRead(brightnessInPin), 0, 1023, 0, 255);
  //int outputValue = constrain(mappedValue, MIN_BRIGHTNESS, MAX_BRIGHTNESS);

  // now we set the brightness of the strip
  strip.setBrightness(constrain(mappedValue, MIN_BRIGHTNESS, MAX_BRIGHTNESS));

  Clock = RTC.now(); // get the RTC time
  secondval = Clock.second();  // get seconds
  minuteval = Clock.minute();  // get minutes
  hourval = Clock.hour();      // get hours

  if (hourval > 11) hourval -= 12; // This clock is 12 hour, if 13-23, convert to 0-11
  hourval = (hourval * 60 + minuteval) / 12;

  strip.setPixelColor(hourval, 0x0000FF); strip.setPixelColor(hourval - 1, 0x3B3BFB); strip.setPixelColor(hourval + 1, 0x3B3BFB);
//  strip.setPixelColor(hourval-2, 0x001010);strip.setPixelColor(hourval+2, 0x001010);
  strip.setPixelColor(minuteval, 0x800080);
//  strip.setPixelColor(minuteval-1, 0x200020);strip.setPixelColor(minuteval+1, 0x200020);
  strip.setPixelColor(secondval, 0x808000);//strip.setPixelColor(secondval-1, 0x002F00);strip.setPixelColor(secondval+1, 0x002F00);
  strip.show();

  strip.setPixelColor(hourval, 0x000000); strip.setPixelColor(hourval - 1, 0x000000); strip.setPixelColor(hourval + 1, 0x000000);
//  strip.setPixelColor(hourval - 2, 0x000000); strip.setPixelColor(hourval + 2, 0x000000);
  strip.setPixelColor(minuteval, 0x000000); strip.setPixelColor(minuteval - 1, 0x000000); strip.setPixelColor(minuteval + 1, 0x000000);
  strip.setPixelColor(secondval, 0x000000);
//strip.setPixelColor(secondval-1, 0x000000);strip.setPixelColor(secondval+1, 0x000000);

  delay(25);

  Serial.print(hourval, DEC);
  Serial.print(':');
  Serial.print(minuteval, DEC);
  Serial.print(':');
  Serial.println(secondval, DEC);

}

En fouinant un peu, on trouve des problèmes similaires. Ça vient soit d'une version ancienne de la bibliothèque MD_PAROLA (est elle à jour chez toi ?) soit d'un problème avec PROGMEM. Je suppose que tu as une version récente de l'IDE donc que PROGMEM y est incluse. Tu peux essayer d'ajouter ça en début de ton sketch

#include <avr/pgmspace.h>

Fait, mais ça ne change rien.
La libraire MD_Parola est pourtant la même que j'utilise avec le sketch exemple de la librairie et qui fonctionne. C'est quand je l'intègre au sketch de l'anneau que ça ne lui plaît plus.

Je ne comprends pas le fonctionnement de MD_Parola…

J'essaye juste de lui faire afficher en scrolling horizontal, le jour de la semaine (pour ensuite afficher la date, l'heure, la température et le taux d'humidité) et je galère comme un fou à essayer de comprendre les displayText, displayScroll

J'ai bien compris comment récupérer les données RTC, comment elles sont affichées sur l'anneau, maintenant je cherche à les afficher sur la matrice MAX7219.

:frowning: :o :confused: :frowning:

Pour ton problème de police et PROGMEM, as-tu testé l'exemple Parola_Fonts ?

Je n'ai pas utilisé MD_PAROLA depuis longtemps, mais il y a de la doc ici pour faire les animations c(un peu ardu, il est vrai, mais il faut ce qu'il faut) :slight_smile:

Pour le scrolling, il y a cet exemple dont tu peux t'inspirer

Je pense que tout est dans ces lignes :

  uint8_t scrollSpeed = 25;    // default frame delay value
  textEffect_t scrollEffect = PA_SCROLL_LEFT;
  textPosition_t scrollAlign = PA_LEFT;
  uint16_t scrollPause = 2000; // in milliseconds
  P.begin();
  P.displayText(curMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect);

Oui ça règle à priori le souci de fonts, merci ! :slight_smile:
(j'avance petit à petit comme ça)

Merci aussi pour tes conseils sur l'exemple Scrolling dont j'étais en effet reparti.
En fait, je pars de l'exemple et j'essaye de changer des paramètres en tentant de comprendre les impacts. Ce n'est pas toujours ce que j'imagine comme résultat.

Par exemple, pour faire afficher le jour de la semaine voici ce que j'ai fait :

J'ai défini une variable :
int date;

Dans le setup j'ai :
P.displayText(curMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect);

Ensuite à la fin du loop j'ai inscrit :
date = tableauDesJours[dayOfWeek - 1];
strcpy(curMessage, date);
P.displayAnimate();

Sauf qu'il ne s'affiche qu'une seule fois.