For Schleife geht nicht

Hallo zusammen.

Mit eurer Hilfe habe ich es bereits geschafft, im folgenden Lichteffekt-Code erfolgreich die Funktion einzufügen, dass gleichzeitig zu den Button-Funktionen auch ein Sound abgespielt wird.

Nun möchte ich den Code erweitern, so dass die "Torpedo"-Funktion 3 mal hintereinander ausgeführt wird. Also sozusagen 3 Torpedo-"Schüsse" nacheinander.

Habe es bereits mit einer for-Schleife versucht. Kompilierung funktioniert aber das Board macht nichts anderes als vorher. So als hätte die for-Schleife gar keine Auswirkung.

-> siehe Abschnitt "Torpedo Firing" im Sketch

PS: der Code wurde zwar von mir erweitert und leicht angepasst, ist aber nicht von mir

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);


// ===================== Variables =============================================================//
// -------  Declaring Pins ----------------------------------------------//
static byte disruptorPin = 9;
static byte enginePin = 6;
static byte pushButtonPin = 12;
static byte torpPin[] = { 2, 3 };

// -------  User Inputs ------------------------------------------------//
static unsigned long torpUpTime = 1680;
static unsigned long torpFlashTime = 200;
static unsigned long torpDownTime = 500;
static long double torpIdleBrightness = 20;
static long double torpMaxBrightness = 255;
static unsigned long engineFadePeriod = 3000;
static unsigned long disruptorFiringTime = 2400;

// -------  For the Button Pushing -------------------------------------//
unsigned long debounce = 50;
unsigned long holdTime = 1000;

// -------  Bookeeping ------------------------------------------------//
unsigned long currentMillis;
boolean buttonValue = false;
boolean buttonLast = true;
boolean ignoreUp = false;
unsigned long buttonUpTime;
unsigned long buttonDownTime;
unsigned int torpedoPushes = 0;
unsigned int disruptorPushes = 0;
unsigned long torpedoTime;
unsigned long disruptorTime;
unsigned long torpedoMillis;
unsigned long disruptorMillis;
unsigned long disruptorFlashTime;
boolean disruptorState = 0;
// ==================== End Variables ========================================================= //


// ===================== Setup ================================================================ //
void setup(){
  pinMode(disruptorPin,OUTPUT);
  pinMode(enginePin,OUTPUT);
  pinMode(pushButtonPin,INPUT_PULLUP);     // Enables internal pull-up resistor
  pinMode(torpPin[0],OUTPUT);
  pinMode(torpPin[1],OUTPUT);
  
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    while(true);
  }
  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms
  myDFPlayer.volume(20);  //Set volume value (0~30).
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
  
}


// ===================== End Setup ============================================================ //



// ===================== Main Loop ============================================================ //
void loop() {
  currentMillis = millis();         // get current time
  
 // ---------- Push Buttoon Code --------------------------------------------------------//

  buttonValue = digitalRead(pushButtonPin);
  
    // Record Time of Push
  if (buttonValue == false && buttonLast == true && (millis() - buttonUpTime) > debounce){
    buttonDownTime = millis();
    }
  
  // Record Time of Release
  if (buttonValue == true && buttonLast == false && (millis() - buttonDownTime) > debounce){
        buttonUpTime = millis();
        if (ignoreUp == false){
      disruptorTime = millis();        // If released early, fire disruptor!
      disruptorPushes++;
      myDFPlayer.playMp3Folder(2);
      }
      else{
       ignoreUp = false;
      }
   }

  // If push time is longer than threshold, fire torpedo!
  if (buttonValue == false && (millis() - buttonDownTime) > long(holdTime)){
    buttonDownTime = millis();
    torpedoTime = millis();
    torpedoPushes++;
    ignoreUp = true;
    myDFPlayer.playMp3Folder(1);
        
   }
  
  // Record the button state for comparison in the next cycle
  buttonLast = buttonValue;    
 // -------------------------------------------------------------------------------------//
  
  
  
 // ---------- Torpedo Firing ----------------------------------------------------------//
 // Ramp Up Red LED, Flash White LED, then a Ramp Down of Red LED
  // Ramp Up

  for (int i = 0; i < 3; i++){
  
  if ((currentMillis-torpedoTime) < torpUpTime && torpedoPushes > 0){
    analogWrite(torpPin[1],torpIdleBrightness+(torpMaxBrightness-torpIdleBrightness)/torpUpTime*(currentMillis-torpedoTime));
    digitalWrite(torpPin[0], LOW);
    
    
  }  
  // Flash
  else if (((currentMillis-torpedoTime) > torpUpTime) && ((currentMillis-torpedoTime) < (torpUpTime+torpFlashTime)) && torpedoPushes > 0){
    analogWrite(torpPin[1], 0);
    digitalWrite(torpPin[0], HIGH);
    
  } 
  // Ramp Down
  else if (((currentMillis-torpedoTime) > (torpUpTime+torpFlashTime)) && ((currentMillis-torpedoTime) < (torpUpTime+torpFlashTime+torpDownTime)) && torpedoPushes > 0){
    analogWrite(torpPin[1],torpMaxBrightness+(torpIdleBrightness-torpMaxBrightness)/torpDownTime*((currentMillis-torpedoTime)-(torpUpTime+torpFlashTime)));
    digitalWrite(torpPin[0], LOW);
    
  }  
  // Idle
  else{
    analogWrite(torpPin[1], torpIdleBrightness);
    digitalWrite(torpPin[0], LOW);
   }
  }

  
 // ---------- Engine Fading ----------------------------------------------------------- //
  // Slow Up and Down Fade with Shorter Pusations
  int fadeValue = int(127.0+127.0/2.0*(1+(0.75*sin(2*PI*currentMillis/engineFadePeriod)+0.25*cos(14*PI*currentMillis/engineFadePeriod))));
  analogWrite(enginePin,fadeValue);


 // ---------- Disruptor Firing -------------------------------------------------------- //
  // Get Random On or Off Time Using getRandom() Function Below
  disruptorFlashTime = fmod(getRandom(), 4000UL) + 60UL;
  if (((currentMillis - disruptorTime) < disruptorFiringTime) && (disruptorPushes > 0)){
    if(currentMillis - disruptorMillis > disruptorFlashTime) {
      disruptorMillis = currentMillis;  
      digitalWrite(disruptorPin, disruptorState = !disruptorState);
      } 
   }
   else{
     analogWrite(disruptorPin,5);

    }
 // ------------------------------------------------------------------------------------ //


}
// ===================== End Main Loop ======================================================== //




