luzes — Arduino Mega simulation

cromo

An interactive Arduino Mega circuit simulation you can run free in your browser on Velxio, by conexaodharma.

Components

Sketch code

#include <math.h>

// ===============================
// MEGA 2560
// ===============================

const int ledPins[7] = {
  3, 5, 6, 9, 10, 11, 44
};

const int potPins[7] = {
  A0, A1, A2, A3, A4, A5, A6
};

const int modeSwitchPin = 22;

// Frequências dos chakras (Hz)
float chakraFrequencies[7] = {
  4.0,
  8.0,
  11.0,
  14.0,
  18.0,
  20.0,
  22.0
};

unsigned long startDelay[7] = {
  0,
  2000,
  4000,
  6000,
  8000,
  10000,
  12000
};

bool ledEnabled[7];

unsigned long startTime;

void setup() {

  Serial.begin(9600);

  for (int i = 0; i < 7; i++) {

    pinMode(ledPins[i], OUTPUT);
    analogWrite(ledPins[i], 0);

    ledEnabled[i] = false;
  }

  pinMode(modeSwitchPin, INPUT_PULLUP);

  startTime = millis();

  Serial.println("CROMOTERAPIA OK");
}

void loop() {

  unsigned long now = millis();

  bool modoContinuo = (digitalRead(modeSwitchPin) == LOW);

  for (int i = 0; i < 7; i++) {

    // Liberação progressiva dos LEDs

    if (!ledEnabled[i] &&
        now - startTime >= startDelay[i]) {

      ledEnabled[i] = true;

      Serial.print("LED ");
      Serial.print(i + 1);
      Serial.println(" ativo");
    }

    if (!ledEnabled[i])
      continue;

    // ===========================================
    // LEITURA DO POTENCIÔMETRO (CURVA LOGARÍTMICA)
    // ===========================================

    int leitura = analogRead(potPins[i]);

    leitura = constrain(leitura, 0, 1023);

    float brilhoFloat =
      pow((float)leitura / 1023.0, 2.2);

    // brilho entre 180 e 255
    int brilho =
      180 + brilhoFloat * 75;

    // ===========================================
    // MODO CONTÍNUO
    // ===========================================

    if (modoContinuo) {

      analogWrite(
        ledPins[i],
        brilho
      );
    }

    // ===========================================
    // MODO PULSANTE
    // ===========================================

    else {

      float periodo =
        1000.0 / chakraFrequencies[i];

      float fase =
        fmod((float)now, periodo) / periodo;

      float onda =
        (sin(fase * TWO_PI) + 1.0) / 2.0;

      // Oscila entre 80% e 100%
      int brilhoMinimo =
        brilho * 0.80;

      int saida =
        brilhoMinimo +
        onda * (brilho - brilhoMinimo);

      analogWrite(
        ledPins[i],
        saida
      );
    }
  }
}

More projects by conexaodharma