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.
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)
{
...
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...
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)