Hi all,
I'm working on multiplexing with a CD74HC4051E chip in order to read buttons. I am using the 4051 because after I get this circuit down I will use the concept to read analog values from piezo sensors for MIDI drum triggers.
The problem I'm having is that my buttons are sending unexpected messages. I know this because I only have one pin on the 4051 hooked up to a single button, the rest of the 7 pins are tied to ground. So when I press this one button it gives me a different value every time even though it should only be giving me HIGH from pin 0.
Output:
Pressed: 6
Pressed: 1
Pressed: 3
Pressed: 2
Pressed: 1
Pressed: 1
Code:
// Kerl Mera //
// Multiplexing button to serial monitor
const int s0 = 2; // Digital select pins
const int s1 = 3;
const int s2 = 4;
const int a0 = A0; // Analog read pin
boolean buttonActive[] = {false, false, false, false, false, false, false, false};
int buttonState[] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW};
int lastButtonState[] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW}; // the previous reading from the input pin
long lastDebounceTime[] = {0, 0, 0, 0, 0, 0, 0, 0}; // the last time the output pin was toggled
long debounceDelay = 50; // the debounce time;
void setup() {
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, LOW);
Serial.begin(9600);
}
void loop() {
for(int i = 0; i < 7; i++) {
buttonState[i] = cdRead(i);
if (buttonState[i] == 1 && lastButtonState[i] == 0) {
lastDebounceTime[i] = millis();
}
if((millis() - lastDebounceTime[i]) > debounceDelay) {
if(buttonState[i] == HIGH && buttonActive[i] == false) {
Serial.print("Pressed: ");
Serial.println((int) i);
buttonActive[i] = true;
}
else if(buttonState[i] == LOW) {
buttonActive[i] = false;
}
}
lastButtonState[i] = buttonState[i];
}
}
void cdSelect(unsigned int ch) {
switch (ch) {
case 0:
digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, LOW);
break;
case 1:
digitalWrite(s0, HIGH);
digitalWrite(s1, LOW);
digitalWrite(s2, LOW);
break;
case 2:
digitalWrite(s0, LOW);
digitalWrite(s1, HIGH);
digitalWrite(s2, LOW);
break;
case 3:
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
digitalWrite(s2, LOW);
break;
case 4:
digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, HIGH);
break;
case 5:
digitalWrite(s0, HIGH);
digitalWrite(s1, LOW);
digitalWrite(s2, HIGH);
break;
case 6:
digitalWrite(s0, LOW);
digitalWrite(s1, HIGH);
digitalWrite(s2, HIGH);
break;
case 7:
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
digitalWrite(s2, HIGH);
break;
default:
break;
}
}
unsigned short cdRead(unsigned int ch) {
cdSelect(ch);
return analogRead(a0); // Read the analog pin
}
To go over the circuit:
Digital pins 2,3,4 TO 4051 select pins 0, 1, 2
Analog pin 0 TO 4051 Z pin
y0 on 4051 TO button
VCC on 4051 TO 5V
Everything else TO GROUND
