PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PanoBot - Projektvorstellung und DREI Anfänger Fragen zum Code.



Smokyyo
23.03.2014, 04:39
PanoBot - Projektvorstellung

Sisor
23.03.2014, 11:37
Frage 01: ich wollte hier noch ne servo bewegung am Anfang aber es wiederholt sich alles
laufend... Der Anfang sollte nur einmal beim Anschalten und sich nicht laufend Wiederholen. wie
kann ich das machen???
Wenn du etwas in der loop machst wird es wiederholt. Daher der Name loop = Schleife.
Einmalige Sachen evtl. ins setup.


Frage 02:
Es ist gerade so das ich viele "Buttons" hätte (buttonPin 01-05), wie kann ich machen das
ich wenige habe und z.b bei Button doppel drücken, drei mal drücken, oder 5sek gedrückt halten
etc. meine ereignisse statfinden, die da wären: ………………im Code schauen…..
Etwas in der Art:

const int buttonPin = 2; // Pin des Buttons

void setup()
{
//Serial.begin(9600); // zum Testen mit Serial Monitor Kommentarzeichen entfernen
pinMode(buttonPin, INPUT);
}

void loop()
{
int btnPressed = buttonManager(); // gibt Wert in ms zurück
//if(btnPressed > -1) // zum Testen im Serial Monitor Kommentarzeichen entfernen
// Serial.println(btnPressed); // wenn Button gedrückt wurde: Ausgabe im Serial Monitor

if(btnPressed > -1)
{
// kurz gedrückt
if (btnPressed < 500)
{
// etwas tun
}
// etwas länger gedrückt
else if (btnPressed < 1000)
{
// etwas tun
}
// länger gedrückt
else if (btnPressed < 2000)
{
// etwas tun
}
// lange gedrückt
else
{
// etwas tun
}
}
}

int buttonManager()
{
static boolean pressed = false;
static unsigned long pressedMoment = 0;

if (digitalRead(buttonPin) == LOW) // Button gedrückt?
{
if(pressed == false) // gerade gedrückt?
{
pressed = true; // speichern, dass gedrückt wurde
pressedMoment = millis(); // aktuellen Zeitpunkt speichern
}
}
else // nicht gedrückt!
{
if(pressed) // wurde bis eben gedrückt?
{
pressed = false; // speichern, dass nicht mehr gedrückt wurde
int elapsedTime = millis()-pressedMoment;
if(elapsedTime > 50) // wurde mind. 50ms gedrückt?
return elapsedTime; // -> Rückgabe gedrückte Zeit in ms
}
}
return -1;
}

oberallgeier
23.03.2014, 13:58
...
if(btnPressed > -1)
{
// kurz gedrückt
if (btnPressed < 500)
{
// etwas tun
}
// etwas länger gedrückt
else if (btnPressed < 1000)
{
// etwas tun
}
// länger gedrückt
else if (btnPressed < 2000)
{
// etwas tun
}
// lange gedrückt
else
{
// etwas tun
}
}
Vermutlich hängts mit meinen lausigen C-Kenntnissen zusammen . . . denn ich denke, dass bei btnPressed < 500 schon mal die ersten drei Fälle "// etwas tun" bis btnPressed < 2000 abgearbeitet werden, hübsch der Reihe nach, aber eben alle drei. Ich war mal - theoretisch - über diese Abfragekonfiguration gestolpert und mache die Button-drück-Zeit-Analysen etwas anders.

Sisor
23.03.2014, 14:09
Vermutlich hängts mit meinen lausigen C-Kenntnissen zusammen . . . denn ich denke, dass bei btnPressed < 500 schon mal die ersten drei Fälle "// etwas tun" bis btnPressed < 2000 abgearbeitet werden, hübsch der Reihe nach, aber eben alle drei.
Nope. Die Else machts möglich...

Smokyyo
24.03.2014, 17:58
Vielen Dank, ich werde irgenwann die Woche weiter am Code basteln, wird sicher hilfreich sein.