Subroutine für Anfänger

Hallo Gemeinde der Bitkundigen,

als Anfänger mit dem Arduino hab ich ein Entscheidungsproblem im folgenden Sketch.

am liebsten würde ich die Lampen Blinkversion1 bis 3 in so einer Art “Subroutinen” laufen lassen.
So wie ich es vor ca. 35Jahren im Basic mal gelernt hatte.
Leider gibt es diesen Befehl hier nicht . (Oder?)

Wie könnte ich die verschiedenen Blinkversionen, nach der Entscheidung mit

*"if (RX_Signal > 900 && RX_Signal < 1200 ) *

  • {*
  • //mach Blinkversion_1 "*

als Routine einmalig durchlaufen und dann zurück zur Abfrage gehen ?

irgendwie hab ich da etwas Holz im Kopf… >:( :o :confused:

Bitte seht mir nach das ich 30 Jahre nix mit Programmieren am Hut hatte… :-\

/*
Blinklicht mit rx Signalauswertung
 */
// Beginn Def der Variablen ->
int RX_Signal;
int pin_RX_Signal = 5;  // Digitalpin 5 (PWM)
// <- Ende Def der Variablen




void setup() {
 
 pinMode(pin_RX_Signal, INPUT);  // Def der Pins
 Serial.begin(9600);    // initalisierung der seriellen Schnittstelle nur zum test des Eingangssignales

  
pinMode(10, OUTPUT);// initialize digital pin as an output.
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);

}

void loop() {
  
  RX_Signal = pulseIn(pin_RX_Signal, HIGH);
  
if (RX_Signal > 900 && RX_Signal < 1200 )   
    {
      //mach  Blinkversion_1 
    }
    if (RX_Signal > 1200 && RX_Signal < 1500)
      {
        // mach  Blinkversion_2 
  }
  if (RX_Signal > 1500 && RX_Signal < 1800)
      {
        //mach  Blinkversion_3 
      }
 
  
  // nur zu Kontrolle über den seriellen Monitor
  //Serial.print("RX-Impuls (ms):  ");
 //Serial.println(RX_Signal);



//--------------------------------
//Blinkversion_1
  
    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  delay(77);              
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
 
  delay (1000);            
//--------------------------------
//Blinkversion_2

  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  delay(77);              
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
    delay(77); 
    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  delay(77);              
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
 
  delay (1000);            

//--------------------------------
//Blinkversion_2

  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  delay(77);              
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  delay(77); 
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  delay(77);              
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  delay(77);
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  delay(77);              
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  
  delay (1000;            

}

In C nennt man das, was du suchst nicht Subroutine, sondern Funktion.

z.B. so:

[/
/*
Blinklicht mit rx Signalauswertung
 */
// Beginn Def der Variablen ->
int RX_Signal;
int pin_RX_Signal = 5;  // Digitalpin 5 (PWM)
// <- Ende Def der Variablen




void setup() {
 
 pinMode(pin_RX_Signal, INPUT);  // Def der Pins
 Serial.begin(9600);    // initalisierung der seriellen Schnittstelle nur zum test des Eingangssignales

  
pinMode(10, OUTPUT);// initialize digital pin as an output.
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);

}

void loop() {
  
  RX_Signal = pulseIn(pin_RX_Signal, HIGH);
  
if (RX_Signal > 900 && RX_Signal < 1200 )   
    {
      //mach  Blinkversion_1 
      Blinkversion_1();
      
    }
    if (RX_Signal > 1200 && RX_Signal < 1500)
      {
        // mach  Blinkversion_2 
        Blinkversion_2();
  }
  if (RX_Signal > 1500 && RX_Signal < 1800)
      {
        //mach  Blinkversion_3 
      }
 
  
  // nur zu Kontrolle über den seriellen Monitor
  //Serial.print("RX-Impuls (ms):  ");
 //Serial.println(RX_Signal);



//--------------------------------
 
//--------------------------------

//--------------------------------
//Blinkversion_2  // ich vermute das soll Version 3 sein

  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  delay(77);              
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  delay(77); 
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  delay(77);              
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  delay(77);
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  delay(77);              
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  
  delay (1000;            

}
void Blinkversion_1()
{
  
    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  delay(77);              
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
 
  delay (1000);    
}       
void Blinkversion_2()
{

  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  delay(77);              
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
    delay(77); 
    digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  delay(77);              
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
 
  delay (1000);            
}code]

… danke Combie für die super schnelle Antwort.

Vielleicht hast du irgendwo ein Beispie in dem man die vorgehensweise für meinen Sketch einfach ableiten(abschreiben) kann?

LG

...ich glaube nun verstehe ich, wie das geht , ich muss die Blinkversionen einfach als void deklarieren...?!!

DANKE ardubu !!!!!

Ist es egal wo ,im Sketch, die Funktion steht?

Ist es egal wo ,im Sketch, die Funktion steht?

außerhalb der Loop

ardubu: außerhalb der Loop

Prima danke, nun hab ich den ganzen Abend was zum spielen und kann verschieden Blinklichter programieren!!!

Ach wie schön ist die Welt ....wenn man sie versteht !!!

;-)

Dumpfbacke: ...ich glaube nun verstehe ich, wie das geht , ich muss die Blinkversionen einfach als void deklarieren...?!!

void ist eine Art Datentyp. In diesem Fall bedeutet das dass die Funktion keinen Wert zurück gibt. Man kann auch andere Sachen zurückgeben wenn man es braucht.

https://de.wikipedia.org/wiki/Void_%28Schl%C3%BCsselwort%29

ardubu: z.B. so:)

Besser nicht so, sondern gleich richtig lernen. 1. ohne delay, also blockierungsfrei, dann kann der uC später auch noch andere Sachen gleichzeitig 2. endlicher Automat

ElEspanol: 1. ohne delay, also blockierungsfrei,

ja das brauche ich in meiner Version 2.0

...weil ich da "dimmen" will das würde die Abfrage unendlich verlängern......

Nun erst noch mal löten weil auf dem Pin 13 kein PWM geht.

LG