Tak schválne tu prispejem ešte posledný krát...
Funkčnosť programu:
- Zapojenie v režime INPUT s PULLUPOM, t.j. +5V normálne (pri nestlačenom tlačidle), pri stlačení active_LOW (0V)
- Program realizuje výpis dĺžky stlačenia tlačidla (vizuálne na UART monitore vidieť, koľko ms držíš tlačidlo + ak ho pustíš skôr, uvidíš aj zákmity tlačidla)
- Po dosiahnutí 1500 ms nepretržitého držania tlačidla sa zmení stav LED HIGH/LOW, vyskočí sa z cyklu - čaká sa na opätovné stlačenie a držanie tlačidla (debounce sa zohľadní už v samotnom cykle).
- Pridaný aj last_state tlačidla, výpis a počítadlo funguje až pri zmene vstupu, aby po nepretržitom držaní to neprepínalo HIGH/LOW každých 1500ms
- Výpis pri zmene stavu LED s aktuálnym časom millis()
- Vyskúšané aj na hardvéri (programovo vstup využíva externý pullup - vstup je definovaný ako klasický INPUT (ako bol aj v pôvodných programoch))
- Načítavanie vstupu je rozdelené do dvoch premenných (prvá premenná slúži iba ako trigger na druhú časť, kde sa do druhej načítava stav a kontroluje sa v cykle)
Otestuj a daj vedieť. Dúfam, že som to tentokrát nepokašlal a že to sedí s tvojou požiadavkou
Programová implementácia:
Kód: Vybrat vše
const int buttonPin = 10; // číslo pinu tlačítka
const int ledPin = 11; // číslo pinu LED
const int ledPin2 = 13;
long lastDebounceTime = 0;
long debounceDelay = 1500;
int lastButtonState1 = HIGH;
unsigned long timer = 0;
int reading;
int ledState = LOW;
void setup() {
Serial.begin(115200);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
}
void loop() {
reading = digitalRead(buttonPin);
if (reading == LOW && lastButtonState1 == HIGH) {
timer = millis();
int reading2 = digitalRead(buttonPin);
while (reading2 == LOW) {
Serial.println(millis() - timer);
reading2 = digitalRead(buttonPin);
if (millis() - timer >= debounceDelay) {
ledState = !ledState;
digitalWrite(ledPin2, ledState);
Serial.println("ZMENA_LED");
Serial.println(millis());
break; //vyskočíme z cyklu
}
}
}
lastButtonState1 = reading;
}
Veľmi by ma zaujímalo, ako ostatní používatelia pochopili tvoj popis v prvom príspevku tohto vlákna (možno som jediný, ktorý ho pochopil na prvý krát zle
).. Keď som si to prvý krát zbežne prečítal, pochopil som to tak, že držanie 1500ms ti to má zapnúť a aby si nemusel čakať ďalších 1500ms na vypnutie, tak aby ti to zareagovalo hneď... V tom duchu som to toho času tvoril...
Až po opätovnom dôkladnom prečítaní som to pochopil inak... Tak, ako to potrebuješ... 1500 ms držíš, prepne na opačný stav (ak bolo vypnuté, zapne. Ak bolo zapnuté, vypne) a pri opätovnom stlačení a držaní tlačidla zase zmena stavu.
Konkrétne ma zmiatla táto časť...
Sperhak píše: ↑09 čer 2020, 14:36
Stlačím tlačítko a držím ho, po 1,5s sa rozsvieti led, pustím tlačítko. Keď chcem znova stlačiť tlačítko aby led zhasla, musím počkať 1,5s teda ten nastavený čas a až potom mi to znova funguje.