Go Down

Topic: Eerste probeersel. Werkt niet zoals verwacht. Waar ga ik fout (Read 823 times) previous topic - next topic

FTMZ

Hallo mensen,

Ik heb een eerste opzet gemaakt van een sketch.
Ik heb maar weinig ervaring met de Arduino maar wat meer metPICbasic.
Programmeren is me niet vreemd maar de vertaalslag van Basic naar C gaat nogal stroef.
Ik hoop dat jullie me wat op gang kunnen helpen.

Wat ik probeer is te zien dat een knopje wordt ingedrukt. (keystroke)
Dat is een Bool want het is of aan of uit...
Dan gebeurt er her en der vanalles wat nu even irrelevant is.

Ik vraag me af hoe ik aangeef dat het RXledje zichtbaar knippert.
in voorbeeldcodes zag ik  "int RXLED = 17" , maar hoe en waarom snap ik nog niet.
Ik lijk zo een integer (variabele?) te maken met de naam RXLED en een waarde van 17.
Hoe weet de Arduino dat het poortje 17 is?
Met "int teller = 0" geef ik aan dat ik een variabele met de naam teller maak met een waarde van 0, toch?
Ik zie het verschil niet.
Ook bij "Const int key = 5" geef ik aan dat ik een variabele heb met een vaste waarde van 5. Dit is een poort, dus ook daar weer... Hoe weet Arduino dat dit een poort is?

Kijk alsjeblieft niet teveel inhoudelijk naar de code. Het zijn veel opzetjes en experimentjes.
Later werk ik dat uit.
Nu echt iets van: "als ik dit doe, wat doet hij dan?"

Code: [Select]

int teller = 0;
bool keystroke = 0; // 1 of 0 keyaanslag
int RXLED = 17;
const int key = 5;   //poort voor de key, gereserveert?
void setup() {
  pinMode(RXLED, OUTPUT);     //ledje ter indicatie
  pinMode(key,INPUT_PULLUP);  //keypoort
  pinMode(9,INPUT_PULLUP);    //failsafe

  Serial.begin(9600);
  teller = 0;
}

void loop() {
  while (digitalRead(9) == 0)
   {  RXLED = 1;
      delay(200);
      RXLED = 0;
      delay(300);
      Serial.println ("test");
   }
start:
 while (1 == 1)
  {while (digitalRead(key) == 0);
     {RXLED = 1;
      teller++;
      delay(1000);
      Serial.println (teller);
     }
   RXLED = 0; 
     
  }
}

nicoverduin

Kijk eens naar het voorbeeld programma blink.ino in de ide bij de voorbeelden
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

FTMZ

Ik denk niet dat ik je begrijp.
In het door jou genoemde voorbeeld kan ik niets verhelderends vinden.
Een ledje laten knipperen kan iedere starter. Dat is ook niet de issue.

Een groot deel van mijn code werkt wel, maar ik vraag me af wat wat doet. :smiley-confuse:
Waarom iets is zoals het is?
Waarom doe ik het zo en niet anders?

Enfin.
Inhoudelijk heb ik mijn vragen al omschreven in mijn startpost.  :smiley-cool:

MAS3

#3
Jan 18, 2019, 12:52 am Last Edit: Jan 18, 2019, 10:58 pm by MAS3 Reason: Typos
Hoi en welkom.

Jouw analyse is correct, maar niet compleet.

En Nico's antwoord is geheel terecht.
Als 'ie zegt kijk eens naar dat voorbeeld, dan bedoelt 'ie niet dat je er eens even heel kort overheen moet schieten, maar dat je aandachtig elke regel leest die daar in staat.
De betreffende sketch laat zien wat er nodig is, inclusief commentaar maar zonder overbodige toestanden.

