Arduino - Om en kombination händer inom 2 sek

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
basekson
Inlägg: 69
Blev medlem: 24 juli 2012, 14:50:21

Arduino - Om en kombination händer inom 2 sek

Inlägg av basekson »

Hej,

Jag försöker få till en kod som läser av knapptryck från en IR-kontroll och om jag trycker 1,2,3 på mindre än 2 sekunder så aktiverar man en funktion. Trycker jag 1,2,3 på 3 sekunder så ska inget hända.

Har någon ett kort exempel på hur man kan få in tid i ekvationen? :)
cosmox
EF Sponsor
Inlägg: 3854
Blev medlem: 6 januari 2004, 02:11:54
Ort: Hjälteby - Tjörn

Re: Arduino - Om en kombination händer inom 2 sek

Inlägg av cosmox »

Hej igen,

Har du pillat något med arduino innan?
basekson
Inlägg: 69
Blev medlem: 24 juli 2012, 14:50:21

Re: Arduino - Om en kombination händer inom 2 sek

Inlägg av basekson »

Ja ganska mycket. Jag har fått allt att fungera men problemet är bara att få till upplåsning av funktionen via hemliga koden 1,2,3 inom en viss tid.
Användarvisningsbild
RDX*
EF Sponsor
Inlägg: 1646
Blev medlem: 28 maj 2003, 22:52:04
Ort: Skåne - Lund

Re: Arduino - Om en kombination händer inom 2 sek

Inlägg av RDX* »

Tänk på problemet som en tillståndsmaskin, där du har en timer som nollställer tillståndet.
Bild
basekson
Inlägg: 69
Blev medlem: 24 juli 2012, 14:50:21

Re: Arduino - Om en kombination händer inom 2 sek

Inlägg av basekson »

Tackar! Tänkte mest hur jag får till det där med tiden, kan PHP och där finns ju time() osv.
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino - Om en kombination händer inom 2 sek

Inlägg av Icecap »

Det behövs ju en timer!
Jag brukar ha en timer-interrupt på 10ms för såna grejer, interruptrutinen räknar sedan ner timer-variablen.

Du kan göra såhär:
1: Om '1' kommer in ska timer-variabeln ställas till 2 sek. Om du har en 100Hz interrupt blir det alltså 2000.
2: Du ska även ha en sekvensräknare som ställas till 1.
3: Om nästa tecknet är '2' ska sekvensräknaren räknas upp till 2, annars ska timer-variabeln nollas och sekvensräknaren nollas.
4: Samma som 3 fast med '3'.
5: Om timern är större än noll OCH sekvensräknaren == 3 är saken biff och du kan starta självdestruktionen eller vad du vill.
basekson
Inlägg: 69
Blev medlem: 24 juli 2012, 14:50:21

Re: Arduino - Om en kombination händer inom 2 sek

Inlägg av basekson »

Hänger med på det Icecap, tack!

Jag hänger dock inte med på hur man får en timer i Arduino? Kan 1% av c++ men fattar basic för att ta mig runt och koppla samman saker.

Jag förstod inte 100Hz interrupt, hur jag får en timer på 10ms och hur jag gör en self destruct, övrigt förstår jag.
Stort tack för att du tar dig tid! :)
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Arduino - Om en kombination händer inom 2 sek

Inlägg av johano »

Det räcker väl att timerinteruptet som körs var 2:a sekund nollar sekvensräknaren.
Om sekvensräknaren når 3 så körs funktionen, typ såhär nånting i lite pseudokod:

Kod: Markera allt


volatile int sequence = 0;

void TimerInterrupt() 
{
    sequence = 0;
}

void setup()
{
   // setup a timer interrupt to fire every 2seconds
}

void loop() 
{
    while(1) 
    {
       if(BUTTON1_PRESSED && sequence==0)
          sequence=1;
       if(BUTTON2_PRESSED && sequence==1)
          sequence=2;
       if(BUTTON3_PRESSED && sequence==2)
          sequence=3;

      if(sequence==3)
      {
            // kör funktionen som ska köras.

            sequence=0; // nollställ
      }

    }
}

/j
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino - Om en kombination händer inom 2 sek

Inlägg av Icecap »

"Self destruct" var en joke, det är såklart "gör vad som ska göras om kombinationen är tryck inom given tid".

Då jag inte besmittar mig med Arduino kan jag knappast hjälpa dig med den delen, jag vet dock att det finns en systime() som stegar 1ms åt gången som kan användas.

Kommer det '1' kan du spara systime() + 2000 i en variabel och när kombinationen är inne OCH systime() <= variabeln är saken biff.

Johano: med en 2 sek. interrupt kan du inte veta om du börjar vid 1,99 eller 2,01.
Senast redigerad av Icecap 9 januari 2019, 11:06:55, redigerad totalt 1 gång.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Arduino - Om en kombination händer inom 2 sek

Inlägg av johano »

Icecap: Ah du har helt rätt såklart!! :doh:

tänkte inte på det :-)
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino - Om en kombination händer inom 2 sek

Inlägg av Icecap »

johano: det är lugnt - jag har lärt mig det den hårda vägen...
basekson
Inlägg: 69
Blev medlem: 24 juli 2012, 14:50:21

Re: Arduino - Om en kombination händer inom 2 sek

Inlägg av basekson »

Vilka gudar ni är, tack!! :)
Användarvisningsbild
Klas-Kenny
Inlägg: 11328
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Arduino - Om en kombination händer inom 2 sek

Inlägg av Klas-Kenny »

I Arduino kan du använda millis() på ett liknande sätt som time() i PHP.
SeniorLemuren
Inlägg: 7809
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Arduino - Om en kombination händer inom 2 sek

Inlägg av SeniorLemuren »

Om du söker på timer Arduino så hittar du massor av exempel på olika sätt att använda timers i Arduino Här kommer ett enkelt exempel som finns med i Arduinos IDE under Fil/Exempel/ElapsedMillis

Simple example of using elapsedMillis library

Kod: Markera allt

/*  
  Simple example of using elapsedMillis library
  
  This example does othing more than blinking a LED... but the difference 
  here to just using delay(1000) to control the delay between blinks is that 
  you can do more in the loop - like get user input, check buttons, get sensor
  input and other tasks that take time - while you wait for the next time the 
  LED is to change state. All you need to do is add it before or after the 
  'if' statement that controls the check of the time elapsed. 
  
  This example code is in the public domain.
*/

#include <elapsedMillis.h>

elapsedMillis timeElapsed; //declare global if you don't want it reset every time loop runs

// Pin 13 has an LED connected on most Arduino boards.
int led = 13;

// delay in milliseconds between blinks of the LED
unsigned int interval = 1000;

// state of the LED = LOW is off, HIGH is on
boolean ledState = LOW;

void setup() 
{                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

void loop()
{
  if (timeElapsed > interval) 
  {				
      ledState = !ledState;         // toggle the state from HIGH to LOW to HIGH to LOW ... 
      digitalWrite(led, ledState);
      timeElapsed = 0;              // reset the counter to 0 so the counting starts over...
  }
}
basekson
Inlägg: 69
Blev medlem: 24 juli 2012, 14:50:21

Re: Arduino - Om en kombination händer inom 2 sek

Inlägg av basekson »

Otroligt stort Tack alla för era inputs! Nu känner jag att jag har vad jag behöver för att lyckas när jag kommer hem ikväll.

Väldigt imponerad över detta forum med bra snabb feedback, tack vare er!
Skriv svar