hello, im struggling a little to understand this code for esp32 that reads the pin states of 4 shift registers(74hc165).
my wiring(except its expanded to 9 registers, following exactly the same pattern the 4 registers follow):
i need to expand the code to read my 9 shift registers rather than the 4 the code was designed for:
const byte latchPin = 14; // to latch the inputs into the registers
const byte clockPin = 13; // I choose the SCK pin
const byte dataPin = 12; // I choose the MISO pin
uint32_t oldOptionSwitch = 0; // previous state of all the inputs
const int pulseWidth = 10; // pulse width in microseconds
void setup ()
{
Serial.begin( 115200);
Serial.println( "Turn on and off the switches");
Serial.println( "Top row is switch 0 (right) to switch 7 (left)");
Serial.println( "Second row is 8 to 15, and so on");
pinMode( clockPin, OUTPUT); // clock signal, idle LOW
pinMode( latchPin, OUTPUT); // latch (copy input into registers), idle HIGH
digitalWrite( latchPin, HIGH);
}
void loop ()
{
// Give a pulse to the parallel load latch of all 74HC165
digitalWrite( latchPin, LOW);
delayMicroseconds( pulseWidth);
digitalWrite( latchPin, HIGH);
// Reading one 74HC165 at a time and combining them into a 32 bit variable
// The last 74HC165 is at the bottom, but the switches start numbering
// at the top. So the first byte has to be shifted into the highest place.
uint32_t optionSwitch = 0;
for ( int i = 24; i >= 0; i -= 8)
{
optionSwitch |= ((uint32_t) ReadOne165()) << i;
}
for ( int i = 0; i < 32; i++)
{
if ( bitRead( optionSwitch, i) != bitRead( oldOptionSwitch, i))
{
Serial.print( "Switch ");
if ( i < 10)
Serial.print( " ");
Serial.print( i);
Serial.print( " is now ");
Serial.println( bitRead( optionSwitch, i) == 0 ? "down ↓" : "up ↑");
}
}
oldOptionSwitch = optionSwitch;
delay( 25); // slow down the sketch to avoid switch bounce
}
// The ReadOne165() function reads only 8 bits,
// because of the similar functions shiftIn() and SPI.transfer()
// which both use 8 bits.
//
// The shiftIn() can not be used here, because the clock is set idle low
// and the shiftIn() makes the clock high to read a bit.
// The 74HC165 require to read the bit first and then give a clock pulse.
//
byte ReadOne165()
{
byte ret = 0x00;
// The first one that is read is the highest bit (input D7 of the 74HC165).
for ( int i = 7; i >= 0; i--)
{
if ( digitalRead( dataPin) == HIGH)
bitSet( ret, i);
digitalWrite( clockPin, HIGH);
delayMicroseconds( pulseWidth);
digitalWrite( clockPin, LOW);
}
return ( ret);
}
code taken from this tutorial, except i am using an esp32 devkit v1, not arduino uno.
to read 9 registers (72 i/o's) is it as simple as changing:
for ( int i = 0; i < 32; i++)
{
if ( bitRead( optionSwitch, i) != bitRead( oldOptionSwitch, i))......
to:
for ( int i = 0; i < 72; i++)
{
if ( bitRead( optionSwitch, i) != bitRead( oldOptionSwitch, i))......
optionSwitch is a 32 bits variable, so it can hold only 32 buttons states.
You cannot just increase the iterations of the for loop.
You have to use another method of storing the buttons states. The easiest way is to use an array, where each element of the array contains one button state. It will waste memory, using at least one byte per button state, instead of one bit.