// ===================== Pseduo-Random Generator ============================================== //
// Found This Online. I Take No Credit for It.
unsigned long m_w = 1;
unsigned long m_z = 2; 

unsigned long getRandom()
{
    m_z = 36969L * (m_z & 65535L) + (m_z >> 16);
    m_w = 18000L * (m_w & 65535L) + (m_w >> 16);
    return (m_z << 16) + m_w;  /* 32-bit result */
}
// ===================== End Pseduo-Random Generator ========================================== //

Wo soll "Torpedo Firing" sein?

Gruß Tommy

Zeile 115 ff

Tommy56: Wo soll "Torpedo Firing" sein?

Gruß Tommy

Wie Finnlay schon gesehen hat, ab Zeile 115.

Hatte auch schon daran gedacht die Funktion, dass 3 mal hintereinander ein Abschuss erfolgt, bei Zeile 99 einzufügen, weil hier die if-Abfrage des Buttons für den Torpedo Effekt erfolgt. Hat ab3er auch nicht funktioniert.

Trace84: Wie Finnlay schon gesehen hat, ab Zeile 115.

Hatte auch schon daran gedacht die Funktion, dass 3 mal hintereinander ein Abschuss erfolgt, bei Zeile 99 einzufügen, weil hier die if-Abfrage des Buttons für den Torpedo Effekt erfolgt. Hat ab3er auch nicht funktioniert.

Das ist aber keine Funktion, sondern eine "for-Schleife".

Hi

Und: Innerhalb der Schleife wir die gleiche Zeit geprüft - 3x - an den Variablen, Die die Zeit beinhalten, tut Sich gar nichts.

Denke, Du willst in zeitlichen Versatz den Auslöse-Taster simulieren - der Rest 'Oha, der Taster wurde gedrückt, lass Mal Krach machen' sollte dann wieder von Alleine ablaufen.

MfG

HotSystems: Das ist aber keine Funktion, sondern eine "for-Schleife".

Vielen Dank für den hilfreichen Hinweis. Damit bin ich dem Problem bereits ein Stück näher gekommen.

postmaster-ino: Hi

Und: Innerhalb der Schleife wir die gleiche Zeit geprüft - 3x - an den Variablen, Die die Zeit beinhalten, tut Sich gar nichts.

Denke, Du willst in zeitlichen Versatz den Auslöse-Taster simulieren - der Rest 'Oha, der Taster wurde gedrückt, lass Mal Krach machen' sollte dann wieder von Alleine ablaufen.

MfG

Bisher ist es so, dass der "Krach" mit dem Lichteffekt zusammen 1x bei längerem Drücken des Tasters ausgeführt wird. Ich hätte aber gern, dass diese Effekt 3x ausgeführt wird.

Trace84: ..... Bisher ist es so, dass der "Krach" mit dem Lichteffekt zusammen 1x bei längerem Drücken des Tasters ausgeführt wird. Ich hätte aber gern, dass diese Effekt 3x ausgeführt wird.

Dann musst du diese Schleife außerhalb deiner Button-Abfrage laufen lassen und eine Merker-Variable dazu einsetzen, wenn der Button gedrückt wurde. Und das am besten in einer eigenen Funktion.

HotSystems: Dann musst du diese Schleife außerhalb deiner Button-Abfrage laufen lassen und eine Merker-Variable dazu einsetzen, wenn der Button gedrückt wurde. Und das am besten in einer eigenen Funktion.

Dir ist schon klar, dass ich diesen Topic erstellt habe, weil ich nicht weiß wie es geht, oder?

Trace84: Dir ist schon klar, dass ich diesen Topic erstellt habe, weil ich nicht weiß wie es geht, oder?

Neeee.....woher soll ich wissen, was du weist und was nicht. Ich habe doch beschrieben, wie es geht. Was musst du noch wissen ?

Wie man eine Funktion schreibt ?

HotSystems: Neeee.....woher soll ich wissen, was du weist und was nicht. Ich habe doch beschrieben, wie es geht. Was musst du noch wissen ?

Wie man eine Funktion schreibt ?

Wenn du mal mit dem Auto stehen bleibst, den ADAC anrufst, der Typ aussteigt, die Motorhaube öffnet und sagt "Sie müssen nur die paar Schrauben entfernen, den Kolben und Ventile tauschen und dann können Sie weiterfahren" möchte ich mal dein Gesicht sehen. Ist doch ganz einfach oder? Was musst du noch wissen? Woher soll denn der ADAC-Typ wissen was du weißt und was nicht?

Hallo....du hast wohl nicht begriffen, wo du bist.

Der ADAC kosten Geld....falls du weist, was das ist.

Wir machen hier alles kostenlos in unserer Freizeit und sind nicht deine Grundschullehrer. Also mitarbeiten sonst wird das nix.

HotSystems: Hallo....du hast wohl nicht begriffen, wo du bist.

Der ADAC kosten Geld....falls du weist, was das ist.

Wir machen hier alles kostenlos in unserer Freizeit und sind nicht deine Grundschullehrer. Also mitarbeiten sonst wird das nix.

Mich hat noch keiner aufgeklärt wo bin ich hier. Würdest du das bitte übernehmen?

Und es heißt "kostet Geld" nicht "kosten Geld" und wenn dein "weist" sich auf den Wortstamm "Wissen" und nicht auf weisen (im Sinne von jemanden leiten) bezieht, wird es mit ß geschrieben. Das schreibe ich dir, obwohl ich in meiner Freizeit bin und kein Grundschullehrer.

Oder wolltest du mir jetzt sagen, dass die Qualität deiner Antworten von einer Zahlung abhängig ist? Dann muss ich nochmal in den Forenregeln nachlesen und gucken, ob das überhaupt erlaubt ist.

Aber zurück zum Thema. Definitiv will ich hier keine vorgefertigte Lösung haben. Denn daraus lernt man nichts. Wenn man aber nicht einmal weiß, wo man anfangen soll, kann man sich sonst wieviele Seiten und Beispiele von Funktionen und Schleifen angucken wie man will und wird trotzdem nicht schlauer. Warum? Nun, weil die meisten Anwendungen sehr individuell sind und Beispiele und Erklärungen sich oft nur auf einfache Mechanismen wie das Blinken einer LED beziehen.

PS: mehr als Danke sagen kann ich hier leider nicht, wenn dir das nicht reicht um in deiner Freizeit als "Nicht-Grundschullehrer" Tips zu geben, möchte ich auf deine Hilfe verzichten. Denn keinesfalls möchte ich, dass du dich zu etwas genötigt fühlst, wenn man als blutiger Anfänger nicht sofort weiß wie man eine Wiederholungs-Schleife mit einer Merker-Variablen außerhalb der eigentlichen Button-Abfrage schreibt.

OK....Glückwunsch, lesen kannst du ja.

Dann lies dir auch die Sprach-Referenz zum Arduino durch, die findest du hier im Menü. Offensichtlich ist das aber zu schwer für dich, sonst würdest du nicht derartig reagieren.

Denn mit deiner Arroganz wirst du vermutlich nicht viel Hilfe bekommen. Wenn doch, nochmals Glückwunsch.

HotSystems: OK....Glückwunsch, lesen kannst du ja.

Dann lies dir auch die Sprach-Referenz zum Arduino durch, die findest du hier im Menü. Offensichtlich ist das aber zu schwer für dich, sonst würdest du nicht derartig reagieren.

Denn mit deiner Arroganz wirst du vermutlich nicht viel Hilfe bekommen. Wenn doch, nochmals Glückwunsch.

Mit meiner Arroganz (dir gegenüber) bekomme ich definitv keine Hilfe. Das stimmt! Und war ja auch genau meine Absicht, falls du das PS gelesen hast.

HotSystems: Hallo....du hast wohl nicht begriffen, wo du bist.

Der ADAC kosten Geld....falls du weist, was das ist.

Wir machen hier alles kostenlos in unserer Freizeit und sind nicht deine Grundschullehrer. Also mitarbeiten sonst wird das nix.

HotSystems: Neeee.....woher soll ich wissen, was du weist und was nicht. Ich habe doch beschrieben, wie es geht. Was musst du noch wissen ?

Wie man eine Funktion schreibt ?

Na zum Glück ist das nicht arrogant. Danke

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

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

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.

Hi

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

Gutes Gelingen auch Dir!

MfG

postmaster-ino: 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.

Trace84: 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.