Befehl neben if Bedingung ausführen

Hallo,

ich hoffe ihr könnt mir weiterhelfen!

Hier erstmal der Code:

int sensorPin = A0;    // select the input pin for the potentiometer
int R1 = 11;
int R2 = 12;  // select the pin for the LED
int sensorValue = 0;  // variable to store the value coming from the sensor

void setup() {
 // declare the ledPin as an OUTPUT:
 pinMode(R1, OUTPUT);
 pinMode(R2, OUTPUT);
}

void loop() {
 // read the value from the sensor:
 sensorValue = analogRead(sensorPin);
 // turn the ledPin on
if (sensorValue > 100) {
   digitalWrite(R1, LOW);
   digitalWrite(R2, LOW);
   delay(1000);
 } else {
    digitalWrite(R1, HIGH);
    digitalWrite(R2, HIGH);
 }

}

Jetzt würde ich gerne folgendes tun. Während R1 und R2 auf low sind soll alle 2 Minuten Pin 13 für eine Sekunde angeschaltet werden. Es ist aber wichtig, dass die arduino den if befehl weiter prüft weil ansonsten die Relais, welche auf r1 und r2 geschaltet sind auf high springen!

Ich hoffe ihr könnt mir behilflich sein.

Danke im Voraus

Ja, das ist eine klassische Anwendung für "BlinkWithoutDelay", dann blinkt die Diode ohne Beeinträchtigung des übrigen Codes.

Danke für die schnelle Antwort!

Ich bin wirklich ein völliger Neuling!

Wo bette ich den Code genau ein?

Wo bette ich den Code genau ein?

Schau dir die grundlegendsten Beispiele und deinen Code möglichst genau an.

Jeder Sketch definiert zuerst globale Variable und dann die zwei Funktionen setup und loop ...

Und jetzt du... ;)

michael_x:
Schau dir die grundlegendsten Beispiele und deinen Code möglichst genau an.

Jeder Sketch definiert zuerst globale Variable und dann die zwei Funktionen setup und loop …

Und jetzt du… :wink:

</*
 Analog Input
Demonstrates analog input by reading an analog sensor on analog pin 0 and
turning on and off a light emitting diode(LED)  connected to digital pin 13.
The amount of time the LED will be on and off depends on
the value obtained by analogRead().

The circuit:
* Potentiometer attached to analog input 0
* center pin of the potentiometer to the analog pin
* one side pin (either one) to ground
* the other side pin to +5V
* LED anode (long leg) attached to digital output 13
* LED cathode (short leg) attached to ground

* Note: because most Arduinos have a built-in LED attached
to pin 13 on the board, the LED is optional.


Created by David Cuartielles
modified 30 Aug 2011
By Tom Igoe

This example code is in the public domain.

http://www.arduino.cc/en/Tutorial/AnalogInput

*/

int sensorPin = A0;    // select the input pin for the potentiometer
int R1 = 11;
int R2 = 12;  // select the pin for the LED
int sensorValue = 0;  // variable to store the value coming from the sensor
const int ledPin = 13;
int ledState = LOW;
unsigned long previousMillis = 0;
const long interval = 1000;

void setup() {
 // declare the ledPin as an OUTPUT:
 pinMode(R1, OUTPUT);
 pinMode(R2, OUTPUT);
 pinMode(ledPin, OUTPUT);
 
}

void loop() {
 unsigned long currentMillis = millis();


 
 // read the value from the sensor:
 sensorValue = analogRead(sensorPin);
 // turn the ledPin on
if (sensorValue > 100) {
   digitalWrite(R1, LOW);
   digitalWrite(R2, LOW);
   delay(1000);
    if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }

 } else {
    digitalWrite(R1, HIGH);
    digitalWrite(R2, HIGH);
 }

}

SO???

Läuft es denn bei dir?

Du solltest aber nicht einfach nur copy&paste machen, sondern auch daraus lernen.

Und bitte setzte deinen Sketch in Code-Tags (Schaltfläche </>) dann ist er besser zu lesen.

Entschuldigung! Kann ich leider noch nicht sagen, da der Aufbau des Projekts noch beim Kollegen in der Halle steht. Kann es erst später testen! Wenn ich mir das so jetzt durchlese bzw den Code anschaue, dann ist es für mich doch schlüssig. Immer wenn die Relais auf LOW sind läuft der Code für die LED weiter.

