Zo, ben er dus weer een tijdje mee bezig geweest.
Ik denk dat het menu nu gerepareerd is.
Ik ben nu niet thuis dus kan niet even de code in mijn Uno zetten om te testen.
Daarvoor zou ik een aantal regels moeten aanpassen die te maken hebben met een ander display (1602) en mogelijk andere toetswaardes, maar omdat je menu nu nog klein is zou dat verder wel moeten werken.
Probeer de bijgevoegde sketch nog maar eens om te zien hoe het nu is.
De belangrijkste verandering is het verplaatsen van de regel die "3" afsluit (nu op regel 63).
Ik vermoed dat je lastige toetsverwerking kwam doordat er dus dingen door mekaar liepen.
Heb hem net geprobeerd en het werkt!!
Het display is nu ook veel stabieler en het knippert ook niet meer met het intoetsen van de knoppen.
Er zitten nog twee kleine foutjes in.
1
Als ik nu in het menu Distilleren/Instellingen ben.
En ik kies voor optie 2 INSTELLINGEN en ik druk normaal op de OK toets.
Dan gaat hij naar het menu INSTELLINGEN en gelijk weer terug naar menu 2 DISTILLEREN-INSTELLINGEN.
Dit gaat uiteraard zeer snel en haast niet te zien.
Druk ik de toets OK nu heel snel in dan werkt het wel en komt hij in het volgende menu Instellingen (mm=4).
En dan is het goed.
2
het tweede probleem is en dat was de vorige keren ook zo.
Is dat wanneer ik nu in menu mm=4 ben (instellingen)
en ik druk op de ok toets gaat hij weer terug naar het menu distilleren/instellingen.
Dit wil ik er eindelijk uit hebben.
Omdat ik in het volgende menu (mm=4)
weer andere opties wil invoegen.
en ik wil alleen terug naar het begin menu distilleren / instellingen
Als ik hier een keuze voor maak.
Hoop dat je dit begrijpt wat ik hier mee bedoel.
De commentaren die je bij de code hebt gezet hebben me nu een hoop geleerd.
Dit was net de info die ik miste om sommige dingen te begrijpen mijn dank hiervoor.
Ik hoop dat ik vanaf nu wat makkelijker het menu kan opbouwen door je commentaren.
Ik hoop dat je samen met mij eerst de andere twee foutjes wilt oplossen.
Voordat ik veder ga met het menu opbouwen.
Zodat ik zonder problemen veder kan gaan stap voor stap.
En dat ik dit hier dan kan posten.
Kom ik dan een fout tegen of iemand anders.
Kunnen we hierop gelijk inspringen
En leer ik hier het meest van.
Ik denk dat het probleem met het terug keren naar het begin menu .
Te maken heeft met de eerste optie van de code.
Waarin er eerst ok geselecteerd moet worden, om met het menu te beginnen.
PRESS OK
Ik denk dat hij dit stukje constant mee neemt in de loop en hierdoor eindelijk de twee foutjes ontstaan.
Wat denk jij daarvan=
Alvast bedankt voor deze hulp in het oude jaar.
En vooral voor het goed beginnen in het nieuwe jaar met dit projeckt!!
Dat je display nu niet meer knippert, is precies waarom ik het menu in 2 stappen doe.
Dat is dus eerst het menu afbeelden, en dan de bediening van dat menu zonder het hele scherm te wissen en weer opnieuw te schrijven (dat is een wat uitgebreidere manier om te zeggen "hij knippert").
Dat gebeurde de laatste keer dus omdat je als het ware mm2 en mm3 had samengevoegd.
Het stukje met "Press OK" is nieuw en door jou gemaakt, ik zal daar nog eens extra naar kijken want dat had ik tot nog toe niet gedaan.
Ik had eerder al iets gemaakt om te voorkomen dat je onbedoeld heen en weer gaat springen tussen de menu's.
Dat zal ik nog eens bekijken.
Mogelijk moet na het registreren van de enter toets die waarde even op slot gedaan worden, maar das dus iets wat bekeken moet worden.
Als die waarde inderdaad zoals jij vermoed twee keer word verwerkt terwijl void.loop 1 keer doorlopen word, dan moet dat dus opgelost worden.
Ik zal dan ook nog even naar mm 4 kijken, daar heb ik ook weinig aandacht aan besteed omdat ik vond dat daar niets gebeurt (ik geloof dat dat een leeg menu is).
Ik kan je niet vertellen wanneer ik daar tijd voor heb, dus je geduld blijft nodig.
Ik heb nu menu modus 4 en 5 toegevoegd, en helemaal onderaan staat dat nog een keer als commentaar.
Dat onderste stukje kun je als macro gebruiken.
Als je een nog een menu verder wil gaan, kun je dat stukje als basis pakken.
Knippen tussen de /* en */, en dan in loop plakken.
Daarna aanpassen aan jouw wensen, en je hebt er weer een menu bij getoverd.
Hier zijn nu 3 regels (waarvan 1 de titel is) gebruikt, maar je kan dus ook hier weer uitbreiden tot 4 regels en meerdere kolommen zoals in mijn eerste voorbeeld van een paar maanden geleden.
Ik heb ook wat ingebouwd dat moet voorkomen dat je maar heel kort in je menu blijft.
Ik had namelijk ooit iets gemaakt om te zien of er een nieuwe toets was ingedrukt.
Dan werd de variabele KeyDet 1.
In dat geval werd die toets pas afgehandeld.
Alleen werd KeyDet nergens meer gewist, in ieder geval niet in mm 3.
Dus als je dan in mm 4 terecht kwam, dan was KeyDet nog steeds 1 maar er was in werkelijkheid helemaal geen nieuwe toets geregistreerd.
Door de waarde direct te wissen (er een 0 van te maken), nadat geconstateerd was dat deze 1 was, kan dat niet meer gebeuren.
Ik weet niet zeker of dat het probleem ook echt was, maar het was in ieder geval iets dat niet klopte.
Omdat mm 4 en 5 direct na mm 2 en 3 worden uitgevoerd als aan de voorwaarden word voldaan, moest deze aanpassing sowieso gemaakt worden.
super heb hem geupload en het werkt bijna.
Het probleem wat er nu nog inzit
Is nog steeds dat hij kijkt of er op ok gedrukt word.
Dit heb ik toen zelf ingezet.
als ik nu instellingen selecteer en duw rustig op ok gaat hij weer terug naar mm=2
Kies ik instellingen en druk snel op toets ok
gaat hij wel netjes naar mm=4
Dit komt volgens mij door mijn toegevoegde code in het begin van de scets.
Ik denk dat hij bij elke keer bij het doorlopen van de loop.
Controleerd of de ok toets word gebruikt.
Ik zou dit ook kunnen oplossen door in plaats van press oke
hier een delay neer kan zetten van een paar seconden
en het stukje code verwijderen van press oke.
Wat denk jij daarvan?
Een delay vind ik bijna altijd een slecht idee.
De delays die niet in de loop zitten zijn wel ok, maar in de loop vind ik dat daar betere oplossingen voor zijn.
Het probleem dat je nu nog ziet komt vermoedelijk omdat dat het eerste is wat je doet als je een toetsdruk hebt binnengehaald.
Het maakt nu ook niet uit in welke menu mode je dan bent.
Daarom kun je beter controleren of niet alleen zojuist de OK toets werd gedrukt, maar ook of we wel in mm 1 zitten, want alleen dan willen we met de OK toets in mm 2 terecht komen.
Dus heb ik de regel: if ((key ==4)) // Waneer toets 4 "OK" gedetecteerd word ga dan naar menu 2
Aangepast als volgt: if ((mm==1)&&(key ==4)) // Waneer toets 4 "OK" gedetecteerd word ga dan naar menu 2
Hierdoor worden beide voorwaarden gecontroleerd voor er naar mm 2 word gegaan in het opstartscherm.
Dan heb ik er nog een extra veiligheidje ingebouwd.
Wanneer in mm 5 het menu word verlaten door op item 2 te gaan staan en de OK toets word gedrukt, dan word niet alleen de menu modus omgeschakeld, maar word ook de informatie van de toets gewist door er -1 (betekent geen toets gedrukt) in te zetten.
Toch klopte daar nog iets anders niet zie ik net.
Want er werd ook naar mm 4 teruggeschakeld als je in mm 5 zat.
Dat betekent ook dat wanneer je daar eenmaal inzit, je er niet meer uit kunt.
Want mm 4 word maar 1 keer uitgevoerd, en dan word direct naar mm 5 omgeschakeld.
Dat was ook een foutje.
Er moet naar een andere menu mode dan 4 worden omgeschakeld.
Het lijkt me wel logisch dat je dan naar mm 2 wil gaan maar je zegt zelf dat dat niet de bedoeling is.
Waar wil je heen als je uit menu 4 (en 5) gaat door exit te kiezen ?
Of heb je die keuze om dat menu te verlaten niet ?
In mm 2 word de hoofdkeuze gemaakt tussen distilleren of instellingen.
En in mm 1 word nu alleen nog maar gewacht op de OK toets.
Je kunt ook in mm 1 meetwaardes op je scherm zetten die dan worden getoond zolang er niet op OK word gedrukt.
Dat kun je doen nadat je een keer in mm 2 bent geweest om de keuze te maken tussen instellen en distilleren.
Als je dat wil dan laat je dus eerst je startscherm zien zoals nu, en een volgende keer als je het menu verlaten hebt komen dan je waardes tevoorschijn.
Dat heb ik nu dus niet ingebouwd, dus kom je terug in mm 2.
Inderdaad een betere oplossing dan die van mij.
Ook vind ik het wat profesioneler overkomen.
Inplaats van een delay
Wat je schrijft aan het eind is uiteindelijk mijn bedoeling.
Bij instellingen kun je alle waarden gaan aanpassen.
Als je dit hebt gedaan kom je weer in het menu instellingen distilleren.
Dan gaan we distileren waarin je in een paar stapen het distilleren begint.
En je in een begin scherm komt met temperaturen .
Ben bezig om een overzicht te maken in blokken wat ik wil.
Deze zal ik je van de week even toe sturen.
Heb je een idee wat ik wil maken.
Waarschijndelijk heb je hier ook ideeen over.
Ben ook bezig om de onewire dallas temp sensors in de ketel te plaatsen.
Hierna ga ik de naald kraan automatiseren.
Weet nog niet of ik dit met een servo of stappen motor ga doen.
Wat zou het makkelijksre zijn met software schrijven?
Al met al nog een hoop te doen.
Maar dit uitdokteren maken en over lezen om te leren.
Vind ik reuze leerzaam om te doen.
Nou dan word er in een volgende versie mm 0 toegevoegd.
Als je begint en er een welkomst scherm word weergegeven, ben je dan in mm 0.
Daar kom je ook nooit meer terug als je er eenmaal uit bent.
Na het drukken op de OK toets gaat het zo als het nu is, maar als je dan het menu uiteindelijk verlaat door te kiezen voor distilleren, kom je in mm 1.
mm 1 is dan dus wat het meest op je scherm zal staan en dat zijn dus je meetwaardes en zo van het distilleren zelf.
Voor je naaldkraan (geen idee wat dat is), is aansturen met een servo het eenvoudigst.
Niet alleen vanwege de software, maar ook vanwege de hardware.
Want om een stappenmotor te kunnen gebruiken voor zoiets als dit, moet je ook een sensor hebben die registreert wanneer je aan het beginpunt bent aangekomen (kraan == dicht).
Ik weet alleen niet of zo'n servo wel sterk genoeg is om dat te doen, en een servo heeft een maximale verdraaiing van 180 graden.
Ik ben al heel wat aan het stoeien geweest met het nieuw menu.
Om te weten hoe het werkt.
Door je comentaren is het nu een stuk duidelijker!
Weet nu ook hoe dit werkt.
Ik heb nu weer een vraagje waar ik niet uit kom.
Ik heb een menu opgebouwd onder instellingen.
Ik zal het hier proberen weer te geven hoe dit op het scherm er uitziet.
Het menu heb ik nu weergegeven als hierboven
Dit staat onder mm=4
Nu dit is opgebouwd is sluit ik mm=4
En ga ik naar mm=5
Hieronder heb ik drie (cases) gemaakt.
Zodat het pijltje voor <+/-> komt te staan.
Ook is het me gelukt om het pijltje op de juiste manier over deze 3 keuzes te laten gaan.
Het selecteren is ook geen probleem.
Maar wat ik graag zou willen is om niet met de knoppen omhoog omlaag over deze 3 keuzes te gaan
Maar met pijltje links en rechts.
Omdat ik de 5 knoppen zoals onder in het bedieningspaneel wil zetten
^
< OK >
v
Zodat het wat logischer word.
Weet jij een manier om deze twee toetsen daar aan te koppelen?
De waarde van toets links is 448 en rechts is 0
Ik zal de code met het nieuwe stukje menu er bij zetten
Nog een kleine aanvulling.
Het menu zoals je de laatste keer hebt aangepast
Werkt nu zonder problemen!!
bedankt.
Een naaldkraan is eindelijk een gewone kraan alleen wat precieser af te stellen.
Dus niet zo van open en dicht maar druppel voor druppel.
Deze kraan gaat heel soepel open en dicht.
Ik heb hier wat servos liggen die erg veel kracht kunnen leveren.
En waar ik mee heb getest en die krijgen de kraan met gemak open.
Ik ben alleen iets aan het bedenken om de slag van 180 graden om te zetten naar twee omwentellingen
van de naaldkraan.
De opening van de naaldkraan word later in stappen gedaan
Die daar dan voor zijn ingesteld bv 0 dicht 128 volledig open.
Nog genoeg om mee te hobbyen.
Maar geduld en tijd is bij mij geen probleem.
Er mee bezig zijn is voor mij ook al een hobby
mvg Rolf
Na nog eens goed naar je menu te kijken zag ik hoe ik het kon oplossen.
Eindelijk te simpel om het over het oog te zien.
met het stukje code
if (KeyDet){ // Het volgende word uitgevoerd omdat we een nieuwe toets hebben gezien, anders overgeslagen
// Omdat we de toets vrij moeten geven voordat we naar het volgende item gaan, moeten we kijken of de waarde nieuw is of niet
if ((key)==0) Item++; // Toets UP, dus Item verhogen ( is nu 0 dus toets RECHTS geworden)
if ((key)==3) Item--; // Toets DOWN, dus Item verlagen (is nu dus 3 geworden LINKS)
if ((Item)==4) Item=1; // 5-1 // dit stukje is hoe de pijl over het menu gaat en weer terug // Als we voorbij de hoogste komen, gaan we weer terug naar de eerste
if ((Item)==0) Item=3; // 0-4 // Ga naar de laatste item // Als we onder de laagste komen, gaan we naar de hoogste
if ((Item==2)&&(key==4)) { // Waneer "INSTELLINGEN" is gekozen en op de toets (4) OK word geduwd
Item = 1; // Zet Item terug, anders zouden we per ongeluk het menu de voelgnde keer op de verkeerde plaats binnenkomen en er gelijk weer uit raken voor we er goed en wel in zijn.
mm = 2; // Zet menu mode terug zodat we het volgende "rondje" het menu hebben verlaten
key = -1; // Wis key waarde ( -1 is geen key geregistreerd) zodat ie niet de volgende ronde nog blijft hangen.
} // Sluit Instellingen OK
Ik hoefde alleen toets links en rechts aan te geven.0=rechts en 3 is links.
Weer een voorbeeld dat je menu dus
beginners vriendelijk is.
Ook is het makkelijk dat je dit per menu kunt veranderen of toevoegen.
Dus weer een stukje veder met het opbouwen van het menu.
Hou je op de hoogte!!
Ik heb het menu weer wat veder opgebouwd.
Als je in het menu instellingen komt ga ik daar veder met 1 keuze per display grootte.
Ik zal proberen dit even uit te leggen met een tekeningetje.
Dit zie je nu in het display.
Duw je nu op de OK toets.
Dan kom je in het volgende scherm uit:
VOORLOOP TEMPERATUUR
INSTELLEN:
87'C
<+/->
In de toekomst kun je in dit scherm met de pijltjes omhoog/omlaag de temp veranderen.
Deze staat nu op 87 graden zoals in het voorbeeld ziet.
Druk je op het pijltje naar links (ESC) kom je in menu instellingen 1 terug.
Dit werkt nu
Als je nu weer in het menu instellingen bent en je drukt op het pijltje naar beneden
kom je in het volgende scherm.
dit werkt ook allemaal naar behoren ook kun je via menu 2 van instellingen via de ok toets in een volgend menu komen.
Maar als ik nu dit zo door doen naar menu instellingen 3 gebeurt er iets vreemds dan werkt
het menu niet meer.?
ik zal de code toevoegen hoe het allemaal werkt
en de code waar ik een derde menu aan heb geknoopt en het niet meer werkt.
ziet iemand hier de fout waar het mis gaat?
Hier een stukje code als voorbeeld wat ik heb gemaakt
if (mm ==4) // Zitten we in menu mode 4 ?
{ // We gaan het menu afbeelden
lcd.clear(); // Wis het display zodat we klaar zijn voor het normale scherm
lcd.setCursor(0,0); // Ik ben er niet helemaal zeker van dat we die cursor echt al terug moeten zetten
lcd.print("1) -INSTELLINGEN-");
lcd.setCursor(1,1); // Tweede regel, tweede positie
lcd.print(" INSTELLEN TEMP.");
lcd.setCursor(1,2); // Derde regel, tweede positie
lcd.print(" VOORLOOP OPVANG");
lcd.setCursor(0,3); // Derde regel, tweede positie
lcd.print("<ESC> <+/-> <OK>");
mm = 5; // Het menu is gemaakt, nu gaan we naar de volgende stap, namelijk bediening ervan
} // Sluit MM 4; het menu is gemaakt
if (mm ==5)
if (KeyDet){ // Het volgende word uitgevoerd omdat we een nieuwe toets hebben gezien, anders overgeslagen
KeyDet = 0; // Omdat we de toets vrij moeten geven voordat we naar het volgende item gaan, moeten we kijken of de waarde nieuw is
if ((mm==5)&&(key ==4)) { // Waneer toets (4) OK word geduwd
Item = 1; // Zet Item terug, anders zouden we per ongeluk het menu de voelgnde keer op de verkeerde plaats binnenkomen en er gelijk weer uit raken voor we er goed en wel in zijn.
mm = 6; // Zet menu mode terug zodat we het volgende "rondje" het menu hebben verlaten
key = -1; // Wis key waarde ( -1 is geen key geregistreerd) zodat ie niet de volgende ronde nog blijft hangen.
} // Sluit toets OK
if ((mm==5)&&(key ==3)) // Waneer toets 3 "ESC" gedetecteerd word ga dan naar menu 2
{ // 3
mm = 2; // zie hierboven: ga naar menu modus 2
} // Einde 3; Deze stond eerst verderop maar hier past ie beter
if ((mm==5)&&(key ==2)) // Waneer toets 2 "OMLAAG" gedetecteerd word ga dan naar menu 8
{ // 3
mm = 8; // zie hierboven: ga naar menu modus 8
} // Einde 3; Deze stond eerst verderop maar hier past ie beter
} // -- Sluit KeyDet --
Wat werkt er dan niet meer ?
Heb je bemerkt dat je maar de 1e helft van zo'n menu hebt gekopieerd, en niet de 2e ?
Je maakt dus de inhoud van het scherm van mm12 , maar niet de verwerking die je in mm 13 zou doen.
mm 13 word wel ingesteld als huidige modus, maar je doet niets als je in mm ==13 zit.
Dus eigenlijk klopt het nog steeds en werkt een en ander precies zoals je gemaakt hebt.
Als je tevreden bent met jouw mm 10 en je mm 12 op vergelijkbare wijze wil laten werken, kun je beter mm 10 en 11 samen kopiëren en daar 12 en 13 van maken.
Die pas je dan weer aan naar de juiste gegevens.
Vergeet niet de commentaren goed bij te werken, ik zie dat sommige opmerkingen niet meer kloppen en dat zal vroeg of laat tot verwarring leiden.
Hoi mas heb het even geprobeerd wat je zij met kompleet copieren.
Ik zal de code even toevoegen zoals ik dit net heb getest
Ik heb hen nu voor me liggen
( wat is dit verslaafd om te doen zeg droom er gewoon soms van)
Als ik hem nu aanzet
loopt mooi door het welkomst tekst
kies ok
werkt ook goed kom ik in het menu waar ik kan kiezen met het pijltje instellingen/distilleren
kies instellingen
kom ik in het eerste menu van instellingen (kun je ook zien aan de 1 links boven in het display.
duw ik nu op het pijltje naar beneden.
Kom ik gelijk in menu 3 met de tekst test
hij gaat niet eerst naar menu 2 wat hij met de code zonder menu 3 wel netjes deed omhoog en omlaag
maar het vreemde is hou ik de toets omlaag in kom ik menu 2
laat ik hem los kom ik weer in menu 3
maar terug naar menu 1 lukt niet
duw ik op pijltje links (esc)
heb ik het zelfde probleem als met pijltje omhoog?
Nogmaals: zorg dat je commentaren kloppen, dat scheelt heel veel zoeken.
if (mm ==13)
if (KeyDet){ // Het volgende word uitgevoerd omdat we een nieuwe toets hebben gezien, anders overgeslagen
KeyDet = 0;
// Omdat we de toets vrij moeten geven voordat we naar het volgende item gaan, moeten we kijken of de waarde nieuw is
if ((mm==13)&&(key ==4)) { // Waneer toets (4) OK word geduwd
Item = 1; // Zet Item terug, anders zouden we per ongeluk het menu de voelgnde keer op de verkeerde plaats binnenkomen en er gelijk weer uit raken voor we er goed en wel in zijn.
mm = 14; // Zet menu mode terug zodat we het volgende "rondje" het menu hebben verlaten
key = -1; // Wis key waarde ( -1 is geen key geregistreerd) zodat ie niet de volgende ronde nog blijft hangen.
} // Sluit Instellingen OK
if ((mm==13)&&(key ==1)) // Waneer toets 2 "OMLAAG" gedetecteerd word ga dan naar menu 2
delay(50);
{ // 3
mm = 8; // zie hierboven: ga naar menu modus 8
lcd.clear(); // maak het lcd scherm leeg oftewel wis het vorige menu
} // Einde 3; Deze stond eerst verderop maar hier past ie beter
if ((mm==13)&&(key ==2)) // Waneer toets 2 "OMLAAG" gedetecteerd word ga dan naar menu 2
{ // 3
mm = 16; // zie hierboven: ga naar menu modus 8
}
if ((mm==13)&&(key ==3)) // Waneer toets 3 "ESC" gedetecteerd word ga dan naar menu 2
{ // 3
mm = 8; // zie hierboven: ga naar menu modus 2
lcd.clear(); // maak het lcd scherm leeg oftewel wis het vorige menu
} // Einde 3; Deze stond eerst verderop maar hier past ie beter
} // -- Sluit KeyDet --
} // -- Sluit loop; hier is de loop dus beëndingd --
Hier gebeuren rare dingen.
Ten eerste op de eerste regel die hierboven staat, die doet het volgende:
Als menu mode == 13
(doe niets en ga verder met de volgende regel)
Dat is niet de bedoeling.
Met het veranderen van 11 in 13, heb je vermoedelijk ook de daarbij geplaatste { gewist.
En omdat je daarna een foutmelding kreeg heb je ook de } die je over had gewist.
Door dit hele stuk weer in te sluiten tussen { }, hoef je verderop helemaal niet te controleren of we in mm 13 zitten, want dit stukje tussen { } word alleen uitgevoerd als we in mm 13 zitten.
Dus dan hoef je alleen nog maar te controleren welke toets er gedrukt werd.
Bij toets 1 ga je naar mm 8.
Bij toets 2 ga je naar mm 16 die niet bestaat.
Bij toets 3 ga je naar mm 8.
Ik vraag me af in hoeverre dat jouw bedoeling was.
Nogmaals: zorg dat je commentaren kloppen, dat scheelt heel veel zoeken.
lcd.clear(); // maak het lcd scherm leeg oftewel wis het vorige menu
Gebruik alleen commentaar als het echt nodig is om te begrijpen wat er gebeurt.
Hier staat dus echt 3x hetzelfde, zelfs een beginner van het eerste uur zal lcd.clear begrijpen.
Dat is dus (1) zonde van de type inspanning en (2) het vertroebeld de relevante commentaren
door gebruik te maken van eenduidige functie en variable namen wordt code stukken leesbaarder en hoef je minder commentaar te gebruiken. In plaats van korte cryptische variabelnamen besteed je type tijd aan goede namen. ook juiste datatype helpt enorm.
Overal staat " if (mm == 13) " dat kun je er ook uithalen
Ik heb het stukje code van de vorige post herschreven met betere namen voor de variabelen. Daarbij ook nog een bug gevonden.
Vraag aan jou, was al het commentaar nodig?
// bovenaan in je programma definieren
const int KEY_NONE = -1;
const int KEY_OMHOOG = 1;
const int KEY_OMLAAG = 2;
const int KEY_ESC = 3;
const int KEY_WEETNIET = 4; // betere naam nodig
if (menuMode == 13)
{
if (NewKeyDetected == true) <<<<<<<<< naam en type veranderd (weet niet of type verandering kan, afh. rest vd code
{
NewKeyDetected = false;
if ( key == KEY_WEETNIET )
{
Item = 1;
menuMode = 14;
key = NOKEY;
}
else if ( key == KEY_OMHOOG ) <<<< let op de ELSE die toegevoegd is.
{
delay(50); <<<<<<<< verzet, stond buiten de { }
menuMode = 8;
lcd.clear();
}
else if ( key == KEY_OMLAAG )
{
menuMode = 16;
}
else if ( key == KEY_ESC )
{
menuMode = 8;
lcd.clear();
}
}
}
ipv de nummers voor menumodes kun je ook const int's hiervoor definieren, bv
const int MENU_CONFIG=42;
Dat stukje gaat zo te zien alleen over het eerder door mij aangehaalde stukje uit het geheel.
De waarde 'key' komt uit een functie die dus de ingedrukte toets binnenhaalt.
De commentaren die er staan zijn in de loop van de tijd toegevoegd door homedistiller en mij om elke stap uit te leggen.
Daarna zijn delen van de code geknipt en geplakt, maar daarbij niet alle commentaren aangepast.
Ik ben het met je eens dat een commentaar dat eenmaal gegeven is, niet herhaald hoeft te worden.
Als er iets verandert dan kun je dat wel weer toelichten.
homedistiller heeft wel behoefte aan veel commentaar om te begrijpen wat er allemaal gebeurt, en dan word het erg vervelend als dat commentaar onjuist is.
Vandaar mijn opmerking daar over.
Ik heb in mijn vorige post proberen uit te leggen dat de controle op mm == 13 niet telkens hoeft te worden herhaald en dat de eerste keer als die controle word uitgevoerd, er niets mee gedaan word.
Dat alles door het wegvallen van de { }.
Dit menu heb ik ooit voor mezelf gebouwd om te zien of ik dat kon, zonder gebruik te maken van andere menu's en zaken die ik toen nog niet begreep.
Dat heb ik gebouwd aan de hand van een voorbeeld sketch dat de toetsen binnenhaalt uit mijn lcd keypad shield, nadat ik die had aangepast om goed om te gaan met variaties in de toetswaardes (er word nu gecontroleerd op een range in plaats van op absolute waardes).
Het was een eenvoudig menu dat niet dieper ging dan 2 schermpjes (plus het normale scherm buiten het menu).
De variabele namen waren voor mij voldoende duidelijk en ik vond kortere namen lekkerder (minder typen bijvoorbeeld).
Inderdaad leest en werkt het wel een stuk sneller als je niet controleert op een toetswaarde, maar op de toets functie, zoals omhoog, omlaag, links en rechts.
En dan heb je ook minder snel een stukje commentaar nodig om het te begrijpen.
Het moet ook een niet al te groot probleem zijn dat alsnog te gaan doen (wel een beetje werk).
En als het menu zo groeit tot een groot ding, kun je inderdaad beter proberen om meer passende variabelen te gebruiken.
Ik heb eerder gezegd dat je het best eerst een overzicht kunt maken van alle menu schermen die je wil maken en waar die ten opzichte van elkaar moeten komen.
Want dan kun je van te voren al een idee krijgen hoe het er uit ziet en welke variabelen (en diens types) je gaat gebruiken.
Je laatste tip volg ik niet helemaal.
Bedoel je dat je de menu mode wil controleren aan de hand van de variabele contante naam (if mm == MENU_CONFIG) ?
Dat is inderdaad ook weer duidelijker (door een naam in plaats van een abstract getal), maar gebruik je dan niet wat veel variabelen constanten terwijl daar telkens slechts 1 keer op gecontroleerd word ?
Dat menu dat ik gemaakt had heb ik hier in het begin aangeboden als mogelijkheid op homedistiller's vraag naar een menu.
Maar hij wil een stuk dieper gaan met een hele menu structuur.
Dat moet ook kunnen, en in eerste instantie kun je dan dingen herhalen met andere waarden en andere kleine wijzigingen.
Wellicht is er een veel efficiëntere manier om dit te doen (met een aantal functies bijvoorbeeld), maar ik ben bang dat homedistiller het dan niet meer kan volgen.
Aangezien homedistiller hier regelmatig vragen over heeft, is elke stap inmiddels toegelicht.
En aan het eind is er nu ook een stuk commentaar dat geknipt en geplakt kan worden en dan heel snel als nieuw menu scherm kan worden gebruikt na wat relatief kleine aanpassingen..