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.
VIDEO
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:
VIDEO
Příprava schéma pro pájení ve Fritzing:
VIDEO
Pájení a testování:
VIDEO
Pro další streamy se přidejte na https://www.twitch.tv/bastlir/