Arduino menu voor meesterproef

Hallo,

Ik ben voor mijn meesterproef van O&O. Dit is een vak waarbij ik een product moet maken voor een opdrachtgever. Hiervoor maak ik een testruimte voor RC-auto. In deze ruimte is het mogelijk om een aantal dingen te meten waaronder de gewichtsverdeling per wiel en het aantal RPM. Er zit ook een windtunnel omheen waarmee de aerodynamica kan worden getest. Er is doormiddel van stappen motoren de verkanting, de hoek waaronder de auto staat , in te stellen. Ook is de wielbasis in te stellen doormiddel van motoren. En de plaats van de rook is met stappenmotoren in te stellen.

Het is mij nu gelukt om al deze onderdelen los aan te sturen. Ook heb ik alle motoren in een menu staan samen met de fan controller en de load cells. In dit menu is er doormiddel van drukknoppen te switchen tussen verschillende menu's en met andere knoppen zijn deze instellingen weer aan te passen.

Ik liep bij de RPM meter tegen het probleem aan dat er een interrupt in zit. Deze zorgt ervoor dat zodra het menu voor de RPM meter in wordt gegaan er niet meer naar een andere pagina gegaan kan worden. Hoe los ik dit op?

Verder worden de stappen motoren minder snel naarmate de code langer wordt. Is hier een oplossing voor?

De Weegschalen werken, alleen er zit een delay in van 500 milliseconden kan ik deze delay eruit halen zodat de knoppen wel gelijk reageren?

Ik hoop dat iemand mij kan helpen.

De code is als bestand bij gevoegd want deze is te groot om als tekst weg te zetten.

button_menu_008_4motoren_4xloadcel_fan_controllerl.ino (12.5 KB)

Blink-without-delay geeft je keurig aan hoe je ipv te wachten op 500mS je nu na 500mS iets gaat doen. Zonder het proces te stoppen. Dus ff die sketch bestuderen en je weet de oplossing.

Bedankt ik zal er naar kijken. Heeft u ook een oplossing voor het probleem met de interrupt want dit is het enige wat echt nog helemaal niet werkt?

Hoi Bassie123, welkom.

Ik kom bijna in de verleiding om je te vertellen dat je het aan Adriaan moet vragen, of even aan de binnenkant van je ogen moet bekijken.
Maar dat zal ik niet doen.

Dankzij de blink without delay sketch, zul je een aantal zaken leren.
Dus neem je tijd om die sketch goed te bestuderen.

Ik heb niks met interrupts (nog niet nodig gehad).
Maar ik weet wel dat je je interrupt routines zo kort mogelijk moet houden.
En ik denk niet dat die interrupt je probleem vormt.

Ik heb toch nog even je code bekeken.
Blink without delay is er voor om blokkerende code te voorkomen.
Maar delay is niet de enige manier om blokkerende code te genereren.
In de functie waar je het toerental gaat laten zien, blokkeer je op 2 nivo's .
Want je gebruikt er delay(400), maar die staat achter een zeer foute while.

Want while() betekent dus zolang er aan de voorwaarde tussen de (haakjes) wordt voldaan, doe je wat er tussen de eerstvolgende {} staat.
Een test of aan een voorwaarde wordt voldaan, resulteert in een nul voor niet waar, en een 1 voor wel waar.
En wat jij dus doet, is dit:

Zolang waar waar is, doe je het gedoe met de rpm_arrays.
Als je daar eenmaal inzit, hoe ga je daar dan weer uitkomen ?

Dat is je probleem.

Verder vraag ik me ook af hoe vaak time niet >0 zal zijn.

Bedankt voor de reactie.
Het ligt dus aan de while loop. Aan welke voorwaarde moet ik deze while dan laten voldoen. Ik kom daar namelijk niet achter.
En ik zal inderdaad de blink wihout delay nog eens heel goed bestuderen.

Ik heb geen idee.
Iemand heeft ooit bedacht dat het een goed idee zou zijn om dat zo te doen.
Dat is degene van wie je de code 'geleend' hebt.
Zou je die persoon dus moeten vragen.

De while is bedoeld om in een eindeloze loop te komen, en dat lukt dus.
Als je dat niet wil, dan moet je er iets aan doen.
Maar dan kun je dus niet while(1) doen.
Ik zou echt niet weten waarom je daar een while() zou moeten toepassen.
Want je haalt een waarde binnen.
En als die er is, dan ga je even wachten, print die waarde naar het scherm.

Dan ga je even wachten, en print die oude waarde nog een keer naar het scherm.
Dan ga je even wachten, en print die oude waarde nog een keer naar het scherm.
Dan ga je even wachten, en print die oude waarde nog een keer naar het scherm.
Dan ga je even wachten, en print die oude waarde nog een keer naar het scherm.
Dan ga je even wachten, en print die oude waarde nog een keer naar het scherm.
.
.
.
Dat blijf je dus oneindig doen, en het slaat helemaal nergens op.

Maar als je vind dat iets soortgelijks gedaan moet worden, dan moet je het dus slimmer aanpakken.
Dan maak je een flag, en die flag set je als je de RPMs wil gaan doen.
Wanneer je dan op het betreffende stukje aangekomen bent, dan ga je dus de RPMs telkens opnieuw ophalen.
En daarna kun je die opgehaalde RPMs gaan afbeelden.
Verder kijk je dan of er op een bepaalde knop gedrukt word.
En als die knop werd gedrukt, moet je ergens iets resetten.

Als je het zo doet, dan sluit je jezelf dus onder een voorwaarde op in een weergave van RPMs, totdat die voorwaarde niet meer geldt.
En dat is waar een while() voor bedoeld is.
Wat je nu doet, is misbruik maken van het while() mechanisme, terwijl je het zelf niet door hebt.
En dus loop je in de val.

Ik heb geen idee wat een meesterproef en / of O&O is, maar als het programmeerwerk daar een onderdeel van uitmaakt, dan betwijfel ik wel of je je al op het meester nivo kunt begeven.
Maar goed, aan de andere kant ben je dus nog met de opleiding bezig.
Dus is er nog hoop.

Ik denk dat ik hem snap.
O&O is trouwens een onderdeel van de havo waar wij projecten voor een opdrachtgever uitvoeren en in dit project sluiten wij onze havo af. Ik heb in 4 maanden 5 uur per week mezelf arduino leren programmeren. natuurlijk zitten hier iets meer dan de standaard uurtjes in. Volgensmij verward u dit een beetje met een master opleiding. Maar dat maakt verder niet uit.

Zoals gezegd, ik ken het niet.
Havo was me ook een nivo te hoog destijds, maar das vooral ook al heel lang geleden.
Dus ik denk niet dat er toen al op een dergelijke wijze gewerkt werd.

De naam meesterproef kan op verschillende wijzen ontleed worden, en is daarmee ambiguous oftewel dubbelzinnig.
Dat is een slechte eigenschap in Arduino land.
Ik neem aan dat jij die naam niet bedacht hebt, en het is je daarmee dus niet kwalijk te nemen.

Wanneer je je probleem opgelost hebt, en het naar je zin werkend hebt, stellen we het hier op prijs als je jouw oplossing ook toont.
En als je opdracht ook een begeleidend rapport van jouw hand vereist, dan stel ik het op prijs als deze thread in de bronvermelding terecht komt.
Zou het wel om een master's degree of nog hoger gaan, dan zou ik dat zelfs eisen.

als je de functie bijv RPM niet gebruikt zet dan de interupt uit.
en je kunt natuurlijk in de while meerdere voorwaarden zetten dus een stopknop kan ook.