Blokování vstupů nebo výstupů???

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, ...)
SvubOndrej
Příspěvky: 3
Registrován: 08 říj 2020, 20:46
Reputation: 0

Blokování vstupů nebo výstupů???

Příspěvek od SvubOndrej » 08 říj 2020, 21:03

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???

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

Re: Blokování vstupů nebo výstupů???

Příspěvek od kiRRow » 08 říj 2020, 21:34

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.

Uživatelský avatar
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ů???

Příspěvek od pavel1tu » 09 říj 2020, 07:12

Rozvedu to, jak to vysvětluji na kroužku:

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
   }
   
 }  
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
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

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

Re: Blokování vstupů nebo výstupů???

Příspěvek od gilhad » 09 říj 2020, 15:03

Sto lidi, sto chuti :)
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
}

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

Uživatelský avatar
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ů???

Příspěvek od pavel1tu » 09 říj 2020, 15:40

gilhad píše:
09 říj 2020, 15:03
Sto lidi, sto chuti :)
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"

SvubOndrej
Příspěvky: 3
Registrován: 08 říj 2020, 20:46
Reputation: 0

Re: Blokování vstupů nebo výstupů???

Příspěvek od SvubOndrej » 11 říj 2020, 11:28

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í :-D.
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);
   
}
 

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

Re: Blokování vstupů nebo výstupů???

Příspěvek od kiRRow » 11 říj 2020, 11:40

Co se stane, když držíš tlačítko1 a do toho stiskneš tlačítko2 ? ... relé1 odpadne, ne ?

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

Re: Blokování vstupů nebo výstupů???

Příspěvek od kiRRow » 11 říj 2020, 11:47

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
	}

SvubOndrej
Příspěvky: 3
Registrován: 08 říj 2020, 20:46
Reputation: 0

Re: Blokování vstupů nebo výstupů???

Příspěvek od SvubOndrej » 11 říj 2020, 13:02

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!!!

Uživatelský avatar
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ů???

Příspěvek od pavel1tu » 11 říj 2020, 14:04

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".
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Odpovědět

Kdo je online

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