Oder sehe ich das Falsch?

Wenn du jetzt noch Sketch in Code-Tags (Schaltfläche </>) dann ist er besser zu lesen. Das kannst du auch nachträglich machen.

Was ich so erkennen kann, sollte es mit dem Blinken funktionieren.

So habe es gerade mal einfach so getestet!

Die LED blinkt aber jetzt habe ich noch ein Problem!

Wenn der Intervall auf 1000 millis steht dann blinkt die Led ja jede Sekunde. Aber ich hätte gerne, dass die LED beispielsweise alle 10 Sekunden für 0,5 Sekunden blinkt. Derzeit ist es ja so das wenn ich jetzt den Intervall auf 10000 stelle, dass die LED 10 sek an und 10 sek aus ist.

Ok, meine Lösung wäre hier einen fertigen Timer (SimpleTimer.h) zu nehmen.

Den startest du wenn Relais gezogen, alle 10 sek.

Ich weiß, es gibt noch andere Lösungen, aber das funktioniert und ist mein "Favorit".

Hallo, da C & P so beliebt ist...

const unsigned int onTime = 500;
const unsigned int offTime = 10000;


unsigned long previousMillis=0;


int interval = onTime;


boolean LED13state = true;


void setup() {
  pinMode(13, OUTPUT);
}

void loop() {

  digitalWrite(13, LED13state);


  unsigned long currentMillis = millis();


  if ((unsigned long)(currentMillis - previousMillis) >= interval) {

    if (LED13state) {
  
      interval = offTime;
    } else {
      
      interval = onTime;
    }

    LED13state = !(LED13state);

  
    previousMillis = currentMillis;
  }
}

Gruß und Spaß Andreas

HotSystems: Ok, meine Lösung wäre hier einen fertigen Timer (SimpleTimer.h) zu nehmen.

Den startest du wenn Relay gezogen, alle 10 sek.

Ich weiß, es gibt noch andere Lösungen, aber das funktioniert und ist mein "Favorit".

Ok danke für eine Lösung! Den Code muss ich mir jetzt erstmal anschauen! Der ist doch etwas lang! :-)

Bis man raus hat, wie eine Library funktioniert, (und ob sie das macht was man will), hat man meist die Funktion selbst geschrieben.

Andreas’ Beispiel kann man etwas vereinfachen:

const unsigned int onTime = 500;
const unsigned int zyklus = 10000;

unsigned long previousMillis;

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis < onTime)  digitalWrite(13, HIGH);
  else   digitalWrite(13, LOW);
 
  if (currentMillis - previousMillis >= zyklus)   previousMillis = currentMillis;
}

Der GesamtZyklus ist 10 sek. Die ersten 500 ms ist die LED an, sonst aus. fertig.

Hallo, nicht schlecht! Andreas sagt, Danke schön. Gruß und Spaß Andreas

michael_x: Bis man raus hat, wie eine Library funktioniert, (und ob sie das macht was man will), hat man meist die Funktion selbst geschrieben.

Und diese Lösung ist auch viel schlanker als die Lösung mit der Library. Danke auch von mir.

Danke für die Blumen :wink:

@Snakebite1911:

BlinkWithoutDelay ist ja leicht verständlich, die nächste “knifflige” Frage ist meist, wie man zwei delay() durch millis() ersetzt.

Der Trick ist: das delay wird eigentlich nicht durch einen millis() Aufruf ersetzt, sondern eher durch eine weitere Zustandvariable wie unsigned long previousMillis; im vorigen Beispiel.

Wo du die folgenden Zeilen (oder etwas ähnliches) in eins der BlinkWithoutDelay-Beispiele einfügst, und was sonst noch aus deinem Original-Sketch fehlt, kriegst du selber raus:

unsigned long startRelaisZeit; 


void loop() {
 sensorValue = analogRead(sensorPin);
 if (sensorValue > 100) {
      digitalWrite(R1, LOW);
      startRelaisZeit = currentMillis;
 }
 if ( (sensorValue < 100) && (currentMillis - startRelaisZeit > 1000) )   {
          digitalWrite(R1, HIGH);
 }
}

Evtl. sollte man in setup R1 und R2 erstmal auf HIGH schalten (und dann auf pinMode(R1, OUTPUT); )
Oder startRelaisZeit mit -1000 vorbelegen … ( das geht übrigens auch bei unsigend Variablen )