Appel fonction par moniteur série


20:40:21.942 -> RUCHE N°1
20:40:21.942 -> Température INT : 22.4°C
20:40:21.942 -> Température EXT : 22.6°C
20:40:21.942 -> Humidité EXT : 60.3%
20:40:21.942 -> inf Kg
20:40:22.036 ->
20:40:24.098 -> RUCHE N°1
20:40:24.098 -> Température INT : -127.0°C
20:40:24.098 -> Température EXT : 22.6°C
20:40:24.098 -> Humidité EXT : 60.3%
20:40:24.098 -> inf Kg
20:40:24.192 ->
20:40:26.301 -> RUCHE N°1
20:40:26.301 -> Température INT : 22.4°C
20:40:26.301 -> Température EXT : 22.6°C
20:40:26.301 -> Humidité EXT : 60.3%
20:40:26.301 -> inf Kg
20:40:26.394 ->
20:40:28.503 -> RUCHE N°1
20:40:28.503 -> Température INT : 22.4°C
20:40:28.503 -> Température EXT : 22.6°C
20:40:28.503 -> Humidité EXT : 60.4%
20:40:28.503 -> inf Kg
20:40:28.597 ->
20:40:30.706 -> RUCHE N°1
20:40:30.706 -> Température INT : 22.4°C
20:40:30.706 -> Température EXT : 22.6°C
20:40:30.706 -> Humidité EXT : 60.4%
20:40:30.706 -> inf Kg
20:40:30.799 ->
20:40:32.908 -> RUCHE N°1
20:40:32.908 -> Température INT : 22.4°C
20:40:32.908 -> Température EXT : 22.6°C
20:40:32.908 -> Humidité EXT : 60.4%
20:40:32.908 -> inf Kg
20:40:33.002 ->
20:40:35.111 -> RUCHE N°1
20:40:35.111 -> Température INT : 22.4°C
20:40:35.111 -> Température EXT : 22.6°C
20:40:35.111 -> Humidité EXT : 60.4%
20:40:35.111 -> inf Kg
20:40:35.205 ->
20:40:37.314 -> RUCHE N°1
20:40:37.314 -> Température INT : 22.4°C
20:40:37.314 -> Température EXT : 22.6°C
20:40:37.314 -> Humidité EXT : 60.4%
20:40:37.314 -> inf Kg
20:40:37.407 ->
20:40:39.516 -> RUCHE N°1
20:40:39.516 -> Température INT : 22.4°C
20:40:39.516 -> Température EXT : 22.6°C
20:40:39.516 -> Humidité EXT : 60.4%
20:40:39.516 -> inf Kg
20:40:39.610 ->
20:40:39.610 -> Nouveau Facteur d'étalonnage: 12840.00
20:40:39.610 -> Facteur enregistré :
20:40:39.610 -> 12840.00
20:40:39.610 -> Calibration mise à jour
20:40:41.719 -> RUCHE N°1
20:40:41.719 -> Température INT : 22.4°C
20:40:41.719 -> Température EXT : 22.6°C
20:40:41.719 -> Humidité EXT : 60.4%
20:40:41.719 -> -1.15 Kg
20:40:41.812 ->
20:40:43.921 -> RUCHE N°1
20:40:43.921 -> Température INT : 22.4°C
20:40:43.921 -> Température EXT : 22.6°C
20:40:43.921 -> Humidité EXT : 60.4%
20:40:43.921 -> -1.14 Kg
20:40:44.015 ->
20:40:46.124 -> RUCHE N°1
20:40:46.124 -> Température INT : 22.4°C
20:40:46.124 -> Température EXT : 22.6°C
20:40:46.124 -> Humidité EXT : 60.4%
20:40:46.124 -> -1.15 Kg
20:40:46.218 ->
20:40:48.327 -> RUCHE N°1
20:40:48.327 -> Température INT : 22.4°C
20:40:48.327 -> Température EXT : 22.6°C
20:40:48.327 -> Humidité EXT : 60.4%
20:40:48.327 -> -1.15 Kg
20:40:48.420 ->
20:40:50.529 -> RUCHE N°1
20:40:50.529 -> Température INT : 22.4°C
20:40:50.529 -> Température EXT : 22.6°C
20:40:50.529 -> Humidité EXT : 60.4%
20:40:50.529 -> -1.15 Kg
20:40:50.623 ->
20:40:52.732 -> RUCHE N°1
20:40:52.732 -> Température INT : 22.4°C
20:40:52.732 -> Température EXT : 22.6°C
20:40:52.732 -> Humidité EXT : 60.4%
20:40:52.732 -> -1.14 Kg
20:40:52.825 ->
20:40:54.934 -> RUCHE N°1
20:40:54.934 -> Température INT : 22.4°C
20:40:54.934 -> Température EXT : 22.6°C
20:40:54.934 -> Humidité EXT : 60.4%
20:40:54.934 -> -1.14 Kg
20:40:55.028 ->
20:40:55.028 -> Facteur d'étalonnage:
20:40:55.028 -> 12840.00
20:40:57.137 -> RUCHE N°1
20:40:57.137 -> Température INT : 22.4°C
20:40:57.137 -> Température EXT : 22.6°C
20:40:57.137 -> Humidité EXT : 60.3%
20:40:57.137 -> -1.14 Kg
20:40:57.231 ->
20:40:59.433 -> ets Jul 29 2019 12:21:46
20:40:59.433 ->
20:40:59.433 -> rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
20:40:59.433 -> configsip: 0, SPIWP:0xee
20:40:59.433 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
20:40:59.433 -> mode:DIO, clock div:1
20:40:59.480 -> load:0x3fff0030,len:1344
20:40:59.480 -> load:0x40078000,len:13964
20:40:59.480 -> load:0x40080400,len:3600
20:40:59.480 -> entry 0x400805f0
20:41:00.980 -> Calibration Factor: 0.00
20:41:00.980 -> Readings:
20:41:03.089 -> RUCHE N°1
20:41:03.089 -> Température INT : 22.4°C
20:41:03.089 -> Température EXT : 22.6°C
20:41:03.089 -> Humidité EXT : 60.4%
20:41:03.089 -> inf Kg
20:41:03.182 ->
20:41:05.291 -> RUCHE N°1
20:41:05.291 -> Température INT : 22.4°C
20:41:05.291 -> Température EXT : 22.6°C
20:41:05.291 -> Humidité EXT : 60.4%
20:41:05.291 -> inf Kg



