Waarom werkt de lcd nog niet goed in wokwiki ?

Ik stel voor dat je de waarde van buttonState print; bv

if ((buttonState != lastButtonState) && buttonState != 1023)
{
  Serial.println(buttonState);
}

En lees de documentatie voor digitalRead().

Dank je

Dit lijkt te werken

yep,

Met deze code kan ik de "cursor" verplaatsen.

#include <LiquidCrystal.h>

int buttonPin =  A1;
int buttonState = 1; 
int lastButtonState = 1 ; 

int choice = 0; 

LiquidCrystal LCD(12, 11, 10, 9, 8, 7);  //Create Liquid Crystal Object called LCD

void showMenu(int counter) {

  LCD.clear(); 
  LCD.setCursor(0, counter); 
  LCD.print("--->"); 
  LCD.setCursor(5,0);  
  LCD.print("Sweep");
  LCD.setCursor(5,1); 
  LCD.print("Staart");  
};

void setup() {
  LCD.begin(16,2);  //Tell Arduino to start your 16 column 2 row LCD
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  showMenu(choice); 
}


void loop() {

  buttonState = digitalRead(buttonPin); 

if ((buttonState != lastButtonState) && buttonState == 0) {
    
    lastButtonState = buttonState; 
    choice++; 
    showMenu(choice);
  };

  
}

Komende tijd google gebruiken om uit te zoeken hoe je een derde item kunt toevoegen en die zichtbaar kan maken.

Waarom denk je dat google je daarbij de beste oplossing gaat geven ?
Ik raad je aan om eerst wat te bedenken en eens te zien of je dat kunt uitvoeren.
Daar leer je het meest en het best van, niet van iets kopieren dat je ergens vindt.
Wees niet bang om gewoon wat te proberen.
Wanneer dat wat je bedacht hebt niet werkt, is dat geen tegenslag maar een kans (opportunity) om er van te leren.
Verder raad ik je ook aan om niet een derde regel / mogelijkheid te bedenken, maar meteen rekening te houden met meerdere items in je scroll-menu.
Dat gaat je straks weer wat zweten besparen als je aan het vierde of vijftiende item wil gaan werken.

Dat was ook mijn plan.

en ik was niet van plan om code te kopieeren maar om ideeen te krijgen hoe ik zoiets kan aanpassen.

Voor meerdere items in het menu zit ik te denken aan een array.
En ik moet nog iets bedenken dat de choice variable binnen het aantal van de menu items blijft.

:+1:

Dat heb je al onder controle, dit is exact hetzelfde als wat je al bij je vorige en je laatste oefeningen hebt gedaan, er is nul verschil in het mechanisme.
Alleen een naam (die ook alleen voor jou interessant is, de Arduino maakt het niet uit welke naam het krijgt) en waar je het voor gebruikt zijn anders maar dus het mechanisme niet.
Ik neem aan dat je hiervoor je aparte bestanden hebt gemaakt (hergebruik van wat je ooit hebt gebouwd).

Heb ik wel maar gebruik ze even niet.

Volgens mij moet dit werken :

#include <LiquidCrystal.h>


String menuItems[3] = {"Sweep", "Staart", "Twee keer"}; 

int buttonPin =  A1;
int buttonState = 1; 
int lastButtonState = 1 ; 

int choice = 0; 

LiquidCrystal LCD(12, 11, 10, 9, 8, 7);  //Create Liquid Crystal Object called LCD

