Blokování vstupů nebo výstupů???
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, ...)
-
- Příspěvky: 3
- Registrován: 08 říj 2020, 20:46
- Reputation: 0
Blokování vstupů nebo výstupů???
Dobrý den,
Jsem úplný začátečník s Arduinem a potřeboval bych radu.
Potřebuji napsat program pro arduino UNO na ovládání relé tlačítky.
4tlačítka ovládají 4relé - to je v pohodě - funguje, ale problém je to, že bych potřeboval blokovat spuštění dvou relé najednou, tak, aby se dalo stisknout vždy jen jedno tlačítko, které ovládá přiřazené relé a nešlo po dobu stisknutí tlačítka sepnout jiné relé jiným tlačítkem.
Jsem fakt v koncích.
Zkušenosti ze SŠ končí u rozblikání LED .
Našel by se někdo, kdo by mi poradil???
Jsem úplný začátečník s Arduinem a potřeboval bych radu.
Potřebuji napsat program pro arduino UNO na ovládání relé tlačítky.
4tlačítka ovládají 4relé - to je v pohodě - funguje, ale problém je to, že bych potřeboval blokovat spuštění dvou relé najednou, tak, aby se dalo stisknout vždy jen jedno tlačítko, které ovládá přiřazené relé a nešlo po dobu stisknutí tlačítka sepnout jiné relé jiným tlačítkem.
Jsem fakt v koncích.
Zkušenosti ze SŠ končí u rozblikání LED .
Našel by se někdo, kdo by mi poradil???
Re: Blokování vstupů nebo výstupů???
Když testuješ tlačítko1, tak před sepnutím relé1 otestuj i ty zbývající. Pokud zjistíš, že už je zmáčklé tlačítko3, příkaz sepni relé1 neprovedeš. Nahoď kód.
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Blokování vstupů nebo výstupů???
Rozvedu to, jak to vysvětluji na kroužku:
pro osetreni zakmitu tlacitek SW
https://bastlirna.hwkitchen.cz/arduino- ... -debounce/
nebo si najdi HW osetreni
PS: mozna tam jsou chyby, jde to udelat i jinak, toto je jen zaklad
Kód: Vybrat vše
#define TLACITKO1 1 //definuje vstup tlačítka
#define TLACITKO2 2
#define TLACITKO3 3
#define TLACITKO4 4
bool TL1,TL2,TL3,TL4; //pro ulozeni stavu tlacitka
void setup()
{
pinMode(TLACITKO1, INPUT); // nebo INPUT_PULLUP pak ale sepnuty stav bude LOW
pinMode(TLACITKO2, INPUT);
pinMode(TLACITKO3, INPUT);
pinMode(TLACITKO4, INPUT);
}
void loop()
{
TL1 = digitalRead(TLACITKO1); // nacteni aktualniho stavu tlacitka, je to lepsi kdyz to zpracovavas vicekrate
TL2 = digitalRead(TLACITKO2)
TL3 = digitalRead(TLACITKO3)
TL4 = digitalRead(TLACITKO4)
if(TL1 == HIGH && TL2 == LOW && TL3 == LOW && TL4 == LOW) // je-li ted stisknuto jen jedno tlacitko tlacitko
{
digitalWrite(RELE1, HIGH); // zmen hodnotu vystupu ale bude to trpet zákmity tlacitek, rele neni nikde definovano vyhodi to chybu
}
}
https://bastlirna.hwkitchen.cz/arduino- ... -debounce/
nebo si najdi HW osetreni
PS: mozna tam jsou chyby, jde to udelat i jinak, toto je jen zaklad
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Blokování vstupů nebo výstupů???
Sto lidi, sto chuti
Ja bych na to sel spis takto:
Poznamky:
- davam predost zapisu porovnani ve tvaru if (konstanta == promenna) {}; protoze pokud bych se uklepnul a nechal tam jen jedno =, tak mi kompilator vynada, ze konstantu menit nemuzu.
- if ( false == promenna ) {}; jde zapsat (a ja to tak delam) i jako if ( ! promenna) {}; ale tady jsem to pro prehlednost nepouzil
Ja bych na to sel spis takto:
Kód: Vybrat vše
#define POCET 4
// mame 4 dvojice tlacitko, rele
int tlacitka[POCET] = {5,6,7,8}; // Arduino piny prislusejici tlacitkum (pozor, pole se indexuji od nuly), tlacitka se pripoji druhou stranou na zem (0)
int rele[POCET] = {9,10,11,12}; // pin 13 je vetsinou LEDka
int aktualni_rele=-1; // cislo sepnuteho rel (0..3), nebo -1, kdyz zadne sepnute neni
void setup(){
for (int i=0; i<POCET; i++) { // projdeme vsechna tlacitka a nastavime jako vstupy
pinMode(tlacitka[i], INPUT_PULLUP); // Pullup zajisti, ze nestisknute tlacitko je HIGH, pripojeni na zem, ze stisknute je LOW
};
for (int i=0; i<POCET; i++) { // projdeme vsechna rele a nastavime jako vystupy
pinMode(rele[i], OUTPUT); // rele pripojime asi spis prez tranzistor, nebo jiny zesilovac. Pro ladeni radeji pouzijeme LED s odporem 330 Ohm - 1 kOhm v serii
digitalWrite(rele[i],LOW); // na zacatku jsou vsechna rele vypnuta
};
}
void loop() {
//nacteme tlacitka
bool stav[POCET]; // stav jednotlivych tlacitek, true == stisknuto
for (int i=0; i<POCET; i++) { // projdeme vsechna tlacitka a precteme je
stav[i] = ( LOW == digitalRead(tlacitka[i]) ); // stisknute je LOW
};
// pri pusteni tlacitka vypneme rele
if (aktualni_rele >=0 && false == stav[atkualni_rele] ) { // pokud je nejake rele aktivni a jeho tlacitko je pusteno
digitalWrite ( rele[aktualni_rele], LOW); // tak rele vypneme
aktualni_rele = -1; // a uz neni aktivni zadne
};
// poresime stisknuta tlacitka
int celkem=0; // pocet stisknutych tlacitek
int tlacitko=-1; // je-li neco stisknuto, poznamename si co (staci nam jedno, vic naraz se stejne nesmi)
for (int i=0; i<POCET; i++) { // projdeme vsechna tlacitka
if ( stav[i] ) { // pokud je stisknuto
celkem++; // zvysime pocet celkem
tlacitko = i; // a zapamatujeme si ho
}; // kdy neni stisknuto, nedelame s nim nic
};
if ( 1 == celkem ) { // je-li stisknuto PRAVE JEDNO tlacitko, tak sepneme prislusne rele
aktualni_rele = tlacitko; // tak prislusne rele ma byt sepnute (a vime, ze tlacitko jsme nastavovali, takze nemuze byt -1)
digitalWrite( rele[aktualni_rele], HIGH ); // a tak ho sepneme - pripadne opakovane nastaveni stejneho pinu na HIGH nicemu nevadi
};
// pokud je stiknuty jiny pocet tlacitek nez JEDNA, tak s nima nedelame nic a ignorujeme je
}
- davam predost zapisu porovnani ve tvaru if (konstanta == promenna) {}; protoze pokud bych se uklepnul a nechal tam jen jedno =, tak mi kompilator vynada, ze konstantu menit nemuzu.
- if ( false == promenna ) {}; jde zapsat (a ja to tak delam) i jako if ( ! promenna) {}; ale tady jsem to pro prehlednost nepouzil
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Blokování vstupů nebo výstupů???
Ano,
ale pokud je to začátečník, je na začátek lepší to vzít zdlouhavě,
nepoužívat třeba for-to
nepoužívat funkce
do tohoto jej postrčit později, dle mých dlouhodobých zkušeností pokud v tom začne tápat a ztratí se - znechutíme mu to
PS: umím tu také vyfrknou kod který asi nepochopí, ale s dětmi na kroužku jsem se naučil - jít na to pomalu od jednodušších a přehlednějších kodu k těm efektivním, s funkcemi atd.
A vůbec nic se nenaučí, když mu to tu takhle vyfrkneš, spokojí se s hotovým kodem a ani mu nebude rozumět
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
-
- Příspěvky: 3
- Registrován: 08 říj 2020, 20:46
- Reputation: 0
Re: Blokování vstupů nebo výstupů???
Všem moc děkuji za rady.
Od začátku jsem to zkoušel relativně správně, jen asi byla chyba mezi očima a klávesnicí .
S radou od pavel1tu jsem to dokončil během 5-ti minut ke zdárnému konci.
Chybělo mi tam uložení stavu tlačítka.
Mockrát děkuji
Dopadlo to takhle:
Od začátku jsem to zkoušel relativně správně, jen asi byla chyba mezi očima a klávesnicí .
S radou od pavel1tu jsem to dokončil během 5-ti minut ke zdárnému konci.
Chybělo mi tam uložení stavu tlačítka.
Mockrát děkuji
Dopadlo to takhle:
Kód: Vybrat vše
#define SNIMAC1 2
#define SNIMAC2 3
#define SNIMAC3 4
#define SNIMAC4 5
#define VENTIL1 8
#define VENTIL2 9
#define VENTIL3 10
#define VENTIL4 11
bool S1,S2,S3,S4; //pro ulozeni stavu tlacitka
void setup()
{
pinMode(SNIMAC1, INPUT);
pinMode(SNIMAC2, INPUT);
pinMode(SNIMAC3, INPUT);
pinMode(SNIMAC4, INPUT);
pinMode(VENTIL1, OUTPUT);
pinMode(VENTIL2, OUTPUT);
pinMode(VENTIL3, OUTPUT);
pinMode(VENTIL4, OUTPUT);
}
void loop()
{
S1 = digitalRead(SNIMAC1);
S2 = digitalRead(SNIMAC2);
S3 = digitalRead(SNIMAC3);
S4 = digitalRead(SNIMAC4);
if(S1 == LOW && S2 == HIGH && S3 == HIGH && S4 == HIGH)
{
digitalWrite(VENTIL1, LOW);
}
else digitalWrite(VENTIL1, HIGH);
if(S1 == HIGH && S2 == LOW && S3 == HIGH && S4 == HIGH)
{
digitalWrite(VENTIL2, LOW);
}
else digitalWrite(VENTIL2, HIGH);
if(S1 == HIGH && S2 == HIGH && S3 == LOW && S4 == HIGH)
{
digitalWrite(VENTIL3, LOW);
}
else digitalWrite(VENTIL3, HIGH);
if(S1 == HIGH && S2 == HIGH && S3 == HIGH && S4 == LOW)
{
digitalWrite(VENTIL4, LOW);
}
else digitalWrite(VENTIL4, HIGH);
}
Re: Blokování vstupů nebo výstupů???
Co se stane, když držíš tlačítko1 a do toho stiskneš tlačítko2 ? ... relé1 odpadne, ne ?
Re: Blokování vstupů nebo výstupů???
Kód: Vybrat vše
if(S1 == LOW) { // otestuji první tlačítko
if(S2 == HIGH && S3 == HIGH && S4 == HIGH){ // tlacitko1 je stisknuto, tak otestuji jestli jiné už není stisknuto
digitalWrite(VENTIL1, LOW); // není ... sepnu relé
} // je ... nedělám nic
} else { // tlacitko1 není stisknuto
digitalWrite(VENTIL1, HIGH); // vypnu relé1
}
-
- Příspěvky: 3
- Registrován: 08 říj 2020, 20:46
- Reputation: 0
Re: Blokování vstupů nebo výstupů???
KirRow - díky za nápad a SKVĚLOU radu.
Nebylo to úplně důležité, ale je to SUPER vylepšení.
Funguje to ještě líp, než jsem měl představu
DÍKY!!!
Nebylo to úplně důležité, ale je to SUPER vylepšení.
Funguje to ještě líp, než jsem měl představu
DÍKY!!!
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Blokování vstupů nebo výstupů???
JJ skvělé, to jsem v potaz nebral,
já to bral třeba jako "závadu" a raději všechna relé odepl, ale to závisí na přesných požadavcích.
Já obvykle při více tlačítkách rozhoduji už při jejich vyčítání (většinou podmiňuji že ostatní nesmí být stisknutá),
ale jak jsi již psal výše - co člověk to verze.
Někdy mi i trvá než na kroužku pochopím jaktože ten kod funguje - prostě slátanina, splácanina, ale autor se v tom vyzná, tak neřeším a nechávám každého ať si vytvoří svůj "rukopis".
já to bral třeba jako "závadu" a raději všechna relé odepl, ale to závisí na přesných požadavcích.
Já obvykle při více tlačítkách rozhoduji už při jejich vyčítání (většinou podmiňuji že ostatní nesmí být stisknutá),
ale jak jsi již psal výše - co člověk to verze.
Někdy mi i trvá než na kroužku pochopím jaktože ten kod funguje - prostě slátanina, splácanina, ale autor se v tom vyzná, tak neřeším a nechávám každého ať si vytvoří svůj "rukopis".
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů