Forum: Mikrocontroller und Digitale Elektronik Arduino mit Taster und Warteschleife


von Knarf L. (si7)


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ß

: Verschoben durch User
von Ute (Gast)


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

von Falk B. (falk)


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.

von Knarf L. (si7)


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?

von Falk B. (falk)


Lesenswert?

Ja

von Falk B. (falk)


Lesenswert?

Mist, Fehler. Das muss so heißen
1
        delay(50);  // Entprellzeit abwarten       
2
        while(digitalRead(TASTER)==HIGH);    // warte auf Loslassen
3
        delay(50);  // Entprellzeit abwarten

von Knarf L. (si7)


Angehängte Dateien:

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.

von Falk B. (falk)


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.

von Knarf L. (si7)


Angehängte Dateien:

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

von Knarf L. (si7)


Lesenswert?

Achso, hab es gerade gesehen, passe den Code mit der pinbelegung überein

von Knarf L. (si7)


Lesenswert?

Ok ich hab es. Danke

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.