//this code allows you to use the 74HC595 in combination with 8 LEDs as a type of Bar Graph
//it could be used to display simple values like a volume control or in comination with Rotary Encoders
class MUX74HC595 {
private:
byte _dataPin;
byte _clockPin;
byte _latchPin;
public:
MUX74HC595(byte dataPin, byte clockPin, byte latchPin){
_dataPin = dataPin;
_clockPin = clockPin;
_latchPin = latchPin;
}
void init(){
pinMode(_dataPin, OUTPUT);
pinMode(_clockPin, OUTPUT);
pinMode(_latchPin, OUTPUT);
}
void draw(int value){
byte pattern = 0b00000000;
for (unsigned int i = 0; i < value; ++i) {
pattern |= (1 << i);
}
digitalWrite(_latchPin, LOW);
shiftOut(_dataPin, _clockPin, LSBFIRST, pattern);
digitalWrite(_latchPin, HIGH);
}
};
/*-------------------------------------------------------------------------------*/
#define DS1 2 /* datapin */
#define SHCP1 3 /* clockPin */
#define STCP1 4 /* latchPin */
#define DS2 5
#define SHCP2 7
#define STCP2 6
MUX74HC595 mux1(DS1,SHCP1,STCP1);
MUX74HC595 mux2(DS2,SHCP2,STCP2);
byte val1 = 4;
byte val2 = 4;
void setup() {
Serial.begin(9600);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
mux1.init();
mux2.init();
}
void loop() {
if(digitalRead(9) == LOW && val1 < 8){
val1++;
delay(200);
}
if(digitalRead(8) == LOW && val1 > 0){
val1--;
delay(200);
}
if(digitalRead(10) == LOW && val2 < 8){
val2++;
delay(200);
}
if(digitalRead(11) == LOW && val2 > 0){
val2--;
delay(200);
}
mux1.draw(val1);
mux2.draw(val2);
}