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?
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.
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!
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:
"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.
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
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...
}
}