Récupérer et afficher les 10 dernières prise de température

Bonjour,
J'ai regarder sur internet comment faire mais je ne trouve pas de projet similaire.
J'utilise un ESP32
Je souhaite faire un programme qui va prendre mes 8 dernières valeurs de mon capteurs de température et me les afficher.
Pourriez vous m'aider ? ou m'envoyer un projet existant similaire
Vous remerciant.

Bonjour oasixm

C'est quel type de capteur?

Cordialement
jpbbricole

J'ai un BME280

Bonjour oasixm
As-tu un lien sur le modèle en ta possession, il y a plusieurs types de branchement ou quel est le nom des broches

Cordialement
jpbbricole

je l'ai simplement branché en I2C sur ESP32.
Soit SCL : 22 et SDA :21

Tu peux créer un tableau pour stocker les valeurs. 8 cases pour stocker 8 valeurs.
Tu utilises une variable (un compteur) pour savoir dans quelle case stocker la mesure courante.

Par exemple si tu en es à la mesure numéro 10, le compteur sera à 1 (les huit premières sont stockées de 0 à 7, la neuvième remplace la 0 donc la dixième remplace la 1) . C'est un tableau cyclique, qui recommence au début lorsqu'il arrive à la fin.

Après, tu affiches les valeurs stockées dans le tableau en commençant par celle qui suit, c'est à dire la case 2 dans ce cas. Après le 7 tu repasses à 0.

Merci,
je comprend ce que tu veux me dire, mais je suis débutant en programmation arduino,
N'aurais-tu pas un exemple de programme pour m'aider ?

Commande déjà par faire un programme tout simple qui lit les données du capteur et les affiche dans la console.
Ça doit se trouver sur Google si tu n'y arrives pas (cherche esp32 bme280)

Je sais faire ça :slight_smile: c'est après que ça se complique pour sauvegarder mes valeurs, tu veux que je te montre le programme ?

void printValues() {
    Serial.print("Température = ");
    Serial.print(bme.readTemperature());
    Serial.println(" °C");

    Serial.print("Pression = ");

    Serial.print(bme.readPressure() / 100.0F);
    Serial.println(" hPa");


    Serial.print("Humidité = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");
  Serial.println("===================");
  Serial.println();

Bonjour oasixm

Oui ce serait bien.
Entre temps regardes du côté des tableaux.

Cordialement
jpbbricole

D'accord merci

//BME280
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
unsigned long delayTime;

void setup() {
   Serial.begin(57600);
 while(!Serial);    // time to get serial running
    Serial.println(F("BME280 test"));
    unsigned status;
    status = bme.begin();  
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
        Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16);
        Serial.print("        ID of 0x60 represents a BME 280.\n");
        while (1) delay(10);
    }
    
    Serial.println("-- Default Test --");
    Serial.println();
}

void loop() {
printValues();
 delay(10000);
}


void printValues() {
    Serial.print("Température = ");
    Serial.print(bme.readTemperature());
    Serial.println(" °C");

    Serial.print("Pression = ");

    Serial.print(bme.readPressure() / 100.0F);
    Serial.println(" hPa");


    Serial.print("Humidité = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");
  Serial.println("===================");
  Serial.println();
}


J'ai tenté un code qui modifie le moins possible ce que tu as déjà (uniquement pour la température, si ça marche, tu peux t'en inspirer pour les autres données) :

//BME280
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
unsigned long delayTime;

#define NbValeurs 8
float tabTemp[NbValeurs] = {0.0f};

void setup() {
   Serial.begin(57600);
   while(!Serial);    // time to get serial running
   Serial.println(F("BME280 test"));
   unsigned status;
   status = bme.begin();  
   if (!status) {
      Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
      Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16);
      Serial.print("        ID of 0x60 represents a BME 280.\n");
      while (1) delay(10);
   }
    
   Serial.println("-- Default Test --");
   Serial.println();
}

void loop() {
   static int index = 0;
   tabTemp[index] = bme.readTemperature();
   printValues(index);
   index = (index + 1)%NbValeurs;
   delay(10000);
}


void printValues(int index) {
    Serial.println("Températures = ");
    for (int i = 0; i < NbValeurs; i++) {
      int j = (i + index)%NbValeurs;
      Serial.printf("%2d\t%f6.2 °C\n",i, tabTemp[j]);
    }
}

Pas compilé, pas testé...

