Elektro zámok

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Axamith
Příspěvky: 533
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Elektro zámok

Příspěvek od Axamith » 13 čer 2020, 07:32

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 :-)

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Elektro zámok

Příspěvek od martinius96 » 15 čer 2020, 04:10

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 :oops:

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 :roll: ).. 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.

Hanz
Příspěvky: 262
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Elektro zámok

Příspěvek od Hanz » 17 čer 2020, 23:33

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.

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Elektro zámok

Příspěvek od martinius96 » 18 čer 2020, 00:04

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.

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Elektro zámok

Příspěvek od KamilV » 18 čer 2020, 00:07

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...

Hanz
Příspěvky: 262
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Elektro zámok

Příspěvek od Hanz » 18 čer 2020, 19:17

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 ;)

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 11 hostů