Go Down

Topic: For Schleife geht nicht (Read 1 time) previous topic - next topic

postmaster-ino

Hi

Meinst Du, SO bekommst Du wirklich mehr Hilfe?
Sofern die 84 in Deinem Nick kein Alter ist - ok, dann eigentlich auch - solltest Du aus der Trotz-Phase bereits draußen sein.

Uns ist durchaus klar, daß Du irgendwo ein Problem hast - sonst wärst Du wohl nicht hier aufgeschlagen (kommt aber schon selten vor, daß Wer nur zum Trollen vorbei schaut).
Auch können wir recht schnell erkennen, WER den Anfangs-Post geschrieben hat - keine große Kunst - also ist auch dieser Hinweis von Deiner Seite eher 'für die Doofen unter Euch' - was nun auch wieder nicht sonderlich toll ankommt.

Wollen wir uns nun auf das von Dir angedachte Niveau begeben, oder wieder wie halbwegs zivilisiertes Volk halbwegs erwachsen miteinander kommunizieren?

Zur aller größten Not hätte ich auch eigene Probleme mit meinen Arduinos ... Die mir eigentlich wesentlich wichtiger sind, als Deine!

MfG

Trace84

Hi

Meinst Du, SO bekommst Du wirklich mehr Hilfe?
Sofern die 84 in Deinem Nick kein Alter ist - ok, dann eigentlich auch - solltest Du aus der Trotz-Phase bereits draußen sein.

Uns ist durchaus klar, daß Du irgendwo ein Problem hast - sonst wärst Du wohl nicht hier aufgeschlagen (kommt aber schon selten vor, daß Wer nur zum Trollen vorbei schaut).
Auch können wir recht schnell erkennen, WER den Anfangs-Post geschrieben hat - keine große Kunst - also ist auch dieser Hinweis von Deiner Seite eher 'für die Doofen unter Euch' - was nun auch wieder nicht sonderlich toll ankommt.

Wollen wir uns nun auf das von Dir angedachte Niveau begeben, oder wieder wie halbwegs zivilisiertes Volk halbwegs erwachsen miteinander kommunizieren?

Zur aller größten Not hätte ich auch eigene Probleme mit meinen Arduinos ... Die mir eigentlich wesentlich wichtiger sind, als Deine!

MfG
Sätze wie "du hast wohl nicht begriffen wo du hier bist" und "wir sind nicht deine Grundschullehrer" ist also ein halbwegs zivilisiertes Niveau?

Auch die Anspielung auf mein Alter oder eines angeblichen Trotz und Troll-Verhaltens ist also das Niveau, welches hier gewünscht ist?

Wenn man bedenkt, dass ich lediglich darauf hingewiesen habe, dass ich keineswegs weiß, WIE der Vorschlag von HotSystems umzusetzen ist, sind solche Aussagen mehr als nur fehl am Platz.

Einem Anfänger vorzuschlagen er müsse einfach nur eine Merkervariable in eigener Funktion außerhalb der Buttonabfrage einsetzen hilft genauso wenig weiter wie vorzuschlagen für den Widestand nur die Spannung durch die Stromstärke zu teilen.

Beide Aussagen mögen per se richtig sein und total einfach. Helfen aber einem Anfänger nicht beim WIE weiter.

postmaster-ino

Hi

Wie Du willst - zumindest eines meiner Probleme konnte ich in der Zwischenzeit lösen.

Gutes Gelingen auch Dir!

MfG

Trace84

Hi

Wie Du willst - zumindest eines meiner Probleme konnte ich in der Zwischenzeit lösen.

Gutes Gelingen auch Dir!

MfG
Ich als Anfänger wollte hier nur eine Hilfestellung und werde gleich angefeindet, weil ich nicht sofort sämtliche Fachbegriffe kenne und nicht weiß, wie diese in einem Sketch umzusetzen sind (ein Autofahrer kann das Auto bedienen, weiß aber noch lange nicht, wie es zu reparieren ist).

Und dann wird noch derjenige in Schutz genommen, der ohne Grund sofort herablassend und beleidigend antwortet. Und du selbst hast noch mitgemacht, indem du auf mein geistiges Alter anspielst.

Tolles Forum....Stichwort: Hetze im Netz

Das wars. Bin raus hier!

PS: ich habe übrigens nicht darauf hingewiesen WER den Anfangspost gemacht hat, sondern, dass ich ihn gemacht habe, weil ich nicht weiß, wie ich etwas umsetzen soll....das hatte also nichts mit deinem "für die Doofen unter euch" zu tun.

HotSystems

Ich als Anfänger wollte hier nur eine Hilfestellung und werde gleich angefeindet,
.....
Es reicht jetzt.

