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