const int NUM_BYTES = 5;
// PUSZKA A1 (Panel sterujący)
// 74HC165 - PRZYCISKI (BUTTONS)
const int BTN_SL = 1; // PL (Parallel Load / Shift Load)
const int BTN_CK = 2; // CP (Clock Pin / Serial Clock)
const int BTN_DI = 42; // DS (Serial Output z 165 do ESP32)
// 74HC595 - DIODY LED
const int LED_LATCH = 4; // RCK (Register Clock / Latch Pin)
const int LED_CLOCK = 5; // SRCK (Serial Clock / Clock Pin)
const int LED_DATA = 6; // SERIAL (Data Input)
// PUSZKA A2 (Moduł wykonawczy)
// 74HC165 - POTWIERDZENIE (FEEDBACK)
const int FEED_SL = 7; // PL (Parallel Load / Shift Load)
const int FEED_CK = 15; // CP (Clock Pin / Serial Clock)
const int FEED_DI = 16; // DS (Serial Output z 165 do ESP32)
// 74HC595 - PRZEKAŹNIKI (RELAY + ULN2803)
const int RELAY_LATCH = 17; // RCK (Register Clock / Latch Pin)
const int RELAY_CLOCK = 18; // SRCK (Serial Clock / Clock Pin)
const int RELAY_DATA = 21; // SERIAL (Data Input)
// Tablice danych (40 bitów każda)
byte buttonData[NUM_BYTES]; // Surowy odczyt z przycisków
byte lastButtonState[NUM_BYTES]; // Do detekcji kliknięcia
byte relayState[NUM_BYTES]; // Stan bistabilny przekaźników
byte feedbackData[NUM_BYTES]; // Odczyt feedbacku z A2
// Mikrosekundy dla ESP32-S3
const int pulseDelay = 5;
void setup() {
Serial.begin(115200);
// Setup pinów A1
pinMode(BTN_SL, OUTPUT); pinMode(BTN_CK, OUTPUT); pinMode(BTN_DI, INPUT);
pinMode(LED_LATCH, OUTPUT); pinMode(LED_CLOCK, OUTPUT); pinMode(LED_DATA, OUTPUT);
// Setup pinów A2
pinMode(FEED_SL, OUTPUT); pinMode(FEED_CK, OUTPUT); pinMode(FEED_DI, INPUT);
pinMode(RELAY_LATCH, OUTPUT); pinMode(RELAY_CLOCK, OUTPUT); pinMode(RELAY_DATA, OUTPUT);
digitalWrite(BTN_SL, HIGH);
digitalWrite(FEED_SL, HIGH);
Serial.println("System ESP32-S3: 40 kanalow gotowe.");
}
void loop() {
// 1. ODCZYT PRZYCISKÓW (Puszka A1)
digitalWrite(BTN_SL, LOW);
delayMicroseconds(pulseDelay);
digitalWrite(BTN_SL, HIGH);
delayMicroseconds(pulseDelay);
for (int i = NUM_BYTES - 1; i >= 0; i--) {
for (int j = 0; j < 8; j++) {
int bit = digitalRead(BTN_DI);
bitWrite(buttonData[i], j, bit);
digitalWrite(BTN_CK, HIGH);
delayMicroseconds(pulseDelay);
digitalWrite(BTN_CK, LOW);
delayMicroseconds(pulseDelay);
}
}
// 2. LOGIKA BISTABILNA
for (int i = 0; i < NUM_BYTES; i++) {
for (int j = 0; j < 8; j++) {
bool isPressed = bitRead(buttonData[i], j);
bool wasPressed = bitRead(lastButtonState[i], j);
// Jeśli wciśnięto (zbocze narastające)
if (isPressed && !wasPressed) {
// Zmień stan przekaźnika na przeciwny
bitWrite(relayState[i], j, !bitRead(relayState[i], j));
int buttonNumber = (i * 8) + j;
Serial.print("Przelaczono kanal: ");
Serial.println(buttonNumber);
}
}
// Zapamiętaj stan
lastButtonState[i] = buttonData[i];
}
// 3. WYSYŁANIE DO PRZEKAŹNIKÓW (Puszka A2)
digitalWrite(RELAY_LATCH, LOW);
for (int i = 0; i < NUM_BYTES; i++) {
shiftOut(RELAY_DATA, RELAY_CLOCK, LSBFIRST, relayState[i]);
}
digitalWrite(RELAY_LATCH, HIGH);
// 4. ODCZYT FEEDBACKU (Puszka A2)
digitalWrite(FEED_SL, LOW);
delayMicroseconds(pulseDelay);
digitalWrite(FEED_SL, HIGH);
for (int i = NUM_BYTES - 1; i >= 0; i--) {
feedbackData[i] = shiftIn(FEED_DI, FEED_CK, LSBFIRST);
}
// 5. WYSYŁANIE NA LEDy (Puszka A1)
digitalWrite(LED_LATCH, LOW);
for (int i = 0; i < NUM_BYTES; i++) {
// LEDy pokazują to, co fizycznie odczytał feedback w A2
shiftOut(LED_DATA, LED_CLOCK, LSBFIRST, feedbackData[i]);
}
digitalWrite(LED_LATCH, HIGH);
// Odświeżanie ~100Hz wystarczy
delay(10);
}DS: dataPin (cyan)
SHCP: clockPin (violet)
STCP: latchPin (limegreen)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
1 ... 2 ... 3 ... 4 ... 5 ... 6 ... 7 ... 8 ... 9 ... 10
11 . 12 .13 . 14 . 15 .16 . 17 . 18 .19 . 20
21 . 22 .23 . 24 . 25 .26 . 27 . 28 .29 . 30
31 . 32 .33 . 34 . 35 .36 . 37 . 38 .39 . 40
RELAY 1
RELAY 40
// Puszka A1 (Przyciski i LEDy)
const int BTN_SL = 1;
const int BTN_CK = 2;
const int BTN_DI = 42;
const int LED_LATCH = 4;
const int LED_CLOCK = 5;
const int LED_DATA = 6;
// Puszka A2 (Przekaźniki i Feedback)
const int FEED_SL = 7;
const int FEED_CK = 15;
const int FEED_DI = 16;
const int RELAY_LATCH = 17;
const int RELAY_CLOCK = 18;
const int RELAY_DATA = 21;