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/