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

Ovládání teploty pomocí relé a senzoru DS18B20

Tento projekt umožňuje měřit teplotu pomocí senzoru DS18B20, zobrazit ji na I2C LCD displeji, a ovládat relé podle teplotních limitů. Relé bude aktivní, když je teplota mezi 0 a 22 stupni Celsia. Projekt může sloužit k ovládání topení, ventilace nebo jiného zařízení podle okolní teploty.