Bistabilní KO

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Bistabilní KO

Příspěvek od ondraN » 05 kvě 2023, 08:00

Tenhle debounce je docela zajímavý, ale je blokující a docela rychlý, takže nemusí zachytit některé vzdálnější zákmity.

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Bistabilní KO

Příspěvek od kiRRow » 05 kvě 2023, 10:02

Ano. Řešení toho debounce je krásně jednoduché. Jeho nevýhoda je, že trochu hůře se po tom bude chtít delší debounce ... také se ten debounceTime bude měnit s časovou náročností loopu. (ať žije delay)
Jako ty tlačítka to je tady věčný problém :lol: . Pokud mám projekt, který má 5tlačítek, které zmáčknu jednou za týden, abych si něco prohlédnul, nebo nějak upravil parametry ... bez problému to jde ošetřit programově. Pokud mám projekt typu herní krabička, kde do těch čudlíků chci bušit i několikrát za vteřinu (a během toho se musí vypočítat změny ve hře, vypočíst grafický výstup a poslat ho na displej) -> je lepší toho co nejvíce ošetřit hardwarově.
Tlačítka prostě šumí, buď ušetřím HW a budu se trápit s SW, nebo si ušetřím práci v SW, ale přidělám si další HW. Obojí je stejně spolehlivým zdrojem chyb :D

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

Re: Bistabilní KO

Příspěvek od AstroMiK » 06 kvě 2023, 08:47

kiRRow píše:
05 kvě 2023, 10:02
... Řešení toho debounce je krásně jednoduché ...
Opravdu "krásně jednoduché"?
Musím se přiznat, že mi na první pohled vůbec nebylo jasné, co se v té řádce s logickými součty a bitovými posuny vlastně děje.

Až teprve když jsem si smyčku dostatečně zpomalil a jednotlivé členy nechal binárně vypisovat, tak mi to začalo dávat smysl.
Naproti tomu ten první příklad od AI sice zabere o pár bajtů systémových prostředků víc, ale je přehledný a jeho funkce je okamžitě čitelná.

Dene Elanik
Příspěvky: 67
Registrován: 29 led 2020, 20:15
Reputation: 0

Re: Bistabilní KO

Příspěvek od Dene Elanik » 22 kvě 2023, 18:46

Prosím o radu. Potřeboval bych překlápět výstup po delších časových úsecích. Řádově minuty. Interval1 = výstup ThermoClose ZAP, interval2 = výstup ThermoClose VYP. Delay se nehodí, blokuje program, přerušení je obsazené a vnitřní časovače nedávají dostatečně dlouhé časy. Zkoušel jsem to pomocí millis, ale výstup se chová jak chce.
Kde je chyba?

