Unterschied "if" und "while"

Moin Jungs/Mädels,

worin besteht der Unterschied zwischen „if“ und „while“ in meinem Script (siehe unten).
Was für Unterschiede gibt es bzw. was können diese verursachen?
Kann man überhaupt "if" anstelle "while" dort einsetzen?

Danke und ein lieber Gruß.

void Sensor ()
{
Wire.requestFrom(40, 1); 
while(Wire.available()) 
{
Sensor1 = Wire.read(); 
}

  • if (bedingung) {block} fragt einmalig eine Bedingung ab: Wenn Bedingung zutrifft, dann führe den Anweisungsblock einmal aus.
  • while (bedingung) {block} beginnt eine Schleife: Solange die Bedingung erfüllt ist, führe den Anweisungsblock aus.

Das kann man ohne Kontext nicht beantworten.

1 Like

Hi "agmue",
kann es passieren, dass er in der "while" hängen bleibt?
Und ein "if" würde hier auch gehen?

Ja und jein.

Wie schon von agmue geschrieben, ohne deinen Sketch, ist keine genauere Antwort möglich.

1 Like

Gegenfrage: Was willst Du bezwecken?

Sonst wie #4.

1 Like

Hier mal mein einfaches Sketch:
Mehr ist es einfach nicht.

Ich habe das Gefühl, wenn mein Motor (230V AC) ein bestimmten Peak erzeugt
(Snubber und alles was man sich zu EMV Entstörung vorstellen kann ist schon verbaut, BITTE nichts mehr in die Richtung vorschlagen),
dass er irgendwo hängen bleibt und dann muss ich den RESET drücken.

#include <Wire.h>
int pin5 = 46;
int Sensor1 = 0;

void setup() 
{
   Wire.begin();
   pinMode(pin5,OUTPUT); 
}




void loop()
{
Sensor();

 if(Sensor1==1)
 {
  digitalWrite(pin5,HIGH);
  }
  else
  {
    digitalWrite(pin5,LOW);
  }  

}


void Sensor ()
{
Wire.requestFrom(40, 1); 
while(Wire.available()) 
{
Sensor1 = Wire.read(); 
}

das ist keine Analyse.
Bau dir Serial print Ausgaben in deine If / else Zweige und while schleifen ein dann siehst du was dein Code wirklich macht. Dann sagst du uns wo er genau verbleibt.

dann bring mal daher:

  • einen Schaltplan
  • einen Link auf deine Komponeten
  • Echtbilder vom Aufbau aus denen wir den Aufbau erkennen. Jede einzelne Komponente, jedes Kabel muss erkennbar sein.
1 Like

@noiasca
Sehr gute Idee :slight_smile: Das werde ich machen wenn ich heute Abend Zuhause bin.

Grüße

Alternativer Vorschlag (ungetestet):

#include <Wire.h>
const uint8_t pin5 = 46;
int Sensor1 = 0;

void setup()
{
  Wire.begin();
  pinMode(pin5, OUTPUT);
}

void loop()
{
  if ( Sensor() )
  {
    if (Sensor1 == 1)
    {
      digitalWrite(pin5, HIGH);
    }
    else
    {
      digitalWrite(pin5, LOW);
    }
  } else {
    // Fehlerbehandlung
  }
}

bool Sensor ()
{
  bool erfolg = false;
  Wire.requestFrom(40, 1);
  if (Wire.available())
  {
    Sensor1 = Wire.read();
    erfolg = true;
  }
  return erfolg;
}

Ich habe I²C schon mal zum Blockieren gebracht und I²C ist nur für ein paar cm Leitungslänge konzipiert. Eine Schleife mit while kann ein Programm blockieren. Meine Variante mit ìf hat zumindest theoretisch bessere Chancen.

Bei 230V AC sind spezielle Vorkehrungen zu treffen.
Da du aber offensichtlich unsere Hilfe in diese Richtung ablehnst, macht eine Hilfe hier wenig Sinn. Warum meinst du, dass unsere Infos dir nicht helfen werden ?

@agmue
Das hört sich schonmal super an :grinning:
Ich werde es nachher mal testen.
Endlich mal einer der zugibt, dass I2C blockiert.

Grüße

Diese Aussage ist nicht ganz richtig.
Es hängt immer davon ab, wie du deinen Sketch programmierst.