Hallo Alle,
ich baue gerade an einem Schallerzeuger für eine Halloween Figur.
Der Schallerzeuger funktioniert im Prinzip ähnlich wie eine Boga, in dem er die Verbrennungsgase auf Überschall beschleunigt, die am ende des Rohrs auf eine Wand aus stehender Luft treffen. So viel zum Prinzip.
Zu meinem Problem:
Der Schallerzeuger soll bei bestimmten Ereignissen einen Knall erzeugen
Nach dem Einschalten soll die erste LED durch langsames Blinken den "Bereitschaftszustand" anzeigen. Der Schallerzeuger wartet auf einen Tastendruck, der die Ladezeit bestimmt. Es gibt drei verschiedene Lademengen, wobei die erste nur Zimmerlautstärke erzeugt.
Nachdem eine der Tasten gewählt wurde, zieht der Servo für eine definierte Zeit ein Ventil und lässt Butangas durch eine Venturidüse in den Schallerzeuger (Signalisiert durch die 2. LED).
Ist die Zeit abgelaufen (Timeout 1, 2, 3) springt der Schallerzeuger in den Zustand "Zündbereit" und wartet auf die Feuertaste. Wird diese gedrückt, zieht ein relais an, dass einen Funkenerzeuger schält. Blitzbumm. Break;, Neustart.
Ich habe versucht (hat wie ihr seht nicht geklappt) auf delays zu verzichten. Und ich möchte lernen mit Strukturen zu arbeiten, deshalb die "cases".
Ich dachte, das ist für mich als Anfänger leichter zu verstehen, weil ich ähnlich wie damals in Basic (Nicht lachen jetzt, war meine erste Programmiersprache auf dem VC64
) hin und herspringen k(önnen) wollte^^. Schade.
10
20
30
Das ganze war erstmal ein Griff ins Klo so, und ihr werdet mich auslachen^^
Ich bin hier, weil ich Hilfe brauche, es richtig zu machen.
Die Aufgabe ist eigentlich nicht schwer und wäre auch mit Delays und einfacher Abfolge von Befehlen möglich. Ich will das aber noch erweitern, deshalb würde ich das mit den Cases gerne so lassen irgendwie.
#include <Servo.h>
const int ledPin1 = 4;
const int ledPin2 = 3;
const int ledPin3 = 2;
const int buttonPinLoad1 = 12; // Laden1
const int buttonPinLoad2 = 10; // Laden2
const int buttonPinLoad3 = 9; // Laden3
const int buttonPinFire = 11; // Feuer
Servo myservo;
const long time1 = 1000; // 1sec. testbang
const long time2 = 3000; // 3sec. soft
const long time3 = 6000; // 6sec. hard
int myState = 0;
long myTimeout = 0;
long myStartTime = 0;
void setup() {
myservo.attach(6); // attaches the servo on pin 9 to the servo obj
pinMode(buttonPinFire, INPUT_PULLUP);
pinMode(buttonPinLoad1, INPUT_PULLUP);
pinMode(buttonPinLoad2, INPUT_PULLUP);
pinMode(buttonPinLoad3, INPUT_PULLUP);
Serial.begin(9600);
myservo.write(90);
}
void loop() {
switch (myState) {
case 0: // Warten
blinkSlow1(); // LED Ausgabe langsames Blinken
if (digitalRead(buttonPinLoad1) == 0) myState = 1;
if (digitalRead(buttonPinLoad2) == 0) myState = 2;
if (digitalRead(buttonPinLoad3) == 0) myState = 3;
break;
case 1: // ladestart 1
if (digitalRead(buttonPinFire) == 1) {
blinkFast1(); // LED1 Ausgabe langsames Blinken
blinkSlow2(); // LED2 Ausgabe langsames Blinken
myTimeout = time1;
myStartTime = millis();
myservo.write(100);
if (millis() - myStartTime > myTimeout) myState = 4;
}
case 2: // ladestart 2
if (digitalRead(buttonPinFire) == 1) {
blinkFast1(); // LED1 Ausgabe langsames Blinken
blinkFast2(); // LED2 Ausgabe schnelles Blinken
myTimeout = time2;
myStartTime = millis();
myservo.write(100);
if (millis() - myStartTime > myTimeout) myState = 4;
}
case 3: // ladestart 3
if (digitalRead(buttonPinFire) == 1) {
blinkFast1(); // LED1 Ausgabe schnelles Blinken
blinkFastest2(); // LED2 Ausgabe schnellstes Blinken
myTimeout = time3;
myStartTime = millis();
myservo.write(100);
if (millis() - myStartTime > myTimeout) myState = 4;
}
case 4: // Gas Aus
myservo.write(90);
if (digitalRead(buttonPinFire) == 1) {
blinkFast3(); // LED3 Ausgabe schnelles Blinken
if (millis() - myStartTime > myTimeout) myState = 5;
}
case 5: // Feuerbereit
if (digitalRead(buttonPinFire) == 1) {
blinkFast2(); // LED3 Ausgabe schnelles Blinken
}
break;
}
}
void blinkFast1(){
if (millis() % 500 > 250) analogWrite(ledPin1, 155);
else analogWrite(ledPin1, 0);
}
void blinkFast2(){
if (millis() % 500 > 250) analogWrite(ledPin2, 155);
else analogWrite(ledPin2, 0);
}
void blinkFast3(){
if (millis() % 500 > 250) analogWrite(ledPin3, 155);
else analogWrite(ledPin3, 0);
}
void blinkFastest1(){
if (millis() % 200 > 100) analogWrite(ledPin1, 155);
else analogWrite(ledPin1, 0);
}
void blinkFastest2(){
if (millis() % 200 > 100) analogWrite(ledPin2, 155);
else analogWrite(ledPin2, 0);
}
void blinkFastest3(){
if (millis() % 200 > 100) analogWrite(ledPin3, 155);
else analogWrite(ledPin3, 0);
}
void blinkSlow1() {
if (millis() % 2000 > 1000) analogWrite(ledPin1, 255);
else analogWrite(ledPin1, 0);
}
void blinkSlow2() {
if (millis() % 2000 > 1000) analogWrite(ledPin2, 255);
else analogWrite(ledPin2, 0);
}
void blinkSlow3() {
if (millis() % 2000 > 1000) analogWrite(ledPin3, 255);
else analogWrite(ledPin3, 0);
}
