Kb. 100 ezerszer fut le a loop másodpercenként egy egyszerű led villogtatással, az 10 mikrosec, 16 relé kiírása 160 mikrosec, a relé sokkal lassúbb ennél, mire összeérnek az érintkezők.
Töb gomb nyomása semmi gond, akár 16-ot is nyomhatsz egyszerre, 160 mikrosec alatt beolvassa és újabb 160 mikrosec után bekacsolja a reléket. Mivel nem mátrixban vannak a gombok, hanem mindegyik egy egyedi ic bemenethez csatlakozik, egymástól függetlenek, csak a beolvasás soros.
A rövid nyomás egyszerűbb. Nekem 50 msec a legrövidebb gombnyomás időm, ezalatt 100-szor beolvassa a 16 gombot és kiírja a relék állapotát, tehát tetszőleges gyorsasággal csattoghatnak a relék.
A hosszút le kell kezelni, hogy a következő ciklusban ne vegye egyből gombnyomásnak. Delay nincs, hanem jelzőváltozó van, ami a gomb állapotát mutatja, és amíg nem engedték föl, addig azzal a gombbal csak vár.
csak vázlatosan:
gomballapot=0
loop
{
if(gomb benyomva && gomballapot==0)
{
relet valtani
gomballapot=1
}
if(gomb felengedve){gomballapot=0}
}
A loop pörög, amíg a gomb nincs benyomva a gomballapot valtozóba 0-t ír.
Ha benyomom a gombot, akkor az első if feltétel teljesül, kapcsol a relé és a gombállapotba 1-et ír. Amíg nyomom a gombot a továbbiakban nem teljesül a feltétel egyik ifben se, de a loop pörög tovább.
Amint fölengedem a gombot, a második if teljesül, 0-t ír a gomballapotba, és visszakerültünk az eredeti állapotba, jöhet a gombnyomás.
Áramszünetnél reset van. Egyrészt ha bootloader van, akkor 1-2 másodpercig inicializál, közben villog a 13-as pinen a led, ki tudja a többi pinen mi történik, ezért valószínűleg a bootloader nélküli használat tanácsolt. Másrészt a pinek bemenetek lesznek az inicializálás után, tehát nem hajtanak meg semmit, relét se. Harmadrészt én shiftregiszterben gondolkodok, mert 6 kapcsoló kevésnek tűnik, tehát nem az arduino kimenetei számítanak, hanem a shiftregiszter ic. Fogalmam sincs, hogy pl. a hc595 mit csinál táp rákapcsoláskor, de más portbővítő megoldás is lehet, ezt mindig egyedileg meg kell vizsgálni, hogy az hogyan viselkedik. Ha nincs bootloader, akkor elég hamar elindulhat a program, és előírt állapotba kapcsolja a reléket, de pártized másodpercig akár ismeretlen számú relé meg is húzhat. De lehet egy kis monostabillal a G-t lehúzni fél másodpercre, és akkor nem kapcsol be semmi, utána meg már a program beállította tetszőlegesre.