Pour info je suis en négatif car j'ai débranché ma balance :slightly_smiling_face:
Merci

#include <EEPROM.h> // https://docs.arduino.cc/learn/built-in-libraries/eeprom/
#include <DFRobot_SHT20.h>
DFRobot_SHT20 sht20(&Wire, SHT20_I2C_ADDR);
#include <dummy.h>

#include "OneWire.h"
#include "DallasTemperature.h"

OneWire oneWire(13);
DallasTemperature ds(&oneWire);

#include "HX711.h"


#define DOUT  0
#define CLK  4
HX711 scale;

float calibration_factor = 0.0; //12840 Facteur initial


void setup()
{
  Serial.begin(115200);  // définition de l'ouverture du port série.

  ds.begin();          // sonde interieur activée (T°).
  sht20.initSHT20();        // sonde extérieur activée (T° et Tx humidité).
  pinMode(13, INPUT);  // désignation du port pour la sonde intérieur.
  pinMode(15, INPUT_PULLUP); // désignation du port pour la sonde extérieur.

  EEPROM.get(0, calibration_factor); // Restitution depuis mémoire semi permanente.
  scale.begin(DOUT, CLK);
scale.set_scale(calibration_factor);
  scale.tare(); //Remettre la balance à 0.
  Serial.println("Calibration Factor: " + String(calibration_factor));;
  Serial.println("Readings:");
}


