Is dit een goed plan ?

Ben nu bezig om de code van 2 projecten samen te voegen.
Namelijk :
lcd's : https://wokwi.com/projects/436553938972699649
lcd menu : https://wokwi.com/projects/437823988872739841

Nu vroeg ik me af of dit een goed plan was om de code voor het lcd scherm samen te voegen met de code voor de leds.

Plan :

// function prototypes for button functions
void buttonUp();
void selectChoice(); 
void buttonDown(); 

struct Button {
  const uint8_t pin;
  unsigned long lastDebounceTime;
  uint8_t lastButtonState;

  uint8_t currDebouncedState;
  uint8_t prevDebouncedState;

   void (*func)();
};

unsigned long long debounceDelay = 20;

// Create and initialize an array of 3 Button objects
Button buttonList[] = {
  { A3, 0, !ISPRESSED, !ISPRESSED, !ISPRESSED, buttonUp }, // buttomUp
  { A2, 0, !ISPRESSED, !ISPRESSED, !ISPRESSED ,selectChoice}, // select
  { A1, 0, !ISPRESSED, !ISPRESSED, !ISPRESSED, buttonDown }, // buttondown
};

Deze code verplaatsen naar input.cpp

LiquidCrystal LCD(12, 11, 10, 9, 8, 7); 

Deze code verplaatsen naar pins.h

void showMenu(int counter) {

  LCD.clear();
  LCD.setCursor(0, 0);
  LCD.print("--->");
  LCD.setCursor(5, 0);
  LCD.print(menuItems[counter % NUMELEMENTS(menuItems)]);
  LCD.setCursor(5, 1);
   LCD.print(menuItems[(counter + 1) % NUMELEMENTS(menuItems)]);
};

Deze code verplaatsen naar output.cpp

void buttonUp()
{
  if (choice > 0) {
    choice--;
  } else {
    choice = 2; 
  }
   
}

void selectChoice()
{
  selectedChoice = choice % NUMELEMENTS(menuItems) ; 
  Serial.print("U hebt gekozen voor ");
  Serial.println(menuItems[selectedChoice]);  
}

void buttonDown()
{
 
    ++choice; 
 
  Serial.print("Waarde counter :  "); 
  Serial.println(choice); 
}

void readButton(int index) {

  buttonState = digitalRead(buttonList[index].pin);

  if (buttonState != buttonList[index].lastButtonState) {
    buttonList[index].lastDebounceTime = millis();
    
  }

  if ((millis() - buttonList[index].lastDebounceTime) > debounceDelay) {
    buttonList[index].currDebouncedState = buttonState;
  }

  if (buttonState != buttonList[index].lastButtonState) {
    buttonList[index].lastButtonState = buttonState;
  }
}

Deze verplaatsen naar input.cpp

void loop()
{
  for (uint8_t cnt = 0; cnt < NUMELEMENTS(buttonList); cnt++)
  {

    readButton(cnt);
    if (buttonList[cnt].currDebouncedState != buttonList[cnt].prevDebouncedState)
    {
      
      buttonList[cnt].prevDebouncedState = buttonList[cnt].currDebouncedState;

      // bug fgix
      if (buttonList[cnt].currDebouncedState == ISPRESSED)
      {
        
        if (buttonList[cnt].func != nullptr) {
          buttonList[cnt].func();
          showMenu(choice);  
        }
        
      }
      else
      {
        
      }
    }
  }
}

Deze verplaatsen naar input.cpp onder een nog te bedenken naam.
en dan denk ik aanvragen via de .ino file ?

Is dit een goed plan of is er een betere manier ?

Overwegingen

Je oude input.cpp en input.h bestanden zijn eigenlijk de gebruikers interface; je had een simpele gebruikers interface die de schakelaar en de potentiometer afhandelden (alleen ingangen). Nu is die gebruikers interface een beetje uitgebreid met drukknoppen (i.p.v van een schakelaar) en een LCD.

Daarom zou ik input.cpp en input.h hernoemen naar bv ui.cpp en ui.h.

Alle code die je geschreven hebt voor de drukknoppen en LCD horen thuis in de ui bestanden; het lezen van de potentiometer uiteraard ook.

