Ik moet de laatste post nog even lezen, de spelregels zijn niet wat je noemt makkelijk en voor de handliggend (voor een leek) ...
Anyhoo -- voor het gebruik van knoppen kennen 2 "problemen";
1) Het uitlezen van wat de opdracht is
Hier ben je al mee bezig, door gebruik te maken van een matrix etc.
Dit kan dus een matrix coördinaat zijn, op een stand van den rotary switch, etc.
Niet het moeilijkste stuk zeg maar.
2) Het opvangen van een knop druk
Deze is lastiger. Als je kijkt naar jouw 5x6 matrix sketch, dan zie je dat de Arduino (ESP) steeds bezig is de toetsaanslag, en/of los laten, probeert op te vangen. Aan de hand daarvan worden dan bepaalde zaken uitgevoerd. Tijdens deze uitvoer van taken worden de toetsaanslagen echter niet geregistreerd, wanneer we een eenvoudige opstelling hebben.
Punt 2) is dus het meest lastig.
Een manier om dit op te vangen is het gebruik maken van een interrupt. Als een pin hoog gaat (veranderd of laag gaat) dan wordt een stukje code snel tussendoor uitgevoerd en daarna weer doorgaan waar we waren gebleven.
Je moet dit zien als:
- zet alles stil, en sla even op waar we nu stoppen
- voor de interrupt-functie uit als een pin "veranderd"
- ga weer verder waar we in 1 gestopt zijn.
Bijvoorbeeld: de toetsaanslag (de "opdracht") opslaan in een globale variable.
Omdat dit het programma even stop zet, willen we dus dat die interrupt functie zo kort mogelijk is om het te laten lijken alsof het programma nog gewoon door gaat. Als het programma dan weer verder gaat, zal deze moeten reageren op de nieuwe opdracht.
Gelukkig is realtime niet een drama in onze toepassing, maar we willen natuurlijk wel dat de bediening goed loopt.
Helaas kunnen we niet al te veel interrupts hiervoor gebruiken.
Maar ... omdat we de ESP32 kunnen gebruiken, hebben 2 cores en na wat leeswerk zie ik dat we beiden in onze sketch kunnen gebruiken, waarbij ze informatie kunnen delen maar niet op elkaar hoeven te wachten. Het idee dus: 1 core gebruiken we om alle toetsen te lezen, en de andere core gebruiken we voor LED weergave. Communicatie tussen de 2 cores kan via globale variabelen (naar wat ik er er over gelezen heb).
Core 1 draait dus het uitlezen van het keypad of de matrix, en slaat steeds alleen maar op wat er veranderd. Dus als +10 seconden wordt ingedrukt dan zetten Core 1 de tijd op +10 seconden. Als we op reset tijd drukken, dan zet Core 1 de tijd op nul. etc.
Core 2 daarentegen loopt steeds door een lus die kijkt wat de waarden voor tijd, score, periode etc is, en zet de LEDs accordingly.
Ik heb dit zelf nog niet getest, want ik komt er net achter dat mijn ESP32 niet op mijn breadboard past (ik kan niet meer bij de pinnen aan 1 kant 😜 ).
We kunnen dus met jouw matrix al een sketch maken die de globale variabelen aanpast op basis van de knop drukken - te volgen via de seriële monitor.
Als dat goed werkt, kunnen we kijken hoe we dat kunnen combineren met een 2de core, waarbij we dan de 2de core, via de seriële monitor, steeds de globale waarden even laat zien.
Als ook dat goed werkt, dan kunnen we de 2de core gebruiken om de LEDs aan te sturen.
Merk op: in mijn eerdere verhaal keek ik naar een sketch voor een normale Arduino (die maar 1 core heeft). De dubbele schakelaar zou daarbij gebruikt worden om de opdracht door te geven (b.v. tijd +10 seconden), en het tweede deel van de schakelaar (in parallel met alle andere schakelaar) zou dan de interrupt triggeren. Op die manier zouden we dus maar 1 interrupt nodig hebben. Bij de dubbele core aanpak hebben we waarschijnlijk helemaal geen interrupt nodig.