Bistabilní KO
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Re: Bistabilní KO
Tenhle debounce je docela zajímavý, ale je blokující a docela rychlý, takže nemusí zachytit některé vzdálnější zákmity.
Re: Bistabilní KO
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
. 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
Jako ty tlačítka to je tady věčný problém

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

Re: Bistabilní KO
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á.
-
- Příspěvky: 62
- Registrován: 29 led 2020, 20:15
- Reputation: 0
Re: Bistabilní KO
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?
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();
}
Re: Bistabilní KO
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();
}
Re: Bistabilní KO
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?
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?
-
- Příspěvky: 62
- Registrován: 29 led 2020, 20:15
- Reputation: 0
Re: Bistabilní KO
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.
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.

-
- Příspěvky: 62
- Registrován: 29 led 2020, 20:15
- Reputation: 0
Re: Bistabilní KO
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.
Re: Bistabilní KO
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)
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
-
- Příspěvky: 39
- Registrován: 31 srp 2017, 22:29
- Reputation: 0
Re: Bistabilní KO
Ř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ů
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti