ESP32-C6+74HC165+74HC595 — Esp32 C6 simulation

An interactive Esp32 C6 circuit simulation you can run free in your browser on Velxio, by kshyhoo.

Components

Sketch code

const int NUM_BYTES = 1;
// 74HC165-1 - PRZYCISKI
const int BTN_SL =  3; // PL
const int BTN_CK =  2; // CP
const int BTN_DI = 11; // Q7
// 74HC165-2 - FEEDBACK PRZEKAŹNIKÓW
const int FEED_SL =  9; // PL
const int FEED_CK = 13; // CP
const int FEED_DI = 12; // Q7
// 74HC595-2 - PRZEKAŹNIKI
const int RELAY_CLOCK = 19; // SRCLK - SHCP
const int RELAY_LATCH = 18; // RCLK  - STCP
const int RELAY_DATA  = 15; // SER   - DS
// 74HC595-1 - LED
const int LED_CLOCK = 5; // SRCLK - SHCP
const int LED_LATCH = 4; // RCLK  - STCP
const int LED_DATA  = 0; // SER   - DS

#define HEARTBEAT_MS 1000

byte buttonData[NUM_BYTES]          = {0};
byte lastButtonState[NUM_BYTES]     = {0};
byte relayState[NUM_BYTES]          = {0};
byte feedbackData[NUM_BYTES]        = {0};
byte ledData[NUM_BYTES]             = {0};
byte lastPrintedButtons[NUM_BYTES]  = {0};
byte lastPrintedFeedback[NUM_BYTES] = {0};

const int pulseDelay = 5;
unsigned long loopCount = 0;
unsigned long lastHeartbeat = 0;

void printBin(const byte *arr, int n) {
  for (int i = n - 1; i >= 0; i--) {
    for (int b = 7; b >= 0; b--)
      Serial.print(bitRead(arr[i], b));
    if (i > 0)
      Serial.print('_');
  }
}

bool changed(const byte *a, const byte *b, int n) {
  for (int i = 0; i < n; i++) if (a[i] != b[i]) return true;
  return false;
}
// 74HC165: po PL na Q7 jest od razu D7, kolejne bity (D6..D0) wchodzą z każdym CP
// Wynik: bit k bufora = wejście Dk
void read165(int pl, int clk, int data, byte *buffer) {
  digitalWrite(pl, LOW);
  delayMicroseconds(pulseDelay);
  digitalWrite(pl, HIGH);
  delayMicroseconds(pulseDelay);
  for (int i = NUM_BYTES - 1; i >= 0; i--) {
    buffer[i] = 0;
    for (int j = 0; j < 8; j++) {
      bitWrite(buffer[i], 7 - j, digitalRead(data));
      digitalWrite(clk, HIGH);
      delayMicroseconds(pulseDelay);
      digitalWrite(clk, LOW);
      delayMicroseconds(pulseDelay);
    }
  }
}
// 74HC595: pierwszy wysłany bit kończy na Q7, więc MSBFIRST => bit k bufora = wyjście Qk
// (Przy bajtach > 1 najpierw wysyłamy ostatni bajt - on trafia do dalszego układu w łańcuchu.)
void write595(int latch, int clk, int data, const byte *buffer) {
  digitalWrite(latch, LOW);
  for (int i = NUM_BYTES - 1; i >= 0; i--) {
    shiftOut(data, clk, MSBFIRST, buffer[i]);
  }
  digitalWrite(latch, HIGH);
}

void setup() {
  Serial.begin(115200);
  unsigned long t0 = millis();
  while (!Serial && millis() - t0 < 2000) delay(10);

  pinMode(BTN_SL, OUTPUT);
  pinMode(BTN_CK, OUTPUT);
  pinMode(BTN_DI, INPUT);
  pinMode(FEED_SL, OUTPUT);
  pinMode(FEED_CK, OUTPUT);
  pinMode(FEED_DI, INPUT);
  pinMode(RELAY_LATCH, OUTPUT);
  pinMode(RELAY_CLOCK, OUTPUT);
  pinMode(RELAY_DATA, OUTPUT);
  pinMode(LED_LATCH, OUTPUT);
  pinMode(LED_CLOCK, OUTPUT);
  pinMode(LED_DATA, OUTPUT);

  digitalWrite(BTN_SL, HIGH);
  digitalWrite(BTN_CK, LOW);
  digitalWrite(FEED_SL, HIGH);
  digitalWrite(FEED_CK, LOW);

  write595(RELAY_LATCH, RELAY_CLOCK, RELAY_DATA, relayState);
  write595(LED_LATCH, LED_CLOCK, LED_DAT

More projects by kshyhoo