/*
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");
}