#include <Wire.h>
#include <JC_Button.h>
const uint8_t MANUAL = 1; // Define MANUAL mode as 1
const uint8_t AUTOMATIC = 2; // Define AUTOMATIC mode as 2
const int BTN_MEM_PIN[] = {17, 18, 19};
const int BTN_SET_MEM = 20;
const int up = 21;
const int dn = 22;
const int Tr = 23;
const int Rtr = 24;
const int tiltr = 25;
const int tiltl = 26;
const int backup = 27;
const int backdn = 28;
const int slide = 29;
const int slideb = 30;
const int lock = 31;
const int unlock = 32;
const int BUTTON_N = 33;
const int BUTTON_R = 34;
const int redLED = 35;
const int yellowLED = 36;
const int greenLED = 37;
const int LED_1 = 38;
const int LED_2 = 39;
#define ACCURACY 40
#define DEBOUNCE_MS 10
#define PULLUP false
#define INVERT false
uint8_t MODE = MANUAL; // Default mode is MANUAL
#define SLAVE_ADDRESS 8
Button btnExtend(up, PULLUP, INVERT, DEBOUNCE_MS);
Button btnRetract(dn, PULLUP, INVERT, DEBOUNCE_MS);
Button btnExtend1(Tr, PULLUP, INVERT, DEBOUNCE_MS);
Button btnRetract1(Rtr, PULLUP, INVERT, DEBOUNCE_MS);
Button btnExtend2(tiltr, PULLUP, INVERT, DEBOUNCE_MS);
Button btnRetract2(tiltl, PULLUP, INVERT, DEBOUNCE_MS);
Button btnExtend3(backup, PULLUP, INVERT, DEBOUNCE_MS);
Button btnRetract3(backdn, PULLUP, INVERT, DEBOUNCE_MS);
Button btnExtend4(slide, PULLUP, INVERT, DEBOUNCE_MS);
Button btnRetract4(slideb, PULLUP, INVERT, DEBOUNCE_MS);
Button btnExtend5(lock, PULLUP, INVERT, DEBOUNCE_MS);
Button btnRetract5(unlock, PULLUP, INVERT, DEBOUNCE_MS);
Button btnSetPos(BTN_SET_MEM, PULLUP, INVERT, DEBOUNCE_MS);
Button btnPos1(BTN_MEM_PIN[0], PULLUP, INVERT, DEBOUNCE_MS);
Button btnPos2(BTN_MEM_PIN[1], PULLUP, INVERT, DEBOUNCE_MS);
Button btnPos3(BTN_MEM_PIN[2], PULLUP, INVERT, DEBOUNCE_MS);
const unsigned long DEBOUNCE_DELAY = 50;
unsigned long lastDebounceTimeN = 0;
unsigned long lastDebounceTimeR = 0;
bool buttonNState = HIGH;
bool lastButtonNState = HIGH;
bool buttonRState = HIGH;
bool lastButtonRState = HIGH;
bool loop1Active = true;
void readButtons();
void setup() {
Wire.begin(); // Join I2C bus as master
pinMode(BUTTON_N, INPUT_PULLUP);
pinMode(BUTTON_R, INPUT_PULLUP);
pinMode(redLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
digitalWrite(redLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(greenLED, LOW);
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, LOW);
pinMode(up, INPUT_PULLUP);
pinMode(dn, INPUT_PULLUP);
pinMode(Tr, INPUT_PULLUP);
pinMode(Rtr, INPUT_PULLUP);
pinMode(tiltr, INPUT_PULLUP);
pinMode(tiltl, INPUT_PULLUP);
pinMode(backup, INPUT_PULLUP);
pinMode(backdn, INPUT_PULLUP);
pinMode(slide, INPUT_PULLUP);
pinMode(slideb, INPUT_PULLUP);
pinMode(lock, INPUT_PULLUP);
pinMode(unlock, INPUT_PULLUP);
pinMode(BTN_SET_MEM, INPUT_PULLUP);
pinMode(BTN_MEM_PIN[0], INPUT_PULLUP);
pinMode(BTN_MEM_PIN[1], INPUT_PULLUP);
pinMode(BTN_MEM_PIN[2], INPUT_PULLUP);
}
void loop() {
bool readingN = digitalRead(BUTTON_N);
bool readingR = digitalRead(BUTTON_R);
if (readingN != lastButtonNState) {
lastDebounceTimeN = millis();
}
if (readingR != lastButtonRState) {
lastDebounceTimeR = millis();
}
if ((millis() - lastDebounceTimeN) > DEBOUNCE_DELAY) {
if (readingN != buttonNState) {
buttonNState = readingN;
if (buttonNState == LOW) {
loop1Active = true;
}
}
}
if ((millis() - lastDebounceTimeR) > DEBOUNCE_DELAY) {
if (readingR != buttonRState) {
buttonRState = readingR;
if (buttonRState == LOW) {
loop1Active = false;
}
}
}
lastButtonNState = readingN;
lastButtonRState = readingR;
if (loop1Active) {
digitalWrite(LED_1, HIGH);
digitalWrite(LED_2, LOW);
handleLoop1();
} else {
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, HIGH);
handleLoop2();
}
}
void handleLoop1() {
readButtons();
controlRelaysLoop1();
}
void handleLoop2() {
readButtons();
controlRelaysLoop2();
}
void readButtons() {
btnExtend.read();
btnRetract.read();
btnExtend1.read();
btnRetract1.read();
btnExtend2.read();
btnRetract2.read();
btnExtend3.read();
btnRetract3.read();
btnExtend4.read();
btnRetract4.read();
btnExtend5.read();
btnRetract5.read();
btnSetPos.read();
btnPos1.read();
btnPos2.read();
btnPos3.read();
// Send button states to the slave
Wire.beginTransmission(SLAVE_ADDRESS);
Wire.write(btnExtend.isPressed());
Wire.write(btnRetract.isPressed());
Wire.write(btnExtend1.isPressed());
Wire.write(btnRetract1.isPressed());
Wire.write(btnExtend2.isPressed());
Wire.write(btnRetract2.isPressed());
Wire.write(btnExtend3.isPressed());
Wire.write(btnRetract3.isPressed());
Wire.write(btnExtend4.isPressed());
Wire.write(btnRetract4.isPressed());
Wire.write(btnExtend5.isPressed());
Wire.write(btnRetract5.isPressed());
Wire.write(btnSetPos.isPressed());
Wire.write(btnPos1.isPressed());
Wire.write(btnPos2.isPressed());
Wire.write(btnPos3.isPressed());
Wire.endTransmission();
}
void controlRelaysLoop1() {
// Control relays through slave
Wire.beginTransmission(SLAVE_ADDRESS);
Wire.write('L'); // Indicate loop 1
Wire.endTransmission();
}
void controlRelaysLoop2() {
// Control relays through slave
Wire.beginTransmission(SLAVE_ADDRESS);
Wire.write('R'); // Indicate loop 2
Wire.endTransmission();
}