#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
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
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
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.
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....
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"
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.
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.