Arduino Uno Gametimer

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Berichten: 1
Geregistreerd: 01 Okt 2019, 16:52

Arduino Uno Gametimer

Berichtdoor LilJiggly » 01 Okt 2019, 21:34

Hey iedereen op het forum!

Graag zou ik wat hulp willen krijgen bij een Arduino project.
Het is in principe niks ingewikkelds, maar ik ben alleen niet zo goed in coderen.
Het idee is een gametimer in de vorm van pixel hearts om gamers bewust te laten worden van hun tijdsgebrek aan games en deze te regulieren door een timer te maken die ze eraan herinnert dat het tijd is om bijna te stoppen of te stoppen.

Bijgevoegd zit de poster voor het concept.
https://drive.google.com/open?id=1BMjKR9dN_OAuaUZnrRMFkF-e422wvzwJ

Ik ben in ieder geval op zoek naar iemand die mij zou willen helpen met de code.
De volgende code zou geschreven moeten worden:
- een timer functie van 2 uur ( om te prototypen 2 minuten )
- 4 hartjes die allemaal uit 2 led lampjes bestaan
- elk kwartier ( of 15 seconden ) gaat er een half hartje uit
- elk halfuur ( of 30 seconden ) gaat er een hartje uit + een "damage" geluidje
- wanneer de timer afloopt hoor je een game over geluid
- om de timer te starten druk je op de groene +1 (1up) knop
- iedere druk op de knop voegt een halfuur aan de timer toe ( half hartje )
- De rode knop reset de timer of zet em uit

Hoop dat iemand geïnteresseerd is!

Groetjes, Sam :)

Advertisement

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

Re: Arduino Uno Gametimer

Berichtdoor Koepel » 03 Okt 2019, 00:59

Als je code hebt die je niet begrijpt, dan kun je het niet wijzigen en loop je meteen vast als er iets verandert.
Wij geven er de voorkeur aan dat je iets probeert, en dan wijzen wij op de mogelijkheden.
Wanneer wij code geven, dan gaat het 9 van de 10 keer helemaal fout.

Om dit forum positief te houden, kunnen we dus beter géén kant-en-klare sketch geven.
Daar leer je er niets van en je raakt alleen maar gefrustreerd en minder geïnteresseerd in Arduino. Dat zou niet leuk zijn, want wij zijn Arduino-enthousiastelingen.
Je kunt beter iets doen dat je wel begrijpt, bijvoorbeeld met een ledstrip, of volg arduino beginners lessen op Youtube: https://arduino-lessen.nl/

Wanneer iemand een project wil beginnen, dan vraag ik vaak om een goede omschrijving. Dan haken de meesten al af.
Dus ik ben blij dat je logisch hebt nagedacht en een goede beschrijving geeft :D

Is het een opdracht voor school ?

Een paar opmerkingen:

"iedere druk op de knop voegt een halfuur aan de timer toe ( half hartje )"
Je bedoelt een kwartier ?
Je kunt een kwartier toevoegen, of je kunt naar de tijd springen die bij het aantal halve hartjes past.
Stel dat een kwartier bijna op is, en iemand drukt op de groene knop om een kwartier toe te voegen. Dan springt hij naar het volgende halve hartje die snel daarna verdwijnt (omdat het kwartier bijna op was). Dat kan verwarrend zijn.

"De rode knop reset de timer of zet em uit"
Dat kan nog wat beter uitgewerkt worden.

"Het is in principe niks ingewikkelds"
Als oefening voor mezelf heb ik gekeken hoe ingewikkeld het zou worden.
Code: Alles selecteren
// Met een Arduino Uno.
// In plaats van 4 (halve) hartjes zijn er 8 hekjes met punten er tussen.
// Toets in de seriele monitor een 'g' gevolgd door enter
// voor de groene knop. Type een 'r' gevolgd door enter
// voor de rode knop.
//
// De basis zijn seconden, die wordt gemaakt met millis().
//

unsigned long previousMillis;
const unsigned long interval = 1000;

unsigned long countDownSeconds;  // de (omlaag) teller in seconden
bool running;     // loopt de gametimer of niet

// De "test" waarden, 40 seconden en 5 seconden
const unsigned long maxSeconds = 40UL;
const unsigned long halveHartjesSeconds = 5UL;

// De "echte" waarden, 2 uur en 15 minuten
// const unsigned long maxSeconds = 60UL * 60UL * 2UL;
// const unsigned long halveHartjesSeconds = 60UL * 15UL;



