I hope I can get some help on how to get this to work.
I have multiple Sensors (32 of these) which values I want to read. I am using a master multiplexer HC4051 connected to 4 slave multiplexers, this is my wiring: [here][1]
I tested it using one single multiplexer and it works as intended, but when adding the slave I cannot getting it to work, I am not sure how to code for it.
When using this code:
// 74XX4051 ADDRESS PINS :
#define M_S0 2
#define M_S1 3
#define M_S2 4
#define S_S0 7
#define S_S1 6
#define S_S2 5
// 74XX4051 ANALOG PIN :
#define Z 0
void setup() {
// CONFIGURE ADDRESS PINS
pinMode(M_S0, OUTPUT);
pinMode(M_S1, OUTPUT);
pinMode(M_S2, OUTPUT);
pinMode(S_S0, OUTPUT);
pinMode(S_S1, OUTPUT);
pinMode(S_S2, OUTPUT);
// CONFIGURE SERIAL
Serial.begin(57600);
}
void loop() {
int value;
// LOOP THROUGH ALL THE ADDRESSES OF THE MASTER
for ( byte count = 0; count < 4 ; count++ ) {
// SET THE ADDRESS
digitalWrite(M_S0, bitRead(count, 0) );
digitalWrite(M_S1, bitRead(count, 1) );
digitalWrite(M_S2, bitRead(count, 2) );
// LOOP THROUGH ALL THE ADDRESSES OF THE SLAVES
for ( byte count_1 = 0; count_1 < 32 ; count_1++ ) {
digitalWrite(S_S0, bitRead(count_1, 0) );
digitalWrite(S_S1, bitRead(count_1, 1) );
digitalWrite(S_S2, bitRead(count_1, 2) );
// READ THE ANALOG VALUE
value = (bitRead(count_1, 2), bitRead(count_1, 1), bitRead(count_1, 0));
}
// READ THE ANALOG FOR THE MASTER ADRESSE
value = analogRead(Z);
// SERIAL OUTPUT
// print : ### value
Serial.print(bitRead(count, 2));
Serial.print(bitRead(count, 1));
Serial.print(bitRead(count, 0));
Serial.print(' ');
Serial.println(value);
delay(100);
}
}
I am only getting random readings really (the reading LED for the moisture sensor does not switch on when the reading is done).
What I am doing wrong? Any help is appreciated.
UPDATE:
i updated my code as follows :
// Master moisture sensor pins
#define M_S0 7
#define M_S1 8
#define M_S2 9
// Slave moisture sensor pins
#define S_S0 4
#define S_S1 5
#define S_S2 6
// PIN from the transistor to power the sensors only when doing a reading
int sensorVCC = 13;
// ANALOG PIN :
#define Z 0
void setup() {
Serial.begin(9600);
// CONFIGURE ADDRESS PINS
pinMode(M_S0, OUTPUT);
pinMode(M_S1, OUTPUT);
pinMode(M_S2, OUTPUT);
pinMode(S_S0, OUTPUT);
pinMode(S_S1, OUTPUT);
pinMode(S_S2, OUTPUT);
pinMode(sensorVCC, OUTPUT);
digitalWrite(sensorVCC, LOW);
}
void loop() {
// LOOP THROUGH ALL THE ADDRESSES OF THE MASTER
for (int i = 0; i < 32; i++) {
digitalWrite(sensorVCC, HIGH);
delay(100); //make sure the sensor is powere
digitalWrite(M_S2, i & 0b100000);
digitalWrite(M_S1, i & 0b010000);
digitalWrite(M_S0, i & 0b001000);
digitalWrite(S_S2, i & 0b000100);
digitalWrite(S_S1, i & 0b000010);
digitalWrite(S_S0, i & 0b000001);
delay(1);
int humidityRaw = analogRead(Z); // 1023 to 0 ===> 0 to 100%
int humidityReal = map(humidityRaw, 975, 523, 0, 100);
digitalWrite(sensorVCC, LOW);
Serial.print("Input ");
Serial.print(i);
Serial.print(": ");
Serial.print(humidityReal);
Serial.println(" % ");
delay(1000);
}
}
and this is my output :
Input 0: 100 %
Input 1: 0 %
Input 2: 100 %
Input 3: 0 %
.
.
.
Input 0: 0 %
Input 1: 100 %
Input 2: 0 %
Input 3: 0 %
.
.
.
Input 0: 100 %
Input 1: 0 %
Input 2: 0 %
Input 3: 0 %
.
.
.
ONLY channel 0 is hooked !! .... it seems that it reads with different delays. changing the delay gives me different sequence. what is wrong ?