Do - While voor een bepaalde tijd

IDE gerelateerde berichten
Berichten: 4
Geregistreerd: 03 Mrt 2016, 10:12

Do - While voor een bepaalde tijd

Berichtdoor Bar » 15 Aug 2016, 17:01

Ik zit enorm te rommelen met een volgens mij niet ingewikkeld vraagstuk.

Voor een schietspelletje (nerf), heb ik een aantal doelen gemaakt. Die doelen lichten random op. Op een gegeven moment blijft een lampje bij een willekeurig doel langer branden(1). Dat is het doel dat je moet raken. Tot zover gaat het goed.

Nu moet gedurende (1) een loop geactiveerd worden voor een bepaalde tijd. Die loop bekijkt of een knop wordt ingedrukt (knop zit achter het doel en wordt ingedrukt als het doel wordt geraakt, moment push button). Dat laatste lukt ook nog. Alleen ik krijg het niet voor elkaar om een loop gedurende een bepaalde tijd uit te voeren als voldaan wordt aan één criterium.

Excuses voor de rommelige code. Ben de hele dag bezig, veel gewijzigd:)
cpp code
int sign = 0;
int numCounter = -1;
int x = 0;
int previousNo = 0;
int randomNumber;
int A = 0;
int B = 0;
#include <TM1637Display.h>
const int CLK = 8; //Set the CLK pin connection to the display
const int DIO = 9; //Set the DIO pin connection to the display
TM1637Display display(CLK, DIO);

const int buttonPin = 10; // runs hit

void setup() {

pinMode(2, OUTPUT);// digital ports run relays
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(buttonPin, INPUT);
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
display.setBrightness(0x0a);}

void getRandomNo() {
int rand = random(2,8);
if(rand == previousNo) {
getRandomNo();
} else {
randomNumber = rand;
previousNo = randomNumber;
}}

