/*
   SN74HC165N_shift_reg

   Program to shift in the bit values from a SN74HC165N 8-bit
   parallel-in/serial-out shift register.

   This sketch demonstrates reading in 16 digital states from a
   pair of daisy-chained SN74HC165N shift registers while using
   only 4 digital pins on the Arduino.

   You can daisy-chain these chips by connecting the serial-out
   (Q7 pin) on one shift register to the serial-in (Ds pin) of
   the other.

   Of course you can daisy chain as many as you like while still
   using only 4 Arduino pins (though you would have to process
   them 4 at a time into separate unsigned long variables).

*/

/* How many shift register chips are daisy-chained.
*/
#include <SoftwareSerial.h>//per la comunizazione con modulo BT

#define HC05RxPin 4                      // "RXD" Pin on HC05
#define HC05TxPin 5                      // "TXD" Pin on HC05
//const byte HC12SetPin = 6;                      // "SET" Pin on HC05

SoftwareSerial BT(HC05RxPin, HC05TxPin); //Rx, Tx

int ritardo_j;
unsigned long tempo_j;
byte j; //contatore

//--------------------------sezione shiftin

#define NUMBER_OF_SHIFT_CHIPS  3

/* Width of data (how many ext lines).
*/
#define DATA_WIDTH   NUMBER_OF_SHIFT_CHIPS * 8

/* Width of pulse to trigger the shift register to read and latch.
*/
#define PULSE_WIDTH_USEC   5

/* Optional delay between shift register reads.
*/
#define POLL_DELAY_MSEC   1

/* You will need to change the "int" to "long" If the
   NUMBER_OF_SHIFT_CHIPS is higher than 2.
*/
#define BYTES_VAL_T unsigned long

int ploadPin        = 8;  // Connects to PL Parallel load pin the 165
int clockEnablePin  = 9;  // Connects to CE Clock Enable pin the 165
int dataPin         = 11; // Connects to Q7 the Q7 pin the 165
int clockPin        = 12; // Connects to CP the Clock pin the 165

BYTES_VAL_T pinValues;
BYTES_VAL_T oldPinValues;

char reportSens[9];
char reportCount[2];

void setup()
{
  Serial.begin(9600);

  /* Initialize our digital pins...
  */
  pinMode(ploadPin, OUTPUT);
  pinMode(clockEnablePin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, INPUT);

  digitalWrite(clockPin, LOW);
  digitalWrite(ploadPin, HIGH);

  /* Read in and display the pin states at startup.
  */
  pinValues = read_shift_regs();
  display_pin_values();
  oldPinValues = pinValues;

  BT.begin(9600);
  reportSens[26];
  reportCount[2];
  tempo_j = 0;
  ritardo_j = 1000;
  j = 0;
}

void loop()
{
  /* Read the state of all zones.
  */
  pinValues = read_shift_regs();

  /* If there was a chage in state, display which ones changed.
  */
  if (pinValues != oldPinValues)
  {
    Serial.print("*Pin value change detected*\r\n");
    display_pin_values();
    oldPinValues = pinValues;

    Serial.println("send-this pinValues");
    Serial.println(pinValues, BIN);
    sprintf(reportSens, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", pinValues);//nome del vettore, formato dati, dati
  }

  delay(POLL_DELAY_MSEC);

  //-------------------------------------------sezione BT
  //trasmissione contatore

  if ( millis() >= tempo_j + ritardo_j)
  {
    j++;
    tempo_j = millis();

    //formazione vettore dati e trasmissione
    // sprintf(reportSens, "%d,%d,%d", statoDX[1], i, statoSX[1]);//nome del vettore, formato dati, dati
    sprintf(reportCount, "%d", j);//nome del vettore, formato dati, dati

    Serial.println("trasmetto a BT il contatore");
    Serial.println(reportCount);

    // BT.println(reportSens);

    //azzero il contatore

    if ( j == 9 )
    {
      j = 0;
    }
  } 
}

//funzioni lettura shiftregister

/* This function is essentially a "shift-in" routine reading the
   serial Data from the shift register chips and representing
   the state of those pins in an unsigned integer (or long).
*/
BYTES_VAL_T read_shift_regs()
{
  long bitVal;
  BYTES_VAL_T bytesVal = 0;

  /* Trigger a parallel Load to latch the state of the data lines,
  */
  digitalWrite(clockEnablePin, HIGH);
  digitalWrite(ploadPin, LOW);
  delayMicroseconds(PULSE_WIDTH_USEC);
  digitalWrite(ploadPin, HIGH);
  digitalWrite(clockEnablePin, LOW);

  /* Loop to read each bit value from the serial out line
     of the SN74HC165N.
  */
  for (int i = 0; i < DATA_WIDTH; i++)
  {
    bitVal = digitalRead(dataPin);

    /* Set the corresponding bit in bytesVal.
    */
    bytesVal |= (bitVal << ((DATA_WIDTH - 1) - i));

    /* Pulse the Clock (rising edge shifts the next bit).
    */
    digitalWrite(clockPin, HIGH);
    delayMicroseconds(PULSE_WIDTH_USEC);
    digitalWrite(clockPin, LOW);
  }

  return (bytesVal);
}

/* Dump the list of zones along with their current status.
*/
void display_pin_values()
{
  Serial.print("Pin States:\r\n");

  for (int i = 0; i < DATA_WIDTH; i++)
  {
    Serial.print("  Pin-");
    Serial.print(i);
    Serial.print(": ");
    if ((pinValues >> i) & 1)
      Serial.print("HIGH");
    else
      Serial.print("LOW");

    Serial.print("\r\n");
  }

  Serial.print("\r\n");
}

74HC165
74HC165
74HC165