Stránka 4 z 4
Re: Elektro zámok
Napsal: 13 čer 2020, 07:32
od Axamith
Sperhak píše: ↑12 čer 2020, 18:16
. . .
Tak sa mi to podarilo. Naposledy som to robil 1 hodinu potom som to vzdal. Teraz som dostal nápad a bolo to za 2 min hotové.
. . .
Někdy to prostě chce pauzu, nejsi sám, kdo zírá do problému celé odpoledne, spát jde po půlnoci a nic kloudného nevypotí. A jindy je to za chvilku.
Pokud se opravdu chceš Arduinu a programování obecně věnovat, počítej s tím, že to žere čas, spoustu času.
Já osobně, než začnu řešit svůj "neřešitelný" problém na fóru věnují spoustu hodin hledání na webu, snažím se dohledat podobnou problematiku a pochopit ji. Proč? protože to tak lépe pochopím, než když mi to někdo napíše. A o to mi jde, problematice rozumět.
Držím palec, aby ti to vydrželo, po prvotních třenicích uvidíš, že je tady spousta šikovných a ochotných lidí ti pomoci. Snaž se nemít jen funkční kód, je lepší znát, proč to tak je a nabyté znalosti použiješ v dalším projektu nebo budeš moci poradit jiným

Re: Elektro zámok
Napsal: 15 čer 2020, 04:10
od martinius96
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.
Re: Elektro zámok
Napsal: 17 čer 2020, 23:33
od Hanz
mám dotaz k druhé ledPin - definovaná je , ale nikde se s ní nepracuje ?
...a nechodí to jak je psáno. Stačí jen rychlý stisk tlačítka /klepnutí do něj /a led se po 1,5s přepne, což je vidět na seriovém monitoru s výpisem změna Led.Kdybych držel tlačítko jak dlouho chci, tak led se po daném čase nepřepne, ať je v jakém chce stavu, ale až pustím tlačítko teprve odpočte 1,5s a změní stav.
Re: Elektro zámok
Napsal: 18 čer 2020, 00:04
od martinius96
Mne to funguje presne podľa toho popisu. Používaš to s externým pullupom ako je napísané v inštrukciách?
Je to zapojenie INPUT_PULLUP so vstupom definovaným ako INPUT, pretože sa využíva externý pullup rezistor.
Tá druhá LED sa nepoužíva, ale nechal som ju tam, ak by ju Sperhak chcel používať napríklad rovnako s tou druhou LED diódou.
Re: Elektro zámok
Napsal: 18 čer 2020, 00:07
od KamilV
Kód: Vybrat vše
const int buttonPin = 10; // číslo pinu tlačítka
const int ledPin = 11; // číslo pinu LED
const long delay = 1500;
long lastDebounceTime = 0;
bool lastButtonState = HIGH;
bool ledState = LOW;
void setup() {
Serial.begin(115200);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() {
// pokud jsem pustil tlacitko (nebo mam zakmit), prestavam merit cas
if (digitalRead(buttonPin) == HIGH) {
lastDebounceTime = 0;
lastButtonState = HIGH;
}
// pokud jsem stiskl tlacitko a pred tim stisknuto nebylo, zacinam merit cas
else if (digitalRead(buttonPin) == LOW && lastButtonState == HIGH) {
lastButtonState = LOW;
lastDebounceTime = millis();
}
// pokud drzim stisknuto po pozadovanou dobu, vykonam akci
if (lastDebounceTime > 0 && millis() >= lastDebounceTime + delay) {
lastDebounceTime = 0;
trigger_action();
}
redraw();
}
void trigger_action() {
ledState = !ledState;
}
void redraw() {
digitalWrite(ledPin, ledState);
}
Je to jen koncept, píšu z hlavy bez kompilace...
Re: Elektro zámok
Napsal: 18 čer 2020, 19:17
od Hanz
omlouvám se martinius96 - chybu jsem měl v zapojení tlačítka jak správně předvídáš, nějak mě to uteklo. Tvůj kod je OK
