Go Down

Topic: Schleife einmal durchlaufen lassen (Read 1 time) previous topic - next topic

pronicolas

Apr 05, 2020, 08:38 am Last Edit: Jun 05, 2020, 06:32 pm by pronicolas
Guten Tag zusammen, ich habe folgenden Sketch: Ich möchte erreichen, dass die if bzw. else Schleife bei betätigen des Tasters nur einmal durchläuft und dann bei jeweils grün = HIGH oder rot = HIGH bleibt.
Wie kann ich das erreiche beziehungsweise welcher Code ist dafür nötig.

Vielen Dank im Voraus


Code: [Select]


/*

*/

int tasterstatus1 = 0;
int gruen1 = 6;
int gelb1 = 7;
int rot = 8;
int ampel1 = 9;

void setup() {
    pinMode(gruen1,OUTPUT);
    pinMode(gelb1,OUTPUT);
    pinMode(rot1,OUTPUT);
    pinMode(ampel1,INPUT);
}

void loop() {
    


tasterstatus1=digitalRead(ampel1);


if (tasterstatus1 == HIGH)
    {
    digitalWrite(gruen1,HIGH);
    digitalWrite(gelb1, LOW);
    digitalWrite(rot1, LOW);
    delay(1000);
    digitalWrite(gruen1,HIGH);
    digitalWrite(gelb1, HIGH);
    digitalWrite(rot1, LOW);
    delay(1000);
    digitalWrite(gruen1,LOW);
    digitalWrite(gelb1, LOW);
    digitalWrite(rot1, HIGH);
    
    
    
    
    }

else

    {
      digitalWrite(gruen1,LOW);
    digitalWrite(gelb1, LOW);
    digitalWrite(rot1, HIGH);
    delay(1000);
    digitalWrite(gruen1,LOW);
    digitalWrite(gelb1, HIGH);
    digitalWrite(rot1, LOW);
    delay(1000);
    digitalWrite(gruen1,HIGH);
    digitalWrite(gelb1, LOW);
    digitalWrite(rot1, LOW);
    }
}

Peter-CAD-HST

Moin pronicolas

einfach die IF Eintrittsbedingung an deine Bedingungen anpassen.

Gruss Peter

und gesund bleiben
KISS Q&D - keep calm and carry on - mind the gap - beware of sharks! -

uwefed

Du benutzt eine Statusvariable. In der if Bedingung der "Schleife" kontrollierst Du ob die Statusvariable zB 0 ist. in der "Schleife" setzt Du die Statusvariable auf 1. Wenn die "Schleife" wieder ausgeführt werden soll setzt Du die Statusvariable wieder auf 0.
Grüße Uwe

combie

#3
Apr 05, 2020, 09:44 am Last Edit: Apr 05, 2020, 09:46 am by combie
Quote
dass die if bzw. else Schleife
if-schleife

Quote
Wie kann ich das erreiche beziehungsweise welcher Code ist dafür nötig.
Erreichen kannst du das in dem du das so programmierst.

Und welcher Code dafür nötig ist?
Natürlich einer, der das tut, was du willst.
Sicherlich Dutzende Möglichkeiten es gibt.


Leider habe ich dein Problem nicht verstanden...
Der Lauf soll nur einmal nach dem Einschalten stattfinden?
Warum steht er dann in loop() und nicht in setup()

Oder soll es bei jedem Betätigen durchlaufen werden?
Dann wirst du Betätigungen erkennen müssen.

Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:
Quote
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
ProtoThreads,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay, 
--
Blink Without Delay
Die Nachtwächter Erklärung
--
MicroBahner/MobaTools/url]
[url=https://forum.arduino.cc/index.php?topic=413734.msg2848523]Intervall Macro

Multitasking Macros
INTERVAL Ersatzstoff
CooperativeTask
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
Quelle: Jean-Paul Sartre

HotSystems

Damit dein Beispiel überhaupt richtig und sicher funktioniert, solltest du dich komplett von den delays verabschieden.
Ersetze die delays durch Funktionen mit millis (Beispiel BlinkWithoutDelay) und berücksichtige die schon gemachten Vorschläge.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

pronicolas

#5
Apr 05, 2020, 07:41 pm Last Edit: Apr 05, 2020, 07:42 pm by pronicolas
Also setze ich die schleife in setup?

vielen dank für eure Tipps. :)

my_xy_projekt

Guten Tag zusammen, ich habe folgenden Sketch: Ich möchte erreichen, dass die if bzw. else Schleife bei betätigen des Tasters nur einmal durchläuft und dann bei jeweils grün = HIGH oder rot = HIGH bleibt.
Wie kann ich das erreiche beziehungsweise welcher Code ist dafür nötig.

Vielen Dank im Voraus


Code: [Select]