int vorigeAantalHalveHartjes;


void setup()
{
  Serial.begin( 9600);
  Serial.println( "Gametimer");
}


void loop()
{
  // -----------------------------------------
  // millis timer om een 'tick' van 1 seconde te maken
  // -----------------------------------------

  if( millis() - previousMillis >= interval)
  {
    previousMillis += interval;   // += interval om in sync met de tijd te lopen
   
    // Hou de tijd bij voor het aftellen
    if( running)
    {
      if( countDownSeconds > 0)
      {
        countDownSeconds--;
      }
     
      if( countDownSeconds == 0)
      {
        Serial.println( "Game over geluid");
        running = false;
      }
    }
   
    // Een keer per seconde is ook handig om de seriele monitor te updaten.
    // Nu we hier toch zijn (in de 1-seconde-timer) kan dat er nog wel bij.
    if( running)
    {
      displayHartjes();
    }
  }
 
 
  // -----------------------------------------
  // Lees de "knoppen" in.
  // -----------------------------------------
  // Bij echte knoppen is een 'debounce' van de knoppen nodig.
 
  bool rodeKnop = false;
  bool groeneKnop = false;
  if( Serial.available() > 0)
  {
    byte data = (byte) Serial.read();
    switch( data)
    {
      case 'g':
        groeneKnop = true;
        break;
      case 'r':
        rodeKnop = true;
        break;
    }
  }
 
 
  // -----------------------------------------
  // Verwerk de informatie van de knoppen
  // -----------------------------------------
 
  if( running)
  {
    if( rodeKnop)
    {
      running = false;
      countDownSeconds = 0;
      Serial.println( "Gestopt");
    }
   
    if( groeneKnop)
    {
      countDownSeconds += halveHartjesSeconds;
      if( countDownSeconds > maxSeconds)   // niet boven maximum gaan
      {
        countDownSeconds = maxSeconds;
      }
      vorigeAantalHalveHartjes = -1;   // voorkom dat dit als overgang wordt gezien
    }
  }
  else
  {
    if( groeneKnop)
    {
      running = true;
      countDownSeconds = maxSeconds;
      vorigeAantalHalveHartjes = -1;   // maak ongeldig
      Serial.println( "Gestart");
    }
  }
}


void displayHartjes()
{
  // De count down naar boven afronden voor het aantal halve hartjes.
  // De hartjes zijn pas op, als de count down helemaal nul is.
  int aantalHalveHartjes = (int) (countDownSeconds / halveHartjesSeconds) + 1;
  if( countDownSeconds == 0)
  {
    aantalHalveHartjes = 0;
  }
 
  if( aantalHalveHartjes == 0)
  {
    Serial.println( "--.--.--.--");
  }
  else
  {
    for( int i=0; i<aantalHalveHartjes; i++)
    {
      if( i % 2 == 0 && i > 0)
      {
        Serial.print( ".");
      }
      Serial.print( "#");
    }
    Serial.println();

    // Controleer met de vorige waarde, maar alleen als de vorige geldig was.
    if( vorigeAantalHalveHartjes >= 0)
    {
      if( vorigeAantalHalveHartjes != aantalHalveHartjes)
      {
        // Het aantal hartjes is zojuist gewijzigd.
        // Bij 0, 2, 4, 6 een geluid, dus bij een even nummer
        // Omdat het "damage geluid" even kan duren wordt dit gedaan
        // nadat de hartjes zijn ge-update, omdat anders de vertraging
        // van het aantal hartjes te zien kan zijn.
        if( aantalHalveHartjes % 2 == 0)
        {
          Serial.println( "Damage geluid");
        }
      }
    }
    vorigeAantalHalveHartjes = aantalHalveHartjes;  // onthouden voor de volgende keer

  }
}


Ik ga je niet helpen met je project. Sorry :(
Als je iemand kunt vinden in je omgeving die het samen met jou kan maken, dan kun je mijn sketch als voorbeeld gebruiken.
Ik maak een 1-seconde-timer en de basis is de variabele 'countDownSeconds'. Het aantal hartjes wordt iedere keer opnieuw berekend.

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

Re: Arduino Uno Gametimer

Berichtdoor shooter » 03 Okt 2019, 16:14

om te beginnen kun je misschien beter eerst met scratch beginnen, dat is wat vriendelijker en makkelijker.
gebruik bijvoorbeeld mblock dat is scratch speciaal voor de arduino.
paul deelen
shooter@home.nl

Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten