Arduino UNO R3 endlosschleife

Hallo liebe Arduino Freunde, ich habe ein einen Arduino UNO R3 und einen Raspberry pi, aber um den PI geht es in dieser frage nicht, ich möchte gerne 2 Outputs des Arduino Uno's schalten und zwa so lange bis ich sie mit einem befehl stoppe, mein jetziger code sieht so aus:

int led4 = 8; int led5 = 9;

void setup()

{ pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); Serial.begin(9600); }

void loop()

{ if (Serial.available()) { char c = Serial.read();

if (c == 'H') //AN { digitalWrite(led4, HIGH); delay(500); digitalWrite(led4, LOW); delay(100);

digitalWrite(led5, HIGH); delay(200); digitalWrite(led5, LOW); delay(5000); }

if (c == 'L') //Aus { digitalWrite(led4, LOW); delay(200); digitalWrite(led5, LOW); delay(200); } } }

Der Arduino bekommt vom Raspberry Pi über die Serielleschnitstelle die befehle H und L, nur möchte ich gerne das wenn er den Befehl H bekommt das er SO lange AN ist bis er den befehl L bekommt für aus. wäre klasse wenn mir jemand helfen könnte!

Hallo, so, wie Du das beschreibst, würde ich es so machen:

 if (c == 'H')               //AN
  {
  digitalWrite(led4, HIGH);   
  digitalWrite(led5, HIGH); 
}

Ich fürchte nur, Du willst tatsächlich eine andere Funktionalität.

ja die delay zeiten sind unabdingbar

das problem ist ja das er nach der zeit von delay(5000) nicht von vorne anfängt sondern erst wenn der befehl H erneut gesendet wurde und das soll so lange ausgeführt werden bis er den befehl L bekommt

Für sowas gibt es Variablen :)

bool stateOn = false;

...

if(c == 'H')
   stateOn = true;
else if (c == 'L')
   stateOn = false;

if(stateOn)
{
}
else
{
}

Außerdem solltest du auf delay() verzichten und das durch millis() ersetzen (siehe BlinkWithoutDelay). Dann kannst du auch während dem blinken serielle Daten empfangen.

if (Serial.available()) { if (c == 'H') //AN }

Die Abfrage auf c sollte außerhalb von Serial.available() passieren.

if (Serial.available())
{
  char c = Serial.read();
}
if (c == 'H')               //AN
  {
   ...
   }
int led4 = 6;
int led5 = 7;
bool stateOn = false;




void setup() 
{                

     pinMode(led4, OUTPUT);    
    pinMode(led5, OUTPUT);    
    Serial.begin(9600);
}   


void loop() 
{
if (Serial.available())
{
  char c = Serial.read();
  {
if(c == 'H')
   stateOn = true;
else if (c == 'L')
   stateOn = false;
  }
if(stateOn)
{
  digitalWrite(led4, HIGH);  
  delay(500);            
  digitalWrite(led4, LOW);  
  delay(100);           

  digitalWrite(led5, HIGH);  
  delay(200);              
  digitalWrite(led5, LOW);    
  delay(5000);            
}
else if (stateOn)
{
  digitalWrite(led4, LOW); 
delay(200);            
digitalWrite(led5, LOW);  
delay(200);    
}
}
}

Hab es grade mal etwas umgeändert, aber es hat sich nichts geändert :(

Du musst Eingabe und Ausgabe trennen. Du darfst das Schalten der LEDs nicht in Serial.available() machen!

Am besten macht man sowas in völlig getrennten Funktionen. Dann kann sowas gar nicht passieren.

Außerdem:

else if (stateOn)

Korrekt:

else if (!stateOn)

Danach hast du halt wie schon gesagt, das Problem dass dir delay() den ganzen Prozessor blockiert.

Serenifly: Du musst Eingabe und Ausgabe trennen.

Es geht um die Klammer hinter Serial.read().

irgentwie bekomm ich hier grad nix hin :D, ich weiß so ein forum dient lediglich der selbsthilfe aber würde es dir große umstände machen mir den Teil kurz zuschreiben?

Hier mit einer LED (onboard an Pin 13), ohne fehleranfälligen Code bei dem alles zusammen steght und ohne delay():

const int LED = 13;
const unsigned int ON_PHASE = 1000;
const unsigned int OFF_PHASE = 300;

bool led_on = false;

void setup()
{
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
}

void loop()
{
  input();
  output();
}

void input()
{
  if (Serial.available())
  {
    char c = Serial.read();

    switch (c)
    {
      case 'l':
      case 'L':
        led_on = false;
        break;
      case 'h':
      case 'H':
        led_on = true;
        break;
      default:
        ;
    }
  }
}

void output()
{
  static unsigned long previousMillis;

  if (led_on)
  {
    if (!digitalRead(LED) && (millis() - previousMillis > OFF_PHASE))
    {
      previousMillis = millis();
      digitalWrite(LED, HIGH);
    }
    else if (digitalRead(LED) && (millis() - previousMillis > ON_PHASE))
    {
      previousMillis = millis();
      digitalWrite(LED, LOW);
    }
  }
  else
  {
    digitalWrite(LED, LOW);
  }
}