Hallo liebe Community,
ich habe mich nun schon seit über einem Jahr in das Thema Microcontroller reingefuchst, jedoch läuft es immer noch nicht so richtig. Ich habe ein sehr gutes Grundverständnis von Elektronik, schließlich bin ich im 2. Lehrjahr als Elektroniker für Automatisierungstechnik, aber diese Microcontroller spielen mir immer wieder Streiche. Um nun auf den Punkt zu kommen, gehe ich den Versuch eines Shotspenders das 2. mal an und habe das Grundprinzip auch zum laufen gebracht. Ein 5V Netzteil, welches maximal 3A liefern kann, speist einen Arduino Nano über den 5V Pin ein (Ich nutze nicht den Vin Pin, weil ich gelesen habe, dass man diesen erst ab ca.6V verwenden darf, da am Linearregler min. 1V abfällt und es sonst zu Problemen führen kann). Außerdem steuere ich den Motor für die Pumpe über ein MOS - Modul an. Die 3 Taster sind über die internen Pullup-Widerstände geschaltet, den Servo steuere ich über PWM an (sollte man hier einen Transistor verwenden, um nicht über die 10mA am I/O Pin zu kommen) und ich habe 2 RGB LEDs, welche ich direkt über je zwei 100 Ohm Widerstände (Rot und Blau) und einen 150 Ohm Widerstand (Grün).
Jetzt zum eigentlichen Problem:
Skech und co. hat wunderbar funktioniert, bis nach einiger Zeit der Arduino Nano aus unerklärlichen Gründen angefangen hat zu spinnen. Servo fährt hin und her ohne Tastendruck. Die gründe LED leuchtet sehr schwach, die "Unterboden-LED" leuchtet gar nicht mehr. Die Pumpe geht auch nicht mehr. Also Netzteil getrennt und Programm nochmal neu hochladen. Hochladen funktioniert auch nicht (Fehlermeldung: Arduino reagiert nicht?! oder so ähnlich). Nach 5min. warten konnte ich es wieder hochladen und es funktioniert wieder einigermaßen. Aber nicht so wie vorher (Pumpe hat immer wieder Hänger und in dieser Zeit funktionieren auch die LEDs nicht). On Board LED leuchtet während diesen Hängern!!! Mir kommt es vor wie kleine Resets. Schafft der Nano es nicht diese Leistung bereitzustellen?
#include <Servo.h>
#define TASTER_1_PIN 15
#define TASTER_2_PIN 17
#define TASTER_3_PIN 19
#define SERVO_PIN 3
#define PUMPE_PIN 5
#define POTENTIOMETER_PIN 14
#define UNTERBODEN_LED_R 9
#define UNTERBODEN_LED_G 8
#define UNTERBODEN_LED_B 7
#define FAHRERKABINE_LED_R 11
#define FAHRERKABINE_LED_G 10
#define FAHRERKABINE_LED_B 12
Servo servo;
bool taster1Pressed = false;
bool taster2Pressed = false;
bool taster3Pressed = false;
int pumpenzeit = 3000; // Standard-Pumpenzeit: 3 Sekunden
unsigned long previousMillis = 0;
const long interval = 1000; // Intervall für die Lichtshow (in Millisekunden)
bool lightsOn = false;
void setup() {
pinMode(TASTER_1_PIN, INPUT_PULLUP);
pinMode(TASTER_2_PIN, INPUT_PULLUP);
pinMode(TASTER_3_PIN, INPUT_PULLUP);
pinMode(PUMPE_PIN, OUTPUT);
pinMode(POTENTIOMETER_PIN, INPUT);
pinMode(UNTERBODEN_LED_R, OUTPUT);
pinMode(UNTERBODEN_LED_G, OUTPUT);
pinMode(UNTERBODEN_LED_B, OUTPUT);
pinMode(FAHRERKABINE_LED_R, OUTPUT);
pinMode(FAHRERKABINE_LED_G, OUTPUT);
pinMode(FAHRERKABINE_LED_B, OUTPUT);
servo.attach(SERVO_PIN);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
lightsShow();
}
pumpenzeit = map(analogRead(POTENTIOMETER_PIN), 0, 1023, 1000, 5000); // Pumpenzeit justieren
if (!digitalRead(TASTER_1_PIN) && !taster1Pressed) {
taster1Pressed = true;
assignColorToDriverCabin(255, 0, 0); // Rot für Taster 1 in der Fahrerkabine
fillGlass(1);
} else if (!digitalRead(TASTER_2_PIN) && !taster2Pressed) {
taster2Pressed = true;
assignColorToDriverCabin(0, 255, 0); // Grün für Taster 2 in der Fahrerkabine
fillGlass(2);
} else if (!digitalRead(TASTER_3_PIN) && !taster3Pressed) {
taster3Pressed = true;
assignColorToDriverCabin(0, 0, 255); // Blau für Taster 3 in der Fahrerkabine
fillGlass(3);
}
if (digitalRead(TASTER_1_PIN) && taster1Pressed) {
taster1Pressed = false;
}
if (digitalRead(TASTER_2_PIN) && taster2Pressed) {
taster2Pressed = false;
}
if (digitalRead(TASTER_3_PIN) && taster3Pressed) {
taster3Pressed = false;
}
}
void fillGlass(int glassNumber) {
switch (glassNumber) {
case 1:
moveServoToGlass(83);
delay(500); // Verzögerung vor dem Pumpen
if (taster1Pressed) {
digitalWrite(PUMPE_PIN, HIGH);
delay(pumpenzeit); // Pumpenzeit einstellen
digitalWrite(PUMPE_PIN, LOW);
}
break;
case 2:
moveServoToGlass(131);
delay(500); // Verzögerung vor dem Pumpen
if (taster2Pressed) {
digitalWrite(PUMPE_PIN, HIGH);
delay(pumpenzeit); // Pumpenzeit einstellen
digitalWrite(PUMPE_PIN, LOW);
}
break;
case 3:
moveServoToGlass(180);
delay(500); // Verzögerung vor dem Pumpen
if (taster3Pressed) {
digitalWrite(PUMPE_PIN, HIGH);
delay(pumpenzeit); // Pumpenzeit einstellen
digitalWrite(PUMPE_PIN, LOW);
}
break;
}
}
void moveServoToGlass(int angle) {
servo.write(angle);
delay(500); // Zeit für den Servo, sich zu bewegen
}
void assignColorToDriverCabin(int red, int green, int blue) {
digitalWrite(FAHRERKABINE_LED_R, red > 0 ? HIGH : LOW);
digitalWrite(FAHRERKABINE_LED_G, green > 0 ? HIGH : LOW);
digitalWrite(FAHRERKABINE_LED_B, blue > 0 ? HIGH : LOW);
}
void lightsShow() {
if (!taster1Pressed && !taster2Pressed && !taster3Pressed) {
// Unterbodenbeleuchtung zufällige Farbe
randomColorForUnderbody();
}
}
void randomColorForUnderbody() {
int colors[3] = {UNTERBODEN_LED_R, UNTERBODEN_LED_G, UNTERBODEN_LED_B};
int selectedColor = random(3); // Zufällige Auswahl einer Farbe
for (int i = 0; i < 3; i++) {
digitalWrite(colors[i], i == selectedColor ? HIGH : LOW);
}
}
(Ich weiß nicht wie ich hier im Forum Videos hochladen kann. Das würde die Sache vereinfachen. Und ich habe kein Schaltplan-Programm, somit auch keinen Schaltplan)
Danke schonmal für eure Hilfe!