Relé - časovač (tlačítka, displej)

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.
ondyy
Příspěvky: 23
Registrován: 29 úno 2020, 23:32
Reputation: 0

Relé - časovač (tlačítka, displej)

Příspěvek od ondyy » 01 bře 2020, 01:16

Zdravím,

potřeboval byl poradit s částí projektu - potřebuji spínat relé na dobu určenou uživatelem - po stisku tlačítka by se zvýšila doba sepnutí vždy např. o 5 sekund (kdykoliv by bylo možné přidat čas). Stiskem tlačítka reset by došlo k vynulování časovače a tedy rozepnutí relé (stejně jako na mikrovlnné troubě).
Na hodinovém displeji s TM1637 by se zobrazoval zbývající čas. Dále by se dvoupolohovým spínačem nastavovalo buď trvalé sepnutí relé nebo sepnutí dle zmíněného časovače.

Chtěl bych se tedy prosím zeptat, jakým způsobem bych měl toto řešit? - aby byly splněny všechny tyto požadavky.
Samozřejmě v tomto případě nemohu použít delay(), uvítám část zdrojového kódu.


Děkuji za rady

Uživatelský avatar
gilhad
Příspěvky: 786
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Relé - časovač (tlačítka, displej)

Příspěvek od gilhad » 01 bře 2020, 08:29


ondyy
Příspěvky: 23
Registrován: 29 úno 2020, 23:32
Reputation: 0

Re: Relé - časovač (tlačítka, displej)

Příspěvek od ondyy » 01 bře 2020, 09:30

Ano, ale já to potřebuji jinak. Jedno stisknutí tlačítka = přičtení 5 s. Rozhodně nechci přidávat čas držením tlačítka (dalších 5 s se přičte až po uvolnění a opětovném stisknutí tlačítka).

Uživatelský avatar
gilhad
Příspěvky: 786
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Relé - časovač (tlačítka, displej)

Příspěvek od gilhad » 01 bře 2020, 10:05

Tak si to to tak uprav - poznamenej si pri tom pricteni, zda je tlacitko stisknuto, pak si poznamenej, az bude pusteno s dalsi pricitani delej az kdyz ma napsano, ze posledni stav je pusteno a zase bude stisknuto

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Relé - časovač (tlačítka, displej)

Příspěvek od pavel1tu » 01 bře 2020, 11:41

Takže
1 - tlačítko START, stiskem se přičte 5s do časovače a ihned se začne časovat, každým dalším stiskem se přidá 5s i když šasovač poběží ?
2 - tlačítko RESET se časovač vynuluje
3 - přepínač pro výbět rtvalé sepnutí/časovač
4 - na displeji poběží čas - pžedpokládám v sekundách

to je celkem jednoduché - co už máš hotové z tohoto ?

to je k maturitě ? ;)
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

AstroMiK
Příspěvky: 593
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Relé - časovač (tlačítka, displej)

Příspěvek od AstroMiK » 01 bře 2020, 13:17

Já jsem dělal něco podobnýho pro tohle vlákno:
https://www.arduino-forum.cz/viewtopic.php?f=30&t=550

Je to sice bez displeje a reset se provádí dlouhým stiskem startovacího tlačítka, ale jako základ by to snad použít šlo.
Na začátku se v parametrech nastavuje přičítaný čas a maximální doba, která se dá naklikat
Hodně prostoru tam zabírají různé režimy blikání LED, když se čítač blíží ke konci (jednoblik / dvojblik / trvalé svícení) - to by se mohlo vyhodit (program to trochu znepřehledňuje).
casovac.ino
(7.31 KiB) Staženo 131 x

ondyy
Příspěvky: 23
Registrován: 29 úno 2020, 23:32
Reputation: 0

Re: Relé - časovač (tlačítka, displej)

Příspěvek od ondyy » 01 bře 2020, 14:19

pavel1tu - Ano, přesně takto, tyto 4 body bych chtěl aby byly splněny. (k maturitě to není - je to pro spínání motoru na určitou dobu)

