Hello,
I'm trying to use momentary buttons as ON/OFF on 3 cascaded 74HC4067 that I've copied from the Mux shield on a prototipe breadboard.
(I have also buy the shield from mayhewlabs but I'm still waiting it from the US so I cloned it for playing a bit)
I've used this code:
//Mux_Shield_DigitalIn_Example
//http://mayhewlabs.com/arduino-mux-shield
/*
This example shows how to read and store all pins as digital inputs into arrays and print the results over serial.
Switches should be connected from ground to the pin input.
Internal pull-up resistors are used on the inputs, so when a switch is depressed, the reading
changes from 1 to 0, but to correct this logic, the digitalRead function is corrected with '!'
to actually store a 1 when a switch is depressed.
To simplify this code further, one might use nested for loops or function calls.
*/
//Give convenient names to the control pins
#define CONTROL0 5
#define CONTROL1 4
#define CONTROL2 3
#define CONTROL3 2
//Create arrays for data from the the MUXs
//See the Arduino Array Reference: http://www.arduino.cc/en/Reference/Array
int mux0array[16];
int mux1array[16];
int mux2array[16];
void setup()
{
//Set MUX control pins to output
pinMode(CONTROL0, OUTPUT);
pinMode(CONTROL1, OUTPUT);
pinMode(CONTROL2, OUTPUT);
pinMode(CONTROL3, OUTPUT);
//Open the serial port at 28800 bps
Serial.begin(9600);
//Set analog pins to digital input
pinMode(14, INPUT);
pinMode(15, INPUT);
pinMode(16, INPUT);
//Turn on pullup resistors
digitalWrite(14, HIGH);
digitalWrite(15, HIGH);
digitalWrite(16, HIGH);
}
void loop()
{
//This for loop is used to scroll through and store the 16 inputs on the FIRST multiplexer
for (int i=0; i<16; i++)
{
//The following 4 commands set the correct logic for the control pins to select the desired input
//See the Arduino Bitwise AND Reference: http://www.arduino.cc/en/Reference/BitwiseAnd
//See the Aruino Bitshift Reference: http://www.arduino.cc/en/Reference/Bitshift
digitalWrite(CONTROL0, (i&15)>>3);
digitalWrite(CONTROL1, (i&7)>>2);
digitalWrite(CONTROL2, (i&3)>>1);
digitalWrite(CONTROL3, (i&1));
//Read and store the input
//Since internal pullup is on, the pin goes low on changing, so the value needs to be flipped from 0 to 1 (!)
mux0array[i] = !digitalRead(14);
}
//This for loop is used to scroll through the SECOND multiplexer
for (int i=0; i<16; i++)
{
digitalWrite(CONTROL0, (i&15)>>3);
digitalWrite(CONTROL1, (i&7)>>2);
digitalWrite(CONTROL2, (i&3)>>1);
digitalWrite(CONTROL3, (i&1));
mux1array[i] = !digitalRead(15);
}
//This for loop is used to scroll through the THIRD multiplexer
for (int i=0; i<16; i++)
{
digitalWrite(CONTROL0, (i&15)>>3);
digitalWrite(CONTROL1, (i&7)>>2);
digitalWrite(CONTROL2, (i&3)>>1);
digitalWrite(CONTROL3, (i&1));
mux2array[i] = !digitalRead(16);
}
//The following lines are for printing out results of array0
Serial.print("mux0array: ");
for (int i=0; i<16; i++)
{
Serial.print(mux0array[i]);
Serial.print("-");
}
Serial.println(); //line feed
//The following lines are for printing out results of array1
Serial.print("mux1array: ");
for (int i=0; i<16; i++)
{
//Serial.print(mux1array[i]);
//Serial.print("-");
}
//Serial.println();
//The following lines are for printing out results of array2
Serial.print("mux2array: ");
for (int i=0; i<16; i++)
{
//Serial.print(mux2array[i]);
//Serial.print("-");
}
//Serial.println();
}
Running the program everithing works fine and serial show me the button pressed with a 1. The problem is that when I release the button the status go back to 0. What I really need is that I press button and status of that button goes 1, pressing again bring it to 0 and viceversa.
I havbe try to create an array to store the old values and compare with the new ones, but if I leave the button pressed it change status continuosly.
Any help?