Keiner hat dich angefeindet, du wirst allerdings beleidigend.
Das gehört hier tatsächlich nicht her, also gute Reise.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Trace84

#20
Jun 10, 2019, 06:14 pm Last Edit: Jun 10, 2019, 06:16 pm by Trace84
Es reicht jetzt.

Keiner hat dich angefeindet, du wirst allerdings beleidigend.
Das gehört hier tatsächlich nicht her, also gute Reise.

Mich darauf hinzuweisen, dass ihr nicht meine Grundschullehrer seid ist kein anfeinden? Oder zu schreiben "Glückwunsch, lesen kannst du" oder dass ich eine Referenz lesen soll, dass aber "offensichtlich ist das aber zu schwer für dich" ist keine Beleidigung?

Von Geld zu reden und zu sagen "falls du weißt was das ist" auch nicht?

Mir zu sagen, ich müsste meines Alters entsprechend aus der Trotzphase raus sein oder dass mein Niveau nicht mal halbwegs zivilisiert ist, ist ebenfalls weder Anfeindung noch Beleidigung?

Was denn bitte dann?

Um es nochmal deutlich zu machen. Ich habe dir (HotSystems) geschrieben, dass ich hier keinen Topic erstellen würde, wenn ich wüsste, wie ich etwas umsetzen muss. Daraufhin hast DU den Spruch mit dem Grundschullehrer geschrieben und dass ich wohl nicht begriffen hätte wo ich hier bin!

Also rede nicht davon, dass mich keiner anfeindet, wenn DU derjenige bist, der mit diesen Sprüchen angefangen hat!

PS: werde nun meinen Account löschen, vielen Dank euch beiden!

Nalp

Also um mal zur Fragestellung zurückzukommen:

Code: [Select]
for (int i = 0; i < 3; i++){
 
  if ((currentMillis-torpedoTime) < torpUpTime && torpedoPushes > 0){
   
    //Aktion
   
  } 


Kann so nicht klappen, da an die if-Bedingung den zeitlichen Abstand der drei Aktionen gar nicht berücksichtigt. Im Moment wird einfach nur in jedem Loop 3-mal geprüft, ob die Zeit erreicht ist und dann ggf. auch drei mal die gleiche Aktion ausgeführt. Das passiert jedoch quasi gleichzeitig und ist von außen nicht wahrnehmbar. Stattdessen müsste pro Loop getestet werden, ob noch eine Aktion gemacht werden muss, z.B. über eine passende Variable ("übrige Schüsse") oder so. Wenn die größer als 0 ist, soll er schießen und dann nach Ablauf der "Schusszeit" erneut prüfen.

ElEspanol

#22
Jun 12, 2019, 07:14 pm Last Edit: Jun 12, 2019, 07:15 pm by ElEspanol
So was macht man sowieso nicht mit einer for Schleife, weil blockierend.

Mit dem Taster eine Variable auf 1 setzen und am Ende des gewünschten Effektes (der mit if aktiviert wird) eins hochzählen. Wenn grösser 3 die Variable nullen. Fertisch. Dann muss man nur den Taster losgelassen haben, sonst geht der Effekt halt länger.
Notfalls eine state machine rein, falls man die Pausen, etc. Besser kontrollieren will.

Trace841

So was macht man sowieso nicht mit einer for Schleife, weil blockierend.

Mit dem Taster eine Variable auf 1 setzen und am Ende des gewünschten Effektes (der mit if aktiviert wird) eins hochzählen. Wenn grösser 3 die Variable nullen. Fertisch. Dann muss man nur den Taster losgelassen haben, sonst geht der Effekt halt länger.
Notfalls eine state machine rein, falls man die Pausen, etc. Besser kontrollieren will.
Hallo, da sich hier ja doch einige Leute Mühe geben, habe ich mich nochmal angemeldet um antworten zu können.

Erstmal vielen Dank für die Hilfe.

Mein größtes Problem ist eigentlich, dass ich nicht weiß, wie ich die Vorschläge umsetzen soll. Habe mir nun einige Seiten zum Thema "Variablen mit Taster setzen" durchgelesen und kann das alles nicht zu meinem Sketch adaptieren, da die meisten Beispiele oft sehr einfach dargestellt sind und meist nicht zu komplexen Codes passen.

Da es ein Taster mit Doppelfunktion ist (kurz Drücken, lang Drücken) habe ich bereits hier Schwierigkeiten über diese Funktion eine Variable auf 1 zu setzen. Ich weiß einfach nicht genau wo und leider auch nicht wie. Denn die Tasterabfrage ist ja dann über if-else an bestimmte Aktionen in einem anderen Teil des Sketches verknüpft.
Mir fehlen noch so einige Grundlagen und als Standmodellbauer fällt es sehr schwer tiefer in die Thematik einzudringen, wenn man eigentlich nur ein paar LEDs blinken lassen möchte.

ElEspanol

#24
Jun 12, 2019, 10:38 pm Last Edit: Jun 12, 2019, 10:39 pm by ElEspanol
Ich hab mir den Sketch mal kurz überflogen.
In den globalen Variablen Deklarationen static mit const verwechselt, das sagt schon was über den Urheber aus. Bin momentan aber nur am Tablet, um einen besseren Überblick zu bekommen, ist der PC besser. Weiss nicht, wann ich da mal etwas Zeit habe für. Sollte aber kein großes Ding werden.
Im Forum ist einiges zu finden für Standmodelle. Wenn du das öfter machst, solltest du dich ruhig etwas in die Programmierung einarbeiten. Zumindest die erweiterten Basics. Es lohnt sich. Weil, je mehr du weißt, desto mehr Spaß macht es.

Doc_Arduino

#25
Jun 12, 2019, 11:19 pm Last Edit: Jun 13, 2019, 10:45 am by Doc_Arduino
Hallo,

ich hatte meinen Beitrag gelöscht, weil du dich abgemeldest hattest.
In dem Thread ist einiges schief gelaufen. Schwamm drüber - Kopf hoch.

Also nochmal. Im Grunde ähnlich wie unser Spanier.
Das i der for Schleife wird bis 3 sturr hochgezählt und die if und else if sind dem i nicht von Interesse. Das wird 3x durchgerasselt und fertig. Es würde Zufall sein wenn zu dem Zeitpunkt ein Zeitenvergleich etc. gültig wäre.

Wenn das "Torpedo Firing" en fester Ablauf ist, dann schreibe es als switch-case und rufe es 3x auf. Counter einbauen. Sollte dann ähnlich wie hier sein. Ein Blinker mittels Zustandsautomaten. Der Taster setzt es nur in Gang. Der LED12 Blinker zeigt dir das nichts blockiert.


Code: [Select]

// https://forum.arduino.cc/index.php?topic=534115.0

const byte pin_Taster2 = 2;
const byte pin_LED12 = 28;
const byte pin_LED13 = 13;
const unsigned int BLINKPAUSE = 1000;


void setup() {
  pinMode(pin_Taster2, INPUT_PULLUP);
  pinMode(pin_LED12, OUTPUT);
  pinMode(pin_LED13, OUTPUT);
}

void loop() {
  
  steuerung();

  heartbeat(pin_LED12, 500);

}


void steuerung ()
{
  enum state {EIN, PAUSE_EIN, AUS, PAUSE_AUS, NICHTS};
  static state zustand = NICHTS;
  static unsigned long zeitmerker = 0;
  
  switch (zustand) {
    case NICHTS:
                if (update_Taster2() ) {
                  zustand = EIN;
                }
                break;

    case EIN:
                digitalWrite(pin_LED13, HIGH);
                zeitmerker = millis();
                zustand = PAUSE_EIN;
                break;

    case PAUSE_EIN:
                if ( millis() - zeitmerker > BLINKPAUSE) {
                  zustand = AUS;
                }
                break;

    case AUS:
                digitalWrite(pin_LED13, LOW);
                zeitmerker = millis();
                zustand = PAUSE_AUS;
                break;

    case PAUSE_AUS:
                if ( millis() - zeitmerker > BLINKPAUSE) {
                  zustand = NICHTS;
                }
                break;
                            
    default: zustand = AUS;
             break;
  }

}


bool update_Taster2()
{
  static unsigned long last_ms = 0;
  static bool state = false;

  if (millis() - last_ms > 30) {
    last_ms = millis();
    state = !(digitalRead(pin_Taster2));
  }
  return state;
}


void heartbeat (const byte led, unsigned int interval)           // Kontrolle ob Sketch blockiert
{
  static unsigned long last_ms = 0;
  static bool state = LOW;
  
  unsigned long ms = millis();
  
  if (ms - last_ms >= interval) {
    last_ms = ms;
    state = !state;
    digitalWrite(led, state);
  }
}



Du ersetzt den Taster durch eine bool Variable

Code: [Select]

void steuerung (bool run)
{
  enum state {EIN, PAUSE_EIN, AUS, PAUSE_AUS, NICHTS};
  static state zustand = NICHTS;
  static unsigned long zeitmerker = 0;
  
  switch (zustand) {
    case NICHTS:
                if (run) {
                  zustand = EIN;
                }
                break;


und zählst woanders einen Counter der ggf. "run" auf true setzt bzw. an die Funktion übergibt. Angedeutet ...

Code: [Select]

if (countZyklen < zyklen) {        // Anzahl der Zyklen noch nicht erreicht?
  pushed = true;
}

steuerung( pushed );


Ergänzung.
Den Counter zählst du im obigen Bsp. Sketch im case PAUSE_AUS hoch, wenn auf case NICHTS umgeschalten wird. Erst hier ist ein Durchlauf komplett und der nächste könnte beginnen. Jetzt musste das wie schon andere sagten alles durcharbeiten, verstehen lernen und für deine Zwecke anpassen.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Nalp

Und zur Ergänzung: Dein Code ist zwar recht lang, aber die Funktion, um die es geht, hängt nicht so stark am Rest. Ich empfehle dir, mal ein kleines Programm zu schreiben, in dem du wirklich nur das umsetzt: Irgendwas passiert zeitgesteuert dreimal hintereinander, zum Beispiel das Blinken einer eingebauten LED. Das hilft häufig, das Prinzip zu verstehen und im Kopf klar zu kriegen, was nun der eigentliche Ablauf ist.

Und wenn das auch nicht klappt, kannst du es noch "gröber" machen: Sobald die Aktion ausgelöst wird (z.B. durch deinen langen Druck auf den Button) berechnest du drei Startzeitpunkte. Dann guckst du in der Loop für jeden Zeitpunkt einzeln, ob der erreicht ist und löst die Funktion aus. Das ist nicht schön, aber sollte funktionieren und ist vllt. besser verständlich.

Trace841

Ich hab mir den Sketch mal kurz überflogen.
In den globalen Variablen Deklarationen static mit const verwechselt, das sagt schon was über den Urheber aus. Bin momentan aber nur am Tablet, um einen besseren Überblick zu bekommen, ist der PC besser. Weiss nicht, wann ich da mal etwas Zeit habe für. Sollte aber kein großes Ding werden.
Im Forum ist einiges zu finden für Standmodelle. Wenn du das öfter machst, solltest du dich ruhig etwas in die Programmierung einarbeiten. Zumindest die erweiterten Basics. Es lohnt sich. Weil, je mehr du weißt, desto mehr Spaß macht es.
Über den Urheber kann ich dir leider nix sagen. Ich weiß nur, dass der sich das meiste auch nur aus anderen Sketchen zusammengebastelt hat.

Verwirrend ist für mich auch, dass ja bekanntlich viele Wege nach Rom führen und somit auch ein Code auf viele verschiedene Arten geschrieben werden kann und am Ende das Gleiche rauskommt.
Wie dein Beispiel mit dem verwechselten static und const......es funktioniert trotzdem, obwohl es ja wohl anscheinend falsch ist. Da soll man noch durchblicken.


Hallo,

ich hatte meinen Beitrag gelöscht, weil du dich abgemeldest hattest.
In dem Thread ist einiges schief gelaufen. Schwamm drüber - Kopf hoch.

Also nochmal. Im Grunde ähnlich wie unser Spanier.
Das i der for Schleife wird bis 3 sturr hochgezählt und die if und else if sind dem i nicht von Interesse. Das wird 3x durchgerasselt und fertig. Es würde Zufall sein wenn zu dem Zeitpunkt ein Zeitenvergleich etc. gültig wäre.

Wenn das "Torpedo Firing" en fester Ablauf ist, dann schreibe es als switch-case und rufe es 3x auf. Counter einbauen. Sollte dann ähnlich wie hier sein. Ein Blinker mittels Zustandsautomaten. Der Taster setzt es nur in Gang. Der LED12 Blinker zeigt dir das nichts blockiert.


Du ersetzt den Taster durch eine bool Variable


Ergänzung.
Den Counter zählst du im obigen Bsp. Sketch im case PAUSE_AUS hoch, wenn auf case NICHTS umgeschalten wird. Erst hier ist ein Durchlauf komplett und der nächste könnte beginnen. Jetzt musste das wie schon andere sagten alles durcharbeiten, verstehen lernen und für deine Zwecke anpassen.
Vielen Dank, dass du dann doch nochmal hier etwas dazu geschrieben hast.

Vielleicht bin ich auch etwas naiv an die Sache rangegangen. Ich dachte, ich könnte einfach nur ein paar Zeilen Code ergänzen und muss nicht etwas um- bzw. neuschreiben.

Wenn ich das alles so lese, ist mir zwar schon bewusst, was so insgesamt passiert aber mir fehlen tatsächlich noch massiv die Grundlagen. Ich bekomme bei sowas hier einfach schon einen Knotzen im Kopf:

Code: [Select]

  switch (zustand) {
    case NICHTS:
                if (run) {
                  zustand = EIN;
                }
                break;


Oder bei sowas:

Code: [Select]

  if (millis() - last_ms > 30) {
    last_ms = millis();
    state = !(digitalRead(pin_Taster2));
  }
  return state;
}


Ich weiß zwar was da passieren soll, verstehe aber nicht warum das so und so geschrieben wird. Es ist meist wie mit einer Fremdsprache.....das sprechen geht recht schnell aber die Grammatik verstehen dauert ewig.

Werde mich da mal versuchen durchzuwühlen.



Und zur Ergänzung: Dein Code ist zwar recht lang, aber die Funktion, um die es geht, hängt nicht so stark am Rest. Ich empfehle dir, mal ein kleines Programm zu schreiben, in dem du wirklich nur das umsetzt: Irgendwas passiert zeitgesteuert dreimal hintereinander, zum Beispiel das Blinken einer eingebauten LED. Das hilft häufig, das Prinzip zu verstehen und im Kopf klar zu kriegen, was nun der eigentliche Ablauf ist.

Und wenn das auch nicht klappt, kannst du es noch "gröber" machen: Sobald die Aktion ausgelöst wird (z.B. durch deinen langen Druck auf den Button) berechnest du drei Startzeitpunkte. Dann guckst du in der Loop für jeden Zeitpunkt einzeln, ob der erreicht ist und löst die Funktion aus. Das ist nicht schön, aber sollte funktionieren und ist vllt. besser verständlich.
Das klingt so einleuchtend und logisch und schon beim berechnen von Startzeitpunkten fehlen mir bereits die Grundlagen um das umzusetzen. Also erstmal ordentlich mit millis umgehen lernen.

Wie gesagt, bisher habe ich fertige Sketche benutzt und meist nur "an-aus" Zeiten für das Blinken von LEDs geändert. Das war bisher auch nicht schwer. Aber einen Code umzuändern, so dass ich "mehr" davon habe, ist für mich momentan noch zum Kopf rauchen.

Werde mich aber mal etwas einlesen.

Danke euch allen!

Doc_Arduino

Hallo,

um dir etwas Mut zu machen. Jeder hat irgendwann klein angefangen. Ich beschäftige mich viel mit Details bevor ich aus vielem Kleinen etwas Größeres baue. Hin- und wieder verzettel ich mich dabei. Egal - auch dabei lernt man was.

Grundlage für alles ist der Umgang mit millis, deine ewige Armbanduhr. Die Nutzung bzw. Anwendung derer ist das A & O für nicht blockierende Programme. Der ganze Rest baut darauf auf. Dazu soviel wie möglich lokale Variablen verwenden, nicht alles in die loop werfen, sondern Aufgaben bezogene Funktionen schreiben und diese in der loop aufrufen. Das vereinfacht vieles.

Theseus erklärt millis()
http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung
http://forum.arduino.cc/index.php?topic=423688.0
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Trace841

Hallo,

um dir etwas Mut zu machen. Jeder hat irgendwann klein angefangen. Ich beschäftige mich viel mit Details bevor ich aus vielem Kleinen etwas Größeres baue. Hin- und wieder verzettel ich mich dabei. Egal - auch dabei lernt man was.

Grundlage für alles ist der Umgang mit millis, deine ewige Armbanduhr. Die Nutzung bzw. Anwendung derer ist das A & O für nicht blockierende Programme. Der ganze Rest baut darauf auf. Dazu soviel wie möglich lokale Variablen verwenden, nicht alles in die loop werfen, sondern Aufgaben bezogene Funktionen schreiben und diese in der loop aufrufen. Das vereinfacht vieles.

Theseus erklärt millis()
http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung
http://forum.arduino.cc/index.php?topic=423688.0

Danke fürs Mut machen.

Ein einfaches Blinkprogramm mit millis ist für mich kein Problem. Aber sobald es komplexer wird, hab ich Schwierigkeiten.
Hab das mit dem 3fachen Torpedoschuss erstmal sein lassen und wollte jetzt "nur" beim längeren Betätigen des Tasters einen Sound abspielen und wenn der fertig ist einen anderen inklusive des Lichteffektes für den Torpedoschuss.....und auch hier verzweifle ich schon wieder :D

Dachte zuerst ich könnte einfach nur eine "Pause" zwischen beiden Sound-Triggern setzen und eine Pause, so dass nicht sofort mit dem Lichteffekt angefangen wird, sondern erst, nachdem der erste Sound fertig ist.

Go Up