void loop()
{
  // TEMPERATURE INTERIEURE ET EXTERIEURE de la ruche

  {
    ds.requestTemperatures();
    float temperatureInt = ds.getTempCByIndex(0);

    float temp = sht20.readTemperature();

    float humd = sht20.readHumidity();

    Serial.println("RUCHE N°1");

    Serial.print("Température INT : " );

    Serial.print(temperatureInt, 1);   // Seulement une décimale
    Serial.println("°C");

    Serial.print("Température EXT : ");
    Serial.print(temp, 1);   // Seulement une décimale
    Serial.println("°C");
    Serial.print("Humidité EXT : ");
    Serial.print(humd, 1);   // Seulement une décimale
    Serial.println("%");
Serial.print(scale.get_units(), 2); //Renvoie une décimale
    Serial.print(" Kg");
    delay (100);
    Serial.println("");
    Serial.println("");
  }


  // PARTIE BALANCE pour ETALONNER
  if (Serial.available())
  {
    commandeRecue();
  }
}
void commandeRecue()
{
String calibRx = Serial.readStringUntil('\n');     // Mettre au moins nouvelle ligne dans le moniteur.
  calibRx.trim();     // Nettoyage des 2 bouts de la chaîne https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/trim/
  calibRx.replace(" ", "");     // Supprimer les espaces
  calibRx.replace(",", ".");     // Remplacer la virgule par le point
  calibRx.toUpperCase();     // En majuscules
  boolean changeCal = false;

  // Si on demande à lire la calibration
if (calibRx.startsWith("CALIB?")) { // Pour connaître le facteur actuel de la balance
    Serial.println("Facteur d'étalonnage: ");
Serial.println(calibration_factor);
  } else if (calibRx.startsWith("CALIB")) { // Taper "CALIB12840" 12840 Facteur initial
    // Si on remplace la calibration par une nouvelle valeur
calibration_factor = calibRx.substring(5).toFloat();     // On extrait la valeur de la commande "CALIB....." et la transforme en float
    changeCal = true;
  } else if (calibRx.startsWith("+")) { // Si on incrémente la calibration de 10
    calibration_factor += 10; //Augmente l'étalonnage de 10
    changeCal = true;
  } else if (calibRx.startsWith("-")) {
    // Si on décrémente la calibration de 10
    calibration_factor -= 10; //Diminue l'étalonnage de 10
    changeCal = true;
  }

  // Si on a changé la calibration alors on sauve la valeur en EEPROM
  //  et on prend la modification en compte
  if (changeCal)
  {
Serial.print("Nouveau Facteur d'étalonnage: "); Serial.println(calibration_factor);
    EEPROM.put(0, calibration_factor);     // Sauvegarde en mémoire semi permanente. https://wiki-content.arduino.cc/en/Tutorial/
Serial.println("Facteur enregistré : "); Serial.println(calibration_factor);
scale.set_scale(calibration_factor);
    Serial.println("Calibration mise à jour");
    changeCal = false;
  }
}


C'est tout copié, vous pouvez voir que je suis au facteur 0, ensuite je rentre CALIB12840,je demande quel facteur je suis et enfin je reboot et de nouveau facteur 0

Merci

Je viens de réaliser que tu utilises un ESP32.
J'ai jamais utilisé EEPROM avec un ESP et manifestement c'est cette partie qui pose problème.
Il y a la librairie Preference qui permet de gérer ça.
On en a parlé ici

un tuto là

Oui, maintenant que les deux correspondent, on voit comme l'indique @fdufnews que c'est le stockage en EEPROM qui ne fonctionne pas.

Donc il faut que je parte avec preference.h

Je peux garder quand même cette partie ?

Merci

Ba oui et non
Il faut enlever tout ce qui est en référence avec EEPROM et remplacer par ce qui est indiqué dans le tutorial donné par @fdufnews, par exemple la partie Exemple1
Mais il ne s'agit pas de copier/coller tout l'exemple, il faut que tu comprennes ce que tu fais et remplace uniquement certaine partie qui utilisait EEPROM.
De plus dans ton cas, tu ne veux pas sauver un "int" mais un "float" ce n'est donc pas les mêmes fonction que l'exemple a utiliser.

Edit: j'ai oublié avant de partir directement sur la modification de ton projet, test l'exemple sur ton ESP32, puis quand ca marche, modifie l'exemple pour utiliser le bon type de donnée qui t'intéresse.
Une fois que tu aura appréhender la librairie Preferences, tu pourra modifier ton programme plus facilement.

A la réflexion, je me demande si le problème n'est pas ailleurs.
Il y a une version de la librairie EEPROM pour les ESP32. Elle est indiqué comme étant obsolète et il est conseillé d'utiliser Preference. Donc on peut supposer qu'elle fonctionne.

EDIT: Comme dit un peu plus haut, je n'ai jamais eu besoin d'utiliser EEPROM sur un ESP32 alors j'ai fait une petite recherche et je viens de tomber sur un tuto qui explique qu'il y a quand même quelques lignes à ajouter pour utiliser correctement cette librairie avec un ESP32.

Il faut déterminer la taille de la zone à réserver en Flash pour la fonction.
Et il faut initialiser la fonction.
Dans le cas qui nous intéresse.
Au début du code

#define EEPROM_SIZE sizeof(calibration_factor)

Dans setup() avant d'essayer de lire dans l'EEPROM

EEPROM.begin(EEPROM_SIZE);

Ne serait-il quand même pas mieux d'utiliser directement ce qui est dédié à l'ESP32?
L'utilisation de cette librairie ne semblant pas impliquer beaucoup de changement.

C'est une version d'EEPROM pour l'ESP32. Elle est principalement conservée pour assurer la compatibilité avec les programmes qui viennent du monde AVR.
EEPROM et Preference font partie du package ESP32.
Preference est plus puissante mais, étant donné le besoin, ici EEPROM devrait faire l'affaire et surtout cela ne modifie pas trop le code de @ducat42 ce qui limitera le nombre d'itérations pour en finir.
Ce qui pourrait justifier de passer à Preference ce serait si @ducat42 avait besoin de sauvegarder plus de paramètres car Preference est plus souple, mais jusqu'ici, il n'en a pas exprimé le besoin.

C'est lui qui voit, je n'impose rien.

Merci à tous les 2 pour vos avis, :thinking: pour le moment je ne pense pas mais après peut-être 1 autre chose max!

Qu'est ce qui prend le moins de place ?

Si je pars sur "préférence", il n'y a pas non beaucoup de choses à changer d'après ce que j'ai vu vite fait ce matin...non?
Merci

Egalement.
Il y a des chances pour qu'il faille utiliser la méthode commit() après put(), comme pour les autres méthodes write().
En jetant un œil au code de la méthode put(), effectivement je constate que le commit n'est pas réalisé.

Pour sauvegarder un objet simple comme un float, la librairie Preferences est en effet plus facile d'emploi.

#include <Preferences.h>
Preferences calibration;

#include <DFRobot_SHT20.h>
DFRobot_SHT20 sht20(&Wire, SHT20_I2C_ADDR);
#include <dummy.h>

#include "OneWire.h"
#include "DallasTemperature.h"

OneWire oneWire(13);
DallasTemperature ds(&oneWire);

#include "HX711.h"

#define DOUT  15
#define CLK  4
HX711 scale;

float calibration_factor = 1.0;

void setup()
{
  Serial.begin(115200);
  Serial.println();
  calibration.begin("Facteur d'étalonnage", false);
  calibration.getFloat("Facteur d'étalonnage", calibration_factor);
  

  ds.begin();          // sonde interieur activée (T°).
  sht20.initSHT20();        // sonde extérieur activée (T° et Tx humidité).
  pinMode(13, INPUT);  // désignation du port pour la sonde intérieur.



  scale.begin(DOUT, CLK);
scale.set_scale(calibration_factor);
  scale.tare(); //Remettre la balance à 0.
  Serial.println("Calibration Factor: " + String(calibration_factor));
  Serial.println("Readings:");


}

void loop()
{
  // TEMPERATURE INTERIEURE ET EXTERIEURE de la ruche

  {
    ds.requestTemperatures();
    float temperatureInt = ds.getTempCByIndex(0);

    float temp = sht20.readTemperature();

    float humd = sht20.readHumidity();

    Serial.println("RUCHE N°1");

    Serial.print("Température INT : " );

    Serial.print(temperatureInt, 1);   // Seulement une décimale
    Serial.println("°C");

    Serial.print("Température EXT : ");
    Serial.print(temp, 1);   // Seulement une décimale
    Serial.println("°C");
    Serial.print("Humidité EXT : ");
    Serial.print(humd, 1);   // Seulement une décimale
    Serial.println("%");
Serial.print(scale.get_units(), 2); //Renvoie une décimale
    Serial.print(" Kg");
    delay (100);
    Serial.println("");
    Serial.println("");
  }



  if (Serial.available())
  {
    commandeRecue();
  }
}
void commandeRecue()
{
String calibRx = Serial.readStringUntil('\n');     // Mettre au moins nouvelle ligne dans le moniteur.
  calibRx.trim();     // Nettoyage des 2 bouts de la chaîne https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/trim/
  calibRx.replace(" ", "");     // Supprimer les espaces
  calibRx.replace(",", ".");     // Remplacer la virgule par le point
  calibRx.toUpperCase();     // En majuscules
  boolean changeCal = false;

  // Si on demande à lire la calibration
if (calibRx.startsWith("CALIB?")) { // Pour connaître le facteur actuel de la balance
    Serial.println("Facteur d'étalonnage: ");
Serial.println(calibration_factor);
  } else if (calibRx.startsWith("CALIB")) { // Taper "CALIB12840" 12840 Facteur initial
    // Si on remplace la calibration par une nouvelle valeur
calibration_factor = calibRx.substring(5).toFloat();     // On extrait la valeur de la commande "CALIB....." et la transforme en float
    changeCal = true;
  } else if (calibRx.startsWith("+")) { // Si on incrémente la calibration de 10
    calibration_factor += 10; //Augmente l'étalonnage de 10
    changeCal = true;
  } else if (calibRx.startsWith("-")) {
    // Si on décrémente la calibration de 10
    calibration_factor -= 10; //Diminue l'étalonnage de 10
    changeCal = true;
  }

  // Si on a changé la calibration alors on sauve la valeur en EEPROM
  //  et on prend la modification en compte
  if (changeCal)
  {
    Serial.print("Nouveau Facteur d'étalonnage: "); 
Serial.println(calibRx.substring(5).toFloat());
calibration.putUInt("Facteur d'étalonnage", calibRx.substring(5).toFloat()); // Sauvegarde en mémoire semi permanente.
Serial.println("Facteur enregistré : "); Serial.println(calibration_factor);
scale.set_scale(calibration_factor);
    Serial.println("Calibration mise à jour");
    changeCal = false;
  }

}