Niquel, il fonctionne bien.
En gros, ce que je souhaite faire, c'est d'afficher les valeurs des 8 dernières heures quand je vais cliquer sur un bouton de mon écran tft.
Tu serais comment je peux remplacer les numéros par mes 8 dernières heures ? avec une prise de mesure toute les 30 minutes donc 16 valeurs.
j'utilise un ds1307
mon programme : `//DS1307

#include "RTClib.h"
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};

void setup() {
//DS1307
   Serial.begin(57600);
   
if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running, let's set the time!");
    // When time needs to be set on a new device, or after a power loss, the
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
}
void loop() {
//DS1307
    DateTime now = rtc.now();
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
}

Pour 16 mesures, il suffit de changer
#define NbValeurs 16

Tu peux créer un tableau supplémentaire dans lequel tu mets l'heure au moment de la mesure. Une astuce couramment utilisée est de "compacter" l'heure pour la faire tenir dans un entier. Tu utilises 100 * heures + minutes. Par exemple à 14h30, tu stockes 1430, à 16h00, tu stockes 1600, etc.
Mais si tu veux économiser de la place mémoire, et sachant que tes mesures se font toutes les demi-heures, tu n'as besoin que de stocker l'heure de la première mesure (ou de la dernière) et la mettre à jour à chaque mesure.

Ainsi, si tu stockes l'heure de la première mesure dans la variable 'heure' que l'on passe en argument de la fonction printValues:

void printValues(int index, int heure) {
    Serial.println("Températures = ");
    for (int i = 0; i < NbValeurs; i++) {
      int j = (i + index)%NbValeurs;
      int h = (heure / 100 + i / 2) % 24;
      int m = heure % 100;
      Serial.printf("%2d:%2d\t%f6.2 °C\n", h, m, tabTemp[j]);
    }
}

Il faut modifier la loop pour :

  • faire les mesures chaque demi heure
  • stocker l'heure de la première mesure
  • mettre cette heure à jour à chaque nouvelle mesure (c'est à dire ajouter 30 minutes)

[
Merci,
donc j'ai ajouté ta partie à mon programme et j'ai essayé quelque chose dans le loop mais ça doit pas être ça car mon programme marche pas :slight_smile:

mon loop :

void loop() {
  //DS1307
    DateTime now = rtc.now();
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    
   static int index = 0;
   static int heure = 0;
   tabTemp[index] = bme.readTemperature();
   tabTemp[heure] = now.hour(), now.minute(), DEC;
   printValues(index,heure);
   index = (index + 1)%NbValeurs;
   heure = (heure -30 )%NbValeurs;
   delay(10000);
}


void printValues(int index, int heure) {
    Serial.println("Températures = ");
    for (int i = 0; i < NbValeurs; i++) {
      int j = (i + index)%NbValeurs;
      int h = (heure / 100 + i / 2) % 24;
      int m = heure % 100;
      Serial.printf("%2d:%2d\t%f6.2 °C\n", h, m, tabTemp[j]);
    }
}

Je pense qu'il faut initialiser heure dans le setup. D'abord, la déclarer en variable globale, afin qu'elle soit connue dans le setup et dans la loop. Mettre dans le bloc avant le setup :
int heure;
Puis dans le setup :

DateTime now = rtc.now();
heure = now.hour() * 100 + now.minute();

Là, on a l'heure du lancement du code.

Ensuite dans la loop :

   static int index = 0;
   tabTemp[index] = bme.readTemperature();
   printValues(index, heure);
   index = (index + 1)%NbValeurs;
   heure = (heure + 50)%2400;
   delay(10000);

J'ajoute 50 à chaque mesure (au lieu de 30 minutes, j'ajoute 50 pour éviter un test)
Du coup, il faut modifier le calcul des minutes dans printValues :
int m = (heure % 100) / 5 * 3;

A tester... Bien sûr tu affiches toutes les 10 secondes, donc la journée va passer très vite...

Vous êtes vraiment super sympa sur ce forum merci,
Ducoup j'ai un petit problème, l'heure est en double soit 8x2 pour 16
image.
Pour afficher les 8 h d'avant je dois changer quoi ?
j'ai essayer de soustraire le 50 mais rien ne change, ça doit être dans le printvalue nn ?

Essaye de changer ceci dans le setup
heure = now.hour() * 100 + now.minute() * 5 / 3;
Et

Dans la fonction
int m = (heure % 100) * 3 / 5;

Bonjour,
Je viens d'essayer , toujours le même problème les valeurs d'après et deux fois la même heure .
image