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 = 5;
// 74HC165 - PRZYCISKI (BUTTONS)
const int BTN_SL      = 11; // PL
const int BTN_CK      =  2; // CP
const int BTN_DI      =  3; // Q7
// CE - CLKINH (pin 15) > GND
// 74HC165 - POTWIERDZENIE (FEEDBACK)
const int FEED_SL     = 13; // PL
const int FEED_CK     = 12; // CP
const int FEED_DI     = 18; // Q7
// 74HC595 - PRZEKAŹNIKI (RELAY)
const int RELAY_CLOCK = 21; // SRCLK - SHCP
const int RELAY_LATCH = 20; // RCLK  - STCP
const int RELAY_DATA  = 15; // SER   - DS
// 74HC595 - DIODY LED
const int LED_CLOCK = 5; // SRCLK - SHCP
const int LED_LATCH = 4; // RCLK  - STCP
const int LED_DATA  = 0; // SER   - DS
//
const int BUZZER_PIN  = 10;
#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--) {
  //for (int i = 0; i < NUM_BYTES; i++) {
    buffer[i] = 0;
    for (int j = 7; j >= 0; j--) {
      if (digitalRead(data)) bitSet(buffer[i], j);
      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);
  digit

More projects by kshyhoo