Hallo, habe mir nach Anleitung schon mal ein gegenläufiges Lauflicht zusammen gebastelt und funktioniert soweit. Nun müsste ich das per Taster starten lassen können und nach einer definierbaren Zeit soll es wieder aufhören.
Weiterhin möchte ich 3 weitere LED betreiben z.B. das Verkehrsampel-Script welches gleichzeitig mit dem Lauflicht ablaufen soll.
Zur Erklärung, soll eine Beleuchtung für eine Modellbühne im Maßstab 1:50 werden, wie immer muss es gestern fertig sein. (diesen Sonntag)
Habe hier einen Arduino Nano und 2x 5 LEDs an 330 Ohm Widerständen und nochmal 3 LEDs auch an 330 Ohm Widerständen.
Die 2x LEDs bilden das Lauflicht mit Pin 3 - 7
Den Taster habe ich an Pin 12 (wo muss das andere Kabel vom Taster hin, Widerstand o.ä.)
Die 3 noch zu aktivierenden LEDs sind an Pin 9 - 11
könnte mir bitte einer helfen meinen Scriptcode entsprechend zu erweitern?!
int ledPins[8] = { 3, 4, 5, 6, 7, };
//definiert die Anzahl der LEDs und die benutzten Pins auf dem Arduino
const int buttonPin = 12; // Taster an Pin 12
void setup()
{
pinMode(buttonPin, INPUT); // Taster als Eingang
for (int i = 0; i < 5; i++)
{
pinMode (ledPins [i], OUTPUT); }
}
// Variablen
int buttonState = 0; // Speichert den Zustand des Tasters
void loop() {
// Tasterzustand lesen
digitalRead(buttonPin);
for (int i = 0; i < 5; i++) {
digitalWrite(ledPins[i], HIGH);
delay(200); //Wartezeit An
digitalWrite(ledPins[i], LOW); }
for (int i = 4; i > 0; i--) {
digitalWrite(ledPins[i], HIGH);
delay(200); //Wartezeit Aus
digitalWrite(ledPins[i], LOW); }
}
Laufen soll es gleichzeitig, also das Lauflicht als Bühnenbeleuchtung und die 3 weiteren LED mit dem Ampelscript sollen Lasershow imitieren und und das Relais angezogen bleiben um das Riesenrad zu bewegen, alles gleichzeitig
Nach Tastendruck soll es einmal solange ablaufen wie es definiert wir, z.B. 5 Min.
In der Zeit Taster blockieren kling gut, erst wenn Durchlauf beendet ist wieder frei geben.
Außerdem möchtest du dich in nicht blockierende Programmierung einlesen.
z.B. kannst du "Blink without delay" aus den Beispielen ansehen.
Statemachines gehören da auch auf die Liste.
Mit pinMode(..., INPUT_PULLUP) geht der andere Pin an GND.
erstmal vielen Dank für die bisherige unkomplizierte Hilfe, so hätte ich es niemals zusammen gebraucht, wäre wohl auf 3 Nano´s hinaus gelaufen.
Nun aber zum Fehlerbild.
Lauflicht wie gesagt wunderbar, Blinklicht nur wenn ich den Taster gedrückt halte mit 4k Prellwiderstand (10k habe ich gerade nicht, besorge ich heute)
Lasse ich den Prellwiderstand weg, geht das Blinklicht auch bei gedrückt gehaltenem Taster nicht mehr, das Lauflicht jedoch schon. Auch ein Anziehen vom Relais ist nicht zu hören / spüren.
Ich beschreibe mal den betreffenden Aufbau auf dem Steckboard:
Pin 12 auf Taster -> Taster auf GND -> Prellwiderstand auf GND
Pin 8 auf IN1 Relais
GND auf GND Relais
5V auf VCC Relais
Sollte es nur an dem Prellwiderstand liegen der statt vorgeschlagenen 10 kOhm nur 4 kOhm hat???
Wäre es möglich die Zeiten der 3 LED vom Blinklicht unterschiedlich einstellen zu können, das es nicht so Statisch aussieht? Deshalb hatte ich zu Beginn an das Ampelscript gedacht.
Ich hab Dir mal eingefügt, das Du aus was angezeigt bekommst.
Bitte stelle Deinen Seriellen Monitor unten rechts so ein, wie im setup mit 115200.
constexpr uint8_t llPins {5};
constexpr uint8_t lauflicht[llPins] { 3, 4, 5, 6, 7, };
uint8_t lastllPin;
constexpr uint8_t blPins {3};
constexpr uint8_t blinklicht[blPins] {9, 10, 11,};
uint8_t lastblPin;
constexpr uint32_t toggleTime {200};
constexpr uint8_t buttonPin {12};
constexpr uint32_t laufzeit {10000}; // Zeit in Millisekunden
constexpr bool AUS {LOW};
constexpr bool EIN {!AUS};
constexpr uint8_t relaisPin {8};
constexpr bool relaisOFF {HIGH};
uint8_t state;
uint32_t startTime;
uint32_t lastSwitch;
uint8_t debugState = 255;
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
pinMode(buttonPin, INPUT_PULLUP); // Taster als Eingang
for (uint8_t b = 0; b < llPins; b++)
{
pinMode (lauflicht[b], OUTPUT);
digitalWrite(lauflicht[b], AUS);
}
for (uint8_t b = 0; b < blPins; b++)
{
pinMode (blinklicht[b], OUTPUT);
digitalWrite(blinklicht[b], AUS);
}
pinMode(relaisPin, OUTPUT);
digitalWrite(relaisPin, relaisOFF);
}
void loop()
{
if (debugState != state)
{
Serial.print(F("Neuer Zustand: "));
Serial.println(state);
debugState = state;
}
switch (state)
{
case 0:
if (!digitalRead(buttonPin))
{
Serial.println(F("TASTE gedrückt!"));
startTime = millis();
toggleRelais();
state++;
}
break;
case 1:
blinkLicht();
laufLicht();
if (millis() - startTime > laufzeit)
{
state++;
}
break;
case 2:
allOff();
if (digitalRead(buttonPin))
{
state = 0;
}
break;
default:
state = 0;
break;
}
}
void laufLicht()
{
if (millis() - lastSwitch > toggleTime)
{
llOFF();
Serial.print(F("Neue LauflichtLed: "));
Serial.println(lastllPin);
digitalWrite(lauflicht[lastllPin++], EIN);
if (lastllPin >= llPins)
{ lastllPin = 0; }
lastSwitch = millis();
}
}
void blinkLicht()
{
static uint8_t blinkState = 0;
bool isNew = true;
static uint32_t myTime = 0;
for (uint8_t b = 0; b < blPins; b++)
{
if (digitalRead(blinklicht[b]))
{ isNew = false; }
}
if (isNew)
{
blinkState = 0;
}
switch (blinkState)
{
case 0:
digitalWrite(blinklicht[0], HIGH);
myTime = millis();
blinkState++;
break;
case 1:
if (millis() - myTime > 500)
{
blOFF();
Serial.print(F("Neue BlinkLed ist 1"));
digitalWrite(blinklicht[1], HIGH);
myTime = millis();
blinkState++;
}
break;
case 2:
if (millis() - myTime > 800)
{
blOFF();
Serial.print(F("Neue BlinkLed ist 2"));
digitalWrite(blinklicht[2], HIGH);
myTime = millis();
blinkState++;
}
break;
case 3:
if (millis() - myTime > 300)
{
Serial.print(F("Neue BlinkLed ist 0"));
blOFF();
blinkState = 0;
}
break;
default:
blinkState = 0;
break;
}
}
void allOff()
{
Serial.println(F("Funktion: ALLES AUS!"));
llOFF();
blOFF();
digitalWrite(relaisPin, relaisOFF);
}
void llOFF()
{
for (uint8_t b = 0; b < llPins; b++)
{
digitalWrite(lauflicht[b], AUS);
}
Serial.println(F("Lauflicht OFF"));
}
void blOFF()
{
for (uint8_t b = 0; b < blPins; b++)
{
digitalWrite(blinklicht[b], AUS);
}
Serial.println(F("blinklicht OFF"));
}
void toggleRelais()
{
digitalWrite(relaisPin, !digitalRead(relaisPin));
Serial.print(F("Relais geschaltet - Zustand neu: "));
Serial.print(digitalRead(relaisPin));
}
Dann bekommst Du immer eine Anzeige, wenn sich was tut und das muss dan auch passend passieren.
Wenn was nicht geht, dann Verkabelung prüfen.
Auf dem Relaismodul ist eine LED, die muss ebenfalls an/aus eghen.
FQBN: arduino:avr:nano:cpu=atmega328old
Verwende das Board 'nano' von der Plattform im Ordner: C:\Users\Iev\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6
Verwendung des Kerns 'arduino' von Platform im Ordner: C:\Users\Iev\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6
Sketch wird kompiliert ...
"C:\Users\Iev\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10607 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\Users\Iev\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino" "-IC:\Users\Iev\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\variants\eightanaloginputs" "C:\Users\Iev\AppData\Local\arduino\sketches\496F405D10F01F34196EDDB972561D6C\sketch\brauhausfest_freiberger.ino.cpp" -o "C:\Users\Iev\AppData\Local\arduino\sketches\496F405D10F01F34196EDDB972561D6C\sketch\brauhausfest_freiberger.ino.cpp.o"
Bibliotheken werden kompiliert ...
Kern wird kompiliert ...
Verwendung des vorkompilierten Kerns: C:\Users\Iev\AppData\Local\arduino\cores\arduino_avr_nano_cpu_atmega328old_e0bff5c041da8a5d4697870f7ee0a051\core.a
Alles zusammenlinken...
"C:\Users\Iev\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7/bin/avr-gcc" -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p -o "C:\Users\Iev\AppData\Local\arduino\sketches\496F405D10F01F34196EDDB972561D6C/brauhausfest_freiberger.ino.elf" "C:\Users\Iev\AppData\Local\arduino\sketches\496F405D10F01F34196EDDB972561D6C\sketch\brauhausfest_freiberger.ino.cpp.o" "C:\Users\Iev\AppData\Local\arduino\sketches\496F405D10F01F34196EDDB972561D6C/..\..\cores\arduino_avr_nano_cpu_atmega328old_e0bff5c041da8a5d4697870f7ee0a051\core.a" "-LC:\Users\Iev\AppData\Local\arduino\sketches\496F405D10F01F34196EDDB972561D6C" -lm
"C:\Users\Iev\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy" -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 "C:\Users\Iev\AppData\Local\arduino\sketches\496F405D10F01F34196EDDB972561D6C/brauhausfest_freiberger.ino.elf" "C:\Users\Iev\AppData\Local\arduino\sketches\496F405D10F01F34196EDDB972561D6C/brauhausfest_freiberger.ino.eep"
"C:\Users\Iev\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy" -O ihex -R .eeprom "C:\Users\Iev\AppData\Local\arduino\sketches\496F405D10F01F34196EDDB972561D6C/brauhausfest_freiberger.ino.elf" "C:\Users\Iev\AppData\Local\arduino\sketches\496F405D10F01F34196EDDB972561D6C/brauhausfest_freiberger.ino.hex"
"C:\Users\Iev\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7/bin/avr-size" -A "C:\Users\Iev\AppData\Local\arduino\sketches\496F405D10F01F34196EDDB972561D6C/brauhausfest_freiberger.ino.elf"
Der Sketch verwendet 3344 Bytes (10%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 209 Bytes (10%) des dynamischen Speichers, 1839 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
"C:\Users\Iev\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17/bin/avrdude" "-CC:\Users\Iev\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf" -v -patmega328p -carduino "-PCOM4" -b57600 -D "-Uflash:w:C:\Users\Iev\AppData\Local\arduino\sketches\496F405D10F01F34196EDDB972561D6C/brauhausfest_freiberger.ino.hex:i"
avrdude: Version 6.3-20190619
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "C:\Users\Iev\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf"
Using Port : COM4
Using Programmer : arduino
Overriding Baud Rate : 57600
avrdude: ser_open(): can't open device "\.\COM4": Das System kann die angegebene Datei nicht finden.
avrdude done. Thank you.
Fehlgeschlagenes Hochladen: Hochladefehler: exit status 1
war mein Fehler, hatte externes Netzteil dran gemacht, dachte der Strom vom Rechner könnte zu wenig sein. Hier die Ausgabe vom Seriellen Monitor:
�Start...
Neuer Zustand: 0
TASTE gedrückt!
Relais geschaltet - Zustand neu: 0Neuer Zustand: 1
Lauflicht OFF
Neue LauflichtLed: 0
Lauflicht OFF
Neue LauflichtLed: 1
Lauflicht OFF
Neue LauflichtLed: 2
blinklicht OFF
Neue BlinkLed ist 1Lauflicht OFF
Neue LauflichtLed: 3
Lauflicht OFF
Neue LauflichtLed: 4
Lauflicht OFF
Neue LauflichtLed: 0
Lauflicht OFF
Neue LauflichtLed: 1
blinklicht OFF
Neue BlinkLed ist 2Lauflicht OFF
Neue LauflichtLed: 2
Neue BlinkLed ist 0blinklicht OFF
Lauflicht OFF
Neue LauflichtLed: 3
Lauflicht OFF
Neue LauflichtLed: 4
Lauflicht OFF
Neue LauflichtLed: 0
blinklicht OFF
Neue BlinkLed ist 1Lauflicht OFF
Neue LauflichtLed: 1
Lauflicht OFF
Neue LauflichtLed: 2
Lauflicht OFF
Neue LauflichtLed: 3
Lauflicht OFF
Neue LauflichtLed: 4
blinklicht OFF
Neue BlinkLed ist 2Lauflicht OFF
Neue LauflichtLed: 0
Neue BlinkLed ist 0blinklicht OFF
Lauflicht OFF
Neue LauflichtLed: 1
Lauflicht OFF
Neue LauflichtLed: 2
Lauflicht OFF
Neue LauflichtLed: 3