#include <math.h>
const char data = 11;
const char clock = 12;
const char latch = 8;
const char startButton = 2; // przerwanie 0
const char stopButton = 3; // przerwanie 1
const char selectMode_1 = 4;
const char selectMode_2 = 5; // zmienne do wyboru trybu swiecenia - max. 4 mozliwosci
const unsigned int setDelay = 50; // opoznienie w ms
char statusOfWork = 0; // 0 - stop; 1 - start
void startWorking();
void stopWorking();
void mode_1();
void mode_2();
void mode_3();
void setup()
{
pinMode(data, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(latch, OUTPUT);
pinMode(startButton, INPUT_PULLUP);
pinMode(stopButton, INPUT_PULLUP);
pinMode(selectMode_1, INPUT);
pinMode(selectMode_2, INPUT);
// obsługa przerwania 0 - start - gdy na wejsciu startButton pojawi się zbocze opadające
attachInterrupt(digitalPinToInterrupt(startButton), startWorking, FALLING);
// obsługa przerwania 1 - stop - gdy na wejsciu stopButton pojawi się zbocze opadajace
attachInterrupt(digitalPinToInterrupt(stopButton), stopWorking, FALLING);
}
// infinite loop
void loop()
{
if (statusOfWork)
{
if (digitalRead(selectMode_1) == 0 && digitalRead(selectMode_2) == 0)
{
mode_1();
}
else if (digitalRead(selectMode_1) == 0 && digitalRead(selectMode_2) == 1)
{
mode_2();
}
else if (digitalRead(selectMode_1) == 1 && digitalRead(selectMode_2) == 0)
{
mode_3();
}
}
}
void startWorking() // obsługa funkcji przerwania 0
{
statusOfWork = 1; // status pracy
}
void stopWorking() // obsługa funkcji przerwania 1
{
statusOfWork = 0; // status stopu
}
void mode_1() // tryb 1
{
for(int i = 0; i < 9; i++)
{
digitalWrite(latch, LOW);
int value = pow( 2, i );
if (value == 2) continue;
shiftOut(data, clock, MSBFIRST, value);
digitalWrite(latch, HIGH);
if (i == 8) delay(setDelay*3);
else delay(setDelay);
}
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, 0);
digitalWrite(latch, HIGH);
delay(setDelay*10);
}
void mode_2() // tryb 2
{
for(int i = -1; i < 9; i++)
{
digitalWrite(latch, LOW);
int value = pow( 2, i );
if (value == 2) continue;
if (i == -1) value = 0;
shiftOut(data, clock, MSBFIRST, value);
digitalWrite(latch, HIGH);
delay(setDelay);
}
for(int i = 8; i >= -1; i--)
{
digitalWrite(latch, LOW);
int value = pow( 2, i );
if (value == 2) continue;
if (i == -1) value = 0;
shiftOut(data, clock, MSBFIRST, value);
digitalWrite(latch, HIGH);
delay(setDelay);
}
delay(setDelay*5);
}
void mode_3() // tryb 3
{
for(int i = -1; i < 9; i++)
{
digitalWrite(latch, LOW);
int value = pow( 2, i );
if (value == 2) continue;
shiftOut(data, clock, MSBFIRST, value);
digitalWrite(latch, HIGH);
delay(setDelay);
}
delay(setDelay*3);
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, 0);
digitalWrite(latch, HIGH);
}