void loop() {
display.showNumberDec(A);
getRandomNo();
digitalWrite(randomNumber, LOW); delay(500); digitalWrite(randomNumber, HIGH);
x=x+1;

if ( x == 10) {digitalWrite (randomNumber, LOW); }

do
{
shoot();

} while (x == 10);// maar hoe beperk ik de shoot() loop voor een bepaalde tijd?



void shoot () {
if digitalRead(10 == HIGH) { A = A+1;
digitalWrite (randomNumber, LOW); delay(250); digitalWrite (randomNumber, HIGH); delay(250);
digitalWrite (randomNumber, LOW); delay(250); digitalWrite (randomNumber, HIGH); delay(250);
digitalWrite (randomNumber, LOW); delay(250); digitalWrite (randomNumber, HIGH); delay(250);
digitalWrite (randomNumber, LOW); delay(250); digitalWrite (randomNumber, HIGH); delay(250);
digitalWrite (randomNumber, LOW); delay(250); digitalWrite (randomNumber, HIGH); delay(250);
digitalWrite (randomNumber, LOW); delay(250); digitalWrite (randomNumber, HIGH); delay(250);
digitalWrite (randomNumber, LOW); delay(250); digitalWrite (randomNumber, HIGH); delay(250);
digitalWrite (randomNumber, LOW); delay(250); digitalWrite (randomNumber, HIGH); delay(250);
digitalWrite (randomNumber, LOW); delay(250); digitalWrite (randomNumber, HIGH); delay(250);
digitalWrite (randomNumber, LOW); delay(250); digitalWrite (randomNumber, HIGH); delay(250);
delay (4000);x=0;}

display.showNumberDec(A); }

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Do - While voor een bepaalde tijd

Berichtdoor Koepel » 15 Aug 2016, 17:35

Een recursieve functie in een microcontroller die afhankelijk is van een random getal ? In theorie gaat dat een keer mis (over een paar duizend of paar miljoen jaar misschien).

Je mag gerust meer lege regels toevoegen, en meer commentaar, en minder functies op dezelfde regel.
Als je ergens 10 keer dezelfde code hebt staan, dan kun je daar een for-loop van maken.
Code: Alles selecteren
for( int i=0; i<10; i++)
{
  digitalWrite( randomNumber, LOW);
  delay( 250);
  digitalWrite( randomNumber, HIGH);
  delay( 250);
}


Zoiets als hieronder hebben we allemaal wel eens. Als je te lang naar een code kijkt, dan zie je het niet meer.
Je wilt pin 10 lezen, en niet pin "10 == HIGH". Misschien werkt het al, als je deze bug er uit haalt.
Code: Alles selecteren
  if digitalRead(10 == HIGH) {


De functie shoot() zit binnen de functie loop(). Dat lijkt me niet de bedoeling.
Kun je in het menu de gereedschap/auto-opmaak aanklikken ? Dan zie meteen wat ik bedoel.
Kun je die functie verplaatsen naar buiten de loop() ?

Het is me niet helemaal duidelijk wat de bedoeling is. Als je een probleem omschrijft, kun je het dan eerst omschrijven zonder in programma code te denken ?
Nu gaat een random led aan gedurende een halve seconde.
Af en toe gaat er een led knipperen. Dus die blijft niet altijd aan ?
En dat knipperen stopt als de knop wordt ingedrukt ? En als de knop nooit wordt ingedrukt, stop het dan na een bepaalde ook ?
Je hebt meerdere doelen, maar slechts één knop ? Dus de code wordt nog uitgebreid voor meerdere knoppen ?
Is er nog een 'beloning' ? Bijvoorbeeld een pieptoontje dat het raak was, of alle leds even aan doen.

Je kunt tijdens de delay kijken of de knop wordt ingedrukt. Dat gaat het gemakkelijkst met een aparte functie, die bijvoorbeeld 1ms wacht, dan naar de knop kijkt, dan weer 1ms wacht, enzovoorts. Dat lijkt me hiervoor voldoende en het gemakkelijkst.
Je kunt ook in een loop de led aan en uit zetten en maar 1 keer per loop naar de knop kijken.
En dan is er millis(), daarmee kun je allerlei fancy timing, delays en andere dingen tegelijkertijd doen, maar dat vergt dat de sketch helemaal omgebouwd moet worden.

Berichten: 4
Geregistreerd: 03 Mrt 2016, 10:12

Re: Do - While voor een bepaalde tijd

Berichtdoor Bar » 16 Aug 2016, 07:59

Dank! Met name dat laatste is een interessante optie. Je hebt 4 seconden de tijd om te schieten, dus zou ik die 'loop' 4000 x moeten herhalen. Dat gaat lukken. Maar wat als de treffer juist die ene ms plaatsvindt?

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Do - While voor een bepaalde tijd

Berichtdoor Koepel » 16 Aug 2016, 10:40

Hoeveel milliseconden blijft die knop ingedrukt ?
Als het minder dan een milliseconde is, dan zou je een interrupt kunnen gebruiken.

Je zou ook een extra weerstand en condensator kunnen gebruiken als een RC filter, om de pulse iets verlengen.

Als ik het me zo voor me zie, dan schat ik de tijd op 20ms tot 50ms, maar is puur gissen hoor :shock:

Ik bedoel het iets anders. Is deze pseudo code duidelijk genoeg ?
De delay wordt vervangen door een delay die naar de button kijkt. De return waarde geeft aan of er een 'hit' was. Dit 'hit' springt eerst uit de for-loop van de delay, en daarna uit de for-loop van het knipperen.
Code: Alles selecteren
  for een aantal malen knipperen
  {
    led aan;
    if( delay_met_kijken_naar_button( 250)) break;
    led uit;
    if( delay_met_kijken_naar_button( 250)) break;
  }
...

boolean delay_met_kijken_naar_button( int milli)
{
  for( int i=0; i<milli; i++)
  {
    delay(1);                         // rek de delay uit naar afzonderlijke delays van 1ms
    if( digitalRead( buttonPin) == LOW)   // button aktief ?
      return( true);      // a hit
  }
  return( false);     // geen button
}

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Do - While voor een bepaalde tijd

Berichtdoor shooter » 16 Aug 2016, 11:05

er staat een fout in namelijk de onderste functie staat in de loop dus die moet je verplaatsen naar zelfde stuk als waar random staat.
In de random moet je niet recursief gaan werken, maar een while gebruiken dus zolang het nieuwe gelijk is aan de oude een nieuwe pakken anders klaar en return.

verder staat er tig keer precies dezelfde regel en dat klopt dus ook niet.
doe het dan in een for loop.
zorg dat je de delays eruit haalt en vervangt door een timer.
maak pin 2 en 3 vrij want daar kun je de button met een interupt op zetten, heb je geen last meer dat je knop niet gezien wordt.

en je eerste vraag:
de tijd dat los je op met blink without delay (zie arduino.cc)
die zet je in de loop, en dan spring je telkens even naar een functie die een led aan/uit zet.

om je code beter leesbaar te maken kun je pinnummers met een #define aangeven , dat hoef je maar 1 keer te doen vooraan in het programma
vaak gebeurt dat ook door een int te gebruiken, maar ach ieder zijn meug.
paul deelen
shooter@home.nl

Berichten: 4
Geregistreerd: 03 Mrt 2016, 10:12

Re: Do - While voor een bepaalde tijd

Berichtdoor Bar » 16 Aug 2016, 19:46

Klopt Paul, ik was lui. Code zoveel aangepast dat ik de comments had weggehaald:) Ik ga weer aan de slag. Ik houd jullie op de hoogte! Dank voor de tips! Als het klaar is natuurlijk weer een keiharde video:)
Ik ga eerst break en boolean bestuderen. Nogmaals dank!

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten