[resolu] analogRead(A1) / analogRead(CONSTANTE)

Bonjour,
J'ai un souci avec la fonction analogRead(XX) que je ne comprend pas:

Lorsque je fais cette commande : analogRead(A1), ça fonctionne parfaitement.
En revanche, lorsque je remplace "A1" par une constante :
#define VBAT_pin A1 ou const int VBAT_pin=A1;

analogRead(VBAT_pin) me retourne systématiquement 0.

Avez vous une idée de ou cela peut provenir ?

Merci.

NB : je suis sur un Arduino Uno.

Montrez nous un code complet mettant en évidence le pb (et dites nous ce qui est branché sur A1)

sur A1, il y a un pont diviseur ramenant le 12V à 5V et une zener limitant la tension à 5V.
voici le code complet
la lecture du port analogique se fait dans la fonction void Read_Inputs ()

J'ai due supprimer des fonctions et commentaires car trop long pour l'upload sur le forum

#include <EEPROM.h>
#include <Wire.h>
#include "DS3231.h"


#define motor_sens_pin 8
#define motor_ON_pin 9
#define Imotor_pin A0   //AN0

// Position porte
#define porte_ouverte_pin 2
#define porte_fermee_pin 3

// Position porte
#define Bouton_Ouverture_pin 4
#define Bouton_Fermeture_pin 5

// Batterie
const int VBAT_pin=A1; // AN1

// ************************** Definition des adresses eeprom
#define I_OPEN_MAX_ADD  1 // 2 bytes
#define I_CLOSE_MAX_ADD 3 // 2 bytes
#define T_OPEN_MAX_ADD  5 // 4 bytes
#define T_CLOSE_MAX_ADD 9 // 4 bytes




// ************************** Definition des etats des relais porte
// Moteur de porte
#define motor_ON 1
#define motor_OFF 0
#define motor_sens_ouverture 1
#define motor_sens_fermeture 0
#define TOLERENCE_IMAX 10 // 1/100 courant max en plus admissible
#define TEMPS_DEMARRAGE_MOTEUR 100 // Temps de demarrage du moteur
#define RAPPORT_IMAX_IDEMARRAGE 3 // Rapport courant de demarrage/courant max
#define TOLERENCE_TMAX 10  // 1/100 temps max en plus admissible

// ************************** Definition des constantes
// Timeout
#define TIMEOUTMOTORON 3000 // Time out d'activation max du  moteur (ms)

#define DELAY_MESURE 1  // Temps ms entre 2 mesures
#define NB_CALIB 1  // Nombre de calibrations
#define TEMPS_APRES_ACTION_MOTEUR 500 // Temps d'attente après une action moteur

// Etats action porte
#define PORTE_ACTION_OUVERTURE 1
#define PORTE_ACTION_FERMETURE 2
#define ACTION_IMPOSSIBLE_TIMEOUT 3
#define ACTION_IMPOSSIBLE_OVERCURENT 4
#define PORTE_ACTION_OK 5

#define FILTRE_ENTREES 10 // Nb entrees actives pour activation

// Calibrations porte
unsigned int IopenMax=0, IcloseMax=0;
unsigned long temps_openMax=0,temps_closeMax=0;
unsigned long temps_mesures_entrees=0;
unsigned char Demande_fermeture,Demande_ouverture,Porte_ouverte,Porte_fermee;
int Vbat=0;

//RTC
//RTClib RTC;


 void PrintEEPROM();
 char Porte_Action(char Action, double* temps_action_porte, unsigned int* Imotor); // sens de l'action
 char Door_Motor_calibration();
 void Read_Inputs ();
 char Demande_Fermeture ();
 char Demande_Ouverture ();
 char Demande_Calibration ();


void setup() {
Serial.begin(2000000);
// RTC
//Wire.begin();

digitalWrite( motor_sens_pin ,0);
digitalWrite( motor_ON_pin ,0);
pinMode(motor_ON, OUTPUT);  
pinMode(motor_sens_pin, OUTPUT);  
pinMode(porte_ouverte_pin, INPUT);  
pinMode(porte_fermee_pin, INPUT);  
pinMode(Bouton_Ouverture_pin, INPUT);  
pinMode(Bouton_Fermeture_pin, INPUT);  

//Lecture les parametres en EEPROM
EEPROM.get(I_OPEN_MAX_ADD,IopenMax);
EEPROM.get(I_CLOSE_MAX_ADD,IcloseMax);
EEPROM.get(T_OPEN_MAX_ADD,temps_openMax);
EEPROM.get(T_CLOSE_MAX_ADD,temps_closeMax);


delay(100);
PrintEEPROM();
Serial.print("Ouverture : ");Serial.print(temps_closeMax,DEC);Serial.print("ms\tImax ");Serial.println(IcloseMax);
Serial.print("Fermeture : ");Serial.print(temps_openMax,DEC);Serial.print("ms\tImax ");Serial.println(IopenMax);
}
 
