Tvorba programu s tlačítkem pro ovládání světel

Pro známého vytvářím jednoduché ovládání pro světlo v místnosti. Zadání je jasné:

  • Krátký stisk - postupné rozsvícení do zadané hladiny
    • Další krátký stisk – postupné zhasnutí
    • Další dlouhý stisk – zvyšování intenzity
    • Další dlouhý stisk – snižování intenzity

Celý proces tvorby prototypu jsem zachytil na streamu, z kterého najdete níže celý záznam.

A pokud chcete získat vytvořený program, tak zde je k dispozici:

// Jedno tlačítko pro ovládání světel
/*
  •  Krátký stisk – postupné rozsvícení do nastavené hladiny
  o Další krátký stisk – postupné zhasnutí
  o Další dlouhý stisk – zvyšování intenzity
  o Další dlouhý stisk – snižování intenzity
*/

// nastavení čísel pinů
#define pinTLA 2
#define pinLED 5

// definice
#define ON  LOW
#define OFF HIGH
#define maxSvit 255
#define vychoziSvit maxSvit/2
#define debounceZpozdeni 50
#define zpozdeniKratkyStisk 1000
#define fadeKrok 50

//#define SerialDebug

// proměnné
int ledPWM = 0;
bool stavTlacitka = 1;
bool predchoziStav = 0;
bool predchoziDlouhyStav = 0;
unsigned long casStisku = 0;
unsigned long casOdSepnuti = 0;
bool smerIntenzity = HIGH;

void nastavLED(int ledPwm) {
  // ošetření přetečení
  if (ledPwm > 255) {
    ledPwm = 255;
  }
  // ošetření podtečení
  if (ledPwm < 0) {
    ledPwm = 0;
  }
  analogWrite(pinLED, ledPwm);
  ledPWM = ledPwm;
}

void postupneRozsvit(int maximum = 255) {
  // fade in from min to max in increments of 5 points:
  for (int fadeValue = 0 ; fadeValue <= maximum; fadeValue += 5) {
    // sets the value (range from 0 to 255):
    nastavLED(fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(fadeKrok);
  }
  // přepsání aktuální hodnoty PWM
  ledPWM = maximum;
  // nastavení výchozího směru intenzity
  smerIntenzity = HIGH;
}

void postupneZhasni(int maximum = 255) {
  // fade in from min to max in increments of 5 points:
  for (int fadeValue = maximum ; fadeValue >= 0; fadeValue -= 5) {
    // sets the value (range from 0 to 255):
    nastavLED(fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(fadeKrok);
  }
  // vypnutí LED
  digitalWrite(pinLED, LOW);
  // přepsání aktuální hodnoty PWM
  ledPWM = 0;
  // nastavení výchozího směru intenzity
  smerIntenzity = HIGH;
}

void setup() {
  // nastavení typ pinů
  pinMode(pinTLA, INPUT_PULLUP);
  pinMode(pinLED, OUTPUT);
#ifdef SerialDebug
  Serial.begin(115200);
#endif
}

void loop() {
  // načtení stavu tlačítka do proměnné
  bool nactiTlacitko = digitalRead(pinTLA);
  // kontrola předchozího stavu pro zjištění změny
  if (predchoziStav != nactiTlacitko) {
    casStisku = millis();
    if (nactiTlacitko == ON) {
      casOdSepnuti = millis();
    }
  }
  // vyhodnocení délky stisku
  if ((millis() - casStisku) > debounceZpozdeni) {
    // kontrola překlopení tlačítka
    if (stavTlacitka != nactiTlacitko) {
      stavTlacitka = nactiTlacitko;
      // kontrola ukončení stisku tlačítka
      if (stavTlacitka == OFF) {
#ifdef SerialDebug
        Serial.print("Delka stisku: ");
        Serial.println(millis() - casOdSepnuti);
#endif
        if ((millis() - casOdSepnuti) < zpozdeniKratkyStisk) {
          // kontrola aktuální PWM hodnoty
          if (ledPWM == 0) {
            postupneRozsvit(vychoziSvit);
          }
          else {
            postupneZhasni(ledPWM);
          }
        }
        else {
          smerIntenzity = !smerIntenzity;
#ifdef SerialDebug
          Serial.print("smerIntenzity: ");
          Serial.println(smerIntenzity);
#endif
        }
      }
    }
    else if ((millis() - casOdSepnuti) > zpozdeniKratkyStisk) {
      //
      if (nactiTlacitko == ON) {
        if (smerIntenzity == HIGH) {
          ledPWM += 1;
        }
        else {
          ledPWM -= 1;
        }
        nastavLED(ledPWM);
#ifdef SerialDebug
        Serial.print("nastavLED: ");
        Serial.println(ledPWM);
#endif
      }
    }
  }
  // přepsání předchozího stavu aktuálním
  predchoziStav = nactiTlacitko;
  // krátká pauza
  delay(10);
}

Pokračování s modelováním krabičky na tlačítko ve Fusion 360:

Příprava schéma pro pájení ve Fritzing:

Pájení a testování:

Pro další streamy se přidejte na https://www.twitch.tv/bastlir/

Další podobné články

Test ESC a BLDC motoru

Cílem tohoto Arduino projektu je testování a kalibrace obousměrného regulátoru otáček (ESC) pomocí PWM signálu. Program simuluje sekvenci pohybů: dopředu, neutrální pozici a reverzní chod, což umožňuje ověřit správnou funkci ESC včetně přepínání směru otáčení motoru.

Laserový alarm

Cílem tohoto projektu je vytvořit jednoduchý, ale funkční bezpečnostní systém, který detekuje narušení prostoru pomocí vysílače (laserového paprsku) a přijímače (fotorezistoru). Jakmile je paprsek přerušen, Arduino to vyhodnotí jako narušení a spustí alarm – například zvukový signál pomocí piezo bzučáku.