RC Panzer mit Airsoft

Liebe Arduino Freunde,

Ich habe ein Airsoft auf einen RC Panzer Platziert. Mit dem Aurdino Empfange ich zwei Kanälle und Werte diese aus. Der Code funktioniert auch soweit ziemlich gut.

Die Airsoft soll noch 5 Kugeln wieder geladen werden. Dazu wird ein Relai ein under wieder ausgeschaltet.

In diesem Fall soll der Relai nach einer gewissen Zeit ausgeschaltet werden. Jedoch schaltet das Relai sofort aus. Ich verstehe nicht wieso?

Hier habe ich das Problem:
if(millis()-previousMillis2 >= interval2)

Nach dem 5 Schuss soll das Relai eine Zeit x eingeschaltet bleiben.

Hier der ganze Code:

//+++++++++++++++++++++++++++++++++++++++++++++++++++Deklaration Globale Veriablen

//PINs für LEDs
int pin13=13;

//PINs für Channel
int pin2=2;
int pin3=3;

//Variablen für PWM SIgnale
double channel[2]; //Zum auswerten von 2 Signal Eingängen
                   //0=Channel 8 =>Arduino Pin 3, 1=Channel 11 0=>Arduino Pin 2
//Röle Pin
int RelaiPin_1=11;
int RelaiPin_2 =9; 

//LED Status. Speichert den Status von der LED
int ledState=LOW;


//Anzahl Schüsse lesen
int AnzahlSchuss=0;

/* Einstellungen vom Sheduler. 
 * interval ist die Ladezeit einer Mechanischen Bewegung der Airsofgun
 * interval2 ist die Beförderungs-Zeit der Kugeln vom Magazin zur Airsoft
 */
unsigned long previousMillis=0, previousMillis2=0, vergangeneZeit3=0; // um ziet zu speichere wie viel sekunde nach de letschte änderig vergange isch

//Zeit zum Schiesen und Nachladen Airsoft
unsigned long interval=600; 
//Zeit zum Befördern von Kugeln zum Airoft
unsigned long interval2=5000, interval3=5000; 

//Auswerten
boolean SchussAusloesen=false, erstLadung=true, SchussBeendet=true;

//+++++++++++++++++++++++++++++++++++++++++++++++++++Deklaration Funktionen
//Eigentlich im gleichen File nicht keine Funktionsdeklaration nötig

void automatischAus(double channel_1);
void schuss();
void magazinLaden();

String BegruessungSerialMonitor = "(c)by Sinan Hanic | 17.03.2018 | Version 1.0";

void setup()
{
  //Channel Eingänge
  pinMode(pin2, INPUT);
  pinMode(pin3, INPUT);

  //LED Eingang
  pinMode(pin13, OUTPUT);

  //Röle Pin
  pinMode(RelaiPin_1, OUTPUT);
  pinMode(RelaiPin_2, OUTPUT);

  //Standard Wert
  digitalWrite(pin13, LOW); //LED AUS
  digitalWrite(RelaiPin_1, LOW); //Röle 1 AUS
  digitalWrite(RelaiPin_2, LOW); //Rölle 2 AUS
  
  Serial.begin(9600);
  Serial.println(BegruessungSerialMonitor);
  
}

void loop()
{

  channel[0] = pulseIn(pin2, HIGH); // Schuss | Der übergeben Wert ist "HIGH". Es wird gewartet bis PIN auf HIGH gezogen ist. Startet Timer bis wieder LOW ist. Pulse länge in us wird retour gegeben. Möglich ist auch ein Timer mitzugeben  10 microseconds to 3 minutes, pulseIn(pin, value, timeout)
  channel[1] = pulseIn(pin3, HIGH); //Sicherheit
  
  //automatischAus(channel[1]); //Aufruf Funktion steht ganz oben fall was mit dem Signal etwas nicht stimmen sollte.
  
  //Ausgabe Serial Monitor. PWM Signale
  /*
  Serial.print("CH 8: ");  
  Serial.print(channel[0]);
  Serial.print(" ===== ");
  Serial.print("CH 11: ");   
  Serial.println(channel[1]);
*/

  if(channel[1]>=1001 && channel[1]<=1007) //Sicherheits-Knopf on
  {
    if(channel[0]>=994 && channel[0]<=1002) //Schuss-Knopf
    {
        SchussAusloesen = true;
        Serial.println("Schuss anforderung!");
    }     
  }
  else
  {
     digitalWrite(pin13, LOW);
     digitalWrite(RelaiPin_1, LOW);
  }

   schuss(); 
   magazinLaden();
}

