Arduino mit Taster und Warteschleife

OP #4580119
Lesenswert?

Hallo,

ich habe folgendes Problem,
ich steuere eine LED, eine Kamera und eine Einspritzdüse über ein 
Arduino Mega.
Alle drei sollen auf Knopfdruck ausgelöst werden.
Dafür möchte ich einen Taster benutzen.
Das Programm habe ich wie folgt aufgebaut:


int LED_vor_Kamera = 0;
int Kamera_vor_Injektor = 0;
int Injektor_zeit = 0;
int state = 0;

void setup() {
  pinMode(34, INPUT);             //Taster
  pinMode(32, OUTPUT);            //LED
  pinMode(28, OUTPUT);            //Kamera
  pinMode(24, OUTPUT);            //Injektor

  LED_vor_Kamera = 2000;          //Nur Beispiele für die Dauer
  Kamera_vor_Injektor = 1000;
  Injektor_zeit = 500;
}

void loop() {
  digitalWrite(32, LOW);
  digitalWrite(28, LOW);
  digitalWrite(24, LOW);
  if(digitalRead(34)=HIGH);
  {
  state = 1;
  digitalWrite(32, HIGH);
  delay(LED_vor_Kamera);
  digitalWrite(28, LOW);
  digitalWrite(24, LOW);
  digitalWrite(28, HIGH);
  delay(Kamera_vor_Injektor);
  digitalWrite(24, HIGH);
  delay(Injektor_zeit);
  digitalWrite(24, LOW);
  delay(1000);
  digitalWrite(28, LOW);
  delay(1000);
  digitalWrite(32, LOW);
  if(digitalRead(34)==HIGH);
  state == 1;
  else{
  state = 0;
    }
  }
}

Mein Problem dabei ist zum einen, dass ich das Tastenprellen umgehen 
möchte.
Desweiteren sollen die drei Bauteile nur für ms angesteuert werden. Da 
es sein kann, dass das Programm durchgelaufen ist, bevor der Knopf 
wieder losgelassen wurde, möchte ich sicherstellen, dass das Programm in 
einer Schleife verweilt, bis der Knopf wieder dauerhaft losgelassen 
wurde und soll dann wieder zum Anfang zurückkehren.
Leider fehlen mir jegliche Kenntnisse, wie ich das machen soll, bzw. wie 
ich die Bedingung nennen soll.

Kann mir hier jemand helfen? Ich danke schon mal im voraus.
Gruß
Gast #4580154
Lesenswert?

Ich würds mit einer Variable machen, die festlegt, dass ein bestimmter 
Code nur einmal ausgeführt werden kann (bei Tastendruck)
1
int LED_vor_Kamera = 0;
2
int Kamera_vor_Injektor = 0;
3
int Injektor_zeit = 0;
4
int state = 0;
5

6
void setup() {
7
  pinMode(34, INPUT);             //Taster
8
  pinMode(32, OUTPUT);            //LED
9
  pinMode(28, OUTPUT);            //Kamera
10
  pinMode(24, OUTPUT);            //Injektor
11

12
  LED_vor_Kamera = 2000;          //Nur Beispiele für die Dauer
13
  Kamera_vor_Injektor = 1000;
14
  Injektor_zeit = 500;
15
}
16

17
void loop() {
18
  if(digitalRead(34) == HIGH)
19
  {
20
    if(state == 0){
21
      state = 1;
22
      digitalWrite(32, HIGH);
23
      delay(LED_vor_Kamera);
24
      digitalWrite(28, LOW);
25
      digitalWrite(24, LOW);
26
      digitalWrite(28, HIGH);
27
      delay(Kamera_vor_Injektor);
28
      digitalWrite(24, HIGH);
29
      delay(Injektor_zeit);
30
      digitalWrite(24, LOW);
31
      delay(1000);
32
      digitalWrite(28, LOW);
33
      delay(1000);
34
      digitalWrite(32, LOW);
35
    }
36
  }
37
  else{
38
    state = 0;
39
  }
40
}

So ungefähr. Du hattest noch ein paar Syntax-Fehler: Kein ";" nach 
if/else etc., Vergleiche mit "==" nicht "="

Lg
#4580185
Lesenswert?

@Knarf Lehceur (si7)
1
#define LED 32
2
#define KAMERA 28
3
#define INJEKTOR 24
4
#define TASTER 34
5

6
#define TIME_LED      2000  // ms
7
#define TIME_KAMERA   1000  // ms
8
#define TIME_INJEKTOR  500  // ms
9

