EDIT: I'd go this way (if you need only one or two instances):
// ADC READ channel + Address selection pins
template <uint8_t ADC_Chan, uint8_t Addr0, uint8_t Addr1, uint8_t Addr2, uint8_t Addr3>
class Mux16b {
public:
void initPins () {
pinMode(Addr0, OUTPUT);
pinMode(Addr1, OUTPUT);
pinMode(Addr2, OUTPUT);
pinMode(Addr3, OUTPUT);
pinMode(ADC_Chan, INPUT);
}
int readMux(uint8_t channel) {
digitalWrite(Addr0, channel&1 != 0);
digitalWrite(Addr1, channel&2 != 0);
digitalWrite(Addr2, channel&4 != 0);
digitalWrite(Addr3, channel&8 != 0);
// maybe some delay to stabilize voltage at the ADC_Chan input ??
return analogRead(ADC_Chan);
}
// not necessary but it's easier to use mux(10) than mux.readMux(10)
int operator()(uint8_t channel) { return readMux(channel); }
};
// analogRead from A0, Address pins: 4 9 5 2
Mux16b<A0,4,9,5,2> mux;
void setup() {
Serial.begin(115200);
mux.initPins();
}
void loop() {
Serial.println(mux.readMux(15));
Serial.println(mux(12)); // using overloaded operator ()
delay(5000);
}