Ga naar inhoud


nog een arduino vraag: schiet timer


Matchless

Aanbevolen berichten

  • Moderator

Voor een schiet vereniging heb ik een schiet-timer voor competities (service pistool) gebouwd.

echter geeft hij in 1 sessie onregelmatig problemen.

 

De 3e competitie onderdeel bestaat uit totaal 6 schoten, 3 series van 2 schoten telkens in 3 seconden.

Dus 3 seconde tijd voor schoten, 3 seconde pauze, 3seconde voor 2 schoten.... tot de sessie voorbij is.

de indicatie is een rood en groene led balk en een claxon.

 

Maar de timer geeft op deze sessie erg onregelmatige problemen.  Zo "vergeet" hij wel eens de claxon of de kleurverandering van de LEDs van groen naar rood.

 

Ik denk dat dit te maken heeft met de delay() commando.

Hier mijn stukje code:

 void sessie3(){
    digitalWrite(activePin, HIGH);
    digitalWrite(led3Pin, HIGH);
    digitalWrite(ledPin, HIGH);
    digitalWrite(soundPin, LOW);
    delay (300);
    digitalWrite(soundPin, HIGH);
    delay(2500);
    digitalWrite(soundPin, LOW);
    delay(200);
    digitalWrite(ledPin, LOW);
    digitalWrite(soundPin, HIGH);
    delay(3000);
    
    digitalWrite(ledPin, HIGH);
    digitalWrite(soundPin, LOW);
    delay (300);
    digitalWrite(soundPin, HIGH);
    delay(2500);
    digitalWrite(soundPin, LOW);
    delay(200);
    digitalWrite(ledPin, LOW);
    digitalWrite(soundPin, HIGH);
    delay(3000);
    
    digitalWrite(ledPin, HIGH);
    digitalWrite(soundPin, LOW);
    delay (300);
    digitalWrite(soundPin, HIGH);
    delay(2500);
    digitalWrite(soundPin, LOW);
    delay(200);
    digitalWrite(ledPin, LOW);
    digitalWrite(soundPin, HIGH);
    digitalWrite(led3Pin, LOW);
    delay(3000);
    digitalWrite(activePin, LOW);
     
    
    
  }
  

Ik heb echter geen idee hoe ik de tijdslijn anders kan bouwen zodat hij het wel betrouwbaar blijft doen.

Iemand een idee hoe ik het kan aanpakken?

Een smartphone is een hulpmiddel, geen levensstijl 

Kijk rond IN de wereld in plaats van voorover gebogen NAAR de wereld.

Link naar reactie
Delen op andere sites


Delay is de tijd dat het programma stilstaat dus de volgende regel wordt pas uitgevoerd als de delay om is.

Heb je de monitor (ik denk dat je arduino.exe gebruik) al eens mee laten lopen ?

hier een voorbeeld:

   Serial.begin(57600); // uitlezen via serial port op 57600
 
 void sessie3(){
    digitalWrite(activePin, HIGH);
    digitalWrite(led3Pin, HIGH);
    digitalWrite(ledPin, HIGH);
    digitalWrite(soundPin, LOW);
    Serial.print(" variabelenaam =  "); // hier de naam van een variabele
    Serial.print(variabele); // hier je status van een variabele
    Serial.print('\n'); // nieuwe regel
    delay (300);
    digitalWrite(soundPin, HIGH);
    delay(2500);
 

 

Je moet zelf de variabele invullen maar dan kan je zien wat er in de microcontroller gebeurd

suc6

Link naar reactie
Delen op andere sites

Ik zou zelf liever een timer interrupt gebruiken. Zet de timer op zodat je 10x per seconde een interrupt krijgt, en dan kan je domweg een teller bijhouden die tot 30 telt, en dan de status update.. http://playground.arduino.cc/Code/Timer1  

“Success is not final, failure is not fatal: it is the courage to continue that counts.” ~ Winston Churchill

Link naar reactie
Delen op andere sites

  • Moderator

Ik kan dat met de seriele monitor eens proberen maar de fout is erg onduidelijk. Want soms doet de claxon het niet en soms de led niet.

 

@big fellow..

 

Het zijn geen hele secondes die ik gebruik maar in de laatste paar minisecondes gaat de claxon en leds aan en die moeten aanblijven totdat de sessie is afgelopen.

want de schutters moeten stoppen als de led en claxon uitgaan.En die moeten lijken dat ze tegelijk uitgaan.

Aangezien multitasken op een arduino niet gaat moet ik ervoor zorgen dat het lijkt dat de claxon en leds tegelijk werken.

en de claxon moet toch een korte tijd aan want anders wordt deze niet goed gehoord.

Een smartphone is een hulpmiddel, geen levensstijl 

Kijk rond IN de wereld in plaats van voorover gebogen NAAR de wereld.

Link naar reactie
Delen op andere sites

Als je de interrupt 10x per seconde laat aanroepen, dan heb je een resolutie van 100ms.

 

Iets van dit (pseudo code)

ISR {  // Wordt dus 10x per seconde aangeroepen
  cntLed++;
  cndClax++
  if (cntLed > 10) cntLed = 0; // Reset de counter na 1 seconde
  if (cntClax > 30) cntClax = 0; // Reset de counter na 3 seconden
}
 
mainloop {
  if (cntLed ==  3 ) { // Dus 300 ms!
    LedOn();
  }
  if (cntLed == 6) { // Dus 300 ms nadat de LED is aangegaan!
    LedOff();
  }  
 
  if (cntClax ==  10 ) { // Dus 1000 ms!
    ClaxonOn();
  }
  if (cntLed == 20) { // Dus 1000 ms nadat de claxon is aangegaan!
    ClaxonOff();
  } 
}

Uiteraard is bovenstaand maar een voorbeeld hoe je dingen kan aanpakken. 

aangepast door Big fellow

“Success is not final, failure is not fatal: it is the courage to continue that counts.” ~ Winston Churchill

Link naar reactie
Delen op andere sites

  • Moderator

Maar ik zal de pauzes toch nog met een delay moeten doen ?

 

Ik kan iig het aantal delays of interupts verminderen door een subroutine te maken.

Een smartphone is een hulpmiddel, geen levensstijl 

Kijk rond IN de wereld in plaats van voorover gebogen NAAR de wereld.

Link naar reactie
Delen op andere sites

Kan je hier iets mee?

Maakt geen gebruik van delay(); dus lijkt me mogelijk wel meer de richting in te gaan die jij ook zou willen.

[Vu+ Solo4K] - [VTi 13.x]

[TVV Basic+] - [CD TopHD]
Ik vind het nieuwe overzicht met ongelezen topics in een tijdslijn maar niks...

Link naar reactie
Delen op andere sites

Maak een account aan of log in om te reageren

Je moet een lid zijn om een reactie te kunnen achterlaten

Account aanmaken

Registreer voor een nieuwe account in onze community. Het is erg gemakkelijk!

Registreer een nieuwe account

Inloggen

Heb je reeds een account? Log hier in.

Nu inloggen
×
×
  • Nieuwe aanmaken...