Horloge connecté 16X16RGB ESP32 Dev4 grand débutant

Salut a tous,

voila j'ai 2 projet qui seront liés, en l’occurrence, un suivie ph acidité, température, humidité, pression baro de ma serre hydro.

Le 2eme projet, une horloge, qui biensur affichera l'heure mais aussi les infos du 1er projet de ma serre en l’occurrence la T°/Hygro/Bar et surement aussi quelques autres infos que j’espère récupérer sur le net comme la possibilité de pluie dans l'heure qui suit (via meteofrance)

Voila donc j'ai potassé depuis une semaine le sujet car je suis grand débutant et biensur j'ai plein de question en suspend.

Tout d'abord le matos, ESP32 Dev V4 et une matrice led 16x16RGB (surement WS2812b) et une alim de 5v 10A (50w maxi donc la luminosité sera au maxi à 75% je penses qui sera largement lumineux)
https://fr.aliexpress.com/item/ESP32-DevKitC-core-conseil-ESP32-d-veloppement-conseil-ESP32-WROOM-32D-WROOM-32U-SOLO-1-ESP32/32950878456.html?spm=a2g0s.9042311.0.0.6a166c37qBhqSO

https://fr.aliexpress.com/item/16-16-Pixel-WS2812B-LED-Digital-Flexible-Panel-WS2811-Individually-Color-DC5V/1666100743.html?spm=a2g0s.9042311.0.0.6a166c37qBhqSO

Apres 3 jours a galérer a téléverser un programme (alors qu'il fallait simplement maintenir le bouton BOOT 3 secondes afin de booter), j'ai beaucoup progressé depuis, et j'envisage donc;

En fond (le plus régulièrement affiché) une horloge (soit en rond et aiguilles soit avec coté de l'horloge carré je ne sais pas trop encore.
Et toutes les 5mn en scrolling la T°/Hygro/Bar/Pluie etc...

Ancien programmeur (1990) je m'y suis vite retrouvé dans ce nouveau langage. Le seul truc sont les librairies qui me posent problème actuellement;

j'ai essayé de trouver soit un driver soit une librairie pour une affichage 16x16RGB apparemment y a pas ou j'ai pas assez cherché ou je ne sais pas ou chercher donc si vous avez une adresse suis preneur.
soit une librairie avec des fontes de 8 pixel surement ou 16, mais je préférerais 8 afin de pouvoir faire un scrolling qui reste lisible

j'aimerais aussi donc avoir la possibilité de faire du graphisme c'est a dire dessiner des lignes rectangle ou angle triangle etc... pour pouvoir alors faire l'affichage de l'horloge mais sans librairie je ne connais pas les codes pour cela? j'ai pensé aux différentes librairies FastLed ou AdafruitNeoMatrix afin de gérer les dégradés ou les dessins mais je ne sais pas si cela sera compatible. Si vous savez ou trouver donc la bible pour ces commandes ??? pareil preneur :wink:

et encore dans le meme style j'aimerais via différents mode d'apparition ou disparition des icons style un nuage pour la pluie ou un simple PixelArt16x16 animé en Gif par exemple, et j'aimerais savoir quel fonction?

Voila sinon concernant l'heure de l'horloge, j'ai déjà trouvé comment me connecter sur le net et aussi récupérer l'heure locale, mais je pensais pouvoir alors initier la mémoire RTC avec cette heure puis alors de laisser tourner l'horloge interne et ne plus avoir besoin d'aller la chercher sur le net mais la récupérer depuis la mémoire de l'esp , mais apparemment il va falloir que je face en fait une addition entre l'heure locale du net puis le temps écoulé en secondes (je crois) que pourra me donner l'esp donc la aussi pourriez vous me confirmer cela deja?

Sinon pareil je penses que je vais surement plus galérer a récupérer l'info du % de chance de pluie dans l'heure a venir alors que pas trop de soucie normalement pour les autres infos du 1er projet qui lui téléversera ses infos sur un compte Thingspeak privé. Je vais donc déjà m'occuper des problèmes cités au dessus avant de voir pour le reste.

Merci donc a tous de votre aide a venir, cordialement JB.

PS j'ai pas mis de code pour l'instant la structure du progr n’étant pas encore achevé donc l’écriture encore loin d’être complète.

Bonjour
Pour l'heure, je peux t'aider : j'ai ça dans un programme que je développe en ce moment. De retour à la maison ce soir, je t'envoie quelque chose : c'est assez simple une fois qu'on a compris.

Pour la matrice de leds, je n'ai jamais testé, mais je pense que la bibli Adafruit Neomatrix doit contenir tout ce que tu cherches. Il faut aussi Adafruit_GFX.

Re,

Super merci a toi par avance donc pour ton aide bien rassurante au vue de ton nombre de post.

Pour les bibli en effet j'ai vu la GFX il me semble qui fait les carre rectangle, triangle , angle mais malheureusement je n'ai pas trouvé la liste des fonctions ou c'est que je ne sais pas ou chercher afin d'avoir donc cette bible des biblio lol

Pour la NeoMatrix en effet grâce a la traduction et vue que j'en ai beaucoup lu dernièrement je n'avais pas vue la possibilité en fait de déclarer une matrice 16x16 en fait, et je vois donc quel code ajouter selon la position que je vais faire adopter ma matrice.

En revanche, au vu des topics sur les leds clignotantes avec une résistance, me faudra il donc aussi une résistance sur le pin définie ? ou non ? De plus afin de me rassurer y aurait il un pin particulier ? Sachant que j'aimerais en attendant de l'utiliser de manière définitive dans mon autre projet de serre mon CJMCU-8118
https://www.strawdogs.co/2018/07/Using-the-CJMCU-8128-Breakout-Environment-Sensor-Board/cjmcu-8128-modules.jpg
il me faudrait donc si j'ai bien compris le pin SDA et SCL de libre.

Concernant alors la librairie pour ce cjmcu j'ai en pas trouvé qui fait les 3 instruments, je pensais donc prendre 3 librairies celle pour le BMP280, HDC1080, CCS811 qui apparemment a un soucie au vue de ce que j'ai trouvé
https://www.strawdogs.co/2018/07/Using-the-CJMCU-8128-Breakout-Environment-Sensor-Board/

D'ailleurs avant de connecter mon CJMCU pensez vous que VCC soit un 5v ou un 3,3v ? comme sur les modules séparés ?

Et Merci aussi donc aux 20aines de personnes qui ont deja jetté un coup d'oeil ...
Encore une derniere question concernant les librairies, ou peut on connaitre alors la definition de chaque fonction ? la bible en quelques sorte

JB.

Pour connaitre les fonctions disponibles dans une bibliothèques, il suffit de regarder dans le fichier .h.

Dans ton cas Adafruit_GFX.h. Pour les explications de chaque fonction, c'est différent : certains développeurs les donnent, d'autres pas. Tu peux chercher dans les fichiers .cpp, elle y sont parfois. Chez Adafruit, c'est bien fait : par exemple pour la fonction drawCircle, ligne 309

/**************************************************************************/
/*!
   @brief    Draw a circle outline
    @param    x0   Center-point x coordinate
    @param    y0   Center-point y coordinate
    @param    r   Radius of circle
    @param    color 16-bit 5-6-5 Color to draw with
*/
/**************************************************************************/
void Adafruit_GFX::drawCircle(int16_t x0, int16_t y0, int16_t r,
        uint16_t color) {

Pour connaitre les affectations de pins, il faut chercher le 'pinout', par exemple pour l'ESP : ESP32 pinout

Donc si tu as une RTC en I2C, elle pourra être connectée aux pins 21 et 22. Mais, certains kits ne disposent pas de la pin 21 (va comprendre), donc en cherchant, j'ai vu qu'on pouvait faire de l'I2C avec d'autres couples de pins, comme 4 & 5 par exemple. Mais si tu les as, et qu'elles ne doivent pas être utilisées pour autre chose, prends les 21 et 22. Mais si tu vas chercher l'heure sur Internet tu n'as pas besoin d'une RTC...

Pour la tension : l'ESP32 est un 3.3V. Pour les autres modules, il faut chercher la datasheet, c'est plus sûr. Autant choisir des capteurs en 3.3V si tu les utilises avec un ESP32, c'est le plus simple.

Pour ta matrice de leds, il faut respecter certaines précautions d'utilisation : voir ici et ici. Bien qu'ils annoncent que la tension du signal de commande doit être de 5V, je pense que ça marchera à 3.3V. Si tu dois utiliser des modules qui requièrent des signaux en 5V (à vérifier sur les datasheets), il te faudra un level shifter (il vaut mieux acheter en Chine, c'est plus long à venir mais moins cher).

La pin de commande peut être choisie comme tu veux. Attention cependant, certains pins de l'ESP32 sont 'input only' : les pins 34 - 35 - ... 38 et 39. Donc pas la peine de les utiliser pur commander quelque chose, il faut les réserver pour des capteurs passifs.

Alors voila pour l'heure.

D'abord il faut se connecter à Internet :

/*
    Search available Wifi network and connects.
    Returns the number of the Wifi found or 0 if none available
*/
byte WifiSearch () {
  byte iNetwork = 1;
  while (WiFi.status() != WL_CONNECTED) {
    Serial.printf ("\nTesting network number %d \n", iNetwork - 1);
    unsigned long chrono = millis();
    Serial.printf("Connecting to %s ", ssid[iNetwork - 1]);
      WiFi.begin(ssid[iNetwork - 1], password[iNetwork - 1]);
      byte i = 0;
      while (WiFi.status() != WL_CONNECTED && millis() - chrono < WIFITIMEOUT) {
        delay(200);
        Serial.print(".");
      }
    Serial.printf("\nWifi status %d \n", WiFi.status());
    iNetwork++;
    if (iNetwork > NetworksNumber) return 0; // No network found
  }
  Serial.printf("Connected to network number %d \n", iNetwork - 2);
  return iNetwork - 1; // Number of the network found, starting to 1
}

Là j'ai fait une fonction qui scanne 3 réseaux et se connecte à celui qu'elle trouve. Il faut définir auparavant :

// Internet
#include <WiFi.h>
#include <HTTPClient.h>
#define WIFITIMEOUT 7000ul // ms
const byte NetworksNumber = 3;
const char* ssid[NetworksNumber]     = {"***", "***", "***"};
const char* password[NetworksNumber] = {"***", "***", "***"};

Une fois connecté, il faut aller chercher l'heure :

/*
     Connects to ntp server and set the time in the RTC of the ESP32
*/
void SetTimeByWifi () {
  const char* ntpServer  = "fr.pool.ntp.org";
  //init and get the time
  const long  gmtOffset_sec = 0;
  const int   daylightOffset_sec = 0; // 3600 pour heure d'hiver
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}

Cette fonction met à l'heure la RTC de l'ESP32. Il faut la mettre à l'heure assez régulièrement, car ce n'est pas vraiment une RTC et elle dérive pas mal. Je le fais toutes les heures.

Ensuite, voici un exemple pour afficher l'heure :

/*
     For debug purpose only: print date and time
*/
void PrintTime () {
  time_t rawtime;
  struct tm * timeinfo;
  time (&rawtime);
  timeinfo = localtime (&rawtime);
  Serial.printf ("Date and time : %s\n", asctime(timeinfo));
}

Mais on peut aussi utiliser les diverses informations contenues dans la struct tm, voir les détails ici. Par exemple :

  char currentTime[6] = "xx:xx";
  time_t now;
  struct tm * timeinfo;
  time (&now);
  timeinfo = localtime (&now);
  currentTime[0] = (timeinfo->tm_hour + DST) % 24 / 10 + '0';
  currentTime[1] = (timeinfo->tm_hour + DST) % 24 % 10 + '0';
  currentTime[3] = timeinfo->tm_min / 10 + '0';
  currentTime[4] = timeinfo->tm_min % 10 + '0';

Ce bout de code met dans un tableau de char l'heure au format HH:MM

Bonne continuation !

Bonjour Jibus,

En 2014 j'avais pris l'heure sur : ntp.alapetite.fr
en traitement "manuel" sans aucune bibliothèque. (sans être programmeur)

Si cela intéresse quelqu'un :
http://www.microfer.fr/geryko/telechargements_publics/Arduino_WebClient_horodatage.zip
Merci