Capteur analogique esp32 access point remappage

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.

si qqun peut me creer la page access point ?

Qu'avez vous déjà fait au niveau du code ?

C'est quoi une "page access point"?

c'est la page qu'on peut voir sur son téléphone , en tappant l'ip de son esp , sans passer par le réseaux wifi

un exemple sur arduino

#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]);
  }
}

l'exemple n'a rien à voir avec votre besoin.
postez le code qui "lit le capteur analogique et modifie le tableau de remapage in et out"

sur ESP32 je suggère d'utiliser ESPAsyncWebServer pour gérer la page web de votre site

Dessinez à quoi doit ressembler la page web. il y a un tableau dessus ou juste une valeur ?

#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);
}

en gros je voudrais acceder à ce tableau par access point , le modidier et sauvegarder dans eeprom.

 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

c'est juste pour le calibrage , après je lis la valeur sur l'écran lcd

Si c'est un accès ponctuel pour visualiation et enregistrement de quelques valeurs, le plus simple serait d'utiliser WiFiManager

ça va créer la page pour vous qui apparaît toute seule sur votre smarphone quand vous rejoignez le wifi de l'ESP (portail captif)

si qqun arrive a me faire un code pour l'esp32 en partant de mon exmple ? et une simple page web pour modifier les valeur

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.

j'ai écrit un petit "tuto de base" avec un code qui vous permet de présenter des paramètres et de les modifier simplement ➜ Gestion de préférences mémorisées sur ESP32 avec WiFiManager

il ne vous reste plus qu'à intégrer cela à votre 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);
}

pourquoi pas oui - c'est une page web

le remappage ne fonctionne pas correctement il doit y avoir une erreur

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);
}

l'attente forcée en fin de loop()

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]);

ok j'ai fais la modif avec millis par contre si je supprime le break ça ne fonctionne plus.

autre problème, la lecture analogique est très fluctuante :
17:27:46.311 -> Valeur brute : 2437, Valeur remappée : 594
17:27:47.319 -> Valeur brute : 2437, Valeur remappée : 594
17:27:48.352 -> Valeur brute : 2435, Valeur remappée : 594
17:27:49.332 -> Valeur brute : 2436, Valeur remappée : 594
17:27:50.307 -> Valeur brute : 2474, Valeur remappée : 603
17:27:51.333 -> Valeur brute : 2436, Valeur remappée : 594
17:27:52.350 -> Valeur brute : 2433, Valeur remappée : 593
17:27:53.332 -> Valeur brute : 2437, Valeur remappée : 594
17:27:54.322 -> Valeur brute : 2447, Valeur remappée : 597
17:27:55.333 -> Valeur brute : 2393, Valeur remappée : 584
17:27:56.306 -> Valeur brute : 2434, Valeur remappée : 594
17:27:57.324 -> Valeur brute : 2433, Valeur remappée : 593
17:27:58.323 -> Valeur brute : 2437, Valeur remappée : 594
17:27:59.339 -> Valeur brute : 2435, Valeur remappée : 594
17:28:00.318 -> Valeur brute : 2442, Valeur remappée : 596
17:28:01.320 -> Valeur brute : 2433, Valeur remappée : 593

ce n'est pas le break qu'il faut supprimer - il empêche la boucle for de s'exécuter comme je le disais

la question c'est à quoi sert cette boucle ?

j'en sais rien à vrai dire c'est tiré d'un exemple et j'arrive pas à la supprimer