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

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. 

Electronic TiltMaze

Cílem tohoto projektu je vytvoření jednoduchého ovládacího systému, který umožňuje naklápění dvou servomotorů pomocí analogového joysticku. Platforma řízená servomotory může simulovat pohyb například v ose X a Y — tedy naklánění doleva/doprava a dopředu/dozadu. Tento systém může sloužit jako základ pro různé aplikace:

- Manuální ovládání kamery nebo senzoru (např. na pohyblivé konstrukci nebo robotovi)
- Interaktivní ovládací panel pro školní projekty nebo herní ovladač