if (tasterstatus1 == HIGH)
    {
    digitalWrite(gruen1,HIGH);
    digitalWrite(gelb1, LOW);
    digitalWrite(rot1, LOW);
    delay(1000);
    digitalWrite(gruen1,HIGH);
    digitalWrite(gelb1, HIGH);
    digitalWrite(rot1, LOW);
    delay(1000);
    digitalWrite(gruen1,LOW);
    digitalWrite(gelb1, LOW);
    digitalWrite(rot1, HIGH);
[...]

Die Aufgabenstellung ist massiv ungenau.
Nimm einen Zettel und schreibe auf was Du willst.
Formuliere daraus deine Frage.

Nach dem, was Du oben schreibst und in dem Code zu stehen hast, würde ab hier nichts mehr passieren.

if (tasterstatus1 == HIGH)
   {
   digitalWrite(gruen1,HIGH);

Dann wären beide Bedingungen, die Du vorgibst erfüllt.


Quote
Also setze ich die schleife in setup?
Nein.

postmaster-ino

Was für eine Schleife?

Lies Mal, was combie so Feines gepostet hat ... #3

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

pronicolas

#8
Apr 05, 2020, 08:51 pm Last Edit: Apr 05, 2020, 08:52 pm by pronicolas
Ich komme mit combis Infos nicht so ganz weiter, ich kann es alt genauer formulieren: Wenn der Taster gedrückt wird soll erst die grüne led angehen dann wieder aus, dann die gelbe wieder aus und schlussendlich die rote, die dann auch rot bleiben soll. Wenn der taster nicht gedrückt wird, soll es genau umgelehrt passieren d.h rot aus, gelbe an/aus , grün an und grün an bleiben,

Ich komme mit combis infos nicht so ganz weiter, wenn mir jemand sagen könnte nach was ich ich suchen muss um den Befehl richtig auszuführen, dann wäre ich schon sehr dankbar.

Es geht mir weniger um das delay bzw. die zeitenabfolge.

my_xy_projekt

Ich komme mit combis Infos nicht so ganz weiter,
Naja - eigentlich nicht schwer.
if/else ist KEINE Schleife.

IF ist eine Bedingung.
ELSE wird ausgeführt, wenn genau diese Bedingung NICHT erfüllt ist.

Und dann zu Deiner Vorgabe....
Mit dem Start deines Ardu UND die Taste nicht gedrückt, bekommst Du den Zustand
Quote
Wenn der taster nicht gedrückt wird, soll es genau umgelehrt passieren d.h rot aus, gelbe an/aus , grün an und grün an bleiben,
umgehend.

Es wird der Zustand
Quote
Wenn der Taster gedrückt wird soll erst die grüne led angehen dann wieder aus, dann die gelbe wieder aus und schlussendlich die rote, die dann auch rot bleiben soll.
nur erreicht, wenn die Taste mehr oder weniger schon beim Anlegen der Betriebsspannung gedrückt ist.

Dann würde es auch im setup() reichen.


Das ist sicher nicht das, was Du willst.

postmaster-ino

Hi

Warum schreibst Du nicht einfach, WAS Es werden soll?
... eine Ampel, Die auf Knopfdruck (und gedrückt halten) die Fahrzeug-Ampel auf ROT schaltet.
... Die bei NICHT-Knopfdruck zurück nach GRÜN schalten soll.

Wäre Das ungefähr, Was Du vorhast?

Dann überlegen wir uns, welche Ampel-Phasen wir haben
- ROT
- ROT,GELB
- GRÜN
- GELB
- ... wieder von Vorne

Wenn Knopf gedrückt ist (und die Wartezeit um ist) und noch nicht ROT, dann gehe einen Schritt weiter.
Wenn Knopf NICHT gedrückt ist (und die Wartezeit um ist) und noch nicht GRÜN, dann gehe einen Schritt weiter
Wenn Schritt >GELB, dann Schritt=ROT

Alles keine größere Hexerei - Du musst Dir NUR den Ablauf klar machen - und Diesen dann programmieren.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

combie

#11
Apr 05, 2020, 10:50 pm Last Edit: Apr 06, 2020, 03:38 pm by combie
Quote
Ich komme mit combis infos nicht so ganz weiter,
Merke ich schon!

Allerdings habe ich deine Beschreibung mittlerweile, in etwa, verstanden.
Also kann ich dir zeigen, wie sowas bei mir aussehen könnte.


Code: [Select]
#include <TaskMacro.h>
#include <CombiePin.h>

using LedRed    = Combie::Pin::OutputPin<11>;
using LedYellow = Combie::Pin::OutputPin<12>;
using LedGreen  = Combie::Pin::OutputPin<13>;
using Taster    = Combie::Pin::TasterGND<2>;

const bool stromausfall { false };
const unsigned long ampeltakt { 500 }; //ms

Task ampel()
{
  taskBegin();

  // initialisierung
  Taster().initPullup();
  LedRed().init();
  LedYellow().init();
  LedGreen().init();

  LedRed()    = 1;
  LedYellow() = 0;
  LedGreen()  = 0;

  while(not stromausfall)
  {
    taskWaitFor(Taster()); // auf tastendruck warten
    LedRed()    = 0;
    LedYellow() = 1;
    LedGreen()  = 0;

    taskPause(ampeltakt);
    LedRed()    = 0;
    LedYellow() = 0;
    LedGreen()  = 1;

    taskPause(ampeltakt); // mindest green phase

    taskWaitFor(not Taster());    // auf taste loslassen warten

    taskPause(ampeltakt);
    LedRed()    = 0;
    LedYellow() = 1;
    LedGreen()  = 0;

    taskPause(ampeltakt);
    LedRed()    = 1;
    LedYellow() = 0;
    LedGreen()  = 0;
   
    taskPause(ampeltakt); // mindest red phase

  }
  taskEnd();
}


void setup(void)
{
}

void loop(void)
{
  ampel();
}



Ach ja...
Die Reihenfolge stimmt nicht ganz für dich, aber das wirst du schon umbauen können.
Nicht wahr?
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
Quelle: Jean-Paul Sartre

pronicolas

Wo finde ich die beiden library die oben gennant werden als taskmacro und combie, sonst lässt sich der sketch nicht laden. Besten Dank!!

combie

Vielleicht in der Datei, welche ich da angehangen habe?
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
Quelle: Jean-Paul Sartre

michael_x

Quote from: combie
bei mir
Vorsicht, da wirst du eine Menge lernen müssen.

Code: [Select]

void setup(void)
{
}

void loop(void)
{
  ampel();
}

Im eigentlichen Sketch sieht man, dass man hier nichts sieht. Das ist elegant, es zwingt zum genauer hinschauen.
Das mit dem const bool stromausfall; ist übrigens nur Spaß :)

Go Up