Quote
Code: [Select]
int RXLED = 17;
Ik lijk zo een integer (variabele?) te maken met de naam RXLED en een waarde van 17
Dat is correct, maar niet de beste werkwijze.
Je maakt hier inderdaad een variabele aan met als inhoud de de waarde 17.
Maar deze variabele ga je nooit veranderen.
Daarom doe je er veel beter aan hiervoor geen kostbaar werkgeheugen van de Arduino te reserveren, want dat is wel wat je nu doet.
Beter is het in dit geval een constante toe te wijzen, dus dan word het dit:
Code: [Select]
const RXLED = 17;
Deze niet variabele variabele neemt in het geheel geen geheugen van je Arduino in beslag, want zal alleen intern in de compiler gebruikt worden.
Het betekent dat overal waar je RXLED hebt getypt, bedoelt dat daar de waarde 17 gebruikt moet worden.
En de tekst RXLED komt op meer plaatsen voor dan direct achter de afkorting int.
En daar word er pas werkelijk wat mee gedaan, das het antwoord op je 2e vraag.

De compiler heeft dit helemaal niet nodig, en die kan het niks schelen of je de const met die naam gebruikt, of de waarde die je er aan hebt toegekend.
Maar de programmeur wel.
Want die kan nu veel sneller volgen wat er gebeurt, en als je om een of andere reden een andere poort moet gaan gebruiken, hoe je dat maar op 1 plaats aan te passen.

Overigens, als dit alles is overgenomen uit een voorbeeld, dan weet ik wel waar dat voorbeeld dan vandaan zou komen.
Want het is wel een voorbeeld, maar dan van hoe je het beter niet doet.
Het hier bovenstaande stukje over const en int geeft aan waarom ik dat net typte, en in jouw code worden beide door elkaar gebruikt.
Uiteraard, als dit uit jouw experimenten is komen opborrelen, dan kun je uit mijn stukje hierboven halen hoe je het beter kunt doen en zul je dat dan waarschijnlijk ook wel tegenkomen in een duidelijk en doordacht voorbeeld.

Het is leuk dat je al wat van coden/programmeren hebt geproefd, maar daar zijn wel heel veel smaken ('talen') in.
En ja, dan kom je verschillen tegen, soms grote verschillen.
Maar je kunt veel beter naar de overeenkomsten kijken en met de verschillen leren omgaan.
Je zult zien dat deze verschillen er om een reden zijn.

We gaan het later nog wel even over while en delay hebben, das voor een dergelijk voorbeeld nog niet zo belangrijk....
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

GijKieken

Je moet ergens beginnen, http://www.arduino.nu/, volg daar een link om een manual down te loaden.

septillion

Ik lijk zo een integer (variabele?) te maken met de naam RXLED en een waarde van 17.
Correct
Hoe weet de Arduino dat het poortje 17 is?
Niet...

Met "int teller = 0" geef ik aan dat ik een variabele met de naam teller maak met een waarde van 0, toch?
Correct. En meer precies, een variabele van het type int.


Ook bij "Const int key = 5" geef ik aan dat ik een variabele heb met een vaste waarde van 5.
Correct. Ook al is de term variabele dan een beetje raar. Je hebt nu een constante (van type int) :)

Dit is een poort, dus ook daar weer... Hoe weet Arduino dat dit een poort is?
Weet, niet. Het hangt er puur vanaf waar jij de waarde gebruikt. Wil je 5 als pin (niet poort ;) ) benaderen kan je functies zoals digitalRead() en digitalWrite() gebruiken met de variabele (of constante).

En RXLED, is dat een led die je zelf aan pin 17 hebt gehangen? Welke Arduino gebruik je? Pin 17 is namelijk niet gebruikelijk op een Uno.


Overigens zijn dingen als labels en "while(1 == 1)" zeer ongebruikelijk. Functies vormen betere alternatieven voor labels (of eigenlijk goto's) en voor het laatste heb je nu eenmaal al de loop() :)

Ook, bedenk dat "een knop is ingedrukt" niet hetzelfde is als "een knop wordt ingedrukt". Eerste is hele tijdspanne dat de knop ingedrukt is waar het tweede het éénmalige specifieke moment is dat je de knop in drukt.
Use fricking code tags!!!!
I want x => I would like x, I need help => I would like help, Need fast => Go and pay someone to do the job...

NEW Library to make fading leds a piece of cake
https://github.com/septillion-git/FadeLed

FTMZ

Allereerst Nico, Excuus als mijn eerste reactie was lomp overkwam.
Ik heb altijd wat moeite met antwoorden waarvan ik niet kan inschatten waar het een antwoord op is. :-)

@Mas3,
Je uitleg is helder. Ik kan dit meteen weer vertalen naar PICbasic, waarin je middels de code "Symbol" kon aangeven welke naam er gekoppeld moest worden aan welke waarde of variabele.
Ik begrijp dat je een variabele kunt maken (Int), waar meteen een "alias" aan gehangen wordt (middels Const) en een vooringestelde waarde...

Ik kan in de voorbeeldsketches waar ik mijn eigen sketch uit schrijf niet meteen opmaken waar de koppeling of verwijzing van RXLED naar een bepaalde poort wordt gemaakt.

Even tussendoor een antwoord op Septilion's vraag... Ik heb de ProMicro. Om nog niet nader te noemen redenen. :-) In ieder geval zit daar poort 17(?) verbonden met de RXLED.
Ik baseer me even op voorbeelden die ook gestoeld waren op die ProMicro's.
Ik pak een voorbeeld voor dat printje en ga er aanpassingen in maken en bekijken wat dat doet. ;-)

Met Die Const int key = 5, wilde ik aangeven dat Key op poortje 5 zat.
Uit jullie uitleg maak ik iig op dat dat niet de manier is om een naam aan een poort toe te kennen.

Als jullie me dat kunnen uitleggen, kan ik daar even op doorborduren.
Het verklaar iig dat er niets gebeurd als ik poortje 5 naar null trek. En dát was net waar ik op vast kwam te zitten.

Tot slot, Mas3, weet ik niet waarom men een variabele wilde hangen aan een gegeven wat toch nooit veranderde. Ik snap nu je uitleg over het gebruik van kostbaar geheugen.
Daar kan ik ook verder mee.

@Septillion, voor zover ik jou nog niet heb beantwoord in bovenstaande, las ik je visie op de While statement.
Ik ken de While uit mijn "PICbasic-tijd" en daar werd de While loop altijd met een "Wend" afgesloten.
Dat gebeurt hier natruurlijk met de Brackets. Maar wat C niet leek te slikken was een poging om een oneindige loop te maken met "While 1 = 1". Dat trok hij niet. Maar wel wanneer ik er "While 1 == 1" van maakte.
Ik zou zo niet weten hoe ik andere loops kan bouwen, waar ik onder bepaalde condities uit kan springen.
Middels een Break of wanneer er andere zaken spelen.
Even los ervan dat ik die condities in de While loop kan plaatsten, wil ik wel weten hoe je simpele, oneindige loops kunt maken.

@GijKieken.
Ik ken die cursus... Ik ben er niet gecharmeerd van, ondanks de beste bedoelingen.
Hij is vertaald, maar lang niet alles is overgezet. Er zitten cruciale fouten in en er worden stukken overgeslagen, waardoor ik nog niet weet waarom men "iets" doet.
Ik denk de bekende fout van een tutorial: Er (onbewust) vanuitgaan dat men bepaalde zaken wel begrijpt zodat dit niet wordt benoemd.
Net als autorijden. Je kunt iemand zeggen dat hij een eindje naar voren kan rijden. Maar als diegene niet weet dat de auto in de versnelling moet staan, kom je er nog niet. :-)

GijKieken

Dan maar een tweede poging,
Begining C for Arduino  Jack purdum.

nicoverduin

@ftmz : Ik heb allang opgegeven om me daar nog druk over te maken. Ik weet van mijzelf wat ik wel en niet aan kennis in huis heb en hoe die is opgebouwd. Wat een ander daar mee doet is zijn/haar keus. Dus no hard feelings.
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

shooter

Er zijn een paar manieren om de pinnummers in je programma te zetten, ik gebruik liefst define rxpin=17
betekent dus dat als ik ergens in het programma Digitalwrite(rxpin,HIGH) ik eigenlijk schrij Digitalwrite (17,HIGH)
dat maakt het programma leesbaarder ipv dat je overal 17 neerschrijft. want dat kan van alles betekenen.
In Basic deden we dat ook zo hoor. Bovenaan een stelo pinnamen aan nummers hangen.
Het kan dus ook door een INT te benoemen. Is hetzelfde, behalve als define.


het mag natuurlijk ook een constante zijn dan wordt het in een ander stuk geheugen gezet.
paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

FTMZ

Hallo Mensen,
Even een update. Als ik schrijf:
Code: [Select]

const RXLED = 17

slikt hij dat niet.

Ik krijg daar een foutmelding op bij het compileren:
exit status 1
'RXLED' does not name a type


Misschien dat jij, MAS3, het zo bedoelde: ?
Code: [Select]

const int RXLED = 17


Gezien jouw terechte punt dat je dan onnodige datacapaciteit gebruikt, leek me dat onwaarschijnlijk.

Die optie "Define" van Shooter heb ik ook wel meer voorbij zien komen. Misschien is dat de "Symbol" die ik als alias bedoelde.
Ga ik zo eens mee experimenteren.

MAS3

Inderdaad, dat is wat ik had moeten schrijven.

Const is dus een afkorting van constante (de definitie van iets dat niet verandert), precies het tegenovergestelde van een variabele (de definitie van iets dat zal veranderen).
Zoals shooter al aangaf, kun je hetzelfde bereiken door "define" te gebruiken.

Je zal hierdoor nog steeds geen geheugen van de Arduino gebruiken en alleen geheugen van je PC lenen tijdens het compileren.


Je kunt in de reference (klik !) veel zo niet alles terugvinden over C/C++ dat we hier gebruiken.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

FTMZ

In zoverre ben ik een stuk meer gaan begrijpen. Mijn dank voor de input.  ;)
Intussen weet ik ook hoe poorten worden "gedeclareerd".
Eerst wordt de "constante variabele" gemaakt (het lijkt inderdaad onlogisch, maar het neemt inderdaad geen ruimte in).
Vervolgens kan ik die waarde koppelen aan een  poort.

pinMode(key,INPUT_PULLUP);  waarbij "key" eerder een waarde toegekend heeft gekregen.

Check! Leuk man, dit!

Nog wel verradelijk om een enkel "= teken" te gebruiken voor "is gelijk aan", waar dat eigenlijk "==" moet zijn.

Ik had nog wat verder gekeken naar define. Het is inderdaad een oplossing. Maar het is weer een code die je nét weer anders wegzet. "#" ervoor en geen ";" erachter. Waarom, weet ik niet... Maar verrekte lastig om dat weer even onder de knie te krijgen. "Const Int" is dan toch gemakkelijker...


septillion

Ik reageer even terwijl ik lees:

Ik begrijp dat je een variabele kunt maken (Int),
Een variabele is niet per definitie een int! In C/C++ ken je een hele verzameling aan verschillende type variabelen en je kan ze zelfs zelf definiëren. Dit maakt het en mogelijk andere taken te doen met verschillende variabele (tekst anders behandelen dan een nummer bijvoorbeeld) en het geheugen gebruik ligt vast.

waar meteen een "alias" aan gehangen wordt (middels Const) en een vooringestelde waarde...
Dat is geen alias, maar een type qualifier. Het geeft iets extra's aan voor de variabele. In dit geval dat hij niet te wijzigen valt.

Ik kan in de voorbeeldsketches waar ik mijn eigen sketch uit schrijf niet meteen opmaken waar de koppeling of verwijzing van RXLED naar een bepaalde poort wordt gemaakt.
Zoals gezegd gebeurd dat als je een functie aan roept die iets met een pin (niet poort!) doet. Binnen Arduino zijn de meest gebruikte digitalRead() en digitalWrite().

Even tussendoor een antwoord op Septilion's vraag... Ik heb de ProMicro. Om nog niet nader te noemen redenen. :-) In ieder geval zit daar poort 17(?) verbonden met de RXLED.
Ahh, kijk. Ben niet heel bekend met de Pro Micro maar dat lijkt inderdaad te kloppen.

Met Die Const int key = 5, wilde ik aangeven dat Key op poortje 5 zat.
Dat kan. Maar variabelen hebben alleen voor jou een betekenis, niet voor de compiler. Pas als jij de variabele gaat gebruiken om ergens een pin mee aan te passen zal het ook een functie krijgen voor de compiler.

Tipje voor goed programmeren, geef een variabele een duidelijke en beschrijvende naam en gebruik het kleinst mogelijke datatype wat alle mogelijke waardes kan bevatten. Zou dus hier
Code: [Select]
const byte KeyPin = 5;

Tot slot, Mas3, weet ik niet waarom men een variabele wilde hangen aan een gegeven wat toch nooit veranderde. Ik snap nu je uitleg over het gebruik van kostbaar geheugen.
Vooral voor de duidelijkheid voor jezelf :) Ook kan je zo op één plek het ook ooit veranderen naar bijvoorbeeld pin 7. Door const toe te voegen laat je de compiler weten dat de waarde nooit wordt aangepast. Dit helpt jou dat als je dat ergens in je programma toch probeert je een error krijgt (immers is dat iets wat je dus niet wilt) maar de compiler weet daarmee ook dat hij die waarde niet in het "kostbare" werkgeheugen hoeft te zetten.

Maar wat C niet leek te slikken was een poging om een oneindige loop te maken met "While 1 = 1". Dat trok hij niet. Maar wel wanneer ik er "While 1 == 1" van maakte.
Dat is ook logisch als je het verschil tussen = en == snapt. a = b staat voor het toewijzen van een waarde b aan variabele a (a is nu dezelfde waarde als b). a == b is de controle op gelijkheid (is a gelijk aan b?).

Ik zou zo niet weten hoe ik andere loops kan bouwen, waar ik onder bepaalde condities uit kan springen.
Middels een Break of wanneer er andere zaken spelen.
Even los ervan dat ik die condities in de While loop kan plaatsten, wil ik wel weten hoe je simpele, oneindige loops kunt maken.
Even los van het feit dat er nog een paar andere type loops zijn. Maar voornaamste is dat je zelden(!!!) een oneindigen loop wilt hebben! In de regel heb je er genoeg aan één om je hele programma maar te herhalen. En deze is er al! Dat is namelijk loop() :) Laat voor de rest het herhalen van het programma over aan loop() en sluit je programma niet ergens anders op een een oneindige loop.

Zoals shooter al aangaf, kun je hetzelfde bereiken door "define" te gebruiken.
Gebruik van define hiervoor raad ik ten strengste af. Grootste nadeel, zeker voor een beginner, is de vaak wazige errors die je krijgt als er een fout in zit. Naast dat je wat andere gekke effecten kunt krijgen als je dingen niet in haakjes hebt en het feit dat het niet type safe is. Dingen die een beginner niet gelijk snapt (of hoeft te snappen) maar hem juist wel kan helpen (aan de hand van nuttige errors) betere code te schrijven.
Use fricking code tags!!!!
I want x => I would like x, I need help => I would like help, Need fast => Go and pay someone to do the job...

NEW Library to make fading leds a piece of cake
https://github.com/septillion-git/FadeLed

FTMZ

Top, mensen!
Ik begin steeds meer te begrijpen.
Met wat gepuzzel kan ik het inderdaad af doen met één loop.
Punt is dat ik enkele routines heb waarbij de uitkomst gebruikt moet worden om samen met de uitkomst van andere routines tot een eindwaarde te komen.
Deze eindwaarde wordt overigens middels de KEYboard (HID) functie op het scherm geprojecteerd.
Daarom ook een ProMicro. Dit was een van de weinige (simpele) Arduino's die dit aankon.

Anyway,
Om de uitkomsten die beurtlings uit de verschillende routines komen, steeds weer te verwerken, had ik het plan gevat om dat in een subroutine te doen, die vanuit elke loop benaderd wordt.
Vroegah, ging dat met een Gosub/Return. Ik zie dat dit niet bestaat bij Arduino/C?

Hoe kan ik dan steeds naar de subroutine gaan om daar de verse gegevens te verwerken en weer terug te keren?

BTW, even over je laatste reactie.
Ik had een regel die wel werkte, maar die nu erg knullig lijkt...
Code: [Select]

const bool RXLED = 17; //variabele om te aan te geven dat poortje 17 de RXLED is

[edit]
Oioioi... Ga ik hier even mank... Was in de war met een Bit... :-(
[/edit]
Jij gebruikte daar Byte voor... Beide keren 1 of 0. Mijn oplossing werkte wel. Maakt het iets uit?
Of heb ik mazzel dat het werkt? (in de remarks staat nog steeds dat het een variabele is. Negeer dat maar even. :-) )

Go Up