Du springst mit deinen sw_1 und sw_2 wild in den Abfolgen rum. Dann ist während deiner delays keine tasterabfrage. Der taster muss also genau zur richtigen Zeit gedrückt sein. Zu früh oder zu spät und nichts passiert. während dann ein Delay im Zufallsbereich 500-8000 läuft kannst du so oft Taster drücken wie du willst, da passiert nichts. Und der merkt sich das dann auch nicht.
Du solltest also zuerstmal die Delays rausbauen, wenn du auf Tastendruck reagieren willst.
Und mit Switch case dürfte der Code übersichtlicher werden.
Danke für die schnelle Antwort. Ich werde mit SwitchCase erstmal den Code umstrukturieren. Und dann das Ergebnis posten. Auf delay() zu verzichten ist wegen der random() Funktion aktuell bei meinem Kenntnisstand nicht möglich.
So nochmal die Erklärung, ich verwende 2 Modi der eine dreht den Motor zufällig in einer bedingt zufälligen Geschwindigkeit, der andere Modi dreht den Motor konstant in eine Richtung mit der gleichen
Geschwindigkeit. Die Tasterabfrage kann nur zwischen dem wechsel der Richtungen im zufälligen Modus geändert werden oder immer wenn er konstant läuft. Da ich die Aufgabe Ausbildungsbedingt mache kann es auch sein, dass in der Schaltung ein selbsthaltender Taster fehlt, der sich selbst per HIGH Signal resetet, wenn es das überhaupt gibt. Die Code modifikation mit SwitchCase funktioniert nicht so recht beziehungsweise ist wohl mein Versuch fehlerhaft. Der Versuch liegt anbei. Zu meinem Startcode, die Zufallsdelays sind die einzige mir gebliebene Möglichkeit die automatische random Funktion zu überbrücken und zwei Zustände wechselnd zu halten.
Wenn nicht frage nicht mehr, weil die delays dann die Ursache dafür sind und du die nicht beseitigen willst.
Delay blockiert alles. Du musst genau in der Pause zwischen den Motordrehbewegungen drücken. Nur das zählt dann. Wenn dir das reicht, funktioniert es ja schon, wenn nicht, dann musst du die Lösung suchen für
Taster mit Delay.
Dann bitte posten, weil die suchen andere auch noch.
Cream_and_Butter:
... die Zufallsdelays sind die einzige mir gebliebene Möglichkeit die automatische random Funktion zu überbrücken und zwei Zustände wechselnd zu halten.
Eine Anregung:
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= rdm_delay_time) {
rdm_delay_time = random(500,8000);
...
}
chefin:
Dann bitte posten, weil die suchen andere auch noch.
Bist Du sicher, danach sucht jemand? Mit millis geht das doch einfacher. Aber wenn Du möchtest: Mittels Tastendruck wird die Blinkfrequenz einer LED verändert. Die Reaktionszeit beträgt willkürlich gewählt unter 100 ms.
const int ledPin = 13, tasterPin = 2;
const unsigned int intervallA = 5000, intervallB = 900;
unsigned int intervall = intervallA;
void setup() {
pinMode(tasterPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin, !digitalRead(ledPin));
delayT(intervall);
}
void delayT(uint32_t zeit) {
static bool aktStatus = LOW, altStatus = LOW;
static uint32_t z = 0;
z = zeit / 100;
while (z > 0) {
altStatus = aktStatus;
aktStatus = digitalRead(tasterPin);
if (altStatus && !aktStatus) {
if (zeit == intervallB) {
intervall = intervallA;
} else {
intervall = intervallB;
}
}
delay(100);
z--;
}
}
War nicht so wirklich ernst gemeint. Aber wenn der Threadstarter unbedingt sein delay behalten will, dann soll er. Man kann ihm ja nur dazu raten es anders zu machen. Müssen tut er garnichts.
Hatte ich schon vermutet Aber nix im Fernsehen, Forum offline, da kommt man schon auf komische Gedanken.
Meine Idee: Wenn man ein langes delay in viele kurze delays zerlegt, kann man auch noch einen Taster abfragen. Bei einem größeren Projekt zerlegt man die verschiedenen Aufgaben auch in kleine Teile, damit alle Aufgaben quasi parallel bedient werden.
Als ich millis() noch nicht kannte, habe ich mit einem Zähler gearbeitet, den ich auf Null dekrementierte. Zur Erlangung einer definierten Zeit nutzte ich delay(1). Damit bin ich ein ganzes Stück weitergekommen.
const int ledPin = 13;
const int intervall = 500;
int zaehler = 0;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
if (zaehler == 0)
{
zaehler = intervall;
digitalWrite(ledPin, !digitalRead(ledPin));
}
if (zaehler > 0)
{
zaehler--;
delay(1);
}
}
Nach der Entdeckung von millis() und der bewußten Verwendung endlicher Automaten ging dann für mich die Sonne am Arduino-Himmel auf 8)
So jetzt mit Code außerdem hab ich den pwm pin des l293 direkt auf 5v gesteckt. Im Code sind 3 Versuche und die Variabeln sind vorraussichtlich schonmal für alle Versuche definiert...