Dávám sem část kódu - funkce casovac() - je to převzato z různých návodů na internetu a upraveno do podoby, kterou bych potřeboval - ale hlavní problém je v tom, že časovač sice "funguje" - přidává se stiskem tlačítka 5 sekund, ale bez ohledu na to, kolik času uběhlo, takže např. pokud na začátku zmáčknu tlačítko START 2krát - tudíž natavím 10 s a třeba po 5 s budu chtít přidat dalších 5 s, a zmačknu tlačítko, přidá se mi ale 15 s. To je hlavní problém, se kterým bych potřeboval poradit.

Děkuji



pro přehlednost:
proměnná greenLED je signál do relé (LOW - relé sepnuto, HIGH - relé rozepnuto)


Kód: Vybrat vše

void casovac()
{
     // read the pushbutton input pin:
    buttonState = digitalRead(BUTTON_PIN);

    resetState = digitalRead(RESET_PIN);    
    currentMillis = millis();



  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);

        // zde se pridava cas
        interval += 5000;
        
        
        previousMillis = currentMillis;
        digitalWrite(greenLED, LOW);
        relayOn = true;


        Serial.println(interval);
        Serial.println(currentMillis);
        Serial.println(previousMillis);
        
    } else {
      // if the current state is LOW then the button went from on to off:
      Serial.println("off");
    }
    // Delay a little bit to avoid bouncing
    delay(20);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;



    // if relay is currently on...
    if( relayOn )
    {
        
        // turn red led on, if close to turning off the relay
        if (currentMillis - previousMillis >= interval-redLedInterval )
            digitalWrite(redLED, (millis()/300)%2);//blink red led; 300ms on; 300ms off

            
        // if enough time has elapsed, turn of the relay
        if (currentMillis - previousMillis >= interval) 
        {
          //buttonPushCounter++;
        //Serial.println(buttonPushCounter);
            // .. turn of relay
            digitalWrite(in1, HIGH);
            digitalWrite(greenLED, HIGH);
            digitalWrite(redLED, LOW);
            relayOn = false;
            interval = 0;
        }
    }


    // RESET - vypnuti rele
    if( resetState==HIGH ) // no need to check for previous state, in this specific case
    {
        
        // .. turn of relay
            interval = 0;
            digitalWrite(in1, HIGH);
            digitalWrite(greenLED, HIGH);
            digitalWrite(redLED, LOW);
            relayOn = false;

    }

}

ondyy
Příspěvky: 23
Registrován: 29 úno 2020, 23:32
Reputation: 0

Re: Relé - časovač (tlačítka, displej)

Příspěvek od ondyy » 02 bře 2020, 19:23

Ještě doplním, že funkce casovac() se volá ve funkci loop.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Relé - časovač (tlačítka, displej)

Příspěvek od pavel1tu » 02 bře 2020, 19:40

Nemám čas to podrobně rozebírat,
ale pod tím ++5s kde přidáváš těch 5s
máš "previousMillis = currentMillis;" - nedělá to tohle ?
To dle mne jakoby vynuluješ čas od kdy jsi začal časovat, ne ?

Pokud z loop() voláš jen toto, postrádá to trochu smysl.
Asi budeš muset program přeskládat:
- zvlášť přičítat ++5s při prvním stisku
- svlášť přičítat ++5s když už časuješ

ale je to jen nápad ....
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

ondyy
Příspěvky: 23
Registrován: 29 úno 2020, 23:32
Reputation: 0

Re: Relé - časovač (tlačítka, displej)

Příspěvek od ondyy » 02 bře 2020, 20:56

Jo, to by odpovídalo.

Při dalším stisku tlačítka, pokud už časovač beží se vlastně časovač "vynuluje" a časuje od toho okamžiku stisknutí do intervalu o 5 s delšího než byl předchozí bez ohledu na již uběhlý čas. Já ale potřebuji, aby se dalším stiskem tlačítka pouze přičetlo 5 s k původnímu intervalu mínus již uběhlý čas, neboli aby se přičetlo 5 s ke zbývajícímu času.

Hodily by se nějaké proměnné uběhlý čas a zbývající čas - i pro zobrazování zbývajícího času na displeji.

Díky

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Bing [Bot] a 14 hostů