Capteur UV GUVA-S12SD avec ESP32

Bonjour,
J'ai un ESP32 sur lequel j'ai installé des capteurs pour une station meteo : pluviométre Tem, Hum particules et je souhaite ajouter un capteur UV
A ce stade je bloque mon intensité est à 0 (je sais le temps n'est pas terribble en ce moment mais tout de même :smile:)
J'ai 2 types de capteurs :
Paradisetronic.com Capteur de lumière UV GUVA-S12SD avec sortie analogique 3-5 V 240-370 nm pour Arduino
et
Youmile Module de détection de soudure module de capteur UV 3.3 V-5 V intensité lumineuse carte d'alimentation de détection UV haute sensibilité pour Arduino

Et dans les 2 cas même probléme intensité à 0

voici le type de programme que j'ai testé simple pourtant :


const int uvPin = 34; 

void setup() {
  Serial.begin(115200);
  // Initialiser la broche analogique pour lire les valeurs
  analogReadResolution(12); 
}

void loop() {
  // Lire la valeur analogique du capteur UV
  int uvAnalogValue = analogRead(uvPin);
  
  // Convertir la valeur analogique en tension (esp32 est en 3.3V)
  float voltage = uvAnalogValue * (3.3 / 4095.0);

  // Convertir la tension en intensité de rayonnement UV (mW/cm^2)
  // Selon la datasheet, 1V correspond à 307mW/m^2
  float uvIntensity = voltage * 307.0; // en mW/m^2
  
  // Convertir l'intensité de rayonnement UV en Indice UV
  // Conversion simplifiée, peut nécessiter des ajustements selon le capteur exact
  float uvIndex = uvIntensity / 25.0; // Environ 1 UV Index pour chaque 25 mW/m^2

  // Afficher les valeurs
  Serial.print("Valeur analogique: ");
  Serial.print(uvAnalogValue);
  Serial.print(" | Tension: ");
  Serial.print(voltage, 2);
  Serial.print(" V | Intensité UV: ");
  Serial.print(uvIntensity, 2);
  Serial.print(" mW/m^2 | Indice UV: ");
  Serial.println(uvIndex, 2);
  
  // Attendre 1 seconde avant de refaire une lecture
  delay(1000);
}

Je fais peut être une erreur basique mais je le trouve pas.
Le branchement est assez simple 3.3V ground et pin 34

Merci pour vos conseils.

Comme tu as des println dans ton programme, si tu pouvais donner ce qui s'affiche sur le moniteur série, cela serait un plus.

et nous dire combien tu mesure au VoltMètre, je crois que tu avais 56mV dans le noir, mais tu n'avais pas donné une valeur exposé à la lumière du jour?

Je n'ai pas vu dans le setup, la fonction pinmode pour fixer ta broche en input?

Tu confonds avec ce fil de discussion traitant du même capteur

Il faut séparer les problèmes.

  1. On teste l'ESP32: Si tu câble un potentiomètre à la place du capteur est-ce que l'ADC retourne une valeur correcte?
  2. On teste le capteur:
    • est-ce qu'il y a bien 3.3V sur le capteur?
    • est-ce que tu mesures une tension en sortie du capteur avec un voltmètre? dans le noir? à la lumière du jour?

Merci pour vos premiers retours et comme souvent vos questions m'ont fait creuser des choses.

Apperement j'ai des broches compatibles analogiques de 2 types (je découvre):

"Sur l’ESP32, les pins 36, 39, 34 et 35 peuvent être utilisés comme entrée analogique"
et d'autres
"Deux broches peuvent servir de sortie analogique: GPIO 25 et GPIO 26."

Donc j'ai fait un essai sur la 25 et là j'ai une mesure :

donc voici la version finale :

const int uvPin = 25; 

void setup() {
  Serial.begin(115200);
  analogReadResolution(12); 
}

void loop() {
  
  float voltage = analogRead(uvPin) * (3.3 / 4095.0) * 1000; 
  
  // Afficher la tension
  Serial.print("Tension: ");
  Serial.print(voltage, 2); 
  Serial.println(" mV");
  
  
  delay(1000);
}

Les valeurs sont trés trés faibles, pas de réel différence même quand je masque le capteur, il faut dire qu'aujourd'hui il n'y a pas vraiment d'UV!!!!.

2:56.408 -> Voltage (mV) : 4
13:42:57.392 -> Voltage (mV) : 2
13:42:58.377 -> Voltage (mV) : 0
13:42:59.402 -> Voltage (mV) : 1
13:43:00.401 -> Voltage (mV) : 0
13:43:01.400 -> Voltage (mV) : 6
13:43:02.413 -> Voltage (mV) : 1
13:43:03.391 -> Voltage (mV) : 0
13:43:04.379 -> Voltage (mV) :

Voyez vous encore des choses ...

La "logique" voudrait que tu utilises une entrée analogique, plutôt qu'une broche qui une sortie analogique, bien que cette même broche puisse aussi faire entrée analogique.

Tu ne définis toujours pas le mode de la broche que tu utilises, c'est pourtant une bonne habitude.

Tout est là

Attention aux entrées analogiques de l'ADC2 qui ne peuvent pas être utilisées lorsque le WiFi est actif.

Ah voila pourquoi ça fonctionnait sur mon ESP32 de test sans wifi par contre celui de ma station meteo (wifi actif) ça ne marche plus, dommage, je me suis un peu emballé.
Donc je repars à 0, :persevere:

Je ne peux pas faire de test ce week end mais je partirai bien sur cette version et je prends en compte la remarque de

Par contre je suis toujours à la recherche de la broche compatible j'ai regardé l'article proposé par fdufnews mais je suis un peu perdu :


float sensorVoltage;
float sensorValue;
const pinUV = ????;

void setup() {
  Serial.begin(9600);
  pinMode(pinUV, OUTPUT);
}

void loop() {

  sensorValue = analogRead(pinIUV);
  sensorVoltage = sensorValue* (3.3 / 4095.0) * 1000;

  Serial.print("sensor reading = ");
  Serial.print(sensorValue);
  Serial.print(" sensor voltage = ");
  Serial.print(sensorVoltage);
  Serial.println(" V");
  delay(1000);
}

Il faut choisir une entrée qui corresponde à l'ADC1 c'est indiqué dans le tableau du chapitre ADC

D’après le schéma je peux prendre 32 33 34 35 36 ou 39 sans aucune distinction ?
Et concernant mon programme proposé au dessus ça te va?

Oui. Assure-toi quand même que celle que tu choisis n'est pas utilisée sur la carte. Certaines cartes qui peuvent fonctionner sur batterie utilisent une entrée analogique pour mesurer l'état de la batterie

Il faut déclarer la broche en INPUT.

Ok merci
Je ferai les essais dimanche soir
Une dernière question car je ne trouve pas la confirmation ma base est bien 4095 en ACD.

Par défaut l'ADC délivre une valeur sur 12bits donc de 0 à 4095

Bonjour,
Malgré des essais sur les ports 33/32/34/35 toujours 0 en entrée

je commence à être un peu sec

Merci.

float sensorVoltage;
float sensorValue;
const byte pinUV = 32;

void setup() {
  Serial.begin(9600);
  pinMode(pinUV, INPUT);
}

void loop() {

  sensorValue = analogRead(pinUV);
  sensorVoltage = sensorValue* (3.3 / 4095.0) * 1000;

  Serial.print("sensor reading = ");
  Serial.print(sensorValue);
  Serial.print(" sensor voltage = ");
  Serial.print(sensorVoltage);
  Serial.println(" V");
  delay(1000);
}

Tu as essayé avec un potentiomètre sur les entrées analogiques à la place d'un senseur.
Tu pourrais aussi faire afficher la valeur brute après analogRead() avant d'afficher la valeur convertie.

En fait je n’ai pas de potentiomètre
J’affiche bien analogread ( voir mon programme)
mais c’est également à 0

Je peux essayer de m'en procurer un si tu penses que ça peut débloquer la situation et mieux comprendre.
Ce qui est étrange c'est que ce genre de mesure semble simple en lisant des posts et pourtant je bloque avec un programme simple.

En l'état, tu es incapable de dire si le problème vient du capteur ou de l'ESP32.
En replaçant le capteur par un potentiomètre tu pourras lever le doute. Le potentiomètre te permet d'appliquer une tension variable à l'entrée de ton circuit et de confirmer que la conversion se passe bien (ou pas).

j'ai trouvé cela : est ce que cela conviendrait :

  • Catégorie: Potentiomètre
  • Type: Linéaire
  • Qté:: x1 pièce
  • Impédance: 250kΩ
  • Marque: Mikroteck

N'importe quel potentiomètre, même un truc de récup d'un appareil qui par à la poubelle, peut faire l'affaire.
C'est juste pour faire un essai quelques minutes.