Go Down

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

Trace84

Jun 09, 2019, 10:21 pm Last Edit: Jun 10, 2019, 12:40 pm by Trace84
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


Code: [Select]
#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 ========================================== //

Tommy56

Wo soll "Torpedo Firing" sein?

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Finnlay


Trace84

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.

HotSystems

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".
Gruß Dieter

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

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

Trace84

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.



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.

HotSystems

.....
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.
Gruß Dieter

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

Trace84

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?

HotSystems

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 ?
Gruß Dieter

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

Trace84

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?

HotSystems

#11
Jun 10, 2019, 02:52 pm Last Edit: Jun 10, 2019, 02:52 pm by 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.

Gruß Dieter

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

Trace84

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.

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.
Gruß Dieter

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

Trace84

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.



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.


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

Go Up