Voici mes essais mais sans succès malheureusement, malgré toute l'aprem jusqu'à maintenant... J'ai appris des choses je pense,
Lorsque je redémarre le facteur repart avec float calibration_factor = 1.00

Ça n'enregistre pas. Sûrement j'ai oublié des choses, c'est certains. En regardant, l'exemple, ça à l'air simple.
J'ai une chose à la fois en essayant de les compiler avec ce que vous aviez réalisé, mais je me rends compte que je reste novice....

Merci

Oui, mais dans l'exemple, par exemple, il est écrit que le namespace est limité à 15 caractères. Et je ne suis pas certain que les espaces et les caractères accentués soient autorisés non plus. Donc prends plutôt "etalonnage" à la place de "Facteur d'étalonnage"

Ok merci, et pour toi, ça à l'air d'être bon le reste ce que j'ai ajouté et modifié ?
Merci
Bonne journée

Non, pas vraiment

C'est pas ça

  1. Si on regarde le prototype de la fonction

    float_t getFloat(const char* key, float_t defaultValue = NAN);

    Le premier argument c'est la clé.
    Le second argument, qui est optionnel, c'est la valeur par défaut retournée si la clé n'existe pas.
    La fonction retourne la valeur associée à la clé, si elle existe ou la valeur par défaut.

  2. Il y a aussi confusion entre le namespace et la clé qui identifie un paramètre.
    La librairie Preference permet de mémoriser plusieurs paramètres pour plusieurs applications ou plusieurs sous-domaines dans une application, comme par exemple des paramètres de calibration pour plusieurs capteurs chaque capteur étant associé à un namespace.

    Donc lorsqu'on fait begin() on définit le namespace dans lequel on va travailler par exemple, dans ton cas, on peut l'appeler "balance".

    Lorsqu'on fait un get ou un put on passe en argument à la fonction la clé qui permet d'identifier le paramètre auquel on veut accéder dans le namespace que l'on a précédemment ouvert, dans ton cas le facteur d'étalonnage, on peut nommer la clé "facteur_etalon".

    Ne pas oublier que le namespace comme la clé ne doivent pas dépasser 15 caractères, et dans le doute il vaut mieux éviter les caractères accentués et les espaces.

Donc le mieux serait de faire

calibration.begin("balance", false);   // ouverture du namespace
calibration_factor = calibration.getFloat("facteur_etalon", 1.0 );  // on récupère la valeur associée à la clé facteur_etalon ou 1.0 si elle n'existait pas
}

Et plus loin, dans commandeRecue() il faudra faire

calibration.putFloat("facteur_etalon",calibration_factor); // Sauvegarde en mémoire semi permanente.

A noter c'est calibration_factor qu'il faut sauver car il a pu être modifié par + ou - qui eux manipulent cette variable et non la chaine calibRx comme tu le fais dans ton code.

1 Like

Parfait, ça fonctionne correctement ! Et avec tes explications c'est plus clair !:+1: Merci beaucoup à tous !

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.