10
void setup() {
11
  pinMode(TASTER, INPUT);
12
  pinMode(LED, OUTPUT);
13
  pinMode(KAMERA, OUTPUT);
14
  pinMode(INJEKTOR, OUTPUT);
15
}
16

17
void loop() {
18
    digitalWrite(LED, LOW);
19
    digitalWrite(KAMERA, LOW);
20
    digitalWrite(INJEKTOR, LOW);
21
  
22
    if(digitalRead(TASTER)=HIGH) {
23
        digitalWrite(LED, HIGH);
24
        delay(TIME_LED);
25

26
        digitalWrite(KAMERA, LOW);
27
        digitalWrite(INJEKTOR, LOW);
28
        digitalWrite(KAMERA, HIGH);
29
        delay(TIME_KAMERA);
30

31
        digitalWrite(INJEKTOR, HIGH);
32
        delay(TIME_INJEKTOR);
33

34
        digitalWrite(INJEKTOR, LOW);
35
        delay(1000);
36

37
        digitalWrite(KAMERA, LOW);
38
        delay(1000);
39

40
        digitalWrite(LED, LOW);
41
        
42
        delay(50);  // Entprellzeit abwarten       
43
        while(digitalRead(TASTER)==LOW);    // warte auf Loslassen
44
        delay(50);  // Entprellzeit abwarten       
45
    }
46
}


>Mein Problem dabei ist zum einen, dass ich das Tastenprellen umgehen
>möchte.

Das ist kein Problem.

>Desweiteren sollen die drei Bauteile nur für ms angesteuert werden. Da
>es sein kann, dass das Programm durchgelaufen ist, bevor der Knopf
>wieder losgelassen wurde, möchte ich sicherstellen, dass das Programm in
>einer Schleife verweilt, bis der Knopf wieder dauerhaft losgelassen
>wurde und soll dann wieder zum Anfang zurückkehren.

Auch das ist kein Thema.

Du hast einige grundlegende Fehler drin.

  if(digitalRead(34)=HIGH);

Das ist FALSCH!!! Damit kann keinerlei Anweisung mehr nach dem if() 
ausgewertet werden. Eine schöne Stolperfalle in C!

    delay(Kamera_vor_Injektor);

Das geht auch nicht, die Funktion geht nur mit konstanten Werten.
Du MUSST eine gescheite Formatierung des Quelltextes machen, sonst siehr 
keiner durch, auch du nicht. Das betrifft ier vor allem die Einrückung.
OP #4580221
Lesenswert?

Wow, ok danke. Wirklich super eure Hilfe. Leider kann ich das Programm 
erst am Mittwoch testen, aber danach werde ich sofort berichten. Ja 
leider sind meine Programmierkenntnisse nicht so super. Vielleicht kennt 
ja jemand eine gute Internetseite oder Literatur für Einsteiger. Wenn 
der Taster dann LOW ist, kehrt das Programm dann von alleine zum Anfang 
zurück, damit ich den Taster immer wieder drücken kann ohne das Programm 
neu zu laden?
OP #4582848
Lesenswert?

Hallo,

ich habe nun das Programm getestet.
Leider macht es das ganze genau falsch herum. Sobald ich das Programm 
auf das Arduino lade, fange die leds in zu blinken. Das sollten sie aber 
eigentlich erst bei Knopfdruck. Sobald ich den Knopf gedrückt halte, 
bleiben die LEDs aus. Sobald ich dann den Knopf wieder loslasse, fange 
sie wieder an zu blinken. Und sie fangen nach einem Durchgang wieder von 
alleine von vorne an. Und das sollte ja erst wieder passieren, sobald 
ich den Knopf drücke.
Was läuft da falsch.
Die Schaltung habe ich mal mit angehangen. Bitte um Hilfe.
Angehängte Dateien:
#4582859
Lesenswert?

@ Knarf Lehceur (si7)

>Was läuft da falsch.

Hast du die kleine Korrektur eingefügt?

>Die Schaltung habe ich mal mit angehangen. Bitte um Hilfe.

Deine Schaltung stimmt nicht mit der Software überein, dort ist nämlich 
der Taster auf Pin 34. Der Anschluß für KAMERA stimmt auch nicht.
OP #4582889
Lesenswert?

Ja die Korrektur habe ich eingefügt.

Und die PIN Belegung stimmt doch. Kamera ist im pin 28 und der Taster in 
34. So steht es ja im Programm und so habe ich diese auch gesteckt. 
vielleicht liegt es auch am Taster.
Ich habe diesen. Kann man da was vertauschen? Habe ihn auch schon 
andersherum gesteckt
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren