Je pense avoir compris ce qui clochait.
J'ai modifié le code (notamment la partie void loop()) :
// Déclaration des variables
const byte
pinMUX1_A = 2, // MUX - Broche A
pinMUX1_B = 3, // MUX - Broche B
pinMUX1_C = 4, // MUX - Broche C
pinMUX1_D = 5, // MUX - Broche D
pinMUX1_INH = 6, // MUX - Broche pilotant état INH via transistor
pinMUX1_Analog = A0, // MUX - Broche analogique
pinSensorVIN = A1; // VIN - Broche analogique
byte
countChannel = 0; // Compteur du numéro de broche
const float
coeffDivBridgeVIN = 4.3; // Coefficient diviseur du pont de résistance pour tension VIN => Coef = 1 / (R2 / (R1 + R2))
void setup() {
// Initialisation port console
Serial.begin(9600);
// Activation du pull-up sur la broche A0
//pinMode(pinMUX1_Analog, INPUT_PULLUP);
// Mode des broches 4051
pinMode(pinMUX1_A, OUTPUT);
pinMode(pinMUX1_B, OUTPUT);
pinMode(pinMUX1_C, OUTPUT);
pinMode(pinMUX1_D, OUTPUT);
pinMode(pinMUX1_INH, OUTPUT);
// Mise en état LOW des broches d'adresse
digitalWrite(pinMUX1_A, LOW);
digitalWrite(pinMUX1_B, LOW);
digitalWrite(pinMUX1_C, LOW);
digitalWrite(pinMUX1_D, LOW);
digitalWrite(pinMUX1_INH, LOW);
}
// ----- FONCTIONS ----- //
int fctReadAnalogMux(byte channel) {
digitalWrite(pinMUX1_A, bitRead(channel, 0));
digitalWrite(pinMUX1_B, bitRead(channel, 1));
digitalWrite(pinMUX1_C, bitRead(channel, 2));
digitalWrite(pinMUX1_D, bitRead(channel, 3));
//digitalWrite(pinMUX1_INH, bitRead(channel, 4));
delay (20);
return analogRead(pinMUX1_Analog);
}
unsigned int fctReadAVRVoltage(void) { /** Mesure la référence interne à 1.1 volts */
/* Elimine toutes charges résiduelles */
#if defined(__AVR_ATmega328P__)
ADMUX = 0x4F;
#elif defined(__AVR_ATmega2560__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5F;
#elif defined(__AVR_ATmega32U4__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5F;
#endif
delayMicroseconds(5);
/* Sélectionne la référence interne à 1.1 volts comme point de mesure, avec comme limite haute VCC */
#if defined(__AVR_ATmega328P__)
ADMUX = 0x4E;
#elif defined(__AVR_ATmega2560__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5E;
#elif defined(__AVR_ATmega32U4__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5E;
#endif
delayMicroseconds(200);
/* Active le convertisseur analogique -> numérique */
ADCSRA |= (1 << ADEN);
/* Lance une conversion analogique -> numérique */
ADCSRA |= (1 << ADSC);
/* Attend la fin de la conversion */
while(ADCSRA & (1 << ADSC));
/* Récupère le résultat de la conversion */
return ADCL | (ADCH << 8);
}
float fctAVRVoltageVIN() {
/* Mesure la tension en VIN et la référence interne à 1.1 volts */
unsigned int raw_vin = analogRead(pinSensorVIN);
unsigned int raw_ref = fctReadAVRVoltage();
/* Calcul de la tension réel avec un produit en croix */
float AVRVoltageVIN = ((raw_vin * 1.1) / raw_ref) * coeffDivBridgeVIN;
return AVRVoltageVIN;
}
void loop() {
for(countChannel=0; countChannel<=15; countChannel++) {
Serial.print("Valeur du bouton sur A0 en valeur 0-1023 : ");
Serial.print(fctReadAnalogMux(countChannel));
Serial.print(" Conversion en tension : ");
Serial.print((analogRead(pinMUX1_Analog) * fctAVRVoltageVIN()) / 1023);
Serial.print(" avec une tension sur A0 de : ");
Serial.println(fctAVRVoltageVIN());
delay(100);
}
}
Et là pour chacun des boutons, j'obtiens à l'activation de chacun d'entre eux la même valeur (comprise entre 18 et 20 sur l'échelle de 0 à 1023). Ceci sans le PULLUP activé ni résistance sur les boutons, juste un cablage vers la masse pour chacun d'eux.
Avec le PULLUP activé, les valeurs sont comprises entre 40 et 41.
Je viens de faire l'essai en connectant le second MUX et le code suivant :
// Déclaration des variables
const byte
pinMUX1_A = 2, // MUX - Broche A
pinMUX1_B = 3, // MUX - Broche B
pinMUX1_C = 4, // MUX - Broche C
pinMUX1_D = 5, // MUX - Broche D
pinMUX1_INH = 6, // MUX - Broche pilotant état INH via transistor
pinMUX1_Analog = A0, // MUX - Broche analogique
pinSensorVIN = A1; // VIN - Broche analogique
byte
countChannel = 0; // Compteur du numéro de broche
const float
coeffDivBridgeVIN = 4.3; // Coefficient diviseur du pont de résistance pour tension VIN => Coef = 1 / (R2 / (R1 + R2))
void setup() {
// Initialisation port console
Serial.begin(9600);
// Activation du pull-up sur la broche A0
//pinMode(pinMUX1_Analog, INPUT_PULLUP);
// Mode des broches 4051
pinMode(pinMUX1_A, OUTPUT);
pinMode(pinMUX1_B, OUTPUT);
pinMode(pinMUX1_C, OUTPUT);
pinMode(pinMUX1_D, OUTPUT);
pinMode(pinMUX1_INH, OUTPUT);
// Mise en état LOW des broches d'adresse
digitalWrite(pinMUX1_A, LOW);
digitalWrite(pinMUX1_B, LOW);
digitalWrite(pinMUX1_C, LOW);
digitalWrite(pinMUX1_D, LOW);
digitalWrite(pinMUX1_INH, LOW);
}
// ----- FONCTIONS ----- //
int fctReadAnalogMux(byte channel) {
digitalWrite(pinMUX1_A, bitRead(channel, 0));
digitalWrite(pinMUX1_B, bitRead(channel, 1));
digitalWrite(pinMUX1_C, bitRead(channel, 2));
digitalWrite(pinMUX1_D, bitRead(channel, 3));
digitalWrite(pinMUX1_INH, bitRead(channel, 4));
delay (20);
return analogRead(pinMUX1_Analog);
}
unsigned int fctReadAVRVoltage(void) { /** Mesure la référence interne à 1.1 volts */
/* Elimine toutes charges résiduelles */
#if defined(__AVR_ATmega328P__)
ADMUX = 0x4F;
#elif defined(__AVR_ATmega2560__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5F;
#elif defined(__AVR_ATmega32U4__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5F;
#endif
delayMicroseconds(5);
/* Sélectionne la référence interne à 1.1 volts comme point de mesure, avec comme limite haute VCC */
#if defined(__AVR_ATmega328P__)
ADMUX = 0x4E;
#elif defined(__AVR_ATmega2560__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5E;
#elif defined(__AVR_ATmega32U4__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5E;
#endif
delayMicroseconds(200);
/* Active le convertisseur analogique -> numérique */
ADCSRA |= (1 << ADEN);
/* Lance une conversion analogique -> numérique */
ADCSRA |= (1 << ADSC);
/* Attend la fin de la conversion */
while(ADCSRA & (1 << ADSC));
/* Récupère le résultat de la conversion */
return ADCL | (ADCH << 8);
}
float fctAVRVoltageVIN() {
/* Mesure la tension en VIN et la référence interne à 1.1 volts */
unsigned int raw_vin = analogRead(pinSensorVIN);
unsigned int raw_ref = fctReadAVRVoltage();
/* Calcul de la tension réel avec un produit en croix */
float AVRVoltageVIN = ((raw_vin * 1.1) / raw_ref) * coeffDivBridgeVIN;
return AVRVoltageVIN;
}
void loop() {
for(countChannel=0; countChannel<=31; countChannel++) {
Serial.print("Valeur du bouton sur A0 en valeur 0-1023 : ");
Serial.print(fctReadAnalogMux(countChannel));
Serial.print(" Conversion en tension : ");
Serial.print((analogRead(pinMUX1_Analog) * fctAVRVoltageVIN()) / 1023);
Serial.print(" avec une tension sur A0 de : ");
Serial.println(fctAVRVoltageVIN());
delay(100);
}
}
Avec ou sans PULLUP, les résultats sont identiques.
Je n'ai pas donné les valeurs des tensions, avec un ou deux MUX, les résultats sont les mêmes.