newbie die hulp nodig heeft bij code

Hallo,

Ik ben bezig aan een opdracht voor school met de arduino uno. Ik kom alleen niet uit een specifiek deel hiervan.
De bedoeling van de gehele opdracht is om een Living Colors lamp te maken met 2 knopjes een potmeter en 1 RGB led.
Hier horen 3 functies bij. Een Demo mode. 3 voorafingestelde kleuren, te kiezen met knop 1. En een knop waarme elke basiskleur gekozen kan worden welke je vervolgens kan dimmen om zo nadat je alle 3 de kleuren hebt ingesteld een specifieke kleur hebt.

Daar ligt het probleem.
Ik krijg het vooralsnog zo ver dat wanneer ik op de knop duw ik elke kleur kan kiezen.
De vierde druk op de knop zorgt ervoor dat de potmeter niks meer doet aan de kleuren.
Als je dan weer op de knop drukt moet je rood weer kunnen instellen.

Het probleem is echter dat hij meteen de waarde van de potmeter opneemt waarop die op dit moment staat. Maar stel dat ik rood wil laten staan en alleen een van de andere kleuren wil veranderen dan is dit heel onhandig omdat ik dan weer rood juist moet instellen.

Ik zoek dus een stuk code waar eerst gekeken wordt OF de potmeter waarde veranderd…zo JA dan pas mag ie de kleur aanpassen.

tekst uit de opdracht met de beschrijving

"Als men op de knop drukt voor het kiezen van de te mengen basiskleur, dan wordt de basiskleur gekozen die men met de potmeter kan aanpassen. Elke volgende druk op de knop zorgt voor het kiezen van de volgende basiskleur en het ‘op slot’ zetten van de instelling. De volgorde is: rood, groen, blauw en (na wordt bij de volgende druk op de knop weer rood gekozen).
Het drukken op deze knop verandert de kleur van de lamp niet."

Duidelijker dan dit kan ik het niet beschrijven.

Mijn code tot nu toe (dit is het losse deel met de code om de kleur aan te passen)

const int red = 9;
const int green = 10;
const int blue = 11;
const int colorMixerButton = 13;

int colorMixerButtonState = 0;
int lastColorMixerButtonState = 0;

int potMeter = A0;
int potMeterValue = 0;

int outputValue

int colorMixerCount = 0;

void colorAdjust()
{
  colorMixerButtonState = digitalRead(colorMixerButton);

  if (colorMixerButtonState != lastColorMixerButtonState)
  {
    delay(200);
    if (colorMixerButtonState == HIGH)
    {
      colorMixerCount++;
    }
  }



  if (colorMixerCount == 1)
  {

    potMeterValue = analogRead(potMeter);
    outputValue = map(potMeterValue, 0, 1023, 0, 255);
    analogWrite(red, outputValue);
    delay(2);
  }


  if (colorMixerCount == 2)
  {
    potMeterValue = analogRead(potMeter);
    outputValue = map(potMeterValue, 0, 1023, 0, 255);
    analogWrite(green, outputValue);
    delay(2);
  }

  if (colorMixerCount == 3)
  {
    potMeterValue = analogRead(potMeter);
    outputValue = map(potMeterValue, 0, 1023, 0, 255);
    analogWrite(blue, outputValue);
    delay(2);
  }

  if (colorMixerCount == 4)
  {
    colorMixerCount = 0;
    delay(100);
  }
}

void setup()
{


}

void loop()
{

  colorAdjust();

}

Ik ben echt pas net in de wereld van het programmeren gestapt en ik heb geen enkel idee hoe ik dit moet aanpakken. Misschien wilt iemand een stukje code schrijven, of een duidelijk voorbeeld geven hoe ik dit moet doen.

Alvast bedankt!

eigenlijk schrijf je best aardig hoor, wat weinig commentaar maar toch.
als eerste een opmerking over de functies:
maak de knop functie los van de coloradjust functie (dan worden de if statements ook niet zo diep.)
als eerste zet je de variabele buttonstate, maar dat is een HIGH en geen TRUE dus aanpassen door boolean ervoor te zetten.
dan vraag je of de huidige state ongelijk is aan de oudestate (prima manier om te debouncen.
echter als dat zo is dan staat er nergens een dat de doudestate verandert moet worden in de nieuwe state, en dus gaat je programma niet goed. ach een klein foutje geen probleem hoor.

leer maar snel serial met de monitor, dan kun je kijken op je computer wat er gebeurt.

de delays zijn niet echt nodig maar kan wel voorlopig. je leert snel genoeg blink met millis().

de volgende stap is om met case switch te werken dan heb je die ifs ook niet meer nodig (is gewoon een nette manier van programmeren.

kijk ook of de led gemeenschappelijke pin naar de plus of naar de min moet, als dat plus is dan in de map de getallen omdraaien is het snelste.

een extra stap in je programma:
laat de kleur knipperen als je die aan het instellen bent (is niet makkeleijk, maar dat is dan wel iets wat je niet uit een boekje kunt halen.
en ja je mag de docent best vertellen dat je hulp hier gevraagd hebt, en nodig hem uit om te kijken wat je vraagt en wat je hebt gekregen.
welke opleiding doe je, en waar?

Ik zie dat je de waarde van de potmeter pas binnenhaalt als je bepaald hebt welke kleur je wil instellen.
Je kunt dat ook telkens een maal doen als je in de functie colorAdjust terecht komt en voorbij het vaststellen dat je in de instellingsmodus zit.

De potmeter verandert continu als je in deze modus zit.
Wanneer je tussen kleuren springt, zal de potmeter vrijwel altijd op een positie staan die niet overeenstemt met de waarde die die kleur daarvoor had.
Een potmeter is niet geschikt als je hier omheen wil werken.
Er is wel een mogelijkheid dit te doen door aan een knopje te draaien, maar dat is weer een paar lessen verder in de cursus.
Die mogelijkheid heeft wel een ander voordeel, maar omdat dat niet je opdracht is gaan we er maar niet over verder.
Zoals shooter a zei, is de omschrijving van je probleem ook de oplossing van je probleem.
Je stelt deze voorwaarde:

OF de potmeter waarde veranderd…zo JA dan pas mag ie de kleur aanpassen

Maar er moet nog iets toegevoegd worden, want dit is niet alles wat je moet weten en bovendien kun je beter de vraag omdraaien.
Eigenlijk wil je het volgende als ik je goed begrijp:

OF de potmeter waarde NIET veranderd, EN je net van instel kleur veranderd bent.
Zolang je aan beide voorwaarden voldoet, moet er dus helemaal niets worden ingesteld.

Wanneer je in colorAdjust terecht komt, ga je kijken of er iets veranderd is in colorMixerButtonState.
Wanneer daar niets veranderd is, ga je 200 mS wachten, en vervolgens iets doen.
Ik begrijp niet zo goed wat de functie van het wachten daar is.
Het zal in ieder geval niet helpen tegen contactdender (debouncing).

Zoals je ziet aan mijn handtekening, ben ik een groot voorstander van het NIET gebruiken van delay().
Dat kan veel efficiënter, juist zoals het hier is toegepast.

Overigens kan je nog wel een beetje Human Interface toevoegen.
Je houdt al bij bij welke kleur je bent om in te stellen.
Je gebruiker moet dat ook voor zichzelf doen.
Je kunt die gebruiker daarbij helpen.
Dan laat je, wanneer je verandert van kleur, heel even alleen die kleur zien, zodat de gebruiker weet of ie rood, groen of blauw aan het instellen is.
Hoe je dat kunt doen moet je al weten want daarvoor heb je geen andere technieken nodig dan degene die je hier al hebt toegepast.
Of je docent deze afwijking van de opdracht zal waarderen weet ik niet.
Maar ondertussen is die kleine aanpassing wel een verbetering voor de gebruiker van het eindproduct (ook al zal deze oefening nooit tot zo’n eindproduct leiden).

Ik zal je een beetje in de goede richting helpen Je hebt twee nieuwe variabelen nodig:

boolean potMeterChange; // True or False; int lastPotMeterValue;

Direct na de regel colorMixerCount++; voeg je de regel PotMeterChange = False; toe Dit gebeurt steeds eenmalig nadat er op knop 2 gedrukt is.

Verder heb je in de : if (colorMixerCount == 1/2/3) { extra twee nieuwe if statements nodig namelijk: if PotMeterChange == False { hier wat code } if potMeterValue != lastPotMeterValue { en hier wat code } } Dit is een (van de vele) manier(en) om dit op te lossen, maar je moet het zelf uitwerken.

Over de delay's zou ik me voorlopig geen zorgen maken omdat het programma zo simpel is dat het niets nuttigs hoeft/kan doen gedurende de delay's

shooter: welke opleiding doe je, en waar?

Bedankt voor je uitleg ik heb ben er nog altijd niet uit maar nieuwe inzichten zijn altijd fijn. Ik zit op Fontys in Eindhoven en volg de opleiding HBO ICT en heb gekozen voor de richting Technology. Ik zit nog maar in de tweede periode en heb nog totaal geen eerdere programmeer ervaring. Dus het is wel heel pittig. Maar reuze interessant en WIL het ook zeer zeker onder de knie krijgen.

cartoonist: Ik zal je een beetje in de goede richting helpen Je hebt twee nieuwe variabelen nodig:

boolean potMeterChange; // True or False; int lastPotMeterValue;

Direct na de regel colorMixerCount++; voeg je de regel PotMeterChange = False; toe Dit gebeurt steeds eenmalig nadat er op knop 2 gedrukt is.

Verder heb je in de : if (colorMixerCount == 1/2/3) { extra twee nieuwe if statements nodig namelijk: if PotMeterChange == False { hier wat code } if potMeterValue != lastPotMeterValue { en hier wat code } } Dit is een (van de vele) manier(en) om dit op te lossen, maar je moet het zelf uitwerken.

Over de delay's zou ik me voorlopig geen zorgen maken omdat het programma zo simpel is dat het niets nuttigs hoeft/kan doen gedurende de delay's

Ontzettend bedankt voor deze hulp. Helaas heb ik het ook met deze info nog niet kunnen fixen. Soms weet ik gewoon nog niet waar ik wat precies moet neerzetten om het voor elkaar te krijgen. Ik geef het nog niet op in ieder geval en blijf er nog naar kijken en proberen. Ik mis toch soms op de opleiding een beetje de begeleiding in het hoe en waarom van dingen. Uitleggen waarom iets op een bepaalde manier werkt of concrete voorbeelden geven is geen sterk punt bij een aantal van de docenten.

MAS3: Wanneer je in colorAdjust terecht komt, ga je kijken of er iets veranderd is in colorMixerButtonState. Wanneer daar niets veranderd is, ga je 200 mS wachten, en vervolgens iets doen. Ik begrijp niet zo goed wat de functie van het wachten daar is. Het zal in ieder geval niet helpen tegen contactdender (debouncing).

Zoals je ziet aan mijn handtekening, ben ik een groot voorstander van het NIET gebruiken van delay(). Dat kan veel efficiënter, juist zoals het hier is toegepast.

Overigens kan je nog wel een beetje Human Interface toevoegen. Je houdt al bij bij welke kleur je bent om in te stellen. Je gebruiker moet dat ook voor zichzelf doen. Je kunt die gebruiker daarbij helpen. Dan laat je, wanneer je verandert van kleur, heel even alleen die kleur zien, zodat de gebruiker weet of ie rood, groen of blauw aan het instellen is. Hoe je dat kunt doen moet je al weten want daarvoor heb je geen andere technieken nodig dan degene die je hier al hebt toegepast. Of je docent deze afwijking van de opdracht zal waarderen weet ik niet. Maar ondertussen is die kleine aanpassing wel een verbetering voor de gebruiker van het eindproduct (ook al zal deze oefening nooit tot zo'n eindproduct leiden).

Ik had al zo'n gevoel dat er iets niet klopt met die delays. Maar ik zie mijn exacte fout niet eerlijk gezegd.

Ik snap je punt betreffende die delays dus ik zal zeker kijken naar het linkje in je handtekening en kijken of ik daar iets van opsteek en of ik dit (nu) snap, bedankt voor deze...tip.

Wat je beschrijft om de kleur even te laten zien voordat je hem instelt is een uitbreiding op de hoofdopdracht. Hier heb ik nog niet overnagedacht hoe ik dit precies wil doen. Het mag maar is geen vereiste voor de huidige 'hoofd' opdracht.

In ieder geval bedankt voor de info tot nu toe. Ook al lukt het me nog niet, elke nieuwe info is fijn om te te krijgen!

Mag ik vragen hoe je tot de code tot nog toe bent gekomen ?
(Bij deze doe ik dat dus).
Dat vraag ik omdat ik van mening ben dat je wat nodig is, al ergens anders in je code hebt zitten met eigenlijk maar weinig verschil.
Als je cartoonist’s antwoord en dat van mij combineert kom je mogelijk alweer wat verder.
We zijn ons er van bewust dat dit onderdeel is van je opleiding, en gaan je dus geen kant en klare code voeren.
Want dan heb je misschien wel iets dat werkt, maar geen idee hoe het dan werkt.
En dus heb je er dan niets van geleerd.
Zo kan het zijn dat je de zaken die we je aangeven, niet per se in die volgorde moeten worden uitgevoerd.

Je antwoord dat je met de aangegeven informatie “het nog niet hebt kunnen fixen”, zegt niet zo heel veel.
Als je twijfelt of je iets op de verkeerde plaats neerzet, vraag er dan naar.
Daarvoor moet je dus de aangepaste code tonen, waarop iemand dan weer in kan gaan.
Je hoeft je niet te schamen voor domme fouten of domme vragen (domme vragen bestaan niet, maar niet vragen is best dom).
Iedereen heeft fouten gemaakt en iedereen heeft wel eens hulp nodig om op die fouten gewezen te worden.

De link in mijn handtekening leidt naar het Nederlandstalige gedeelte van het forum, en dat heb je al gevonden.
Blink without delay vind je in de IDE bij de voorbeelden.
Cartoonist heeft gelijk dat de delays niet je 1e prioriteit opeisen.
Zolang je sketch niet veel meer behelst dan wat we tot nog toe gezien hebben doen ze niet heel veel kwaad, en kun je je dus eerst op de belangrijkere zaken concentreren.
Maar als je een delay van 200 mS doet, en je je realiseert dat de controller 16 miljoen instructies per seconde uitvoert, dan vertel je 'm op dat moment dus: “Doe 3.200.000 (drie komma twee miljoen) keer niets” en dat is heel vaak niets doen.

We horen / lezen hier best vaak commentaar over docenten.
Daar zal ongetwijfeld een waarheid inzitten, maar ik vraag me wel af of de zaken dan zo liggen als ze gesteld worden.
Ik heb zelf ook wel dergelijke docenten gehad, dus ik herken het wel.
Wanneer je docent het verhaal niet duidelijk weet over te brengen, is het wel zaak dat je dat aangeeft.
Ik weet niet of dat gebeurd is en ook niet of dat dan door die docent gehonoreerd werd.
Maar als dat niet is gebeurd, dan kan de docent er ook niet op ingaan.
Vraag de docent om de stof op een andere manier uit te leggen als je het niet begrepen hebt.

Het grote probleem wat ik tegenkom in het onderwijs is dat de studenten vrijwel nooit meer leren "programmeren" maar eerder "coderen". In feite zien we dat ook terug in alle voorbeelden van studenten hier. Ik heb vrijwel nooit een een programmastructuur gezien. Men gaat liever gelijk coderen... Tja en dan lopen ze vast. Dat ze gelijk hier komen sluit ik ook niet uit. Immers "Google is your friend"... Een veel gehoorde uitspraak. En toen reageerde "Google" met nogal wat antwoorden. En het "zelfstandig onderzoeks aspect" laat ook steeds meer te wensen over.. Zo moge blijken uit de scripties die ik de laatste 6 jaar onder ogen krijg... Verder ben ik het helemaal met MAS eens dat men misschien wat "assertiever" moet worden als men iets niet begrijpt....

als je nieuwe software hebt en die wilt laten bekijken dan kom maar op hoor, en ja eindhoven ken ik natuurlijk als boschenaar wel.

maak maar eens een flow sheet, dan zie je snel waar je fouten hebt. en natuurlijk die serialprint om te debuggen.

shooter: als je nieuwe software hebt en die wilt laten bekijken dan kom maar op hoor, en ja eindhoven ken ik natuurlijk als boschenaar wel.

maak maar eens een flow sheet, dan zie je snel waar je fouten hebt. en natuurlijk die serialprint om te debuggen.

Ik zal aan je denken als ik nieuwe stukken heb waar ik vragen over heb of wil laten 'beoordelen' Ik woon zelf in Oss en kom oorspronkelijk uit Maastricht (logisch eh).

nicoverduin: Het grote probleem wat ik tegenkom in het onderwijs is dat de studenten vrijwel nooit meer leren "programmeren" maar eerder "coderen". In feite zien we dat ook terug in alle voorbeelden van studenten hier. Ik heb vrijwel nooit een een programmastructuur gezien. Men gaat liever gelijk coderen... Tja en dan lopen ze vast. Dat ze gelijk hier komen sluit ik ook niet uit. Immers "Google is your friend"... Een veel gehoorde uitspraak. En toen reageerde "Google" met nogal wat antwoorden. En het "zelfstandig onderzoeks aspect" laat ook steeds meer te wensen over.. Zo moge blijken uit de scripties die ik de laatste 6 jaar onder ogen krijg... Verder ben ik het helemaal met MAS eens dat men misschien wat "assertiever" moet worden als men iets niet begrijpt....

Ik denk dat daar ook een beetje mijn probleem ligt. We beginnen meteen met die code neer te pennen zonder dat wij echt uitleg krijgen over hoe het nou in elkaar steekt en wat precies met elkaar te maken heeft en waarom. Ik probeer zoveel mogelijk op te zoeken op het web, er zijn echter heel veel verschillende manieren waarop iets kan. En gezien ik achtergrond info mis weet ik niet wat ik het beste kan toepassen. Vragen aan de docenten of medeleerlingen die zich het zelf hebben aangeleerd komt helaas vaak akelig dicht bij het antwoord 'dat is gewoon zo' in de buurt. Ikzelf ben nu 27 en sinds kort weer terug naar school gegaan. Ik heb 10 jaar gewerkt in de bouwmarkt. Ik wist niet goed wat ik wilde vroeger. Ik kom van Kader af maar mijn capaciteiten liggen op HBO. Ik ben volledig uit het studeren en de manier waarop is ook heel anders dan die 10 jaar geleden. Toen hadden we nog niet eens laptops in de klas. Ik denk wel dat ik de richting heb gevonden die ik op wil, de Technology kan vind ik reuze interessant.

MAS3: Mag ik vragen hoe je tot de code tot nog toe bent gekomen ? (Bij deze doe ik dat dus). Dat vraag ik omdat ik van mening ben dat je wat nodig is, al ergens anders in je code hebt zitten met eigenlijk maar weinig verschil. Als je cartoonist's antwoord en dat van mij combineert kom je mogelijk alweer wat verder. We zijn ons er van bewust dat dit onderdeel is van je opleiding, en gaan je dus geen kant en klare code voeren. Want dan heb je misschien wel iets dat werkt, maar geen idee hoe het dan werkt. En dus heb je er dan niets van geleerd. Zo kan het zijn dat je de zaken die we je aangeven, niet per se in die volgorde moeten worden uitgevoerd.

Je antwoord dat je met de aangegeven informatie "het nog niet hebt kunnen fixen", zegt niet zo heel veel. Als je twijfelt of je iets op de verkeerde plaats neerzet, vraag er dan naar. Daarvoor moet je dus de aangepaste code tonen, waarop iemand dan weer in kan gaan. Je hoeft je niet te schamen voor domme fouten of domme vragen (domme vragen bestaan niet, maar niet vragen is best dom). Iedereen heeft fouten gemaakt en iedereen heeft wel eens hulp nodig om op die fouten gewezen te worden.

De code die ik tot nog toe heb kunnen neerzetten heb ik gevonden door bij learning op deze website te kijken en het te combineren met wat ik eerder heb geleerd in de lessen op school. Ik begrijp ten volste dat jullie hier niet een volledig 'af' code gaan voorschotelen. Dat verwacht ik ook zeker niet.

Klopt wat je zegt dat er niet veel mee valt te doen als ik zeg dat ik het nog niet heb kunnen fixen. Momenteel ben ik even met een andere opdracht bezig maar ik zal er zeker nog hier op terug komen. Domme vragen bestaan inderdaad niet, soms niet weten hoe je de vraag moet stellen bestaat helaas wel in mijn geval.

Nogmaals bedankt voor de tips die jullie mij geven. Zo kom ik, ongeacht of het met programmeren te maken heeft, telkens een stap verder om mezelf te verbeteren.

Tiepie88: Ik denk dat daar ook een beetje mijn probleem ligt. We beginnen meteen met die code neer te pennen zonder dat wij echt uitleg krijgen over hoe het nou in elkaar steekt en wat precies met elkaar te maken heeft en waarom. Ik probeer zoveel mogelijk op te zoeken op het web, er zijn echter heel veel verschillende manieren waarop iets kan. En gezien ik achtergrond info mis weet ik niet wat ik het beste kan toepassen. Vragen aan de docenten of medeleerlingen die zich het zelf hebben aangeleerd komt helaas vaak akelig dicht bij het antwoord 'dat is gewoon zo' in de buurt. Ikzelf ben nu 27 en sinds kort weer terug naar school gegaan. Ik heb 10 jaar gewerkt in de bouwmarkt. Ik wist niet goed wat ik wilde vroeger. Ik kom van Kader af maar mijn capaciteiten liggen op HBO. Ik ben volledig uit het studeren en de manier waarop is ook heel anders dan die 10 jaar geleden. Toen hadden we nog niet eens laptops in de klas. Ik denk wel dat ik de richting heb gevonden die ik op wil, de Technology kan vind ik reuze interessant.

Het studeren tegenwoordig is duidelijk anders en er mijns inziens niet op voorruit gegaan. Neemt niet weg dat er zat te vinden is over het vak "programmeren". En kritisch blijven. Ik heb zelf ook een pupil op mijn werk die door mij "opgevoed" gaat worden. Soort privé les :). En dan merk ik wel dat ik nog eea moet afleren... Van gelijk doen naar eerste denken en dan doen... Maar ja die luxe heb je niet. Tegelijkertijd is er niets op tegen om kritisch te blijven richting onderwijzend personeel. Dus begrijp je het niet.... dan doorvragen... In mijn HBO tijd heeft een docent ook wel eens iets een x of 5 mogen herhalen... tot het kwartje viel.... En de rest van klas.... tja jammer.... Ik zit er voor mijn diploma niet omdat zij op tijd naar huis willen :)

Tiepie88: Ik probeer zoveel mogelijk op te zoeken op het web, er zijn echter heel veel verschillende manieren waarop iets kan. En gezien ik achtergrond info mis weet ik niet wat ik het beste kan toepassen.

Alle achtergrond informatie staat in principe op de referentie pagina van deze site.

nu is het moment aangekomen om je programma uit te printen, naast je neer te leggen en opnieuw te beginnen, je zult merken dat met de nieuwe kennis die je nu hebt het ineens geen groot probleem is, maar oplosbaar en nog simpeler ook.