Kód: Vybrat vše

  if (millis() - startTime1 >= interval1) {
    if (teplotaC > 90) { digitalWrite(ThermoClose, 1); }
    startTime1 = millis();  // Aktualizujeme čas poslední události
  }
  if (digitalRead(ThermoClose) == 1) {
    if (millis() - startTime2 >= interval2) {
      digitalWrite(ThermoClose, 0);
      startTime2 = millis();
    }

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Bistabilní KO

Příspěvek od ondraN » 22 kvě 2023, 20:02

Kód: Vybrat vše

if ((millis() + interval1) < startTime1 ) {
    if (teplotaC > 90) { digitalWrite(ThermoClose, 1); }
    startTime1 = millis();  // Aktualizujeme čas poslední události
  }
if (digitalRead(ThermoClose) == 1) {
    if ((millis() + interval2) < startTime2 ) {
      digitalWrite(ThermoClose, 0);
      startTime2 = millis();
    }

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

Re: Bistabilní KO

Příspěvek od gilhad » 22 kvě 2023, 20:13

Přijde mi, že se snažíš příct něco jako:
Každých interval1 otestuj teplotu a pokud je moc, tak na interval2 zavři topení.

Ale říkáš něco jako:
interval1 si ničeho nevšímej, ale pak sleduj teplotu tak často, jak to jen jde. Pokud bude moc, tak zavři topení a zase interval1 neměř nic.
Nezávisle na tom zajisti, aby se nikdy nevyplo topení na víc než interval2. Ale klidně se může zapnout hned po vypnutí.

Čeho chceš vlastně dosáhnout?

Dene Elanik
Příspěvky: 67
Registrován: 29 led 2020, 20:15
Reputation: 0

Re: Bistabilní KO

Příspěvek od Dene Elanik » 22 kvě 2023, 21:31

Jedná se o ovládání serva klapky přívodu vzduchu do kotle na základě teploty vody, aby se kotel nepřetopil.
Tzn. pokud teplota dosáhne např. 90 °C, přivři klapku a čekej, co se stane s teplotou. Pokud bude teplota nadále růst, zase přivři a čekej na změnu teploty. Pokud teplota klesne, začni otvírat přívod vzduchu.
Změny teplot a posun serva jsou pomalé, proto potřebuji dlouhé časy.
Mezi tím však program dělá ještě něco jiného (zobrazení na displeji, ovládání čtyřcestného ventilu aj.)
Potíž je v tom, že spínání výstupu se neděje podle nastavených intervalů, ale nepravidelně - jakoby se někdy časy intervalů sečetly a jindy zase odečetly. :o

Dene Elanik
Příspěvky: 67
Registrován: 29 led 2020, 20:15
Reputation: 0

Re: Bistabilní KO

Příspěvek od Dene Elanik » 22 kvě 2023, 21:40

Jednodušeji řečeno: přepínání výstupu na základě hodnot intervalů tak, aby nespotřebovalo příliš mnoho strojového času.

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

Re: Bistabilní KO

Příspěvek od gilhad » 22 kvě 2023, 23:57

Kód: Vybrat vše

unsigned long long CurrentMillis;
bool chlazeni = false;
// ^^^ tohle je nekde pred setup()

  CurrentMillis = millis(); // zapamatujeme si čas, ať pořád nevoláme funkce a máme ho jednotný
  if (not chlazeni) { // = měření
      if ((CurrentMillis - startTime1) >= interval1) { // pokud nechladime, tak kazdych interval1 merime
        // teplotaC = analogRead(cosi) * nejaky_prepocet_nebo_co
        // stačí měřit jen když chceme znát výsledek (ledaže by ta teplotaC se používala i jinde a měli jsme ji zdarma)
        if (teplotaC > 90) { 
          chlazeni = true; // zahajime chlazeni
          digitalWrite(ThermoClose, 1); // zapneme to
          startTime2=CurrentMillis; // a chladi se odted
          }
      startTime1 = millis();  // Aktualizujeme čas poslední události
    }
  } else { // chlazeni
    if ((CurrentMillis - startTime2) >= interval2) { // uz jsme dochladili
      digitalWrite(ThermoClose, 0); // vypneme to
      chlazeni = false; // ukoncime chlazeni
      startTime1 = CurrentMillis; // a nastavime pocatek pro mereni (meri se odted)
    }
}; // konec if (not chlazeni)
Logika:
buď měříme každých interval1,
nebo chladíme interval2 a pak se vrátíme na začátek, tedy čekáme interval1 na další měření

interval2 se začne počítat až když začneme chladit, proto startTime2 nastavíme až když začneme chladit
interval1 se počítá buď od posledního měření, nebo od konce chlazení - nastavuje se tedy na obou místech

Například interval1 = 1 minuta, interval2 = 5 minut - pokud je moc horko pořád, topí se 1 minutu a chladí 5 minut

zajicjarda
Příspěvky: 39
Registrován: 31 srp 2017, 22:29
Reputation: 0

Re: Bistabilní KO

Příspěvek od zajicjarda » 23 kvě 2023, 14:37

Řeknu ti svůj názor, cobi topenáře. Regulovat klapku až v momentě nahřátí vody na 90 C není ideální. Lepší je zhruba při 60 až 65 začít přivírat klapku a při 80 až 85 by měla být úplně zavřená (úplně, neznamená na 100%, vždy bych tam nechal škvíru třeba 5 mm). Nevím jestli topiš dřevem nebo uhlim, ale obojí má značnou setrvačnost a stejně to dělají i originální armatury od výrobců kotlů

Odpovědět

Kdo je online

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