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

Saimon říká:

Hra „Simon říká“ realizovaná pomocí Arduina je skvělým projektem, jehož cílem je spojit zábavu s učením a rozvojem technických dovedností. Hráč se snaží zapamatovat a správně zopakovat sekvenci světelných nebo zvukových signálů, čímž si trénuje paměť, koncentraci a rychlé reakce.

ROBOTICKÉ RAMENO

Stavebnice obsahuje všechny potřebné díly na sestavení robotnického ramene včetně spojovacího materiálu, pouze je nutné dokoupit čtyři kusy MIKRO SERV SG90. Dále je nutné dokoupit řídící jednotku já jsem použil domácí zásoby ARDUINO NANO a pro něho pak modul ARDUINO NANO IO SHIELD pro jednoduchost zapojení. Díly pro sestavení ramene jdou dobře tzv. vylamovat „vypadávají skoro sami. K servům pokud použijete nové tak doporučuji je před montáží odzkoušet zda jsou funkční v plném rozsahu tj. od 0° do 180°, po namontování a zjištění že servo nefunguje to pak opravdu dost zahýbá s nervy.