unsigned int a;
char essais=0;

void loop() {

Read_Inputs ();

...
}

// ******************************************************************************************************************************
// ************************** Fonctions **************************************************** Fonctions **************************
// ******************************************************************************************************************************



// ***************************************************************
// Lecture des entrées *******************************************
// ***************************************************************
void Read_Inputs ()
{
  int i=0;
//Lecture et filtre des entrees
if (millis() >= temps_mesures_entrees + DELAY_MESURE)
{
  temps_mesures_entrees=millis();
  if ( digitalRead( Bouton_Ouverture_pin) && (Demande_ouverture <= 11* FILTRE_ENTREES)) Demande_ouverture++;
  else if (Demande_ouverture>0)  Demande_ouverture--;
  
  if ( digitalRead( Bouton_Fermeture_pin) && (Demande_fermeture <= 11* FILTRE_ENTREES)) Demande_fermeture++;
  else if (Demande_fermeture>0)  Demande_fermeture--;
  
  if ( digitalRead( porte_ouverte_pin) && (Porte_ouverte <= FILTRE_ENTREES)) Porte_ouverte++;
  else if (Porte_ouverte>0)  Porte_ouverte--;
  
  if ( digitalRead( porte_fermee_pin) && (Porte_fermee <= FILTRE_ENTREES)) Porte_fermee++;
  else if (Porte_fermee>0)  Porte_fermee--;

//Serial.print(a);Serial.print(" ");

  //analogReference(DEFAULT);
  
  //for (i=0;i<10;i++) {Serial.print(analogRead(A0));Serial.print(" ");delay(100);} Serial.println(" ");
  for (i=0;i<10;i++) {Serial.print(analogRead(Imotor_pin));Serial.print(" ");delay(100);} Serial.println(" "); 

  Vbat=(Vbat+(unsigned int)analogRead(Imotor_pin))/2;
    a++;
  if (a>=10)
    {
      

      Serial.print(analogRead(Imotor_pin)); Serial.print(" ");
      Serial.print(Vbat);Serial.println("V");
      a=0;
    }
  }
}

Faites un code de 5 lignes pour tester ce que vous avancez. Là il y a 1 million de trucs en jeu... et même pas tout le code pour voir si vous avez des bugs.

Un soucis (pas lié) que j’ai vu en lisant en diagonale:

if (millis() >= temps_mesures_entrees + DELAY_MESURE)
{
   ...

Il ne faut pas faire d’addition sinon dans une cinquantaine de jours ça va bugger il faut écrire

if (millis() - temps_mesures_entrees >= DELAY_MESURE)
{
   ...

pour ne pas avoir d’overflow

Essaye
#define VBAT_pin=A1; // AN1au lieu de

const int VBAT_pin=A1; // AN1

lesept:
Essaye

#define VBAT_pin=A1; // AN1

non ça c’est N’importe quoi!!! :slight_smile:

Le symbole = deviendrait partie intégrante de l’expression. souvenez vous qu’un define revient purement et simplement à remplacer le mot clé partout où il se trouve par ce que vous avez mis à droite. Donc avec cette définition un analogRead(VBAT_pin) devient analogRead(=A1)... pas top...

C'est juste, j'ai copié / collé trop vite, je pensais à :

#define VBAT_pi A1 // AN1

Euh, c’est ce qu’il fait, non ? dans son premier post il parle de faire

#define VBAT_pin A1 ou const int VBAT_pin=A1;

Faut que j'arrête le calva au petit déjeuner...

lesept:
Faut que j'arrête le calva au petit déjeuner...

:slight_smile:

lesept:
Faut que j'arrête le calva au petit déjeuner...

Non, suffit d'inviter des copains. :smiley:

int analogPin = 3;     // une résistance variable (broche du milieu) 
                            //connectée sur la broche analogique 3
                       // les autres broches de la résistance sont connectées 
                       // l'une au 5V et l'autre au 0V

int val = 0; // variable de type int pour stocker la valeur de la mesure

void setup()
{
  Serial.begin(9600);          //  initialisation de la connexion série
// IMPORTANT : la fenêtre terminal côté PC doit être réglée sur la même valeur. 
}

void loop()
{

  // lit la valeur de la tension analogique présente sur la broche
  val = analogRead(analogPin);    

   // affiche la valeur (comprise en 0 et 1023) dans la fenêtre terminal PC
  Serial.println(val);             

}

Bonsoir,
Merci à tous, et surtout à J-M-L qui m'a permis de mettre le doigt sur une belle connerie de ma part : je n'utilisais le bon nom pour la constante:
analogRead(Imotor_pin) => analogRead(VBAT_pin)

Désolé pour le dérangement et encore merci.

:slight_smile: