Kleine Steuerung macht nicht was sie Soll

Hallo
Ich versuche 3 Ventile zu steuern über einen Taster .
Taser nicht gedrückt soll pin 9 nur blinken als Standby LED .
Ist der Taster kurz gedrückt sollen die Ventile kurz durchschalten und wieder in Ruhezustand gehen.

Leider macht das Programm nicht das was es soll.

  1. beim starten werden erst mal alle Ventile durch geschalten was total Blöd ist.
  2. das Blinken der Standby LED hatte ich schon mal aber nach paar mal Balken starten plötzlich die Ventile ohne Drücken vom Taster .
  3. wenn die Ventile einen Durchgang machen ist es meist nicht nur einer sonder laufen paar mal durch.

Ich werde langsam blöde:
Kann mir Jemand sagen was ich Falsch mache ?

 // Ventil Schaltung
// // Die PINs 9, 11, 12, 13  werden als Ausgänge (OUTPUT) festgelegt
// Der PIN 2 wird als Ausgang festgelegt

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(2, INPUT); 
  //mit digitalWrite(13, LOW) wird der Strom von PIN13 ausgeschaltet
  digitalRead(2==0); 
  digitalWrite(13, LOW);
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  //mit digitalWrite(13, HIGH) wird der Strom von PIN13 eingeschaltet
  digitalWrite(9, HIGH); 
  digitalWrite(10, HIGH); 

}

void loop()
{
  //wenn digitalRead(2), also PIN2 den Wert 1 hat, also gedrückt wird, dann tue
  //das, ventile schalten und zurück zu else 
  if(digitalRead(2) == 1)
      {
        digitalWrite(9,  LOW);  // LED Grün
        digitalWrite(10, HIGH); // LED ROT
        delay(5000);
        digitalWrite(13, LOW);
       //delay(1000);
        
        digitalWrite(13, HIGH); // Ventil1
        delay(1000);
        digitalWrite(13, LOW);
        delay(1000);

        
        digitalWrite(12, HIGH); // Ventil2
        delay(1000);
        digitalWrite(12, LOW);
        delay(1000);  

        
        digitalWrite(11, HIGH);// Ventil3 
        delay(1000);
        digitalWrite(11, LOW);
        delay(1000);
            
 }
  //wenn PIN2 nicht den Wert 1 hat, mach doch mal nix auser Blinken 
  else
  {
 digitalRead(2 ==0);
 delay(100);
 digitalWrite(13, LOW);
 digitalWrite(12, LOW);
 digitalWrite(11, LOW);
 digitalWrite(10, LOW);
 
 digitalWrite(9, LOW);
 delay(500);
 digitalWrite(9, HIGH);
 digitalRead(2 ==0);

  }
}

Bitte setze Deinen Sketch in Codetags (oben links </> im Foreneditor oder [code] davor und [/code] dahinter - ohne die *) - nicht in Quotetags, obwohl das ähnlich klingt.
Das kannst Du auch noch nachträglich durch Editieren tun. Bitte mach das, der Sketch ist besser zu lesen, besonders auf mobilen Geräten.

Wenn Du mehrere Sachen in einem Sketch machen willst, wie Blinken aber gleichzeitig auf Taster reagieren, darf es dort keine Delay() geben. In dieser Zeit tut der Prozessor nichts - auch nicht auf Taster reagieren.
Du musst also die Zeitsteuerung über millis() realisieren. Schaue Dir dazu BlinkWithoutDelay an und suche mal nach der Nachtwächtererklärung (kein Witz).

Gruß Tommy

Hobergs-Art:
Hallo
Ich versuche 3 Ventile zu steuern über einen Taster .
Taser nicht gedrückt soll pin 9 nur blinken als Standby LED .
Ist der Taster kurz gedrückt sollen die Ventile kurz durchschalten und wieder in Ruhezustand gehen.

Leider macht das Programm nicht das was es soll.

Hast Du schon mal an einen Zustandsautomaten mit zwei Zuständen gedacht:

  1. STANDBY (nur eine LED blinkt,)
  2. ACTION (eine Sequenz wird durchgeschaltet)

Für jeden der beiden Zustände eine Zustandsfunktion:

Die standby() Funktion würde ein nichtblockierendes Blinken realisieren, und auf Tastendruck in den Zustand ACTION wechseln.
Die action() Funktion würde die Sequenz durchschalten und danach automatisch in STANDBY wechseln.

Brauchst Du ein Programmbeispiel?

Wenn ja: Ist der Tastschalter an Pin2 angeschlossen?
Mit welcher Schaltung? Pull-up oder Pull-down Widerstand?
Wie lang ist das Anschlusskabel vom Arduino-Board zum Tastschalter (ungefähr)?

ja ein Beispiel wäre nicht schlecht. Ich versuche mir gerade den ersten Tipp durchzulesen mit dem Nachtwächter. Nur sehe ich da noch nicht durch wie ich das mit dem Schalter mache . Danke für Eure Hilfe

der Tastenschalter ist an Pin 2 richtig
Pull Wiederstände 220 Ohm
und Kabel 5 cm ist auf ein Testboard aufgebaut erst mal

Später schalten pin 11,12,13 nur 3 Relais a 3,3 Volt

Hobergs-Art:
ja ein Beispiel wäre nicht schlecht. Ich versuche mir gerade den ersten Tipp durchzulesen mit dem Nachtwächter. Nur sehe ich da noch nicht durch wie ich das mit dem Schalter mache . Danke für Eure Hilfe
Pull Wiederstände 220 Ohm

Da stimmt etwas nicht. Und damit meine ich nicht nur die Falschschreibung "Wiederstände".

Sondern den Wert 220 Ohm.
220 Ohm wäre an 5V hängend ein veritabler "Verbraucher", der circa fünf Milliampere Strom zieht. Damit kann man eine LED leuchten lassen.

Also das wäre ein brauchbarer LED-Vorwiderstand für low-power LEDs, die zu Signalisierungszwecken betrieben werden.

Aber ein pull-Widerstand wäre eher größer, vielleicht 4K7 (4700 Ohm) oder 2K2(2200 Ohm) oder1K (1000 Ohm).

Und wenn Dein Kabel überhaupt nur 5cm lang ist, warum machst Du Dir überhaupt die Mühe, für den Button einen externen pull-Widerstand zu verkabeln?

Da wäre doch das einfachste: Tastschalter zwischen Pin2 und GND schalten, und im setup() den pinMode auf INPUT_PULLUP setzen:
pinMode(2,INPUT_PULLUP);
Das wäre die normale Beschaltung eines Tastschalters für Kabellängen unterhalb einer Gehäuselänge).
Internen pull-up Widerstand per Software aktivieren, keinen externen pull-Widerstand am Schalter anschließen, logischer Wert LOW wenn Taster niedergedrückt.

Kurze Erklärung : es ist richtig mit den LED´s zur zeit ist das ganze auf ein steckboard aufgebaut .
1 taster 3x LED für Ventile und 1x LED für Standby

Wenn der Code geht baue ich das ganze richtig auf.
Mir gehts darum das ich später 3 Ventile auslösen möchte über ein Signal . Das Signal kommt von wo anders und schaltet ein Relais ganz kurz ein . Dieses Signal soll dieser Arduino als Auslöser nehmen.

Jetzt hat also der Arduino das Startsignal also

  1. Grüne Led aus
  2. Ventil1. = zur zeit nur eine LED starten für Time (x) schließen
  3. Pause für Time (x1)
  4. Ventil2. = zur zeit nur eine LED starten für Time (x2) schließen
  5. Pause für Time (x3)
  6. Ventil3. = zur zeit nur eine LED starten für Time (x4) schließen
  7. warten auf neues Signal

klingt einfach aber ich komme nicht dahinter . Mir sind echt die pausen und Ventilzeiten wichtig . die möchte ich angeben können . von 0,3 Millisekunden bis zu 10 sek

Bin für jede Hilfe Dankbar . Langsam drehe ich damit durch

Anfangen Müsste ich ja jetzt so :

// Ventil Schaltung
// // Die PINs 9, 11, 12, 13  werden als Ausgänge (OUTPUT) festgelegt
// Der PIN 2 wird als Ausgang festgelegt
unsigned long LED_timestore;  // Variable Speicher für Systemzeit.

int LedStatus = LOW;
int LedPin = 9;       //Güne LED
int LedPin1 = 10;     //Rote LED
int Ventil1Pin  = 11;     //Ventil 1
int Ventil2Pin  = 12;     //Ventil 2
int Ventil3Pin  = 13;     //Ventil 3
int Taster1Pin(2 ==0);      // Taster 