Wees je ervan bewust dat hernoemen in de IDE onverwachte problem kan opleveren ten gevolge van caching; ik zou adviseren een nieuw project aan te maken om dat probleem te voorkomen.

selectedChoice was vroeger switchValue.

De LCD constructor hoort niet thuis in pins.h maar in ui.cpp. Ik zou echter pins.h wel uitbreiden met pin namen voor de LCD.

#pragma once

const uint8_t ledPins[] = {6, 10, 11, 9, 5, 3};
const uint8_t btnPins[] = {7, 4, 2};
const uint8_t lcdRS = 12;
const uint8_t lcdE = 8;
const uint8_t lcdD4 = A5;
const uint8_t lcdD5 = A4;
const uint8_t lcdD6 = A3;
const uint8_t lcdD7 = A2;

en dan in de constructor de lcdXX namen gebruiken

LiquidCrystal lcd = {lcdRS, lcdE, lcdD4, lcdD5, lcdD6, lcdD7};

De reden hiervoor is dat je dan alle pinnen bij elkaar hebt staan en je niet hoeft te zoeken waar ze gedefinieerd zijn.

Ik zou daar mee beginnen.

Ik heb nog niet goed nagedacht over de pinnen van de knoppen. In plaats van het hierboven getoonde btnPins array kun je namen definiëren, e.g.

const uint8_t btnUpPin = A3;
const uint8_t btnDownPin = A1;
const uint8_t btnSelectPin = A2;

En in btnList array maak je dan gebruik die namen.

Opemerking:
Wees je ervan bewust dat niet iedereen weet waar dit precies over gaat. Ik stel voor dat je daarom even wat linkjes plaatst naar de wokwis voor "staart" en "lcd" (en die wokwis verder niet verandert).

Dank je

Hoe code logisch in te delen is en blijft heel lastig.

En ik heb een nieuw project geopend voor dit : https://wokwi.com/projects/437927718792173569

De code is nu nog voor zaken controleren of ze werken.

Ben nu eerst de komende dagen bezig om in de arduino ide alles aan te passen.

Even voor mijn duidelijkheid

ook showMenu hoort dan in ui.cpp.
Ik vind dat meer een output omdat mensen dit zien. Maar ja ook een input voor de effecten.
Daarom zijn dit soort zaken ook moeilijk in bestanden of classes in te delen.

Inderdaad.

oke

En ik dacht om deze in een aparte header file te zetten omdat de gegevens gebruikt worden om het menu te laten zien in input.cpp en om de juiste effect te kiezen in output.cpp

const char *menuItems[] = {
  "Sweep",
  "Staart",
  "Twee keer",
};

En even goed nadenken hoe ik deze functie ga noemen in het nieuwe project

void loop()
{
  for (uint8_t cnt = 0; cnt < NUMELEMENTS(buttonList); cnt++)
  {

    readButton(cnt);
    if (buttonList[cnt].currDebouncedState != buttonList[cnt].prevDebouncedState)
    {
      
      buttonList[cnt].prevDebouncedState = buttonList[cnt].currDebouncedState;

      // bug fgix
      if (buttonList[cnt].currDebouncedState == ISPRESSED)
      {
        
        if (buttonList[cnt].func != nullptr) {
          buttonList[cnt].func();
          showMenu(choice);  
        }
        
      }
      else
      {
        
      }
    }
  }
}

Mischien iets als handleButtons() ?

Als je die kant op wilt zou ik waarschijnlijk een .h en een .cpp bestand maken voor de LCD.

Het menu kan dan in de .cpp, initialisatie en showMenu() ook.

Mijn originele idee was toen je begon het LCD / drukknoppen gebeuren dat wat je momenteel voor de LCD en drukknoppen hebt geschreven eigenlijk een soort vervanging was voor input.cpp. Dat vergt de minste wijzigingen in het bestaande "staart" programma.

  1. pins.h aanpassen.
  2. input.cpp aanpassen om knoppen af te handelen en het scherm aan te sturen.

Was ook mijn eerste idee

Maar ik zie nu dat in het menu dit wordt gebruikt

const char *menuItems[] = {
  "Sweep",
  "Staart",
  "Twee keer",
};

