Bonsoir à tous,
Désolé pour ce gros temps de latence : fêtes de fin d'année à préparer, surcharge au travail, bref que de bonnes raisons pour avoir mis du temps.
Je me doute que de votre côté, il en est de même et je ne m'attends pas à une réponse immédiate (l'électronique, c'est bien, la famille, c'est mieux).
Je profite de ce post pour vous souhaiter, à tous, de Joyeuses Fêtes de fin d'année.
Concernant le test avec un seul MUX, en voici le schéma en pièce jointe, ainsi que le code :
// 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() {
Serial.print("Valeur du bouton sur A0 en valeur 0-1023 : ");
Serial.print(analogRead(pinMUX1_Analog));
Serial.print(" Conversion en tension : ");
Serial.print((analogRead(pinMUX1_Analog) * fctAVRVoltageVIN()) / 1023);
Serial.print(" avec une tension sur A0 de : ");
Serial.println(fctAVRVoltageVIN());
delay(500);
}
Le souci que j'ai : seul l'appui sur le bouton 1 renvoie bien une valeur modifiée sur A0 mais les autres boutons, aucune réaction ![]()
