Potřebuji dopsat do programu pro ovládání topení tuto podmínku:
Pokud bude vstup D2 sepnutý alespoň 1 sekundu, sepni výstup 11 na 5 vteřin. Jde mi pouze o tu podmínku "sepnutý alespoň 1 sekundu.
Prosím o radu. Předpokládám, že pro znalé je to jednoduché, ale já se s tím trápím delší dobu.
sepnutí po delším podržení tlačítka
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: sepnutí po delším podržení tlačítka
Tipuji, že bojuješ s zákmity na tlačítku ... nebo vstupu ... a relé nebo co je na výstupu ... se při zmáčknutí několikrát sepne a rozepne než se ustálí. Použij example debounce a jako debounce čas nastav 10000ms ... negativní na tom bude to, že další stisk bude zaregistrován až po tom co bude tlačítko 1vteřinu puštěno, neuděláš dvojklik
Re: sepnutí po delším podržení tlačítka
no něco se občas naindukuje na vodič ke vstupu. Mám tam nastavený PULLUP na vstupu, ale asi je to málo. Mimo rozvaděč kde je zdroj a relé není problém, ale v rozvaděči to dělá neplechu. Jakoby se přepínal vstup z 1 na 0 a pak je delší dobu klid. Kdybych mu dal podmínku, že vstup musí být minimálně 1,10... vteřin seplý a pak proveď to co jsem mu napsal, tak to by mě stačilo na nahodilé rušení kolem vstupu. Relé na výstupu je ok. Mám to naprogramované takhle:
const int termostat = 2; // Pin D2 termostat
const int rele_1 = 11; // Pin D11 rele_1 - otevři topení
const int rele_2 = 12; // Pin D12 rele_2 - zavři topení
// virtualne promenne:
int stav_termostatu = 1; // toto je vych stav termostatu, musi být HIGH, protože relé sepne když je LOW
int virtualni_stav = 1; // tady jsem vytvoril virtualnu premennu, kterou budu prepisovat po kazde zmene vstupu D2 od termostatu
void setup() {
pinMode(termostat, INPUT_PULLUP); // nastav pin D2 ako vstup a zaroven napsane PULLUP protoze není odpor proti ruseni, ted OK
pinMode(rele_1, OUTPUT); // nastav rele_1 (pin D11) ako vystup
pinMode(rele_2, OUTPUT); // nastav rele_2 (pin D12) ako vystup
// pro začátek bude stav (pin D2) termostatu je jako v radku 7, t.j. HIGH ako vypnuto a taky
// pro začátek je virtualní proměnná "virtualni_stav" nastavná jako 1, viz řádek 8
digitalWrite(rele_1, HIGH); // rele_1 bude na začátku vypnute
digitalWrite(rele_2, HIGH); // rele_2 bude na začátku vypnute
}
void loop() {
stav_termostatu = digitalRead(termostat); // načítaj stav termostatu
if (stav_termostatu < virtualni_stav) // ak termostat sepl IN2 vůči GND
{
digitalWrite(rele_1, LOW); // zapni rele 1
delay(10000); // nech ho seplé 10 vteřin
digitalWrite(rele_1, HIGH); // vypni rele 1
virtualni_stav = 0; //zmen "virtualni_stav" na 0,
}else{ // jinak nech rele_1 v puvodnim stavu HIGH - vypnute
digitalWrite(rele_1, HIGH);
}
stav_termostatu = digitalRead(termostat); // načítaj stav termostatu
if (stav_termostatu > virtualni_stav) // termostat vypnul IN2 vůči GND
{
digitalWrite(rele_2, LOW); // rele 2 zapni
delay(10000); // nech ho seplé 10 vteřin
digitalWrite(rele_2, HIGH); // vypni rele 2
virtualni_stav = 1; //zmen "virtualni_stav" na 0,
}else{ // jinak nech rele_1 v puvodnim stavu HIGH - vypnute
digitalWrite (rele_2, HIGH);
}
}
const int termostat = 2; // Pin D2 termostat
const int rele_1 = 11; // Pin D11 rele_1 - otevři topení
const int rele_2 = 12; // Pin D12 rele_2 - zavři topení
// virtualne promenne:
int stav_termostatu = 1; // toto je vych stav termostatu, musi být HIGH, protože relé sepne když je LOW
int virtualni_stav = 1; // tady jsem vytvoril virtualnu premennu, kterou budu prepisovat po kazde zmene vstupu D2 od termostatu
void setup() {
pinMode(termostat, INPUT_PULLUP); // nastav pin D2 ako vstup a zaroven napsane PULLUP protoze není odpor proti ruseni, ted OK
pinMode(rele_1, OUTPUT); // nastav rele_1 (pin D11) ako vystup
pinMode(rele_2, OUTPUT); // nastav rele_2 (pin D12) ako vystup
// pro začátek bude stav (pin D2) termostatu je jako v radku 7, t.j. HIGH ako vypnuto a taky
// pro začátek je virtualní proměnná "virtualni_stav" nastavná jako 1, viz řádek 8
digitalWrite(rele_1, HIGH); // rele_1 bude na začátku vypnute
digitalWrite(rele_2, HIGH); // rele_2 bude na začátku vypnute
}
void loop() {
stav_termostatu = digitalRead(termostat); // načítaj stav termostatu
if (stav_termostatu < virtualni_stav) // ak termostat sepl IN2 vůči GND
{
digitalWrite(rele_1, LOW); // zapni rele 1
delay(10000); // nech ho seplé 10 vteřin
digitalWrite(rele_1, HIGH); // vypni rele 1
virtualni_stav = 0; //zmen "virtualni_stav" na 0,
}else{ // jinak nech rele_1 v puvodnim stavu HIGH - vypnute
digitalWrite(rele_1, HIGH);
}
stav_termostatu = digitalRead(termostat); // načítaj stav termostatu
if (stav_termostatu > virtualni_stav) // termostat vypnul IN2 vůči GND
{
digitalWrite(rele_2, LOW); // rele 2 zapni
delay(10000); // nech ho seplé 10 vteřin
digitalWrite(rele_2, HIGH); // vypni rele 2
virtualni_stav = 1; //zmen "virtualni_stav" na 0,
}else{ // jinak nech rele_1 v puvodnim stavu HIGH - vypnute
digitalWrite (rele_2, HIGH);
}
}
Re: sepnutí po delším podržení tlačítka
na vkládání programů prosím používej tag code ... ikonka s </> ... lépe se to čte
jestli si to chceš vyřešit sám, opravdu se podívej na debounce example https://arduino.cz/arduino-zaklady-funkce-debounce/ není to fakt žádnej hardcore, odměnou ti bude fajn pocit
jestli si to chceš vyřešit sám, opravdu se podívej na debounce example https://arduino.cz/arduino-zaklady-funkce-debounce/ není to fakt žádnej hardcore, odměnou ti bude fajn pocit
Re: sepnutí po delším podržení tlačítka
Aha? To jsem netušil, promiň příště to tak udělám. Díky za nasměrování, zkusím to nastudovat.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 10 hostů