Read digital inputs with MUX CD74HC4067

I'm trying to build a simple joystick where once I press a button, my Arduino Leonardo sends a signal to my computer and using a library games can recognize it.
I was able to easily do that using Arduino internal pull up system, but as I needed more buttons I bought a CD74HC4067 multiplexer.
I wired it like the attachment.

In my code I did what I was doing before the MUX and called the Z(SIG) wire as an INPUT_PULLUP, the thing is, I cannot read my input. When I press my push button nothing happens, and if I try using it without the PULLUP I only get noise.

Here's my code:

#define S0 2
#define S1 3
#define S2 4
#define S3 5

#define digital 6

unsigned myDigitalRead(short inputCH, short dig_in);

void setup() {
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);

  digitalWrite(S0, LOW);
  digitalWrite(S1, LOW);
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);

  pinMode(digital,INPUT_PULLUP);

  Serial.begin(9600);
}

void loop() {
  Serial.println(myDigitalRead(0,digital));
}

unsigned myDigitalRead(short inputCH, short dig_in)
{
  
  unsigned digitalVal;

  switch(inputCH)
  {
     case 0:
         digitalWrite(S0,  LOW);
         digitalWrite(S1,  LOW);
         digitalWrite(S2,  LOW);
         digitalWrite(S3,  LOW);
         break; 
     case 1:
         digitalWrite(S0, HIGH);
         digitalWrite(S1,  LOW);
         digitalWrite(S2,  LOW);
         digitalWrite(S3,  LOW);
         break; 
     case 2:
         digitalWrite(S0,  LOW);
         digitalWrite(S1, HIGH);
         digitalWrite(S2,  LOW);
         digitalWrite(S3,  LOW);
         break;  
      case 3:
         digitalWrite(S0, HIGH);
         digitalWrite(S1, HIGH);
         digitalWrite(S2,  LOW);
         digitalWrite(S3,  LOW);
         break; 
      case 4:
         digitalWrite(S0,  LOW);
         digitalWrite(S1,  LOW);
         digitalWrite(S2, HIGH);
         digitalWrite(S3,  LOW);
         break; 
      case 5:
         digitalWrite(S0, HIGH);
         digitalWrite(S1,  LOW);
         digitalWrite(S2, HIGH);
         digitalWrite(S3,  LOW);
         break; 
      case 6:
         digitalWrite(S0,  LOW);
         digitalWrite(S1, HIGH);
         digitalWrite(S2, HIGH);
         digitalWrite(S3,  LOW);
         break; 
      case 7:
         digitalWrite(S0, HIGH);
         digitalWrite(S1, HIGH);
         digitalWrite(S2, HIGH);
         digitalWrite(S3,  LOW);
         break; 
      case 8:
         digitalWrite(S0,  LOW);
         digitalWrite(S1,  LOW);
         digitalWrite(S2,  LOW);
         digitalWrite(S3, HIGH);
         break; 
      case 9:
         digitalWrite(S0, HIGH);
         digitalWrite(S1,  LOW);
         digitalWrite(S2,  LOW);
         digitalWrite(S3, HIGH);
         break; 
      case 10:
         digitalWrite(S0,  LOW);
         digitalWrite(S1, HIGH);
         digitalWrite(S2,  LOW);
         digitalWrite(S3, HIGH);
         break; 
      case 11:
         digitalWrite(S0, HIGH);
         digitalWrite(S1, HIGH);
         digitalWrite(S2,  LOW);
         digitalWrite(S3, HIGH);
         break; 
      case 12:
         digitalWrite(S0,  LOW);
         digitalWrite(S1,  LOW);
         digitalWrite(S2, HIGH);
         digitalWrite(S3, HIGH);
         break; 
      case 13:
         digitalWrite(S0, HIGH);
         digitalWrite(S1,  LOW);
         digitalWrite(S2, HIGH);
         digitalWrite(S3, HIGH);
         break; 
      case 14:
         digitalWrite(S0,  LOW);
         digitalWrite(S1, HIGH);
         digitalWrite(S2, HIGH);
         digitalWrite(S3, HIGH);
         break; 
      case 15:
         digitalWrite(S0, HIGH);
         digitalWrite(S1, HIGH);
         digitalWrite(S2, HIGH);
         digitalWrite(S3, HIGH);
         break;
    
  }

  digitalVal = digitalRead(dig_in);

  return digitalVal; 
}

What can I do to read the buttons input?

First, move MUX EN from the switches to GND. Think of EN as chip select - look up a datasheet for the MUX.

Second, wire the switches as either S1 or S2 in the diagram below. Edit: wire them to the MUX, not to the Arduino.

Retest.

Add a pull up resistor to Pin 6, about 4K7.

Why are you powering it with 3V3? You will damage it by puting 5V signals into it. If it is only a 3V3 device then you need a potential divider on each output from the Arduino to the board. And also a transistor on the output to drive the Arduino and the pull up on the board side.

If it is a 5V capable board then power it with 5V.

See all this:-

switch(inputCH)
  {
     case 0:
         digitalWrite(S0,  LOW);
         digitalWrite(S1,  LOW);
         digitalWrite(S2,  LOW);
         digitalWrite(S3,  LOW);
         break;
     case 1:
         digitalWrite(S0, HIGH);
         digitalWrite(S1,  LOW);
         digitalWrite(S2,  LOW);
         digitalWrite(S3,  LOW);
         break;
     case 2:
         digitalWrite(S0,  LOW);
         digitalWrite(S1, HIGH);
         digitalWrite(S2,  LOW);
         digitalWrite(S3,  LOW);
         break; 
      case 3:
         digitalWrite(S0, HIGH);
         digitalWrite(S1, HIGH);
         digitalWrite(S2,  LOW);
         digitalWrite(S3,  LOW);
         break;
      case 4:
         digitalWrite(S0,  LOW);
         digitalWrite(S1,  LOW);
         digitalWrite(S2, HIGH);
         digitalWrite(S3,  LOW);
         break;
      case 5:
         digitalWrite(S0, HIGH);
         digitalWrite(S1,  LOW);
         digitalWrite(S2, HIGH);
         digitalWrite(S3,  LOW);
         break;
      case 6:
         digitalWrite(S0,  LOW);
         digitalWrite(S1, HIGH);
         digitalWrite(S2, HIGH);
         digitalWrite(S3,  LOW);
         break;
      case 7:
         digitalWrite(S0, HIGH);
         digitalWrite(S1, HIGH);
         digitalWrite(S2, HIGH);
         digitalWrite(S3,  LOW);
         break;
      case 8:
         digitalWrite(S0,  LOW);
         digitalWrite(S1,  LOW);
         digitalWrite(S2,  LOW);
         digitalWrite(S3, HIGH);
         break;
      case 9:
         digitalWrite(S0, HIGH);
         digitalWrite(S1,  LOW);
         digitalWrite(S2,  LOW);
         digitalWrite(S3, HIGH);
         break;
      case 10:
         digitalWrite(S0,  LOW);
         digitalWrite(S1, HIGH);
         digitalWrite(S2,  LOW);
         digitalWrite(S3, HIGH);
         break;
      case 11:
         digitalWrite(S0, HIGH);
         digitalWrite(S1, HIGH);
         digitalWrite(S2,  LOW);
         digitalWrite(S3, HIGH);
         break;
      case 12:
         digitalWrite(S0,  LOW);
         digitalWrite(S1,  LOW);
         digitalWrite(S2, HIGH);
         digitalWrite(S3, HIGH);
         break;
      case 13:
         digitalWrite(S0, HIGH);
         digitalWrite(S1,  LOW);
         digitalWrite(S2, HIGH);
         digitalWrite(S3, HIGH);
         break;
      case 14:
         digitalWrite(S0,  LOW);
         digitalWrite(S1, HIGH);
         digitalWrite(S2, HIGH);
         digitalWrite(S3, HIGH);
         break;
      case 15:
         digitalWrite(S0, HIGH);
         digitalWrite(S1, HIGH);
         digitalWrite(S2, HIGH);
         digitalWrite(S3, HIGH);
         break;
   
  }

you can replace it ALL with:-

if(inputCH & 0x1) digitalWrite(S0, HIGH); else digitalWrite(S0, LOW);
         if(inputCH & 0x2) digitalWrite(S1, HIGH); else digitalWrite(S1, LOW);
         if(inputCH & 0x4) digitalWrite(S2, HIGH); else digitalWrite(S2, LOW);
         if(inputCH & 0x8) digitalWrite(S3, HIGH); else digitalWrite(S3, LOW);

CD74HC4067_Empty.png

OK, diagram shows Vcc for the module connected to 3.3 V. Obvious error, should connect to 5 V on the Leonardo. :astonished:

Grumpy_Mike:
Add a pull up resistor to Pin 6, about 4K7.

Why are you powering it with 3V3? You will damage it by puting 5V signals into it. If it is only a 3V3 device then you need a potential divider on each output from the Arduino to the board. And also a transistor on the output to drive the Arduino and the pull up on the board side.

If it is a 5V capable board then power it with 5V.

See all this:-

switch(inputCH)

{
    case 0:
        digitalWrite(S0,  LOW);
        digitalWrite(S1,  LOW);
        digitalWrite(S2,  LOW);
        digitalWrite(S3,  LOW);
        break;
    case 1:
        digitalWrite(S0, HIGH);
        digitalWrite(S1,  LOW);
        digitalWrite(S2,  LOW);
        digitalWrite(S3,  LOW);
        break;
    case 2:
        digitalWrite(S0,  LOW);
        digitalWrite(S1, HIGH);
        digitalWrite(S2,  LOW);
        digitalWrite(S3,  LOW);
        break;
      case 3:
        digitalWrite(S0, HIGH);
        digitalWrite(S1, HIGH);
        digitalWrite(S2,  LOW);
        digitalWrite(S3,  LOW);
        break;
      case 4:
        digitalWrite(S0,  LOW);
        digitalWrite(S1,  LOW);
        digitalWrite(S2, HIGH);
        digitalWrite(S3,  LOW);
        break;
      case 5:
        digitalWrite(S0, HIGH);
        digitalWrite(S1,  LOW);
        digitalWrite(S2, HIGH);
        digitalWrite(S3,  LOW);
        break;
      case 6:
        digitalWrite(S0,  LOW);
        digitalWrite(S1, HIGH);
        digitalWrite(S2, HIGH);
        digitalWrite(S3,  LOW);
        break;
      case 7:
        digitalWrite(S0, HIGH);
        digitalWrite(S1, HIGH);
        digitalWrite(S2, HIGH);
        digitalWrite(S3,  LOW);
        break;
      case 8:
        digitalWrite(S0,  LOW);
        digitalWrite(S1,  LOW);
        digitalWrite(S2,  LOW);
        digitalWrite(S3, HIGH);
        break;
      case 9:
        digitalWrite(S0, HIGH);
        digitalWrite(S1,  LOW);
        digitalWrite(S2,  LOW);
        digitalWrite(S3, HIGH);
        break;
      case 10:
        digitalWrite(S0,  LOW);
        digitalWrite(S1, HIGH);
        digitalWrite(S2,  LOW);
        digitalWrite(S3, HIGH);
        break;
      case 11:
        digitalWrite(S0, HIGH);
        digitalWrite(S1, HIGH);
        digitalWrite(S2,  LOW);
        digitalWrite(S3, HIGH);
        break;
      case 12:
        digitalWrite(S0,  LOW);
        digitalWrite(S1,  LOW);
        digitalWrite(S2, HIGH);
        digitalWrite(S3, HIGH);
        break;
      case 13:
        digitalWrite(S0, HIGH);
        digitalWrite(S1,  LOW);
        digitalWrite(S2, HIGH);
        digitalWrite(S3, HIGH);
        break;
      case 14:
        digitalWrite(S0,  LOW);
        digitalWrite(S1, HIGH);
        digitalWrite(S2, HIGH);
        digitalWrite(S3, HIGH);
        break;
      case 15:
        digitalWrite(S0, HIGH);
        digitalWrite(S1, HIGH);
        digitalWrite(S2, HIGH);
        digitalWrite(S3, HIGH);
        break;
 
  }




you can replace it ALL with:-


if(inputCH & 0x1) digitalWrite(S0, HIGH); else digitalWrite(S0, LOW);
        if(inputCH & 0x2) digitalWrite(S1, HIGH); else digitalWrite(S1, LOW);
        if(inputCH & 0x4) digitalWrite(S2, HIGH); else digitalWrite(S2, LOW);
        if(inputCH & 0x8) digitalWrite(S3, HIGH); else digitalWrite(S3, LOW);

I did this, I am now using the 5V port and added the pull up resistor, but when I press the buttons nothing happens.
What can I do now?

Take up knitting? :grinning:

So can you now post your modified code and update your diagram to see if it is correct.
Switches should be wired between input and ground, you seem to have them attached to the enable line. I suspect the enable line needs connecting to ground as well.