подарок — ESP32-S3 simulation

An interactive ESP32-S3 circuit simulation you can run free in your browser on Velxio, by svitlana1981kusnirik.

Components

Sketch code

/*
 * ═══════════════════════════════════════════════════
 *  ESP32-S3: 24 світлодіоди (3 групи по 8) — ефект "дихання"
 *
 *  Потенціометр 1 (GPIO 1) — яскравість
 *  Потенціометр 2 (GPIO 2) — швидкість дихання
 *
 *  Група 1 → GPIO 4 (через транзистор T1)
 *  Група 2 → GPIO 5 (через транзистор T2)
 *  Група 3 → GPIO 6 (через транзистор T3)
 *
 *  Транзистори: GPIO → [1 кОм] → база, емітер → GND,
 *  колектор → катоди групи, аноди LED → 3V3 через 220 Ом
 * ═══════════════════════════════════════════════════
 */

const int GROUPS[3]   = {4, 5, 6};   // піни груп (на бази транзисторів)
const int POT_BRIGHT  = 1;           // яскравість
const int POT_SPEED   = 2;           // швидкість дихання

const int PWM_FREQ    = 5000;        // 5 кГц — очі не бачать мерехтіння
const int PWM_RES     = 12;          // 12 біт = 4096 рівнів яскравості

unsigned long breathPhase = 0;       // поточна фаза дихання
unsigned long lastTime = 0;

void setup() {
  Serial.begin(115200);

  // Налаштовуємо апаратний PWM (LEDC) для кожної групи
  for (int i = 0; i < 3; i++) {
    ledcAttach(GROUPS[i], PWM_FREQ, PWM_RES);
    ledcWrite(GROUPS[i], 0);         // старт з вимкнених LED
  }

  Serial.println("Дихання запущено! 🌬️");
}

void loop() {
  unsigned long now = millis();
  float dt = (now - lastTime) / 1000.0;   // час минулого кадру в секундах
  lastTime = now;

  // ─── Читаємо потенціометри ───
  // Яскравість: 0..4095 → згладжування країв
  float brightRaw = analogRead(POT_BRIGHT) / 4095.0;      // 0..1
  float maxBright = brightRaw * brightRaw * 4095.0;       // квадрат = плавніше на мінімумі

  // Швидкість: тривалість одного циклу дихання 500..8000 мс
  // Крутите Пот.2: вліво — повільне дихання, вправо — швидке
  float cycleSec = map(analogRead(POT_SPEED), 0, 4095, 8000, 500) / 1000.0;

  // ─── Фаза дихання ───
  // Проходимо повний цикл (0..2π) за cycleSec секунд
  breathPhase += (2.0 * PI / cycleSec) * dt;
  if (breathPhase >= 2.0 * PI) breathPhase -= 2.0 * PI;

  // ─── Форма "дихання" ───
  // Синус + smoothstep = дуже плавне загоряння і потухання
  float v = (sinf(breathPhase) + 1.0) / 2.0;   // 0..1
  v = v * v * (3.0 - 2.0 * v);                 // smoothstep

  // ─<arg_value>── Записуємо яскравість у всі 3 групи ───
  uint32_t level = (uint32_t)(v * maxBright);
  for (int i = 0; i < 3; i++) {
    ledcWrite(GROUPS[i], level);
  }

  delay(10);   // ~100 кадрів/сек — плавне оновлення
}

More projects by svitlana1981kusnirik