en voor het aansturen in effects.cpp deze code :

bool (*effects[])(int potValue) = {
  sweep,
  staart, 
  nullptr,
};

En eigelijk zijnn ze gelijk en is het niet handig om ze alle twee te houden omdat je dan in 2 plekken zaken moet veranderen.

Probeer hier dus een oplossing voor te bedenken.

Oplossing gevonden? Indien niet, wil je een tip?

Het enigste wat ik kan bedenken is om de struct te plaatsen of in ui.h of in bijvoorbeeld menu.h

Laatste heeft mijn voorkeur omdat anders ui en output aan elkaar gekopppeld worden.

Welke struct?

Deze ?

Dat is geen struct maar een array van pointers (de *) naar tekst (char).

Hieronder een mogelijk oplossing en het maakt inderdaad gebruik van een struct :slight_smile:

struct MenuItem
{
  const char *name;
  const bool (*func)(int);
};

const MenuItem menuItems[] =
{
  {"Sweep", sweep},
  {"Staart", staart},
  {"Twee keer", tweeKeer},
};

In deze struct worden de naam die getoond wordt op het LCD scherm en een functie pointer samengevoegd.

Hier is een simpel demonstratie programma dat je in je wokwi kunt laden

#define NUMELEMENTS(x) (sizeof(x) / sizeof(x[0]))

#include <LiquidCrystal.h>

LiquidCrystal LCD(12, 8, A5, A4, A3, A2);

bool sweep(int);
bool staart(int);
bool tweeKeer(int);

struct MenuItem
{
  const char *name;
  const bool (*func)(int);
};

const MenuItem menuItems[] =
{
  {"Sweep", sweep},
  {"Staart", staart},
  {"Twee keer", tweeKeer},
};

void setup()
{
  LCD.begin(16, 2);
  LCD.print(F("1399401"));

  Serial.begin(115200);
  Serial.println(F("1399401"));
}

void loop()
{
  if (Serial.available())
  {
    char ch = Serial.read();
    if (ch >= '0' && ch <= '9')
    {
      ch -= '0';
      ch %= NUMELEMENTS(menuItems);
      if(menuItems[ch].func != nullptr)
      {
        menuItems[ch].func(0);
      }
    }
  }
}

bool sweep(int potVal)
{
  LCD.setCursor(0, 1);
  LCD.print(F("                "));
  LCD.setCursor(0, 1);
  LCD.print(__FUNCTION__);

  return true;
}

bool staart(int potVal)
{
  LCD.setCursor(0, 1);
  LCD.print(F("                "));
  LCD.setCursor(0, 1);
  LCD.print(__FUNCTION__);

  return true;
}

bool tweeKeer(int potVal)
{
  LCD.setCursor(0, 1);
  LCD.print(F("                "));
  LCD.setCursor(0, 1);
  LCD.print(__FUNCTION__);

  return true;
}

IK ga het uitproberen.

Maar als ik jouw code zie en wat ik bedenk , voel ik me echt een enorme beginner in programmeren en de arduino.

Ik doe iets in 20 regels en dan zie ik dat jij het gewoon in 5- 6 regels doet.

Maar ik leer er wel veel van.

IK heb het net uitgeprobeerd en met dit idee zou ik alles binnen input.cpp kunnen houden.

Wat is daar dan het probleem van ?
Het klinkt voor mij als dat je daar teneergeslagen van raakt, en ik vind dat niet terecht.

Het zal altijd zo zijn dat er mensen zijn met meer handigheid en/of ervaring.
Dat geldt zeer zeker ook voor mij en ik denk dat sterretje dat ook vaak genoeg meemaakt.
Het is juist mooi dat je die mensen vindt en dat ze bereid zijn jou verder te helpen.
Dat is nou juist het mooie van dit forum.
Zie het gewoon als kansen om verder te komen in de richting waar je heen wil.

1 Like

Zie ik.

Maar het is ook frusteren dat een "probleem" waar ik 2 dagen over nadenk en geen oplossing vindt door een ander in 5 min opgelosd wordt.

Een van de problemen waarom ik bij de GGZ loop.
Alles zelf willen kunnen

Weet zelf nog niet precies welke richting ik op wil gaan.
Weet wel dat zoals jij en sterretje me nu zaken leren , ik nieuwsgierig ben geworden naar de rest.

Dat heeft misschien te maken met een gebrek aan kennis als gevolg van het niet voldoende vergaren van de kennis voordat je die wil gaan gebruiken.

Niet dat ik het altijd meteen weet (zeker met structs en pointers enzo) maar een basis cursus C++(evt C) zoals van de voor dummies serie zorgt meestal voor een ruime basis, waarna het met het googlen van bv. 'struct C++ example' je de oplossing al wordt aangedragen.

I denk ook een gebrek aan ervaring om te zien wanneer ik welke manier moet gebruiken om iets op te lossen.

Helaas weer eens compiler problemen die ik niet kan oplossen :frowning:

C:\Users\rwobb\Documents\Arduino\effects_with_menu\ui.cpp:30:3: warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
   const bool (*func)(int);
   ^~~~~
C:\Users\rwobb\Documents\Arduino\effects_with_menu\ui.cpp:38:1: warning: invalid conversion from 'bool (*)()' to 'const bool (*)(int)' [-fpermissive]
 };
 ^
C:\Users\rwobb\Documents\Arduino\effects_with_menu\ui.cpp:38:1: warning: invalid conversion from 'bool (*)()' to 'const bool (*)(int)' [-fpermissive]
C:\Users\rwobb\Documents\Arduino\effects_with_menu\ui.cpp:38:1: warning: invalid conversion from 'bool (*)()' to 'const bool (*)(int)' [-fpermissive]
C:\Users\rwobb\Documents\Arduino\effects_with_menu\ui.cpp: In function 'void showMenu(int)':
C:\Users\rwobb\Documents\Arduino\effects_with_menu\ui.cpp:72:56: error: no matching function for call to 'LiquidCrystal::print(const MenuItem&)'
   LCD.print(menuItems[counter % NUMELEMENTS(menuItems)]);
                                                        ^
In file included from C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Stream.h:26:0,
                 from C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/HardwareSerial.h:29,
                 from C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Arduino.h:233,
                 from C:\Users\rwobb\Documents\Arduino\effects_with_menu\pins.h:3,
                 from C:\Users\rwobb\Documents\Arduino\effects_with_menu\ui.cpp:1:
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:65:12: note: candidate: size_t Print::print(const __FlashStringHelper*)
     size_t print(const __FlashStringHelper *);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:65:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'const __FlashStringHelper*'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:66:12: note: candidate: size_t Print::print(const String&)
     size_t print(const String &);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:66:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'const String&'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:67:12: note: candidate: size_t Print::print(const char*)
     size_t print(const char[]);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:67:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'const char*'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:68:12: note: candidate: size_t Print::print(char)
     size_t print(char);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:68:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'char'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:69:12: note: candidate: size_t Print::print(unsigned char, int)
     size_t print(unsigned char, int = DEC);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:69:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'unsigned char'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:70:12: note: candidate: size_t Print::print(int, int)
     size_t print(int, int = DEC);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:70:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'int'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:71:12: note: candidate: size_t Print::print(unsigned int, int)
     size_t print(unsigned int, int = DEC);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:71:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'unsigned int'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:72:12: note: candidate: size_t Print::print(long int, int)
     size_t print(long, int = DEC);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:72:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'long int'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:73:12: note: candidate: size_t Print::print(long unsigned int, int)
     size_t print(unsigned long, int = DEC);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:73:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'long unsigned int'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:74:12: note: candidate: size_t Print::print(double, int)
     size_t print(double, int = 2);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:74:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'double'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:75:12: note: candidate: size_t Print::print(const Printable&)
     size_t print(const Printable&);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:75:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'const Printable&'
C:\Users\rwobb\Documents\Arduino\effects_with_menu\ui.cpp:74:62: error: no matching function for call to 'LiquidCrystal::print(const MenuItem&)'
   LCD.print(menuItems[(counter + 1) % NUMELEMENTS(menuItems)]);
                                                              ^
