protected:
char *buffer; // the actual char array
unsigned int capacity; // the array length minus one (for the '\0')
unsigned int len; // the String length (not counting the '\0')
Een pointer naar een buffer, dat is twee bytes. En beide ints zijn ook twee bytes en dus 6 bytes geheugen voor één String object; het maakt niet uit of er iets in zit of niets. De tekst zelf zit ergens anders en wordt daarom niet geteld in dit voorbeeld; maar gebruikt uiteraard wel geheugen.
Je kunt een struct gebruiken om een paar gegevens van een knop op te slaan. Bv lastDebounceTime en currentButtonState. Vervolgens creëer je een array van deze structs en een functie (met als parameter de index van een element in het array) die je aanroept voor ieder element in het array.
Even een opmerking ter overweging.
Het lijkt er op dat je een menu hebt met op, neer en select/enter knoppen.
Das aardig, maar je hebt ook een display met maar 2 regels.
Is het dan niet een beter idee om een knop te hebben met een scroll functie en 1 met een select functie ?
Dan heb je geen (bewegende) cursor meer nodig en scroll je door je menu totdat het gewenste item op de bovenste regel staat.
De bovenste regel, omdat je dan nog wel kunt zien wat de volgende optie gaat worden terwijl je net de vorige optie hebt verlaten.
Dat is wellicht iets minder intuïtief dan op en neer, maar het scheelt je wel wat werk.
Want het scrollen komt er toch altijd bij kijken.
In post 54 stel je dat wanneer de cursor op de 2e lijn staat, je scrollt en de pijl dan weer naar de 1e lijn zet.
Is dat ook je bedoeling of bedoel je dat wanneer de cursor op de 2e lijn staat terwijl er verder naar beneden gedrukt wordt terwijl je al op de onderste lijn was ?
ik bedoel het tweede. wanneer de cursor op de 2e lijn staat, je op de button voor naar beneden scrollt en moet de cursor daarna op de 1e lijn staan omdat dan daar het item staat wat je kunt kiezen.
Jouw idee kan ook. IK dacht aan een cursor omdat dan de gebruiker kan zien welke keus hij/zij gaat maken.
Je kunt nog steeds een cursor gebruiken, maar dan 1 die altijd op 0,0 staat.
Ik zou dan niet -> doen, maar alleen > want dat scheelt kostbare LCD ruimte.
Stel je eens voor dat je 20 effecten hebt. Je bent aan het scrollen en scrolt één te ver. Dan moet verder scrollen (19 x drukken) voordat je bij de juiste bent. Voorwaarts / achterwaarts is vele malen gebruikersvriendelijker naar mijn mening.
#include <LiquidCrystal.h>
#define NUMELEMENTS(x) (sizeof(x) / sizeof(x[0]))
int maxButtons = 3;
struct Button {
int lastDebounceTime;
int currentButtonState;
};
struct LIST
{
// number of nodes currently in list
uint8_t size;
// array of nodes
Button buttons[maxButtons];
bool add(Button button)
{
// check
if (size == NUMELEMENTS(buttons))
{
Serial.println(F("Lijst van buttons is vol"));
return false;
}
// copy the specified node to the end of the list
memcpy(&buttons[size], &button, sizeof(Button));
size++;
return true;
}
}
Button buttonUp;
Button buttonDown;
Button buttonSelect
List list;
list.add(buttonUp);
list.add(buttonDown);
list.add(buttonSelect);
Waarom krijg ik deze compile errors :
C:\Users\rwobb\Documents\Arduino\menu_v0.2\menu_v0.2.ino:16:29: error: array bound is not an integer constant before ']' token
Button buttons[maxButtons];
^
C:\Users\rwobb\Documents\Arduino\menu_v0.2\menu_v0.2.ino: In member function 'bool LIST::add(Button)':
C:\Users\rwobb\Documents\Arduino\menu_v0.2\menu_v0.2.ino:21:29: error: 'buttons' was not declared in this scope
if (size == NUMELEMENTS(buttons))
^
C:\Users\rwobb\Documents\Arduino\menu_v0.2\menu_v0.2.ino:3:32: note: in definition of macro 'NUMELEMENTS'
#define NUMELEMENTS(x) (sizeof(x) / sizeof(x[0]))
^
C:\Users\rwobb\Documents\Arduino\menu_v0.2\menu_v0.2.ino:21:29: note: suggested alternative: 'button'
if (size == NUMELEMENTS(buttons))
^
C:\Users\rwobb\Documents\Arduino\menu_v0.2\menu_v0.2.ino:3:32: note: in definition of macro 'NUMELEMENTS'
#define NUMELEMENTS(x) (sizeof(x) / sizeof(x[0]))
^
C:\Users\rwobb\Documents\Arduino\menu_v0.2\menu_v0.2.ino:28:13: error: 'buttons' was not declared in this scope
memcpy(&buttons[size], &button, sizeof(Button));
^~~~~~~
C:\Users\rwobb\Documents\Arduino\menu_v0.2\menu_v0.2.ino:28:13: note: suggested alternative: 'button'
memcpy(&buttons[size], &button, sizeof(Button));
^~~~~~~
button
C:\Users\rwobb\Documents\Arduino\menu_v0.2\menu_v0.2.ino: At global scope:
C:\Users\rwobb\Documents\Arduino\menu_v0.2\menu_v0.2.ino:35:8: error: expected initializer before 'buttonUp'
Button buttonUp;
^~~~~~~~
C:\Users\rwobb\Documents\Arduino\menu_v0.2\menu_v0.2.ino:39:1: error: expected initializer before 'List'
List list;
^~~~
C:\Users\rwobb\Documents\Arduino\menu_v0.2\menu_v0.2.ino:40:1: error: 'list' does not name a type; did you mean 'lrint'?
list.add(buttonUp);
^~~~
lrint
C:\Users\rwobb\Documents\Arduino\menu_v0.2\menu_v0.2.ino:41:1: error: 'list' does not name a type; did you mean 'lrint'?
list.add(buttonDown);
^~~~
lrint
C:\Users\rwobb\Documents\Arduino\menu_v0.2\menu_v0.2.ino:42:1: error: 'list' does not name a type; did you mean 'lrint'?
list.add(buttonSelect);
^~~~
lrint
exit status 1
Compilation error: array bound is not an integer constant before ']' token
Wat bedoel je met de naam van het effect ?
De effecten die wij gemaakt hebben, hebben niks te maken met een button of je moet bedoelen dat de naam buttonUp is ?