lire un capteur analogique sur un esp32 et modifier le tableau de remapage in et out,
par access point,
j'utilise actuellement un capteur de pression d'air 0.1 bar , un simple tuyau plongé dans une cuve , et ça fait une jauge sans contact avec le liquide , ça fonctionne très bien, pour aller plus loin je fais un tableau de remapage si la cuve n'est pas régulière.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h> // Ajout de la bibliothèque EEPROM
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int boutonPasserPin = 5; // Broche pour passer à la ligne suivante
const int boutonSelectionPin = 6; // Broche pour sélectionner la valeur
const int boutonIncrementerPin = 7; // Broche pour incrémenter la valeur sélectionnée
int valeursVin[] = {1, 2, 3, 4}; // Tableau de valeurs "vin"
int valeursVout[] = {2, 4, 6, 8}; // Tableau de valeurs "vout"
int ligneSelectionneeIndex = 0; // Indice de la ligne sélectionnée
void setup() {
pinMode(boutonPasserPin, INPUT_PULLUP);
pinMode(boutonSelectionPin, INPUT_PULLUP);
pinMode(boutonIncrementerPin, INPUT_PULLUP);
lcd.init();
lireValeursDeEEPROM(); // Charger les valeurs depuis l'EEPROM au démarrage
}
void loop() {
lcd.backlight();
afficherValeurs();
// Lire l'état des boutons
int etatPasser = digitalRead(boutonPasserPin);
int etatSelection = digitalRead(boutonSelectionPin);
int etatIncrementer = digitalRead(boutonIncrementerPin);
// Logique pour passer à la ligne suivante
if (etatPasser == LOW) {
passerLigneSuivante();
delay(200); // Anti-rebond
}
// Logique pour sélectionner la valeur
if (etatSelection == LOW) {
selectionnerValeur();
delay(200); // Anti-rebond
}
// Logique pour incrémenter la valeur sélectionnée
if (etatIncrementer == LOW) {
incrementerValeurSelectionnee();
delay(200); // Anti-rebond
}
}
void afficherValeurs() {
lcd.clear();
for(int i = 0; i < 4; i++) {
lcd.setCursor(0, i);
int index = (ligneSelectionneeIndex + i) % 8; // Pour faire défiler les lignes
lcd.print("v");
lcd.print(index / 2 + 1);
lcd.print(index % 2 == 0 ? " in: " : " out: "); // Alterne entre "in" et "out"
lcd.print(index % 2 == 0 ? valeursVin[index / 2] : valeursVout[index / 2]); // Affiche la valeur correspondante
}
}
void passerLigneSuivante() {
ligneSelectionneeIndex = (ligneSelectionneeIndex + 1) % 8; // Pour passer circulairement entre les lignes
}
void selectionnerValeur() {
// Ajouter ici votre logique pour ce que vous voulez faire une fois la valeur sélectionnée
}
void incrementerValeurSelectionnee() {
// Incrémente soit la valeur "vin" soit la valeur "vout" en fonction de la ligne sélectionnée
int index = (ligneSelectionneeIndex / 2) % 4;
if (ligneSelectionneeIndex % 2 == 0) {
valeursVin[index]++;
} else {
valeursVout[index]++;
}
enregistrerValeursDansEEPROM(); // Enregistrer la valeur modifiée dans l'EEPROM
}
void lireValeursDeEEPROM() {
// Lire les valeurs depuis l'EEPROM et les charger dans les tableaux
for (int i = 0; i < 4; i++) {
valeursVin[i] = EEPROM.read(i);
valeursVout[i] = EEPROM.read(4 + i);
}
}
void enregistrerValeursDansEEPROM() {
// Enregistrer les valeurs dans l'EEPROM
for (int i = 0; i < 4; i++) {
EEPROM.write(i, valeursVin[i]);
EEPROM.write(4 + i, valeursVout[i]);
}
}
#include <Wire.h>
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* CS=*/ 10, /* reset=*/ 8);
const int sensorPin = A0;
const float conversionFactor = 1000.0 / 208.0; // Facteur de conversion pour les valeurs du capteur en litres
const int sampleTime = 1000; // Temps pour prendre des échantillons en millisecondes
const int numSamples = 10; // Nombre d'échantillons à prendre
int samples[numSamples]; // Tableau pour contenir les échantillons
int currentSample = 0; // Index de l'échantillon actuel dans le tableau d'échantillons
long lastSampleTime = 0; // Temps du dernier échantillon
// Fonction multiMap pour mapper une plage de valeurs en entrée à une plage de valeurs en sortie
int multiMap(int val, int* _in, int* _out, uint8_t size) {
// Éviter les valeurs en dehors de la plage d'entrée
if (val <= _in[0]) return _out[0];
if (val >= _in[size - 1]) return _out[size - 1];
// Chercher l'intervalle dans lequel se trouve la valeur
uint8_t pos = 1; // Position de l'élément suivant à val
while (val > _in[pos]) pos++;
// Interpoler la valeur
float ratio = (float)(val - _in[pos - 1]) / (_in[pos] - _in[pos - 1]);
return _out[pos - 1] + ratio * (_out[pos] - _out[pos - 1]);
}
void setup() {
u8g2.begin();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_profont15_tf);
u8g2.drawStr(0, 20, "Initialisation...");
u8g2.sendBuffer();
delay(1000); // Délai pour permettre l'initialisation de l'affichage
u8g2.clearBuffer();
u8g2.drawStr(0, 20, "Démarrage...");
u8g2.sendBuffer();
delay(1000); // Délai pour afficher le message "Démarrage..."
// Initialiser le tableau d'échantillons du capteur à 0
for (int i = 0; i < numSamples; i++) {
samples[i] = 0;
}
}
void loop() {
// Prendre un échantillon toutes les sampleTime millisecondes
if (millis() - lastSampleTime >= sampleTime) {
// Lire la valeur du capteur
int sensorValue = analogRead(sensorPin);
// Stocker la valeur brute du capteur dans le tableau d'échantillons
samples[currentSample] = sensorValue;
// Passer à l'échantillon suivant dans le tableau d'échantillons
currentSample = (currentSample + 1) % numSamples;
// Mettre à jour le temps du dernier échantillon
lastSampleTime = millis();
}
// Calculer la valeur moyenne du capteur
int samplesSum = 0;
for (int i = 0; i < numSamples; i++) {
samplesSum += samples[i];
}
int sensorAverage = samplesSum / numSamples;
// Calculer la valeur du capteur en litres en utilisant le facteur de conversion
float sensorLiters = sensorAverage * conversionFactor;
// Remapper la valeur du capteur dans une plage de 0 à 1000 litres en utilisant multiMap
int inValues[10] = {0, 100, 200, 300, 400, 500, 600, 700, 800, 900}; // Valeurs d'entrée
int outValues[10] = {0, 100, 200, 300, 400, 500, 600, 700, 800, 900}; // Valeurs de sortie
int remappedValue = multiMap(sensorAverage, inValues, outValues, 10);
// Effacer le tampon de l'affichage
u8g2.clearBuffer();
// Afficher la valeur brute du capteur et la valeur remappée
u8g2.setCursor(0, 15);
u8g2.print("sonde brute: ");
u8g2.print(sensorAverage);
u8g2.setCursor(0, 30);
u8g2.print("volume d'eau: ");
u8g2.print(remappedValue);
u8g2.sendBuffer();
// Délai pour permettre la mise à jour de l'affichage
delay(100);
}
Je vois mal l'intérêt de développer une usine à gaz pour un besoin ponctuel.
D'autant que si tu modifies les tableaux en interactif il va falloir en plus les stocker quelques part sinon à la première coupure d'alimentation tout sera perdu et cela ne semble pas pris en compte actuellement dans ton code.
#include <WiFi.h>
#include <WebServer.h>
#include <EEPROM.h>
const char *ssid = "ESP";
const char *password = "";
WebServer server(80);
const int numValues = 10; // Nombre de valeurs dans les tableaux inValues et outValues
int inValues[numValues]; // Valeurs d'entrée
int outValues[numValues]; // Valeurs de sortie
void loadValuesFromEEPROM() {
// Charger les valeurs à partir de la mémoire EEPROM
for (int i = 0; i < numValues; i++) {
EEPROM.get(i * sizeof(int), inValues[i]);
EEPROM.get((numValues + i) * sizeof(int), outValues[i]);
}
}
void saveValuesToEEPROM() {
// Enregistrer les valeurs dans la mémoire EEPROM
for (int i = 0; i < numValues; i++) {
EEPROM.put(i * sizeof(int), inValues[i]);
EEPROM.put((numValues + i) * sizeof(int), outValues[i]);
}
EEPROM.commit();
}
void handleRoot() {
String valuesHtml = "<h1>Tableaux de valeurs de remappage</h1><form action='/update' method='post'>";
for (int i = 0; i < numValues; i++) {
valuesHtml += "inValues[" + String(i) + "]: <input type='text' name='inValues[" + String(i) + "]' value='" + String(inValues[i]) + "'><br>";
valuesHtml += "outValues[" + String(i) + "]: <input type='text' name='outValues[" + String(i) + "]' value='" + String(outValues[i]) + "'><br>";
}
valuesHtml += "<br><input type='submit' value='Save'></form>";
// Ajout d'un bouton pour réinitialiser la mémoire EEPROM
valuesHtml += "<br><form action='/reset' method='post'><input type='submit' value='Reset EEPROM'></form>";
server.send(200, "text/html", valuesHtml);
}
void handleUpdate() {
// Mettre à jour les valeurs du tableau avec les valeurs soumises par le formulaire
for (int i = 0; i < numValues; i++) {
inValues[i] = server.arg("inValues[" + String(i) + "]").toInt();
outValues[i] = server.arg("outValues[" + String(i) + "]").toInt();
}
// Enregistrer les nouvelles valeurs dans la mémoire EEPROM
saveValuesToEEPROM();
// Rediriger vers la page principale après la mise à jour
server.sendHeader("Location", String("/"), true);
server.send(302, "text/plain", "");
}
void handleReset() {
// Réinitialiser la mémoire EEPROM
for (int i = 0; i < 512; i++) {
EEPROM.write(i, 0);
}
EEPROM.commit();
// Rediriger vers la page principale après la réinitialisation
server.sendHeader("Location", String("/"), true);
server.send(302, "text/plain", "");
}
void setup() {
Serial.begin(115200);
// Configure ESP32 as Access Point with specified SSID and password
WiFi.softAP(ssid, password);
Serial.println("ESP32 AP Started");
// Print IP address
Serial.print("AP IP address: ");
Serial.println(WiFi.softAPIP());
// Charger les valeurs à partir de la mémoire EEPROM au démarrage
EEPROM.begin(512);
loadValuesFromEEPROM();
// Set up the server routes
server.on("/", HTTP_GET, handleRoot);
server.on("/update", HTTP_POST, handleUpdate);
server.on("/reset", HTTP_POST, handleReset);
server.begin();
}
void loop() {
server.handleClient();
// Lire la valeur brute du pin 34
int sensorValue = analogRead(34);
// Remapper la valeur brute en utilisant les tableaux inValues et outValues
int remappedValue = sensorValue; // Par défaut, utiliser la valeur brute
for (int i = 0; i < numValues; i++) {
if (sensorValue <= inValues[i]) {
remappedValue = outValues[i];
break;
}
}
// Afficher les valeurs sur le moniteur série
Serial.print("Valeur brute : ");
Serial.print(sensorValue);
Serial.print(", Valeur remappée : ");
Serial.println(remappedValue);
delay(1000);
}
celui là à l'air de fonctionner , si vous avez des améliorations ....
#include <MultiMap.h>
#include <WiFi.h>
#include <WebServer.h>
#include <EEPROM.h>
const char *ssid = "jaug";
const char *password = "";
WebServer server(80);
const int numValues = 2; // Nombre de valeurs dans les tableaux inValues et outValues
int inValues[numValues]; // Valeurs d'entrée
int outValues[numValues]; // Valeurs de sortie
void loadValuesFromEEPROM() {
// Charger les valeurs à partir de la mémoire EEPROM
for (int i = 0; i < numValues; i++) {
EEPROM.get(i * sizeof(int), inValues[i]);
EEPROM.get((numValues + i) * sizeof(int), outValues[i]);
}
}
void saveValuesToEEPROM() {
// Enregistrer les valeurs dans la mémoire EEPROM
for (int i = 0; i < numValues; i++) {
EEPROM.put(i * sizeof(int), inValues[i]);
EEPROM.put((numValues + i) * sizeof(int), outValues[i]);
}
EEPROM.commit();
}
void handleRoot() {
String valuesHtml = "<h1>Tableaux de valeurs de remappage</h1><form action='/update' method='post'>";
for (int i = 0; i < numValues; i++) {
valuesHtml += "inValues[" + String(i) + "]: <input type='text' name='inValues[" + String(i) + "]' value='" + String(inValues[i]) + "'><br>";
valuesHtml += "outValues[" + String(i) + "]: <input type='text' name='outValues[" + String(i) + "]' value='" + String(outValues[i]) + "'><br>";
}
valuesHtml += "<br><input type='submit' value='Save'></form>";
// Ajout d'un bouton pour réinitialiser la mémoire EEPROM
valuesHtml += "<br><form action='/reset' method='post'><input type='submit' value='Reset EEPROM'></form>";
server.send(200, "text/html", valuesHtml);
}
void handleUpdate() {
// Mettre à jour les valeurs du tableau avec les valeurs soumises par le formulaire
for (int i = 0; i < numValues; i++) {
inValues[i] = server.arg("inValues[" + String(i) + "]").toInt();
outValues[i] = server.arg("outValues[" + String(i) + "]").toInt();
}
// Enregistrer les nouvelles valeurs dans la mémoire EEPROM
saveValuesToEEPROM();
// Rediriger vers la page principale après la mise à jour
server.sendHeader("Location", String("/"), true);
server.send(302, "text/plain", "");
}
void handleReset() {
// Réinitialiser la mémoire EEPROM
for (int i = 0; i < 512; i++) {
EEPROM.write(i, 0);
}
EEPROM.commit();
// Rediriger vers la page principale après la réinitialisation
server.sendHeader("Location", String("/"), true);
server.send(302, "text/plain", "");
}
void setup() {
Serial.begin(115200);
// Configure ESP32 as Access Point with specified SSID and password
WiFi.softAP(ssid, password);
Serial.println("ESP32 AP Started");
// Print IP address
Serial.print("AP IP address: ");
Serial.println(WiFi.softAPIP());
// Charger les valeurs à partir de la mémoire EEPROM au démarrage
EEPROM.begin(512);
loadValuesFromEEPROM();
// Set up the server routes
server.on("/", HTTP_GET, handleRoot);
server.on("/update", HTTP_POST, handleUpdate);
server.on("/reset", HTTP_POST, handleReset);
server.begin();
}
void loop() {
server.handleClient();
// Lire la valeur brute du pin 34
int sensorValue = analogRead(34);
// Remapper la valeur brute en utilisant les tableaux inValues et outValues
int remappedValue = sensorValue; // Par défaut, utiliser la valeur brute
for (int i = 0; i < numValues; i++) {
// if (sensorValue <= inValues[i]) {
// Calculer la valeur remappée linéairement
remappedValue = map(sensorValue, inValues[i], inValues[i+1], outValues[i], outValues[i+1]);
break;
}
// Afficher les valeurs sur le moniteur série
Serial.print("Valeur brute : ");
Serial.print(sensorValue);
Serial.print(", Valeur remappée : ");
Serial.println(remappedValue);
delay(1000);
}
n'est pas géniale pour gérer les requêtes web qui sont traitées par
il vaudrait mieux passer avec millis() pour gérer les mises à jours toutes les x ms
void setup() {
Serial.begin(115200); Serial.println();
}
void loop() {
static unsigned long chrono = -1000;
server.handleClient();
if (millis() - chrono >= 1000) {
chrono = millis();
// Lire la valeur brute du pin 34
int sensorValue = analogRead(34);
// Remapper la valeur brute en utilisant les tableaux inValues et outValues
int remappedValue = sensorValue; // Par défaut, utiliser la valeur brute
for (int i = 0; i < numValues; i++) {
// if (sensorValue <= inValues[i]) {
// Calculer la valeur remappée linéairement
remappedValue = map(sensorValue, inValues[i], inValues[i + 1], outValues[i], outValues[i + 1]);
break;
}
// Afficher les valeurs sur le moniteur série
Serial.print("Valeur brute : ");
Serial.print(sensorValue);
Serial.print(", Valeur remappée : ");
Serial.println(remappedValue);
}
}
ensuite la boucle for avec le break et sans le test, c'est un peu n'importe quoi puisque le break sort de la boucle immédiatement, c'est comme si vous aviez écrit
// Remapper la valeur brute en utilisant les tableaux inValues et outValues
int remappedValue = sensorValue; // Par défaut, utiliser la valeur brute
remappedValue = map(sensorValue, inValues[0], inValues[1], outValues[0], outValues[1]);