void showMenu(int counter) {

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

void setup() {
  LCD.begin(16,2);  
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  showMenu(choice); 
}


void loop() {

  buttonState = digitalRead(buttonPin); 

if ((buttonState != lastButtonState) && buttonState == 0) {
    
    lastButtonState = buttonState; 
    choice++;
    
    if (choice > sizeof(menuItems) -1) {
      choice = sizeof(menuItems);
    }

    if (choice < 0)  {
      choice = 0;  
    }

    showMenu(choice);
  };

  
}

Als dit redelijk goed is, kan ik de rest van de buttons gaan aansluiten en werkend maken.

Is niet zo heel moeilijk.

En dan heb ik met "lelijke" code het menu werkend :tada:

Nope, de cursor wijst nu naar de verkeerde item.
Even terug naar de tekentafel hoe dit op te lossen.

Iemand een idee hoe ik kan scrollen en de "cursor" op de goede plek kan houden ?

Houd apart bij waar de cursor staat en druk die af op je LCD onafhankelijk van de rest van de inhoud van je scherm.
Je cursor hoeft niet groter te zijn dan 1 karakter (zonde van de ruimte), en houd altijd ruimte vrij om die cursor te plaatsen zonder de rest van je scherm te verpesten.

Omdat je aan het proberen bent wat je allemaal kunt maken voor effecten, kun je dat ook nog uitbreiden naar je cursor.
Zo kun je je cursor uit verschillende karakters laten bestaan die telkens elkaar opvolgen.
Dan doet je sketch ook nog iets tijdens delays, en toon je meteen aan dat een delay beter kan dan met delay().
En ook dat kun je dan weer uitbreiden, want als je wil dat je cursor naar een andere lijn gaat, kun je daar vast nog een mooie animatie voor bedenken (en dat dan ook weer afhankelijk van de richting waarheen bewogen wordt.
We zijn tenslotte nu toch spelenderwijs aan het leren..

oke

Dus nog een variable maken voor de cursorpositie die alleen 1 en 2 gaat bevatten.

Wat bedoel je hiermee :

en houd altijd ruimte vrij om die cursor te plaatsen zonder de rest van je scherm te verpesten.

Nee.
De variabele heeft wel 2 mogelijkheden, maar dat zijn niet 1 en 2.

Met de 2e opmerking bedoel ik dat je niet je cursor over de al aanwezige tekst heen moet gaan zetten en dus moet je daar rekening mee houden.

Ik ben nu weer weg tot vannacht dus zal vragen of opmerkingen niet zien.

Dat de "cursor" een animatie heeft zou heel mooi zijn maar eerst maar even dit aan het werkend krijgen.

Dit idee werkt niet.

#include <LiquidCrystal.h>


String menuItems[3] = {"Sweep", "Staart", "Twee keer"}; 

int buttonPin =  A1;
int buttonState = 1; 
int lastButtonState = 1 ; 

int choice = 0; 
int cursorPos = 0; 

LiquidCrystal LCD(12, 11, 10, 9, 8, 7);  //Create Liquid Crystal Object called LCD

void showMenu(int counter, int cursorPos) {

  Serial.print("counter : ");
  Serial.println(counter);
  
  LCD.clear(); 
  LCD.setCursor(0, cursorPos); 
  LCD.print("--->"); 
  LCD.setCursor(5,0);  
  LCD.print(menuItems[counter]);
  LCD.setCursor(5,1); 
  LCD.print(menuItems[counter + 1]);  
};

void setup() {
  LCD.begin(16,2);  
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  showMenu(choice, 0); 
}


void loop() {

  buttonState = digitalRead(buttonPin); 

if ((buttonState != lastButtonState) && buttonState == 0) {
    
    lastButtonState = buttonState; 
    choice++;
    
    if (choice > sizeof(menuItems) -1) {
      choice = sizeof(menuItems);
    }

    if (choice < 0)  {
      choice = 0;  
    }
    
    cursorPos++; 
   

    showMenu(choice, cursorPos);
  };

  
}

En eigenlijk hoeft die pas naar een volgende regel te "springen" als de "cursor" onderaan is.

Dus nog wat werk te doen om dit werkend te krijgen.

Wanneer je cursor op de onderste lijn staat, en je naar beneden wil bewegen, kan je cursor niet verder.
Daarom moet je dan dus wat aan de overige inhuoud van je scherm doen.

klopt, ben aan het uitproberen hoe dat te doen.
denk dat ik meerdere functies nodig heb om dit voor elkaar te krijgen maar heb nog even geen idee hoe.

Denk nu aan dit in pseudo code

  • wordt er gedrukt op de knop om de rest van het menu te zien.
    • update de choice variable
    • controleer of choice niet meer is dan het aantal menu items
    • als die te hoog is ,zet de choice variable terug naar het aantal menu items
    • is de cursor in de 2e lijn.
      • beweeg het menu een naar boven.
      • zet dan de cursor terug naar de 1e lijn.

Lijkt dit op een goed plan ?

Dit is in ieder geval een bug. Als choice groter is dan 2 maak je choice 3.

Niet de oorzaak van je probleem maar ik wil het even melden.

oops dan zou dan ook choice = sizeof(menuitems) -1 zijn

Nog niet helemaal maar daar had ik even overheen gekeken. Print voor de lol sizeof(menuItems) eens uit in setup().

chips. antwoord is 18

Moet zoiets als dit gebruiken:

(sizeof(menuItems) / sizeof(menuItems[0]))

en dat geeft 3.
Blijkbaar heeft een string een vaste getal voor geheugengebruik.

maar wat vindt je van mijn plan ?

En dit is een bug die ervoor zorgt dat er slechts één keer iets gebeurt als je op de knop drukt; een tweede keer gebeurt er niets. Ik stel voor dat je veel meer debug informatie print (seriële monitor) zodat je kunt zien wat er gebeurt.

oke

eens goed nadenken dan hoe ik kan "zien" of een button ingedrukt is.