#include <Bounce2.h>
const int dataPin = 5; /* SI */
const int clockPin = 7; /* SCK */
const int latchPin = 6; /* RCK */
const int buttonPin4 = 4; /* Botão */
const int buttonPin3 = 3; /* Novo botão */
Bounce debouncer1 = Bounce(); // Instância do debounce para o botão 1
Bounce debouncer2 = Bounce(); // Instância do debounce para o botão 2
int currentState = 0; // Estado atual
bool button2Pressed = false; // Estado do botão 2
uint8_t currentPattern = 0B11111111; // Padrão atual
// Padrões de dados para enviar
uint8_t patterns[] = {
0B11111111, // Desligado
0B01111111, // 1
0B10111111, // 2
0B11011111, // 3
0B11101111, // 4
0B11110111, // 5
0B11111011, // 6
0B11111101, // 7
0B11111110, // 8
};
unsigned long lastDebounceTime = 0; // Tempo da última mudança de estado
unsigned long debounceDelay = 50;
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(buttonPin4, INPUT_PULLUP);
pinMode(buttonPin3, INPUT_PULLUP);
// Configura o debounce
debouncer1.attach(buttonPin4);
debouncer1.interval(debounceDelay);
debouncer2.attach(buttonPin3);
debouncer2.interval(debounceDelay);
// Inicializa com o padrão desligado
sendData(currentPattern);
}
void sendData(uint8_t pattern) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, pattern);
digitalWrite(latchPin, HIGH);
}
void loop() {
debouncer1.update(); // Atualiza o estado do botão 1
debouncer2.update(); // Atualiza o estado do botão 2
if (debouncer1.fell()) { // Verifica se o botão 1 foi pressionado
unsigned long currentTime = millis();
if (currentTime - lastDebounceTime > debounceDelay) {
// Incrementa o estado atual
currentState = (currentState + 1) % (sizeof(patterns) / sizeof(patterns[0]));
// Atualiza o padrão atual
currentPattern = patterns[currentState];
// Combina com o estado do botão 2, se estiver pressionado
if (button2Pressed) {
currentPattern &= patterns[5];
}
// Envia o padrão atual
sendData(currentPattern);
lastDebounceTime = currentTime; // Atualiza o tempo do último debounce
}
}
if (debouncer2.fell()) { // Verifica se o botão 2 foi pressionado
button2Pressed = !button2Pressed; // Alterna o estado do botão 2
if (button2Pressed) {
currentPattern &= patterns[5]; // Combina o padrão atual com o padrão 5
} else {
currentPattern = patterns[currentState]; // Retorna ao padrão atual do botão 1
}
sendData(currentPattern); // Envia o padrão combinado
}
// Gerencia os estados usando switch
switch (currentState) {
case 0:
currentPattern = patterns[0]; // Deslogado
break;
case 1:
currentPattern = patterns[1]; // 1
break;
case 2:
currentPattern = patterns[2]; // 2
break;
case 3:
currentPattern = patterns[3]; // 3
break;
case 4:
currentPattern = patterns[4]; // 4
break;
case 5:
currentPattern = patterns[5]; // 5
break;
case 6:
currentPattern = patterns[6]; // 6
break;
case 7:
currentPattern = patterns[7]; // 7
break;
case 8:
currentPattern = patterns[8]; // 8
break;
default:
currentState = 0; // Reinicia o estado se ultrapassar o tamanho do array
currentPattern = patterns[0];
break;
}
// Combina com o estado do botão 2, se estiver pressionado
if (button2Pressed) {
currentPattern &= patterns[5];
}
sendData(currentPattern); // Envia o padrão atualizado
}