ESP32-CAM et AnalogRead

Lorsque j'ai reçu mon premier esp32-Cam AI Thinker, j'étais très excité à l'idée de pouvoir enfin fabriquer un système capable d'arroser une plante tout en la photographiant. La perspective d'obtenir une chronophotographie de ma plante grandissant de jour en jour m'emplissait de joie !

J'ai tout d'abord regardé le repérage des broches de la carte, et je me suis rendu compte que peu de broches étaient disponibles. Il est clair que l'esp32-Cam nécessite de ruser. Dans mon cas, il était nécessaire de pouvoir utiliser une broche pour écrire afin d'activer et désactiver un relay-switch, et une autre pour lire les données qu'un capteur d'humidité du sol enverrait.

Un capteur d'humidité renvoit des valeurs analogiques. Au vu du repérage de broches, toutes les broches sont capables de recevoir des valeurs analogiques, mais elles sont toutes ADC2 ! Effectivement, sur une esp32-Cam, aucune broche ADC1 n'est directement accessible. Il semblerait bien que la pin 33, dédiée ADC1, de la puce ESP-WROOM-32 soit inutilisée et qu'il soit possible d'y souder un cable pour l'utiliser, mais une telle opération me parait houleuse.

J'ai donc fait un premier test de mon capteur branché sur la broche GPIO 14 l'esp32-Cam avec un programme très simple, qui ne faisait rien d'autre que lire en boucle la valeur reçue et l'afficher dans le moniteur série.

Et ça fonctionnait très bien ! Le capteur renvoyait une valeur entre 0 et 4096 correspondant à la conductivité de la terre dans laquelle il était planté.
Très satisfait de cette première victoire, j'ai agrémenté le programme d'une connection WiFi au réseau local. Lorsque j'ai testé ce code, plus rien ne fonctionnait ! Le programait n'affichait plus comme valeur reçue du capteur que 4096 !

Les broches ADC2 sont en effet utilisées par les fonctionnalités WiFi et Bluetooth de la carte, elles sont a-priori inutilisables dés le premier appel à WiFi.begin().
Heuresement, il existe une solution que j'ai fini par trouver en farfouillant dans les discussions sur le github de Espressif. Cette solution s'est montrée effective sur l'esp32-Cam de AI Thinker, le modèle précis que je possède.

Il s'agit de modifier les valeurs des registres de contrôle de l'ADC2.

// procédure pour utiliser les broches ADC2 sur ESP32-Cam lorsque le WiFi ou le Bluetooth sont activés
// (Généralement, seules les broches ADC1 sont utilisables avec analogRead() lorsque le WiFi ou le Bluetooth sont actifs)

// D'abord on sauvegarde la valeur du registre ADC2 avant de lancer WifiBegin() ou BluetoothBegin()
// Ensuite, après avoir initié la connectin WiFi ou Bluetooth, on ré-écrit dans le registre la valeur sauvegardée 
// Il apparait alors que les valeurs lues par AnalogRead sont inversées ! 
// Il nous faut alors écrire la valeur enregistrée dans le registre ADC2 
// mais aussi écrire dans une autre valeur du registre pour recevoir les données correctement
// On effectue ces opérations avant chaque utilisation de AnalogRead

#include <WiFi.h>
#include "soc/sens_reg.h" // On a besoin de cete variable pour manipuler le registre de controle ADC2
uint64_t reg_b; // cette variable va stocker la valeur du registre ADC2

const char* ssid = "Le_reseau_wifi_local";
const char* password = "le_mdp_wifi_local";

int alt_analogRead(int pin) {
 // On restaure la valeur du registre ADC2
 WRITE_PERI_REG(SENS_SAR_READ_CTRL2_REG, reg_b);
 //On modifie cette autre valeur du registre pour éviter les valeurs inversées
 SET_PERI_REG_MASK(SENS_SAR_READ_CTRL2_REG, SENS_SAR2_DATA_INV);

return analogRead(pin);
}


void setup() {
 Serial.begin(115200);
 pinMode(14,INPUT); // GPIO14 pour recevoir les données du capteur

 // on enregistre la valeur du registre de controle ADC2 AVANT(!) de lancer le Wifi
 reg_b = READ_PERI_REG(SENS_SAR_READ_CTRL2_REG);

 WiFi.begin(ssid, password);

 while (WiFi.status() != WL_CONNECTED) {
   delay(500);
   Serial.print(".");
 }
 Serial.println("");
 Serial.println("Connecté : ");
 Serial.println(WiFi.localIP());
 
 
 }

void loop() {
Serial.println(alt_analogRead(14));// On affiche les valeurs reçues !
delay(100);
}

// Et voila comment on utilise de l'ADC2 et le wifi sur l'esp32-Cam de AI Thinker !!