In file included from C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Stream.h:26:0,
                 from C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/HardwareSerial.h:29,
                 from C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Arduino.h:233,
                 from C:\Users\rwobb\Documents\Arduino\effects_with_menu\pins.h:3,
                 from C:\Users\rwobb\Documents\Arduino\effects_with_menu\ui.cpp:1:
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:65:12: note: candidate: size_t Print::print(const __FlashStringHelper*)
     size_t print(const __FlashStringHelper *);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:65:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'const __FlashStringHelper*'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:66:12: note: candidate: size_t Print::print(const String&)
     size_t print(const String &);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:66:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'const String&'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:67:12: note: candidate: size_t Print::print(const char*)
     size_t print(const char[]);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:67:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'const char*'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:68:12: note: candidate: size_t Print::print(char)
     size_t print(char);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:68:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'char'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:69:12: note: candidate: size_t Print::print(unsigned char, int)
     size_t print(unsigned char, int = DEC);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:69:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'unsigned char'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:70:12: note: candidate: size_t Print::print(int, int)
     size_t print(int, int = DEC);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:70:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'int'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:71:12: note: candidate: size_t Print::print(unsigned int, int)
     size_t print(unsigned int, int = DEC);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:71:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'unsigned int'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:72:12: note: candidate: size_t Print::print(long int, int)
     size_t print(long, int = DEC);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:72:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'long int'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:73:12: note: candidate: size_t Print::print(long unsigned int, int)
     size_t print(unsigned long, int = DEC);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:73:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'long unsigned int'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:74:12: note: candidate: size_t Print::print(double, int)
     size_t print(double, int = 2);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:74:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'double'
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:75:12: note: candidate: size_t Print::print(const Printable&)
     size_t print(const Printable&);
            ^~~~~
C:\Users\rwobb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Print.h:75:12: note:   no known conversion for argument 1 from 'const MenuItem' to 'const Printable&'
C:\Users\rwobb\Documents\Arduino\effects_with_menu\ui.cpp: In function 'void handleMenuButtons()':
C:\Users\rwobb\Documents\Arduino\effects_with_menu\ui.cpp:105:11: error: 'menuList' was not declared in this scope
           menuList[cnt].func();
           ^~~~~~~~
C:\Users\rwobb\Documents\Arduino\effects_with_menu\effects_with_menu.ino: In function 'void loop()':
C:\Users\rwobb\Documents\Arduino\effects_with_menu\effects_with_menu.ino:13:20: warning: unused variable 'oldRR' [-Wunused-variable]
   static RUNRESULT oldRR = EFFECT_ERROR;
                    ^~~~~
C:\Users\rwobb\Documents\Arduino\effects_with_menu\effects_with_menu.ino: At global scope:
C:\Users\rwobb\Documents\Arduino\effects_with_menu\effects_with_menu.ino:13:20: warning: 'oldRR' defined but not used [-Wunused-variable]
Multiple libraries were found for "LiquidCrystal.h"
  Used: C:\Users\rwobb\Documents\Arduino\libraries\LiquidCrystal
  Not used: C:\Users\rwobb\AppData\Local\Arduino15\libraries\LiquidCrystal
exit status 1

Compilation error: no matching function for call to 'LiquidCrystal::print(const MenuItem&)'

Code voor zover ik het nu heb

effects_with_menu2.zip (3,3 KB)

oke

Een aantal bleken makkelijk oplosbaar te zijn

Deze heb ik dan nog over :

C:\Users\rwobb\Documents\Arduino\effects_with_menu2\ui.cpp:30:3: warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
   const bool (*func)(int);
   ^~~~~
C:\Users\rwobb\Documents\Arduino\effects_with_menu2\ui.cpp:38:1: warning: invalid conversion from 'bool (*)()' to 'const bool (*)(int)' [-fpermissive]
 };
 ^
C:\Users\rwobb\Documents\Arduino\effects_with_menu2\ui.cpp:38:1: warning: invalid conversion from 'bool (*)()' to 'const bool (*)(int)' [-fpermissive]
C:\Users\rwobb\Documents\Arduino\effects_with_menu2\ui.cpp:38:1: warning: invalid conversion from 'bool (*)()' to 'const bool (*)(int)' [-fpermissive]