#include <FastLED.h>
#include<EEPROM.h>
#ifndef MultiShiftRegister_h
#define MultiShiftRegister_h
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
class MultiShiftRegister {
int m_latchPin, m_clockPin, m_dataPin, m_totalOutputPins, m_totalShiftRegisters;
int* m_data;
public:
MultiShiftRegister (int, int, int, int);
~MultiShiftRegister();
void set_shift(int);
void set(int);
void clear_shift(int);
void clear(int);
void shift();
private:
int getRegisterPin(int);
int getRegisterNumber(int);
};
#endif
MultiShiftRegister::MultiShiftRegister(int a_totalShiftRegisters, int a_latchPin, int a_clockPin, int a_dataPin) {
m_latchPin = a_latchPin;
m_clockPin = a_clockPin;
m_dataPin = a_dataPin;
m_totalShiftRegisters = a_totalShiftRegisters;
m_totalOutputPins = a_totalShiftRegisters * 8;
m_data = new int[a_totalShiftRegisters]();
}
MultiShiftRegister::~MultiShiftRegister(void) {
delete[] m_data;
}
void MultiShiftRegister::set_shift(int outputPin) {
set(outputPin);
shift();
}
void MultiShiftRegister::clear_shift(int outputPin) {
clear(outputPin);
shift();
}
void MultiShiftRegister::set(int outputPin) {
int registerPin = getRegisterPin(outputPin);
int registerNumber = getRegisterNumber(outputPin);
bitSet(m_data[registerNumber], registerPin);
}
void MultiShiftRegister::clear(int outputPin) {
int registerPin = getRegisterPin(outputPin);
int registerNumber = getRegisterNumber(outputPin);
bitClear(m_data[registerNumber], registerPin);
}
int MultiShiftRegister::getRegisterPin(int outputPin) {
return outputPin % 8;
}
int MultiShiftRegister::getRegisterNumber(int outputPin) {
return outputPin / 8;
}
void MultiShiftRegister::shift() {
digitalWrite(m_latchPin, LOW);
for (int i = m_totalShiftRegisters - 1; i >= 0; i--) {
shiftOut(m_dataPin, m_clockPin, MSBFIRST, m_data[i]);
}
digitalWrite(m_latchPin, HIGH);
}
#define NUMPIXELS 400
int NUM_LEDS = 100;
int sens1 = 6;
int sens2 = 7;
CRGBArray<NUMPIXELS> leds;
int latchPin = 11;
int clockPin = 12;
int dataPin = 8;
int steps = 10;
int l = steps;
int n = 0;
int num = NUM_LEDS;
bool a = false;
bool z = false;
int r = 255;
int b = 0;
int g = 0;
MultiShiftRegister msr (4, latchPin, clockPin, dataPin);
void setup() {
delay(1000);
Serial.begin(9600);
pinMode(sens1, INPUT);
pinMode(sens2, INPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
msr.shift();
FastLED.addLeds<NEOPIXEL, 5>(leds, NUMPIXELS);
fill_solid(leds, NUM_LEDS, CRGB(0, 0, 0));
FastLED.show();
digitalWrite(sens1, LOW);
digitalWrite(sens2, LOW);
}
void loop() {
if (digitalRead(sens1) == HIGH ) {
Serial.println("Sensor1 ON");
FastLED.clear();
OnUp();
check_time();
OffUp();
}
else if (digitalRead(sens2) == HIGH ) {
Serial.println("Sensor2 ON");
FastLED.clear();
OnDown();
check_time();
OffDown();//function call
}
}
void OnUp() {
a = false;
n=0;
l=steps;
num=NUM_LEDS;
for (int i = 0; i <= NUM_LEDS ; i++) {
leds[i] = CRGB(r, g, b);
FastLED.show();
delay(10);
if (n <= steps) {
if (i % 8 == 0) {
Serial.print(n);
Serial.print("--");
msr.set_shift(n++);
}
}
if (digitalRead(sens2) == HIGH) {
a = true;
}
if (a) {
leds[num--] = CRGB(r, g, b);
FastLED.show();
if (i % 8 == 0) {
Serial.print(l);
Serial.print("**");
msr.set_shift(l--);
}
if (i >= num and n >= l) {
break;
}
}
}
} //end OnUp
void OffUp() {
int sta = 0;
for (int i = 0; i <= NUM_LEDS; i++) {
leds[i] = CRGB(0, 0, 0);
FastLED.show();
if (i % 8 == 0) {
msr.clear_shift(sta++);
}
delay(10);
}
} //End OffUp
void OnDown() {
int num = 0;
z = false;
int n =0 ;
int l = steps;
for (int i = NUM_LEDS; i >= 0 ; i--) {
leds[i] = CRGB(r, g, b);
FastLED.show();
delay(10);
if (l >= 0) {
if (i % 8 == 0) {
Serial.print(l);
Serial.print("--");
msr.set_shift(l--);
}
}
if (digitalRead(sens1) == HIGH) {
z = true;
}
if (z) {
leds[num++] = CRGB(r, g, b);
FastLED.show();
if (i % 8 == 0) {
Serial.print(n);
Serial.print("**");
msr.set_shift(n++);
}
if (num >= i and n >= l) {
break;
}
}
}
}//End OfnDown
void OffDown() {
for (int i = NUM_LEDS; i >= 0; i--) {
leds[i] = CRGB(0, 0, 0);
if (i % 8 == 0) {
msr.clear_shift(l++);
}
FastLED.show();
delay(10);
}
}//End OffDown
void check_time() {
for (int t = 0; t <= 2 ; t++) {
Serial.println(t);
delay(1000);
}
}