Neue Frage:
Hallo Freunde,
ich möchte als Geschenk für einen Freund einen Shotspender selbst programmieren, den er mir mal auf social Media gezeigt hat und toll fand. Ich sende den Link mal mit, damit ihr euch besser vorstellen könnt um was es geht: https://www.instagram.com/reel/CprbM-1oehu/?igshid=MDJmNzVkMjY=
Jedoch benutze ich lediglich 2 Endtaster, einen Servo-Motor, eine REB-LED zur Beleuchtung des Fahrerhauses und eine 5V Pumpe, welche ich über ein L298 (Motor Controller für 2 Motoren mit PWM, ich benutze ihn jedoch nur für die Pumpe) ansteuere.
Nun zum Problem: Es hat einmal funktioniert, doch wenn ich nun einen Taster drücke, fährt der Servo zum jeweiligen Glas (auch schön an der Farbe des Lichtes zu erkennen, beim einen Glas wird es blau, beim anderen rot), doch sobald die Pumpe schalten möchte scheint das ganze System zu resetten und der Servo fährt zurück zur Startposition.
Ich weiß, dass ein Arduino bei zu viel Strom "abschaltet", um sich zu schützen. Aber ist das überhaupt das Problem und wie könnte ich den Arduino weniger belasten? Ich habe nämlich schonmal ein Relais getestet, hat aber auch nicht funktioniert. Das Schaltplan-Programm hatte solche Motor Controller nicht, deshalb habe ich es mit einem Relais gezeichnet. Die Widerstände passen auch nicht, aber ich hoffe ihr könnt darüber hinwegsehen. Ich verzweifle, bitte helft mir!
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
int Servo = 9;
int Pumpe = 11;
int Pumpzeit = 10000;
int Lichtzeit = 500; //Zeigt an wie lange die einzelnen Farben leuchten sollen
int Taster1 = 13; //Taster Pin
int Taster2 = 12; //Taster Pin
bool Status1 = 0; //Status, ob Taster gedrückt ist oder nicht
bool Status2 = 0; //Status, ob Taster gedrückt ist oder nicht
bool ObGeradeVoll1 = 0; //Soll speichern, ob Glas gerade voll ist oder nicht, dass wenn ein Glas länger auf dem Schalter steht, es nicht dauerhaft befüllt wird
bool ObGeradeVoll2 = 0; //Soll speichern, ob Glas gerade voll ist oder nicht, dass wenn ein Glas länger auf dem Schalter steht, es nicht dauerhaft befüllt wird
int Pos1 = 40; //Servo Positionen für die jeweiligen Gläser
int Pos2 = 90;
unsigned long Zeit1 = 0; //Soll später mit millis -Befehl schauen, welches Glas als erstes abgestellt wurde
unsigned long Zeit2 = 0;
int r = 6; //RGB- Farbpins
int g = 5;
int b = 7;
int i = 0; //unwichtige Variable wie oft LEDs blinken sollen
void setup() {
Serial.begin(9600);
pinMode(Servo, OUTPUT);
pinMode(Pumpe, OUTPUT);
pinMode(r, OUTPUT);
pinMode(g, OUTPUT);
pinMode(b, OUTPUT);
pinMode(Taster1, INPUT);
pinMode(Taster2, INPUT);
myservo.attach(Servo); // attaches the servo on pin 9 to the servo object
digitalWrite(Pumpe, 0);
}
void loop() {
label:
digitalWrite(g, HIGH);
Status1 = digitalRead(Taster1);
Status2 = digitalRead(Taster2);
Zeit1 = 0;
Zeit2 =0;
if(Status1 == HIGH && ObGeradeVoll1 == 0)
{
Zeit1 = millis(); //Zeit seit Beginn des Programms wird gespeichert, um zu sehen welches Glas wann auf die Taster gestellt wurde
}
if(Status1 == LOW)
{
ObGeradeVoll1 = 0; //Wenn das Glas vom Taster ist, soll der Status des vollen Glases wieder zurückgesetzt werden
}
delay(200);
if(Status2 == HIGH && ObGeradeVoll2 == 0)
{
Zeit2 = millis(); //Zeit seit Beginn des Programms wird gespeichert, um zu sehen welches Glas wann auf die Taster gestellt wurde
}
if(Status2 == LOW)
{
ObGeradeVoll2 = 0; //Wenn das Glas vom Taster ist, soll der Status des vollen Glases wieder zurückgesetzt werden
}
Serial.print("Erstes Glas:");
Serial.println(ObGeradeVoll1);
Serial.print("Zweites Glas:");
Serial.println(ObGeradeVoll2);
if(Zeit1 > 0 && Zeit2 == 0 && ObGeradeVoll1 == 0)
{
digitalWrite(g, LOW);
digitalWrite(b, HIGH);
myservo.write(Pos1); // tell servo to go to position in variable 'pos'
delay(1000);
digitalWrite(Pumpe, 1);
delay(Pumpzeit);
digitalWrite(Pumpe, 0);
ObGeradeVoll1 = 1;
i = 0;
digitalWrite(b, LOW);
goto label;
}
if(Zeit2 > 0 && Zeit1 == 0 && ObGeradeVoll2 == 0)
{
digitalWrite(g, LOW);
digitalWrite(r, HIGH);
myservo.write(Pos2); // tell servo to go to position in variable 'pos'
delay(1000);
digitalWrite(Pumpe, 1);
delay(Pumpzeit);
digitalWrite(Pumpe, 0);
ObGeradeVoll2 = 1;
i = 0;
digitalWrite(r, LOW);
goto label;
}
if(Zeit1 < Zeit2 && Zeit1 != 0 && Zeit2 !=0 && ObGeradeVoll1 == 0 && ObGeradeVoll2 == 0)
{
digitalWrite(g, LOW);
digitalWrite(r, HIGH);
myservo.write(Pos2); // tell servo to go to position in variable 'pos'
delay(1000);
digitalWrite(Pumpe, 1);
delay(Pumpzeit);
digitalWrite(Pumpe, 0);
ObGeradeVoll2 = 1;
i = 0;
digitalWrite(r, LOW);
goto label;
}
if(Zeit2 < Zeit1 && Zeit1 != 0 && Zeit2 !=0 && ObGeradeVoll1 == 0 && ObGeradeVoll2 == 0)
{
digitalWrite(g, LOW);
digitalWrite(b, HIGH);
myservo.write(Pos1); // tell servo to go to position in variable 'pos'
delay(1000);
digitalWrite(Pumpe, 1);
delay(Pumpzeit);
digitalWrite(Pumpe, 0);
ObGeradeVoll1 = 1;
i = 0;
digitalWrite(b, LOW);
goto label;
}
}