void setup() {
  pinMode(LedPin, OUTPUT);  // teilt dem Arduino mit, dass das ein Ausgang ist.
  pinMode(LedPin1, OUTPUT); 
  pinMode(Ventil1Pin, OUTPUT);
  pinMode(Ventil2Pin, OUTPUT);
  pinMode(Ventil3Pin, OUTPUT); 
  pinMode(Taster1Pin, INPUT); 
  
}

Warum willst Du ein Relais zum Auslösen nehmen? Ein relais und ein Taster prellen. Damit schaffst Du Dir zusätzlichen Aufwand.
Wo kammt das Steuersignal her? Könnte man da einen Optokoppler benutzen?

Gruß Tommy

ja Könnte ich benutzen wäre kein Problem. der Taster Simuliert das ganze nur zur zeit .

// Ventil Schaltung
// // Die PINs 9, 11, 12, 13  werden als Ausgänge (OUTPUT) festgelegt
// Der PIN 2 wird als Ausgang festgelegt
unsigned long LED_timestore;  // Variable Speicher für Systemzeit.

int LedStatus = LOW;
int LedPin = 9;       //Güne LED
int LedPin1 = 10;     //Rote LED
int Ventil1Pin  = 11;     //Ventil 1
int Ventil2Pin  = 12;     //Ventil 2
int Ventil3Pin  = 13;     //Ventil 3
int Taster1Pin(2 ==0);      // Taster 

void setup() {
  pinMode(LedPin, OUTPUT);  // teilt dem Arduino mit, dass das ein Ausgang ist.
  pinMode(LedPin1, OUTPUT); 
  pinMode(Ventil1Pin, OUTPUT);
  pinMode(Ventil2Pin, OUTPUT);
  pinMode(Ventil3Pin, OUTPUT); 
  pinMode(Taster1Pin, INPUT); 
  
}

void loop()
{
if (Taster1Pin == 0)
      {
        if (LedStatus == LOW) 
         {
    if (millis() - 1000 > LED_timestore) 
    {
      digitalWrite(LedPin, HIGH);
      LED_timestore = millis();
      LedStatus = HIGH;
         }
      }
   
 }
 else 
{
  if (Taster1Pin == 0)
  {
    if (millis() - 300 > LED_timestore) {
      digitalWrite(LedPin, LOW);
      LedStatus = LOW;
  }
  }
}
}

So gehts schon mal nicht . Versuche das ganze echt zu verstehen :slight_smile:

int Ventil3Pin = 13; //Ventil 3

Das finde ich komisch!

Beim Reset müsste der Bootloader auf Pin13 Blinken.
Dein Ventil zappelt dann.

So gehts schon mal nicht . Versuche das ganze echt zu verstehen :slight_smile:

Ok!

Siehe:

int Taster1Pin(2 ==0);      // Taster

Was ist das?

pinMode(Taster1Pin, INPUT);

Sieht richtig aus, wenn das vorherige nicht falsch wäre.

  if (Taster1Pin == 0)

Wenn der Taster1Pin, mal angenommenerweise, der Pin 2 ist, dann wird der Ausdruck zu:

  if (2 == 0)

Und 2 == 0 wird niemals wahr.

Wie wäre es zum Beispiel so:

const int blinkInterval = 400;

long timeVentil1on = 500;
long pause1        = 500;
long timeVentil2on = 800;
long pause2        = 500; 
long timeVentil3on = 1200;

const byte taster   = 2;
const byte ventil1  = 9;
const byte ventil2  = 10;
const byte ventil3  = 11;
const byte ledRot   = 12;
const byte ledGruen = 13;

boolean buttonState;
boolean lastButtonState;

void setup()
{  pinMode(taster, INPUT_PULLUP);
   pinMode(ventil1, OUTPUT);
   pinMode(ventil2, OUTPUT);
   pinMode(ventil3, OUTPUT);
   pinMode(ledRot, OUTPUT);
   pinMode(ledGruen, OUTPUT);
}

void loop()
{  buttonState = digitalRead(taster);
   if (buttonState == LOW  &&  buttonState != lastButtonState)   // Taster wurde gedrueckt
   {  action();
   }
   digitalWrite(ledGruen, millis()/blinkInterval%2);   // die gruene LED blinkt (nicht-blockierend)
   lastButtonState = buttonState;
}  

void action()    // diese Funktion ist blockierend
{  digitalWrite(ledGruen, LOW);
   digitalWrite(ledRot, HIGH);
   digitalWrite(ventil1, HIGH);
   delay(timeVentil1on);
   digitalWrite(ventil1, LOW);
   delay(pause1);
   digitalWrite(ventil2, HIGH);
   delay(timeVentil2on);
   digitalWrite(ventil2, LOW);
   delay(pause2);
   digitalWrite(ventil3, HIGH);
   delay(timeVentil3on);
   digitalWrite(ventil3, LOW);
   digitalWrite(ledRot, LOW);
}

Du musst die Zeiten und Pinbelegungen natürlich auf deine Bedürfnisse anpassen.

Allgemein fällt mir dazu ein:

  1. Ein Ventil mit Arduino-Pin 13 zu schalten ist keine allzu gute Idee. Bei einem Reset (oder wenn der Arduino “eingeschaltet” wird) blinkt die eingebaute LED auf 13 mehrmals (das hat combie ja bereits erwähnt). Ich glaube, das willst du nicht. Nimm dazu also einen anderen Pin.
  2. Ich hoffe, dass folgendes (in #5) ein Tippfehler ist

Hobergs-Art:
Mir sind echt die pausen und Ventilzeiten wichtig. die möchte ich angeben können . von 0,3 Millisekunden bis zu 10 sek

Ich hoffe du meinst 0,3 Sekunden.
Ein Ventil 0,3 Milisekunden einzuschalten bewirkt beim Ventil wahrscheinlich genau gar nichts (Masseträgheit), aber auch 0,3 Sekunden sind durchaus sportlich :slight_smile:
3) Den Taster musst du gegen GND schalten/tasten. Es wird der interne Pullup-Widerstand verwendet, ein externer Pullup-/Pulldown-Widerstand ist also nicht nötig.

Die Aktion (“action”) wird einmal ausgeführt, wenn der Taster gedrückt wird.
Zum erneuten Ausführen der Aktion muss der Taster losgelassen und dann erneut gedrückt werden.
Wird der Taster über längere Zeit gedrückt gehalten, wird die Aktion also nicht mehrmals ausgeführt.

Die Funktion “action” ist blockierend. Während sie abläuft wird also nicht auf diverse Tastendrücke etc. reagiert (und ein Entprellen des Tasters ist deshalb nicht nötig). Möglicherweise ist das OK, das hängt aber ganz von deinem Anwendungsfall ab - die Informationslage ist ja ein wenig dünn :slight_smile:

Wenn du dann (später) Ventlie damit schalten willst kannst du die eher nicht direkt mit den Arduino-Pins schalten. Du brauchst noch MOSFETs oder zumindest Transistoren etc.

@uxomm

Vielen Dank kann ich da nur sagen.
Echt der hammer so war das ganze geplant und hätte ich in wochen nicht hinbekommen .
Da merke ich wo das ich alt werde . Vor 20 Jahren hätte ich das schneller verstanden.

Eine Frage habe ich noch . Ist es jetzt so das der Taster gedrückt bleiben muss?
Das Andere gerät sendet ja nur rund 1sek ein signal. Durch das entprellen würde das doch da stoppen oder ?

Der Taster braucht nur kurz gedrückt werden um die "Ventilaktion" auszulösen.

Ja habe es gerade aufgebaut und test gemacht :-). Sag mal kann man eigentlich werte wie pausen und eben die Schaltzeiten in eine extra Datei Auslagern?
Unter c++ konnte man das z.b. in einer txt oder einer .h Datei ? geht sowas bei Arduino Programmen auch ?

Bye.

ja

Hobergs-Art:
Ja habe es gerade aufgebaut und test gemacht :-). Sag mal kann man eigentlich werte wie pausen und eben die Schaltzeiten in eine extra Datei Auslagern?
Unter c++ konnte man das z.b. in einer txt oder einer .h Datei ? geht sowas bei Arduino Programmen auch ?

Bye.

Ja, natürlich.
Erstelle in der IDE einen neuen Tab und nenne die Datei "irgendwas.h"
dann includiere diese Datei innerhalb des Sketches
#include "irgendwas.h"

In der Datei "irgendwas.h" können dann Deklarationen stehen, oder Code, Klassendefinitionen etc. Die IDE speichert die Datei beim Speichern im selben Verzeichnis ab wie die .ino Sketchdatei. Und beim Laden der Sketchdateiwird die .h Datei dann auch automatisch wieder mitgeladen.