Lectura Analogica usando MUX 8a1 HEF4051B
Arduino tiene seis entradas/salidas analogicas de contro disponibles, pero como hacerle si necesitamos mas de 6 puertos analogicos para nuestro proyecto o aplicacion, digamos que queremos controlar 8 parametros usando los puertos analogicos, bien podemos multiplexar las señales usando un multiplexor 8a1 pero ¿como lo hacemos?
Empezemos con el MUX
Los multiplexores son circuitos combinacionales con varias entradas y una única salida de datos, están dotados de entradas de control capaces de seleccionar una, y sólo una, de las entradas de datos para permitir su transmisión desde la entrada seleccionada hacia dicha salida. Una señal que está multiplexada debe demultiplexarse en el otro extremo.
En este ejemplo vamos a emplear un Multiplexor/demultiplexor HEF4051B (datasheet) de 8a1 canales analógicos, usaremos el integrado para seleccionar una de ocho fuentes de tensión conectadas a los pines analogicos. Las entradas analógicas se conectan a los pines Y0 a Y7 del 4051. Hay que asegurarse que el voltaje en los pines de canal de entrada (Y0 a Y7) nunca sea mayor a 15 V.

Alambrado:

El HEF4051B es un multiplexor / demultiplexor de 1 a 8 canales analógico con tres entradas de seleccion (S1 a S3), ocho entradas/salidas independientes (Y0 a Y7), una entrada /salida común (Z) y una entrada de habilitación (E), con E en bajo (LOW) uno de los ocho interruptores se selecciona por S1 a S3. VDD y VSS son las conexiones de tensión de alimentación para las entradas digitales de control. Es mas facil entender para que sirve (E) mirando la tabla de verdad de este mux

Emplee este codigo como ejemplo:
Codigo:
//Retorna 1 valor al pin analogico 0 de Arduino de los 8 parametros (Y0 a Y7) conectados al
// mux dependiendo de pines de control (S1, S2, S3)
const int select [ ] ={2,3,4}; //pines se conectan a las lineas de seleccion del mux (S1,S2,S3)
const int analogPin = 0; //pin analogico conectado al la salida del mux (Z)
int getValue( int channel) { //function que returna el valor del canal seleccionado en el mux
for(int bit = 0; bit < 3; bit++) {
int pin = select [ bit ];
int isBitSet = bitRead(channel, bit);
digitalWrite(pin, isBitSet); }
return analogRead(analogPin); }
void setup ( ) {
Serial.begin(9600); //inicializa monitor serial
for(int bit = 0; bit < 3; bit++)
pinMode(select[ bit ], OUTPUT); // pines de seleccion configurados como salida
}
void loop ( ) {
for(int channel = 0; channel < 8; channel++) { //Imprime cada uno de los canales del mux
int value = getValue(channel);
Serial.print(“Channel “);
Serial.print(channel);
Serial.print(” = “);
Serial.println(value); }
delay (1000); //Espera un segundo
}