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
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
@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.
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?
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 |
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.
@ 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.
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
Achso, hab es gerade gesehen, passe den Code mit der pinbelegung überein
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.