/* Definition schuss
Diese Funktion beinhaltet einen kleinen Sheduler. Der Sheduler setzt den Röle PIN eine Zeit auf HIGH.
Relai Stromkreis wird für diese Periode geschlossen 
*/
 void schuss()
 {    
      if(SchussAusloesen && SchussBeendet)
      {
        AnzahlSchuss=AnzahlSchuss+1;
        digitalWrite(pin13, HIGH); 
        digitalWrite(RelaiPin_1, HIGH);
        Serial.println("Geschossen>>> Funktion schuss();");
        SchussBeendet=false;
      }
  
      if(millis()-previousMillis >= interval)
      {
        previousMillis = millis();

        digitalWrite(pin13, LOW); 
        digitalWrite(RelaiPin_1, LOW); 

        SchussAusloesen=false;
        SchussBeendet=true;       //Schussanforderung löschen
      }
 }


/* Definition Funktion magazinLaden
 * Ladet die Airsoft Kugeln. Zahnrad befördert die Kugeln über ein Rohr 
 */
 void magazinLaden(){

    if(AnzahlSchuss==5)
    {
      digitalWrite(RelaiPin_2, HIGH);
      Serial.println((String)"Es wurde "+AnzahlSchuss+"x geschossen");
      AnzahlSchuss=6;
    }
    

     if(AnzahlSchuss>=6)
     { 
      Serial.println("Beginne Nachladen");
      Serial.println((String)"Bereits abgelaufen:"+previousMillis2+" Interval:"+interval2);
      if(millis()-previousMillis2 >= interval2)
      {
          previousMillis2 = millis();
          //if(AnzahlSchuss==6) 
          //{   
            digitalWrite(RelaiPin_2, LOW);
            Serial.println("Nachladen AUS");
            AnzahlSchuss=0; 
          //}
      }
     }
 }
 
/* Definition automatischAus
 * channel_2 Sicherheits-Knopf
 * channel_1 Schuss
 */
void automatischAus(double channel_1){
    
    //Sicherheitsabfrage soll Automatisch off schalten, wenn PWM Signale nicht mehr stimmen oder gestört sind.
    if(channel_1>1007 || channel_1<993) 
    {
          digitalWrite(pin13, LOW);
          digitalWrite(RelaiPin_1, LOW); 
          digitalWrite(RelaiPin_2, LOW);
         
          //Serial.println("!!! Achtung PWM Signal Falsch !!!"); 
    }
}

Wenn du das Relais betätigst, dann solltest du auch previousMillis = millis(); ausführen. Sonst hat er ja keinen Startpunkt.

Der Startpunkt wird ja quasi hier gesetzt:

    if(AnzahlSchuss==5)
    {
      digitalWrite(RelaiPin_2, HIGH);
      Serial.println((String)"Es wurde "+AnzahlSchuss+"x geschossen");
      AnzahlSchuss=6;
    }

Also mit AnzahlSchuss=6;

Erst dann beginnt ja der Startpunkt.

Ich habe erst jetzt Feierabend, mein Kopf ist noch voll. Aber du meinst ich soll es so machen

void magazinLaden(){

    if(AnzahlSchuss==5)
    {
      digitalWrite(RelaiPin_2, HIGH);
      Serial.println((String)"Es wurde "+AnzahlSchuss+"x geschossen");
      AnzahlSchuss=6;

     previousMillis2 = millis(); //<<<<<<<<<
    }

Besten Dank.

Irgendwie hat es auch nicht funktioniert :frowning:
Ich bin am Ende mit meinem Latein

In der Funktion magazinLaden() hast du das Relais betätigt und die Stoppuhr geladen.
Nun musst du in der Loop abfragen, ob die Stoppuhr abgelaufen ist und wenn ja, dann den Relaisausgang zurücksetzen.

Wenn bei mir etwas nicht so funktioniert wie ich möchte, dann überwache ich mit Serial.print die entsprechende Variablen und lasse mir auch ausgeben, wann er in welche Funktion gehüpft ist.

Versuchs mal mit den Serial.print-Befehlen und schau wann er nicht das macht was er soll.

Wenn du nicht weiterkommst, dann beschreibe genau was du erwartest und was das Programm genau macht.
Es werden dann bestimmt einige sich deines Problems annehmen.