// --- BIBLIOTECAS ---
//#include <LiquidCrystal_I2C.h> // CONTROLA LCD
#include <EEPROM.h> // LE E SALVA NA EEPROM
#include <Servo.h> // CONTROLA SERVO-MOTORES
// --- VARIAVEIS GLOBAIS ---
// PINOS DO Shift_Register:
#define clk 8 // CLOCK DO Shift_Register
#define latch 9 // TRAVA DO Shift_Register
#define data 10 // DADOS SERIAIS DO Shift_Register
const byte LEVELpin = 6;
const byte BYPASS = 3;
const byte SET = 2;
const byte DOWN = 4;
const byte UP = 5;
const byte SETled = 11;
const byte BYPASSled = 12;
const byte ONled = 13;
const byte Presets = 3; // MAX PRESETS - 1
const byte LevelMax = 180;
const byte LevelMin = 0;
const byte LvlDly = 150;
byte LvlInd;
byte ShReg = 0x00;
byte LvlReg = 0x00;
byte Level[Presets + 1];
bool IsSETUP = 0;
bool IsBYPASS = 0;
byte Preset = 0;
// --- inicia hardware ---
Servo ServoLevel; // CRIA OBJETO SERVO
void setup() {
// --- INICIA Shift_Register ---
pinMode(clk, OUTPUT); // Shift_Registers
pinMode(data, OUTPUT); // Shift_Registers
pinMode(latch, OUTPUT); // Shift_Registers
ServoLevel.attach(LEVELpin); // SERVO PIN
pinMode(BYPASS, INPUT_PULLUP); // TECLA BYPASS
pinMode(SET, INPUT_PULLUP); // TECLA SET
pinMode(DOWN, INPUT_PULLUP); // TECLA DOWN
pinMode(UP, INPUT_PULLUP); // TECLA UP
pinMode(SETled, OUTPUT); // LED SET
pinMode(BYPASSled, OUTPUT); // LED BYPASS
pinMode(ONled, OUTPUT); // LED ON
FirstStart(); // CLEAN
MenRead(); // READ DATA
ServoLevel.write(Level[Preset]); // INITIAL POSITION
digitalWrite(ONled, 1);
ConfigShiftRegister();
}
void loop() {
if (!digitalRead(UP)) { ToUP(); }
if (!digitalRead(DOWN)) { ToDOWN(); }
if (!digitalRead(BYPASS)) { ToBYPASS(); }
if (!digitalRead(SET)) { ToSET(); }
delay(10);
}
void ToUP() {
if (IsSETUP) {
Level[Preset]++;
if ((Level[Preset]) > LevelMax) {
Level[Preset] = LevelMax;
}
} else {
Preset++;
if (Preset > Presets) {
Preset = Presets;
}
}
ConfigShiftRegister();
ServoLevel.write(Level[Preset]);
if (!IsSETUP) {
while (!digitalRead(UP)) {}
} else {
delay(LvlDly);
}
}
void ToDOWN() {
if (IsSETUP) {
Level[Preset]--;
if ((Level[Preset]) > (LevelMax + 1)) {
Level[Preset] = LevelMin;
}
} else {
Preset--;
if (Preset > (Presets + 1)) {
Preset = 0;
}
}
ConfigShiftRegister();
ServoLevel.write(Level[Preset]);
if (!IsSETUP) {
while (!digitalRead(DOWN)) {}
} else {
delay(LvlDly);
}
}
void ToBYPASS() {
if (IsBYPASS) {
IsBYPASS = 0;
} else {
IsBYPASS = 1;
}
digitalWrite(BYPASSled, IsBYPASS);
while (!digitalRead(BYPASS)) {}
}
void ToSET() {
if (IsSETUP) {
IsSETUP = 0;
MenUpdate();
} else {
IsSETUP = 1;
}
digitalWrite(SETled, IsSETUP);
while (!digitalRead(SET)) {}
}
void ConfigShiftRegister() {
LvlInd = map(Level[Preset], LevelMin, LevelMax, 0, 11);
for (byte cont = 0; cont <= Presets; cont++) {
if (cont == Preset) {
bitWrite(ShReg, cont, 1);
} else {
bitWrite(ShReg, cont, 0);
}
}
for (byte cont = 4; cont <= 15; cont++) {
if ((cont - 4) <= LvlInd) {
if (cont <= 7) {
bitWrite(ShReg, cont, 1);
} else {
bitWrite(LvlReg, cont - 8, 1);
}
} else {
if (cont <= 7) {
bitWrite(ShReg, cont, 0);
} else {
bitWrite(LvlReg, cont - 8, 0);
}
}
}
digitalWrite(latch, LOW);
shiftOut(data, clk, LSBFIRST, ShReg);
shiftOut(data, clk, LSBFIRST, LvlReg);
digitalWrite(latch, HIGH);
}
void MenRead() {
for (byte cont = 0; cont <= Presets; cont++) {
Level[cont] = EEPROM.read(cont);
}
}
void MenUpdate() {
for (byte cont = 0; cont <= Presets; cont++) {
EEPROM.update(cont, (Level[cont]));
}
}
// --- RESET EEPROM PRIMEIRO START ---
void FirstStart() {
if (EEPROM.read(Presets + 1) != B01111011) { // VERIFICA BYTE KEY DO RESET
digitalWrite(BYPASSled, 1);
digitalWrite(SETled, 1);
for (byte cont = 0; cont <= Presets; cont++) {
EEPROM.update(cont, 90);
}
EEPROM.update(Presets + 1, B01111011); // GRAVA BYTE VERIFICADOR DE AUTORESET
}
delay(1000);
digitalWrite(BYPASSled, 0);
digitalWrite(SETled, 0);
}